diff --git a/.github/workflows/test_cornflow_client.yml b/.github/workflows/test_cornflow_client.yml index 4b04692dd..cdc0cb600 100644 --- a/.github/workflows/test_cornflow_client.yml +++ b/.github/workflows/test_cornflow_client.yml @@ -5,6 +5,7 @@ on: types: [ opened, edited, synchronize, reopened ] paths: - 'libs/client/**' + - '.github/workflows/test_cornflow_client.yml' - '!libs/client/README.rst' - '!libs/client/setup.py' push: @@ -57,7 +58,7 @@ jobs: strategy: max-parallel: 21 matrix: - python-version: [ 3.8, 3.9, '3.10', '3.11' ] + python-version: [3.8, 3.9, '3.10', '3.11'] os: [ ubuntu-latest ] steps: @@ -84,7 +85,7 @@ jobs: cd cornflow-server python -m venv afvenv source afvenv/bin/activate - AIRFLOW_VERSION=2.2.1 + AIRFLOW_VERSION=2.7.1 PYTHON_VERSION="$(python3 --version | cut -d " " -f 2 | cut -d "." -f 1-2)" CLIENT_BRANCH="${{ github.head_ref || github.ref_name }}" CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt" diff --git a/.github/workflows/test_cornflow_dags.yml b/.github/workflows/test_cornflow_dags.yml index a7839e42c..7f9d83d29 100644 --- a/.github/workflows/test_cornflow_dags.yml +++ b/.github/workflows/test_cornflow_dags.yml @@ -5,6 +5,7 @@ on: types: [ opened, edited, synchronize, reopened ] paths: - 'cornflow-dags/**' + - '.github/workflows/test_cornflow_dags.yml' - '!cornflow-dags/README.rst' push: branches: @@ -25,7 +26,7 @@ jobs: strategy: max-parallel: 21 matrix: - python-version: [3.7, 3.8] + python-version: [3.8, 3.9, '3.10', '3.11'] os: [ubuntu-latest] steps: @@ -46,12 +47,12 @@ jobs: python -m pip install -U "git+https://github.com/baobabsoluciones/cornflow@${CLIENT_BRANCH}#subdirectory=libs/client" - name: Install airflow run: | - AIRFLOW_VERSION=2.1.0 + AIRFLOW_VERSION=2.7.1 PYTHON_VERSION="$(python3 --version | cut -d " " -f 2 | cut -d "." -f 1-2)" CLIENT_BRANCH="${{ github.head_ref || github.ref_name }}" CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt" - pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" - python -m pip uninstall cornflow-client -y + python -m pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" + python -m pip install -U orloge pulp python -m pip install -U "git+https://github.com/baobabsoluciones/cornflow@${CLIENT_BRANCH}#subdirectory=libs/client" airflow db init airflow users create \ diff --git a/.github/workflows/test_cornflow_server.yml b/.github/workflows/test_cornflow_server.yml index 7eabff50c..18634e058 100644 --- a/.github/workflows/test_cornflow_server.yml +++ b/.github/workflows/test_cornflow_server.yml @@ -5,6 +5,7 @@ on: types: [ opened, edited, synchronize, reopened ] paths: - 'cornflow-server/**' + - '.github/workflows/test_cornflow_server.yml' - '!cornflow-server/docs/**' - '!cornflow-server/README.rst' push: @@ -27,7 +28,7 @@ jobs: strategy: max-parallel: 21 matrix: - python-version: [3.8] + python-version: [3.8, 3.9, '3.10', '3.11'] os: [ubuntu-latest] services: @@ -71,7 +72,7 @@ jobs: run: | python -m venv afvenv source afvenv/bin/activate - AIRFLOW_VERSION=2.2.1 + AIRFLOW_VERSION=2.7.1 PYTHON_VERSION="$(python3 --version | cut -d " " -f 2 | cut -d "." -f 1-2)" CLIENT_BRANCH="${{ github.head_ref || github.ref_name }}" CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt" diff --git a/.gitignore b/.gitignore index fd7086dce..584d2d0f5 100644 --- a/.gitignore +++ b/.gitignore @@ -169,4 +169,7 @@ cornssh.pub *.db # IO files -*.mps \ No newline at end of file +*.mps + +# airflow logs +cornflow-server/airflow_config/logs \ No newline at end of file diff --git a/QUICK_START_GUIDE.RST b/QUICK_START_GUIDE.RST index d0e19221b..ef12abda1 100644 --- a/QUICK_START_GUIDE.RST +++ b/QUICK_START_GUIDE.RST @@ -122,14 +122,6 @@ If on Windows export should be changed to set. .. raw:: html - - -.. - -Docker ------- - -You will also need to install `Docker Community Edition `_ and `Docker Compose `_. See `here `_ how to deploy your own cornflow server. For cornflow-app @@ -192,10 +184,10 @@ If it is the first time you use cornflow-server, you will then need to setup cor export FLASK_APP=cornflow.app export DATABASE_URL=sqlite:///cornflow.db - python manage.py db upgrade - python manage.py access_init - python manage.py create_service_user --username=airflow --email=airflow_test@admin.com --password=airflow_test_password - python manage.py create_admin_user --username=cornflow --email=cornflow_admin@admin.com --password=cornflow_admin_password + flask db upgrade + flask access_init + flask create_service_user --username=airflow --email=airflow_test@admin.com --password=airflow_test_password + flask create_admin_user --username=cornflow --email=cornflow_admin@admin.com --password=cornflow_admin_password From there, you can launch cornflow-server by navigating to the cornflow-server repository and running: @@ -243,7 +235,9 @@ To do so, you need to clone the repository and create a new folder with the name - :code:`/schemas` - :code:`instance.json`: jsonschema that describes the input data. + - :code:`instance_checks.json`: jsonschema that describes the output of the instance checks. - :code:`solution.json`: jsonschema that describes the output data. + - :code:`solution_checks.json`: jsonschema that describes the output of the solution checks. - :code:`config.json` (optional): jsonschema that describes the configuration. - :code:`/solvers` diff --git a/cornflow-dags/DAG/activate_dags.py b/cornflow-dags/DAG/activate_dags.py index ec07893df..837952081 100644 --- a/cornflow-dags/DAG/activate_dags.py +++ b/cornflow-dags/DAG/activate_dags.py @@ -1,8 +1,9 @@ +import cornflow_client.airflow.dag_utilities as utils from airflow import DAG +from airflow.operators.python import PythonOperator from airflow.secrets.environment_variables import EnvironmentVariablesBackend -import cornflow_client.airflow.dag_utilities as utils + from update_all_schemas import get_new_apps -from airflow.operators.python import PythonOperator def create_dag(app): @@ -27,7 +28,16 @@ def solve(**kwargs): **kwargs ) with dag: - t1 = PythonOperator(task_id=app.name, python_callable=solve) + notify = getattr(app, "notify", True) + if not notify: + t1 = PythonOperator(task_id=app.name, python_callable=solve) + else: + t1 = PythonOperator( + task_id=app.name, + python_callable=solve, + on_failure_callback=utils.callback_email, + ) + return dag diff --git a/cornflow-dags/DAG/bar_cutting/__init__.py b/cornflow-dags/DAG/bar_cutting/__init__.py index 1837f592f..49ace3392 100644 --- a/cornflow-dags/DAG/bar_cutting/__init__.py +++ b/cornflow-dags/DAG/bar_cutting/__init__.py @@ -17,12 +17,9 @@ class BarCutting(ApplicationCore): solution = Solution solvers = dict(mip=MipModel, CG=ColumnGeneration) schema = load_json(os.path.join(os.path.dirname(__file__), "./schemas/config.json")) - schema["properties"]["solver"]["enum"].append("mip.cbc") - schema["properties"]["solver"]["enum"].append("CG.cbc") @property def test_cases(self) -> List[Union[Dict, Tuple[Dict, Dict]]]: - options_instance = ["data/example_instance_1.json"] options_solution = ["data/example_solution_1.json"] @@ -44,10 +41,3 @@ def test_cases(self) -> List[Union[Dict, Tuple[Dict, Dict]]]: ) for i in range(len(options_instance)) ] - - def get_solver(self, name: str = "mip") -> Union[Type[Experiment], None]: - if "." in name: - solver, _ = name.split(".") - else: - solver = name - return self.solvers.get(solver) diff --git a/cornflow-dags/DAG/bar_cutting/schemas/config.json b/cornflow-dags/DAG/bar_cutting/schemas/config.json index e7eaf88f7..d857a6310 100644 --- a/cornflow-dags/DAG/bar_cutting/schemas/config.json +++ b/cornflow-dags/DAG/bar_cutting/schemas/config.json @@ -4,8 +4,8 @@ "properties": { "solver": { "type": "string", - "enum": ["mip", "CG"], - "default": "mip" + "enum": ["mip", "CG", "mip.cbc", "CG.cbc"], + "default": "mip.cbc" }, "timeLimit": { "type": "number" diff --git a/cornflow-dags/DAG/facility_location/__init__.py b/cornflow-dags/DAG/facility_location/__init__.py index 0e4f1fa9d..f49073d91 100644 --- a/cornflow-dags/DAG/facility_location/__init__.py +++ b/cornflow-dags/DAG/facility_location/__init__.py @@ -11,17 +11,7 @@ class FacilityLocation(ApplicationCore): instance = Instance solution = Solution solvers = dict(Pyomo=PyomoSolver) - schema = get_empty_schema( - properties=dict(timeLimit=dict(type="number")), - solvers=list(solvers.keys()) + ["Pyomo.cbc"], - ) - - def get_solver(self, name: str = "Pyomo") -> Union[Type[Experiment], None]: - if "." in name: - solver, _ = name.split(".") - else: - solver = name - return self.solvers.get(solver) + schema = load_json(os.path.join(os.path.dirname(__file__), "./schemas/config.json")) @property def test_cases(self): diff --git a/cornflow-dags/DAG/facility_location/schemas/config.json b/cornflow-dags/DAG/facility_location/schemas/config.json new file mode 100644 index 000000000..441d4605a --- /dev/null +++ b/cornflow-dags/DAG/facility_location/schemas/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "properties": { + "solver": { + "type": "string", + "enum": ["Pyomo", "Pyomo.cbc"], + "default": "Pyomo.cbc" + }, + "timeLimit": { + "type": "number" + } + } +} diff --git a/cornflow-dags/DAG/rostering/README.rst b/cornflow-dags/DAG/rostering/README.rst index 1669e72fa..e53d0557e 100644 --- a/cornflow-dags/DAG/rostering/README.rst +++ b/cornflow-dags/DAG/rostering/README.rst @@ -24,6 +24,8 @@ This decision is subject to: - RQ12: employees can not work during downtime. - RQ13: employee starting hour preference. - RQ14: employee max preference hours. +- RQ15: employee weekly schedule +- RQ16: fixed worktable Parameters ---------- @@ -38,6 +40,8 @@ Parameters - Employee preferences: starting and number of hours preferences for one day. - Weekly schedule: starting and ending hours for each week day. - Schedule exceptions: starting and ending hours for a specific date. +- Employee schedule: days of the week the employee can work on +- Fixed worktable: worktable fixed by the user - Parameters: @@ -47,11 +51,21 @@ Parameters - Minimum working hours: the minimum amount of hours that have to be worked each day that the employee works. - Slot length: the length of each time slot in minutes. -- Requirements: table indicating which requirements should be complied and which not +- Requirements: table indicating which requirements should be complied and which not, and if they are, if they should be applied as strict or soft constraints. - - rq09: true or false if the skills requirement has to be applied - - rq10: true or false if the employee holidays requirement has to be applied - - rq11: true or false if the store holidays requirement has to be applied - - rq12: true or false if the employee downtime requirement has to be applied - - rq13: true or false if the employee preferences requirement has to be applied - - rq14: true or false if the employee max preference hours requirement has to be applied \ No newline at end of file + - rq02: "soft", "strict" or "deactivated for the weekly hours constraint + - rq03: "soft", "strict" or "deactivated for the maximum daily hours constraint + - rq05: "soft", "strict" or "deactivated for the maximum days worked per week constraint + - rq06: "soft", "strict" or "deactivated for the minimum daily hours constraint + - rq07: "soft", "strict" or "deactivated for the minimum rest hours between shifts constraint + - rq08: "soft", "strict" or "deactivated for the constraint about needing to have a manager in the store at all times + - rq09: "soft", "strict" or "deactivated for the skills constraint + - rq10: "soft", "strict" or "deactivated for the employees' holidays constraint + - rq11: "strict" or "deactivated for the store holidays constraint + - rq12: "strict" or "deactivated for the employee downtime constraint + - rq13: "soft", "strict" or "deactivated for the employee start hour preferences constraint + - rq14: "soft", "strict" or "deactivated for the employee max preference hours constraint + - rq15: "soft", "strict" or "deactivated for the employee schedule constraint + - rq16: "soft", "strict" or "deactivated for the fixed worktable constraint + +- Penalties: table indicating for each soft constraint the penalty level when it is not respected. \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/core/const.py b/cornflow-dags/DAG/rostering/core/const.py index 81ea3f674..756c548da 100644 --- a/cornflow-dags/DAG/rostering/core/const.py +++ b/cornflow-dags/DAG/rostering/core/const.py @@ -1,11 +1,15 @@ INSTANCE_KEYS_RELATION = { ("employees", "id"): [ - ("contracts", "id_employee"), - ("skills_employees", "id_employee"), + ("contracts", "id_employee", True), + ("skills_employees", "id_employee", False), + ("employee_holidays", "id_employee", False), + ("employee_downtime", "id_employee", False), + ("employee_preferences", "id_employee", False), + ("employee_schedule", "id_employee", False), ], - ("shifts", "id"): [("contracts", "id_shift")], + ("shifts", "id"): [("contracts", "id_shift", False)], ("skills", "id"): [ - ("skills_employees", "id_skill"), - ("skill_demand", "id_skill"), + ("skills_employees", "id_skill", False), + ("skill_demand", "id_skill", False), ], } diff --git a/cornflow-dags/DAG/rostering/core/experiment.py b/cornflow-dags/DAG/rostering/core/experiment.py index dc282cafb..80111a4ad 100644 --- a/cornflow-dags/DAG/rostering/core/experiment.py +++ b/cornflow-dags/DAG/rostering/core/experiment.py @@ -43,6 +43,14 @@ def check_solution(self, *args, **kwargs) -> dict: difference_hours_worked=self.check_hours_worked(), manager_present=self.check_manager_present(), skills_demand=self.check_skills_demand(), + days_worked_per_week=self.check_days_worked_per_week(), + min_hours_worked_per_day=self.check_min_hours_worked_day(), + employee_holidays=self.check_employee_holidays(), + employee_downtime=self.check_employees_downtime(), + start_hour_preference=self.check_start_hour_preference(), + number_hours_preferences=self.check_number_hours_preference(), + employee_work_days=self.check_employee_work_days(), + fixed_worktable=self.check_fixed_worktable() ).vfilter(lambda v: len(v)) def get_objective(self) -> float: @@ -141,6 +149,143 @@ def check_skills_demand(self) -> list: else: return TupList([]) + def check_days_worked_per_week(self): + """Checks if an employee works more days than the number of days on their contract""" + max_working_slots_week = self.instance.get_max_working_days() + + return ( + self.solution.get_ts_employee() + .to_tuplist() + .vapply_col( + None, + lambda v: self.instance.get_week_from_ts( + self.instance.get_datetime_from_string(v[0]) + ), + ) + .to_dict(result_col=0, indices=[2, 1]) + .vapply(lambda v: len(v.vapply(lambda vv: vv[:10]).unique())) + .kvfilter(lambda k, v: v > max_working_slots_week[k]) + .to_tuplist() + .vapply( + lambda v: { + "week": v[0], + "id_employee": v[1], + "nb_days_worked": v[2], + "max_days_week": max_working_slots_week[v[0], v[1]], + } + ) + ) + + def check_min_hours_worked_day(self): + """Checks if an employee works less than the minimum hours""" + min_worked_ts_day = self.instance.get_min_working_slots_day() + + return ( + self.solution.get_ts_employee() + .to_tuplist() + .vapply_col(None, lambda v: v[0][:10]) + .to_dict(result_col=[0], indices=[2, 1]) + .vapply(lambda v: len(v)) + .kvfilter(lambda k, v: v < min_worked_ts_day[k]) + .to_tuplist() + .vapply( + lambda v: { + "date": v[0], + "id_employee": v[1], + "nb_hours_worked": self.instance.slot_to_hour(v[2]), + "min_hours_day": self.instance.slot_to_hour( + min_worked_ts_day[v[0], v[1]] + ), + } + ) + ) + + def check_employee_holidays(self): + """Checks that no employee works on their holidays""" + ts_employee_holidays = self.instance.get_employee_time_slots_holidays() + return ( + self.solution.get_ts_employee() + .to_tuplist() + .vfilter(lambda v: v in ts_employee_holidays) + .vapply_col(None, lambda v: v[0][:10]) + .vapply(lambda v: {"date": v[2], "id_employee": v[1]}) + ) + + def check_employees_downtime(self): + """Checks that no employee works on their downtime""" + employee_downtime = self.instance._get_employee_downtime() + + return ( + self.solution.get_ts_employee() + .to_tuplist() + .vapply_col(None, lambda v: v[0][:10]) + .unique() + .take([1, 2]) + .vfilter(lambda v: v in employee_downtime) + .vapply(lambda v: {"date": v[1], "id_employee": v[0]}) + ) + + def check_start_hour_preference(self): + """Checks that start hour preferences are respected""" + start_preferences = self.instance.get_employee_preference_start_ts() + + return ( + self.solution.get_ts_employee() + .to_tuplist() + .vapply_col(None, lambda v: v[0][:10]) + .to_dict(result_col=0, indices=[2, 1]) + .vapply(lambda v: min(v)) + .kvfilter(lambda k, v: v not in start_preferences.get(k, [v])) + .to_tuplist() + .vapply( + lambda v: {"date": v[0], "id_employee": v[1], "start_hour": v[2][11:]} + ) + ) + + def check_number_hours_preference(self): + """Checks that the preferred number of hours worked is respected""" + preference_hours_employee = self.instance.get_employee_preference_hours() + + return ( + self.solution.get_ts_employee() + .to_tuplist() + .vapply_col(None, lambda v: v[0][:10]) + .to_dict(result_col=0, indices=[2, 1]) + .vapply(lambda v: self.instance.slot_to_hour(len(v))) + .kvfilter(lambda k, v: v > preference_hours_employee.get(k, v)) + .to_tuplist() + .vapply( + lambda v: { + "date": v[0], + "id_employee": v[1], + "number_hours_worked": v[2], + } + ) + ) + + def check_employee_work_days(self) -> TupList: + """Checks if some employees are assigned to work on their days off""" + work_days = self.instance.get_employee_time_slots_rest_days().take([1, 2]) + return ( + self.solution.get_ts_employee() + .to_tuplist() + .vapply_col(0, lambda v: v[0][:10]) + .intersect(work_days) + .vapply( + lambda v: {"date": v[0], "id_employee": v[1]} + ) + ) + + def check_fixed_worktable(self) -> TupList: + """ Checks if some parts of the fixed worktable are not respected """ + ts_employee = self.solution.get_ts_employee().to_tuplist() + + return( + self.instance.get_fixed_worktable() + .vfilter(lambda v: v not in ts_employee) + .vapply(lambda v: {"time_slot": v[0], "id_employee": v[1]}) + ) + def get_one_employee_percentage(self) -> float: """Returns the percentage of time slots where only one employee is working""" ts_employee = self.solution.get_ts_employee() diff --git a/cornflow-dags/DAG/rostering/core/instance.py b/cornflow-dags/DAG/rostering/core/instance.py index d64d65fb9..296c90a1b 100644 --- a/cornflow-dags/DAG/rostering/core/instance.py +++ b/cornflow-dags/DAG/rostering/core/instance.py @@ -16,12 +16,9 @@ # Imports from internal modules from .tools import ( - get_date_from_string, - get_date_string_from_ts, - get_hour_from_date_time, + get_hour_string_from_date_time, + get_hour_string_from_hour_minute, get_one_date, - get_time_slot_string, - get_week_from_ts, ) @@ -74,6 +71,7 @@ def from_dict(cls, data: dict) -> "Instance": data_p["parameters"] = pickle.loads(pickle.dumps(data["parameters"], -1)) data_p["requirements"] = pickle.loads(pickle.dumps(data["requirements"], -1)) + data_p["penalties"] = pickle.loads(pickle.dumps(data["penalties"], -1)) if data.get("skill_demand"): data_p["skill_demand"] = { @@ -124,6 +122,21 @@ def from_dict(cls, data: dict) -> "Instance": else: data_p["employee_preferences"] = SuperDict({}) + if data.get("employee_schedule"): + data_p["employee_schedule"] = TupList( + data["employee_schedule"] + ).to_dict(result_col="week_day", indices=["id_employee", "id_contract"]) + else: + data_p["employee_schedule"] = SuperDict() + + if data.get("fixed_worktables"): + data_p["fixed_worktables"] = { + (el["id_employee"], el["date"], el["hour"]): el + for el in data["fixed_worktables"] + } + else: + data_p["fixed_worktables"] = SuperDict({}) + return cls(data_p) def to_dict(self) -> Dict: @@ -138,12 +151,14 @@ def to_dict(self) -> Dict: "employee_downtime", "store_holidays", "employee_preferences", + "fixed_worktables" ] data_p = {el: self.data[el].values_l() for el in tables} data_p["parameters"] = self.data["parameters"] data_p["requirements"] = self.data["requirements"] + data_p["penalties"] = self.data["penalties"] data_p["weekly_schedule"] = [ {"week_day": d, "starting_hour": h_ini, "ending_hour": h_end} @@ -177,15 +192,16 @@ def to_dict(self) -> Dict: dict(id_employee=id_employee, day=day, hours=hours, start=start) for (id_employee, day, hours, start) in self.data["employee_preferences"] ] + data_p["employee_schedule"] = [ + dict(id_employee=id_employee, week_day=week_day, id_contract=id_contract) + for (id_employee, id_contract), weekdays in self.data["employee_schedule"].items() + for week_day in weekdays + ] return pickle.loads(pickle.dumps(data_p, -1)) def cache_properties(self): """Caches the list of weeks, dates and time slots and its associated properties""" - # We check if the slot length is coherent - if self._get_slot_length() % 5: - print("WARNING, SLOT LENGTH MUST BE MULTIPLES OF 5") - self.weeks = self._get_weeks() self.opening_days = self._get_opening_days() self.dates = self._get_dates() @@ -194,12 +210,18 @@ def cache_properties(self): self.time_slots_properties = self._get_time_slots_properties() def check(self) -> dict: - return dict(incoherent_foreign_keys=self.check_indexes_coherence()) + return SuperDict( + incoherent_foreign_keys=self.check_indexes_coherence(), + missing_data=self.check_missing_data(), + timeslot_length=self.check_timeslot_length(), + penalties=self.check_penalties(), + **self.check_timeslot_coherence(), + ).vfilter(lambda v: len(v)) def check_indexes_coherence(self) -> list: errors = list() for pk, fk_list in INSTANCE_KEYS_RELATION.items(): - for fk_table, fk_column in fk_list: + for fk_table, fk_column, _ in fk_list: fk_values = self._get_property(fk_table, fk_column).values_tl() for fk in fk_values: if fk not in self._get_property(pk[0], pk[1]).values_tl(): @@ -214,6 +236,115 @@ def check_indexes_coherence(self) -> list: return errors + def check_missing_data(self) -> list: + errors = list() + for pk, fk_list in INSTANCE_KEYS_RELATION.items(): + for fk_table, fk_column, f_item_required in fk_list: + if not f_item_required: + continue + items = self._get_property(pk[0], pk[1]).values_tl() + fk_items = self._get_property(fk_table, fk_column).values_tl() + errors += items.vfilter(lambda v: v not in fk_items).vapply(lambda v: { + "primary_table": pk[0], + "foreign_table": fk_table, + "key": pk[1], + "value": v, + }) + + return errors + + def check_timeslot_length(self): + slot_length = self._get_slot_length() + if slot_length not in [15, 30, 60]: + return dict(timeslot_length=slot_length) + return dict() + + def check_timeslot_coherence(self) -> dict: + checks = SuperDict( + weekly_schedule_timeslots=TupList(), + schedule_exceptions_timeslots=TupList(), + shift_hours_timeslots=TupList(), + employee_preferences_timeslots=TupList(), + fixed_worktable_timeslots=TupList() + ) + slot_length = self._get_slot_length() + weekly_schedule = self._get_weekly_schedule(round_ts=False) + schedule_exceptions = self._get_schedule_exceptions(round_ts=False) + contract_start_hours = self._get_employees_contract_starting_hour( + round_ts=False + ) + contract_end_hours = self._get_employees_contract_ending_hour(round_ts=False) + employee_preferences = self._get_employee_preferences(round_ts=False) + fixed_worktable = self.get_fixed_worktable(round_ts=False) + + for key, values in weekly_schedule.items(): + checks["weekly_schedule_timeslots"] += TupList( + { + "weekday": key, + "hour": get_hour_string_from_hour_minute(hour=v[0], minute=v[1]), + } + for v in values + if v[1] % slot_length != 0 + ) + TupList( + { + "weekday": key, + "hour": get_hour_string_from_hour_minute(hour=v[2], minute=v[3]), + } + for v in values + if v[3] % slot_length != 0 + ) + + for key, values in schedule_exceptions.items(): + checks["schedule_exceptions_timeslots"] += TupList( + { + "date": key, + "hour": get_hour_string_from_hour_minute(hour=v[0], minute=v[1]), + } + for v in values + if v[1] % slot_length != 0 + ) + TupList( + { + "date": key, + "hour": get_hour_string_from_hour_minute(hour=v[2], minute=v[3]), + } + for v in values + if v[3] % slot_length != 0 + ) + + checks["shift_hours_timeslots"] += TupList( + {"week": week, "employee": employee, "hour": hour} + for (week, employee), hour in contract_start_hours.items() + if int(hour[3:]) % slot_length != 0 + ) + TupList( + {"week": week, "employee": employee, "hour": hour} + for (week, employee), hour in contract_end_hours.items() + if int(hour[3:]) % slot_length != 0 + ) + + checks["employee_preferences_timeslots"] += TupList( + {"date": date, "employee": employee, "hour": hour_string} + for (employee, date, _, hour_string) in employee_preferences + if int(hour_string[3:]) % slot_length != 0 + ) + + checks["fixed_worktable_timeslots"] = TupList( + {"date": ts[:10], "employee": employee, "hour": ts[-5:]} + for (ts, employee) in fixed_worktable + if int(ts[-2:]) % slot_length != 0 + ) + + return checks.vfilter(lambda v: len(v)) + + def check_penalties(self): + """Checks that all penalties are defined for soft constraints""" + penalties = self.get_penalties().keys_l() + return ( + self.get_requirements() + .kvfilter(lambda k, v: v == "soft" and k not in penalties) + .keys_tl() + .vapply(lambda v: {"requirement": v}) + ) + def _get_weeks(self) -> TupList: """ Returns a TupList with the starting date of each week in date time format @@ -256,8 +387,8 @@ def _get_dates_properties(self) -> SuperDict: return SuperDict( { date: { - "string": get_date_string_from_ts(date), - "week": get_week_from_ts(date), + "string": self.get_date_string_from_ts(date), + "week": self.get_week_from_ts(date), } for date in self.dates } @@ -281,27 +412,39 @@ def _get_time_slots(self) -> TupList: ts = ( TupList( - key + timedelta(hours=h_start, minutes=self._get_slot_length() * x) + key + + timedelta( + hours=h_start, minutes=m_start + self._get_slot_length() * x + ) for key, value in date_shift.items() - for (h_start, h_end) in value - for x in range(int(self._hour_to_slot(h_end - h_start))) + for (h_start, m_start, h_end, m_end) in value + for x in range( + int( + self._minutes_to_slot( + 60 * h_end + m_end - 60 * h_start - m_start + ) + ) + ) ) .vfilter( # Remove schedule exceptions. - lambda v: get_date_string_from_ts(v) + lambda v: self.get_date_string_from_ts(v) not in self._get_schedule_exceptions() ) .vfilter( - lambda v: get_date_string_from_ts(v) not in self._get_store_holidays() + lambda v: self.get_date_string_from_ts(v) + not in self._get_store_holidays() ) ) ts_schedule_exceptions = TupList( - get_date_from_string(d) - + timedelta(hours=h_start, minutes=self._get_slot_length() * x) + self.get_date_from_string(d) + + timedelta(hours=h_start, minutes=m_start + self._get_slot_length() * x) for d, value in self._get_schedule_exceptions().items() - for (h_start, h_end) in value - for x in range(int(self._hour_to_slot(h_end - h_start))) + for (h_start, m_start, h_end, m_end) in value + for x in range( + int(self._minutes_to_slot(60 * h_end + m_end - 60 * h_start - m_start)) + ) ) # In case some shift overlap we apply unique ts_total = (ts + ts_schedule_exceptions).unique2().sorted() @@ -317,10 +460,11 @@ def _get_time_slots_properties(self) -> SuperDict: return SuperDict( { ts: { - "string": get_time_slot_string(ts), - "date": get_date_string_from_ts(ts), - "week": get_week_from_ts(ts), - "hour": get_hour_from_date_time(ts), + "string": self.get_datetime_string_from_ts(ts), + "date": self.get_date_string_from_ts(ts), + "week": self.get_week_from_ts(ts), + "hour": self.get_hour_from_ts(ts), + "hour_string": get_hour_string_from_date_time(ts), } for ts in self.time_slots } @@ -342,6 +486,14 @@ def _get_hour_from_ts(self, ts): """Returns the hour of a given time slot""" return self.time_slots_properties[ts]["hour"] + def _get_hour_string_from_ts(self, ts): + """Returns the hour of a given time slot""" + return self.time_slots_properties[ts]["hour_string"] + + def _get_hour_from_hour_string(self, st): + """Returns a float corresponding to the given hour""" + return int(st[:2]) + int(st[3:]) / 60 + def _get_employees(self, prop) -> SuperDict: """Returns a SuperDict with the employee id as key and the prop as value""" return self._get_property("employees", prop) @@ -358,17 +510,107 @@ def _get_horizon(self) -> int: """Returns the value of the horizon parameter""" return self.data["parameters"]["horizon"] - def _get_weekly_schedule(self): + def _get_weekly_schedule(self, round_ts=True): """Returns a SuperDict of days and the opening hours""" - return self.data["weekly_schedule"] + return self.data["weekly_schedule"].vapply( + lambda v: (v.vapply(lambda vv: self._format_hour_tuples(vv, round_ts))) + ) - def _get_schedule_exceptions(self): + def _get_schedule_exceptions(self, round_ts=True): """Returns a SuperDict of days and the opening hours""" - return self.data["schedule_exceptions"] + return self.data["schedule_exceptions"].vapply( + lambda v: (v.vapply(lambda vv: self._format_hour_tuples(vv, round_ts))) + ) + + def round_hour_string_down_to_tuple(self, hour_string): + """ + Returns a tuple (hours, minutes) with the hour and minutes + of the provided hour_string rounded to the lower time slot + For example: for hour_string = "12:45" and the slot_length being 30, returns 12, 30 + """ + ts_length = self._get_slot_length() + return int(hour_string[:2]), ts_length * (int(hour_string[3:]) // ts_length) + + def round_hour_string_up_to_tuple(self, hour_string): + """ + Returns a tuple (hours, minutes) with the hour and minutes + of the provided hour_string rounded to the upper time slot + For example: for hour_string = "12:45" and the slot_length being 30, returns 13, 0 + """ + ts_length = self._get_slot_length() + rounded_hour = int(hour_string[:2]) + rounded_minutes = ts_length * ceil(int(hour_string[3:]) / ts_length) + if rounded_hour != 23 and rounded_minutes == 60: + return rounded_hour + 1, 0 + elif rounded_hour == 23 and rounded_minutes == 60: + return 0, 0 + return rounded_hour, rounded_minutes + + def _format_hour_tuples(self, tup, round_ts): + """ + Returns a tuple (hour, minutes, hour, minutes) with the hours and minutes of the provided + hour string, with the first hour string rounded down and the second rounded up. + For example: for tup = ("08:15", "19:45") and slot_length = 30, returns (8, 0, 20, 0) + """ + if round_ts: + rounded_hour_1 = self.round_hour_string_down_to_tuple(tup[0]) + rounded_hour_2 = self.round_hour_string_up_to_tuple(tup[1]) + else: + rounded_hour_1 = int(tup[0][:2]), int(tup[0][3:]) + rounded_hour_2 = int(tup[1][:2]), int(tup[1][3:]) + return ( + rounded_hour_1[0], + rounded_hour_1[1], + rounded_hour_2[0], + rounded_hour_2[1], + ) + + def _round_hour_string_down(self, hour_string): + """ + Returns an hour string with the hour rounded to the upper time slot. + For example: for hour_string = "12:45" and slot_length = 30, returns "12:30" + """ + hour, minutes = self.round_hour_string_down_to_tuple(hour_string) + return get_hour_string_from_hour_minute(hour, minutes) + + def _round_hour_string_up(self, hour_string): + """ + Returns an hour string with the hour rounded to the upper time slot. + For example: for hour_string = "12:45" and slot_length = 30, returns "13:00" + """ + hour, minutes = self.round_hour_string_up_to_tuple(hour_string) + return get_hour_string_from_hour_minute(hour, minutes) + + def _get_employee_schedule(self, set_default=True, model=False) -> SuperDict: + """ + Returns a SuperDict with the week and employee as key and the + worked weekdays as values. + By default, an employee can work any day. + For example: [(12, 1), (12, 3), ...] + """ + employees_contracts = self._get_employees_contracts() + employee_schedule = ( + self.data["employee_schedule"] + .to_tuplist() + .to_dict(result_col=2, indices=[0, 1]) + ) + if not set_default: + return ( + employees_contracts + .kvapply(lambda k, v: employee_schedule.get((k[1], v), None)) + .vfilter(lambda v: v) + ) + if self.get_requirement("rq15") == "strict" or (self.get_requirement("rq15") == "soft" and model): + return ( + employees_contracts + .kvapply(lambda k, v: employee_schedule.get((k[1], v), list(range(7)))) + ) + else: + return employees_contracts.vapply(lambda v: list(range(7))) def _get_start_date(self) -> datetime: """Returns the datetime object of the starting date""" - return get_date_from_string(self.data["parameters"]["starting_date"]) + return self.get_date_from_string(self.data["parameters"]["starting_date"]) def _get_end_date(self) -> datetime: """Returns the last date in the horizon""" @@ -398,6 +640,10 @@ def _hour_to_slot(self, hours) -> int: """Converts from a hours to slots""" return int(hours * 60 / self._get_slot_length()) + def _minutes_to_slot(self, minutes) -> int: + """Converts from a hours to slots""" + return int(minutes / self._get_slot_length()) + def _get_employees_contracts(self) -> SuperDict[Tuple[int, int], int]: """ Returns a SuperDict with the week and employee tuple as key @@ -405,7 +651,7 @@ def _get_employees_contracts(self) -> SuperDict[Tuple[int, int], int]: Contracts are supposed to start on Monday and end on Sunday For example: {(36, 1): 10, ...} """ - default_date = get_date_string_from_ts(self._get_end_date()) + default_date = self.get_date_string_from_ts(self._get_end_date()) contract_start = self._get_contracts("start_contract") contract_end = self._get_contracts("end_contract").vapply( @@ -496,7 +742,7 @@ def _get_employees_contract_shift(self) -> SuperDict[Tuple[int, int], int]: contract_shift = self._get_contracts("id_shift") return self._get_employees_contracts().vapply(lambda c: contract_shift[c]) - def _get_employees_contract_starting_hour(self) -> SuperDict: + def _get_employees_contract_starting_hour(self, round_ts=True) -> SuperDict: """ Returns a SuperDict with the week and employee tuple as key and the shift starting hour @@ -504,9 +750,18 @@ def _get_employees_contract_starting_hour(self) -> SuperDict: For example: {(36, 1): 7, ...} """ start = self._get_shifts("start") + + ts_length = self._get_slot_length() + if round_ts: + start = start.vapply( + lambda v: v[:3] + str(ts_length * (int(v[3:]) // ts_length)).zfill(2) + ) + return self._get_employees_contract_shift().vapply(lambda s: start[s]) - def _get_employees_contract_ending_hour(self) -> SuperDict[Tuple[int, int], float]: + def _get_employees_contract_ending_hour( + self, round_ts=True + ) -> SuperDict[Tuple[int, int], float]: """ Returns a SuperDict with the week and employee tuple as key and the shift ending hour @@ -514,6 +769,14 @@ def _get_employees_contract_ending_hour(self) -> SuperDict[Tuple[int, int], floa For example: {(36, 1): 21, ...} """ end = self._get_shifts("end") + ts_length = self._get_slot_length() + + if round_ts: + end = end.vapply( + lambda v: self._round_hour_string_up( + v[:3] + str(ts_length * ceil(int(v[3:]) / ts_length)).zfill(2) + ) + ) return self._get_employees_contract_shift().vapply(lambda s: end[s]) def _get_employee_time_slots_week(self) -> TupList: @@ -523,8 +786,12 @@ def _get_employee_time_slots_week(self) -> TupList: For example: [("2021-09-06T07:00", 36, "2021-09-06", 1), ("2021-09-06T08:00", 36, "2021-09-06", 1), ...] """ - start = self._get_employees_contract_starting_hour() - end = self._get_employees_contract_ending_hour() + start = self._get_employees_contract_starting_hour().vapply( + lambda v: self._get_hour_from_hour_string(v) + ) + end = self._get_employees_contract_ending_hour().vapply( + lambda v: self._get_hour_from_hour_string(v) + ) return TupList( (self.get_time_slot_string(ts), w, self._get_date_string_from_ts(ts), e) @@ -537,6 +804,7 @@ def _get_employee_time_slots_week(self) -> TupList: and (e, self._get_date_string_from_ts(ts)) not in self._get_employee_downtime() if self._get_date_string_from_ts(ts) not in self._get_store_holidays() + if ts.isoweekday() in self._get_employee_schedule()[w, e] ) def get_employees_time_slots_week(self) -> SuperDict: @@ -555,6 +823,68 @@ def get_employees_time_slots_day(self) -> SuperDict: """ return self._get_employee_time_slots_week().take([0, 2, 3]).to_dict(0) + def get_employee_time_slots_holidays(self) -> TupList: + """ + Returns a TupList with the combinations of employees and timeslots + in which the employees are on holidays. + For example: [("2021-09-06T07:00", 1), + ("2021-09-06T08:00", 1), ...] + """ + start = self._get_employees_contract_starting_hour().vapply( + lambda v: self._get_hour_from_hour_string(v) + ) + end = self._get_employees_contract_ending_hour().vapply( + lambda v: self._get_hour_from_hour_string(v) + ) + + return TupList( + (self.get_time_slot_string(ts), e) + for ts in self.time_slots + for (w, e) in start + if self._get_week_from_ts(ts) == w + and start[w, e] <= self._get_hour_from_ts(ts) < end[w, e] + and (e, self._get_date_string_from_ts(ts)) + in self._get_employee_holidays(model=True) + and (e, self._get_date_string_from_ts(ts)) + not in self._get_employee_downtime() + if self._get_date_string_from_ts(ts) not in self._get_store_holidays() + if ts.isoweekday() in self._get_employee_schedule()[w, e] + ) + + def get_employee_time_slots_rest_days(self) -> TupList: + """ + Returns a TupList with the combinations of employees, days and time slots + in which the employees doesn't work. + For example: [("2021-09-06T07:00", "2021-09-06", 1), + ("2021-09-06T08:00", "2021-09-06", 1), ...] + """ + start = ( + self._get_employees_contract_starting_hour() + .vapply(lambda v: self._get_hour_from_hour_string(v)) + ) + end = ( + self._get_employees_contract_ending_hour() + .vapply(lambda v: self._get_hour_from_hour_string(v)) + ) + + return TupList( + (self.get_time_slot_string(ts), self._get_date_string_from_ts(ts), e) + for ts in self.time_slots + for (w, e) in start + if self._get_week_from_ts(ts) == w + and start[w, e] <= self._get_hour_from_ts(ts) < end[w, e] + and (e, self._get_date_string_from_ts(ts)) + not in self._get_employee_holidays() + and (e, self._get_date_string_from_ts(ts)) + not in self._get_employee_downtime() + if self._get_date_string_from_ts(ts) not in self._get_store_holidays() + if ts.isoweekday() not in self._get_employee_schedule(model=True)[w, e] + ) + + @staticmethod + def get_employees_rest_days(ts_employees_rest_days): + return ts_employees_rest_days.take([1, 2]).unique2().vapply(lambda v: tuple(v)) + def get_consecutive_time_slots_employee(self) -> TupList: """ Returns a TupList with a time slot, the nex time slot in the same day @@ -731,7 +1061,7 @@ def _filter_demand(self, ts) -> float: Given a time slot (date time) it returns the demand, if exists, zero otherwise """ return self._get_property("demand", "demand").get( - (self._get_date_string_from_ts(ts), self._get_hour_from_ts(ts)), 0 + (self._get_date_string_from_ts(ts), self._get_hour_string_from_ts(ts)), 0 ) def get_demand(self) -> SuperDict: @@ -751,10 +1081,15 @@ def filter_skills_demand(self, ts, id_skill) -> int: Given a time slot (date time) and the id of a skill, returns the skill demand if it exists, zero otherwise """ return self._get_property("skill_demand", "demand").get( - (self._get_date_string_from_ts(ts), self._get_hour_from_ts(ts), id_skill), 0 + ( + self._get_date_string_from_ts(ts), + self._get_hour_string_from_ts(ts), + id_skill, + ), + 0, ) - def get_ts_demand_employees_skill(self, e_availability) -> TupList: + def get_ts_demand_employees_skill(self, e_availability) -> SuperDict: """ Returns a TupList with the combinations of: - Time slots @@ -776,13 +1111,26 @@ def get_ts_demand_employees_skill(self, e_availability) -> TupList: } ).kvapply(lambda k, v: [e for e in v if (k[0], e) in e_availability]) - def _get_employee_holidays(self) -> TupList: + @staticmethod + def get_ts_skill_demand(ts_demand_employees_skill): + """ + Returns a TupList with the combinations of skills and timeslots when those + skills are needed. + For example: [("2021-09-06T07:00", 1), ("2021-09-06T08:00", 2), ...] + """ + return ( + ts_demand_employees_skill.take([0, 1]).unique2().vapply(lambda v: tuple(v)) + ) + + def _get_employee_holidays(self, model=False) -> TupList: """ Returns a TupList with the combinations of employees and holiday days. For example: [(1, "2021-09-06"), (2, "2021-09-07"), ...] """ - if self.get_requirement("rq10"): + if self.get_requirement("rq10") == "strict" or ( + self.get_requirement("rq10") == "soft" and model + ): return TupList(self.data["employee_holidays"].keys_tl()) else: return TupList([]) @@ -832,7 +1180,7 @@ def _get_store_holidays(self) -> TupList: For example: [("2021-09-06"), ("2021-09-07"), ...] """ - if self.get_requirement("rq11"): + if self.get_requirement("rq11") != "deactivated": return TupList(self.data["store_holidays"].keys_tl()) else: return TupList([]) @@ -884,7 +1232,7 @@ def _get_employee_downtime(self) -> TupList: For example: [(1, "2021-09-06"), (2, "2021-09-07"), ...] """ - if self.get_requirement("rq12"): + if self.get_requirement("rq12") != "deactivated": return TupList(self.data["employee_downtime"].keys_tl()) else: return TupList([]) @@ -928,13 +1276,26 @@ def _get_employee_downtime_days(self) -> SuperDict: downtime_days_week = downtime_days.take([0, 1, 2]).to_dict(2) return SuperDict({k: sum(v) for k, v in downtime_days_week.items()}) - def _get_employee_preferences(self) -> TupList: + def _get_employee_preferences(self, round_ts=True) -> TupList: """ Returns a TupList with the employee preferences - For example: [(1, "2021-09-09", 5, 15), - (1, "2021-09-09", 5, 15), ...] + For example: [(1, "2021-09-09", 5, "15:00"), + (1, "2021-09-09", 5, "15:00"), ...] + """ + return TupList(self.data["employee_preferences"].keys_tl()).vapply_col( + 3, + lambda v: self._round_hour_string_up(v[3]) if round_ts else v[3], + ) + + def get_fixed_worktable(self, round_ts=True) -> TupList: + """ + Returns a TupList with the fixed schedule + For example: [("2021-09-06T08:00", 1), ("2021-09-06T09:00", 1) ...] """ - return TupList((self.data["employee_preferences"].keys_tl())) + return TupList(self.data["fixed_worktables"].keys_tl()).vapply_col( + None, + lambda v: v[1] + "T" + self._round_hour_string_down(v[2]) if round_ts else v[2], + ).take([3, 0]) def get_employee_time_slots_preferences(self) -> SuperDict: """ @@ -969,13 +1330,23 @@ def get_employee_preference_start_ts(self) -> SuperDict: (self.get_time_slot_string(ts), self._get_date_string_from_ts(ts), e) for ts in self.time_slots for e in self._get_employees("id") - if (e, self._get_date_string_from_ts(ts), self._get_hour_from_ts(ts)) + if (e, self._get_date_string_from_ts(ts), self._get_hour_string_from_ts(ts)) in preferences.take([0, 1, 3]) if (self.get_time_slot_string(ts), e) in availability ) return starts_ts.to_dict(0) + def get_employee_fixed_worktable(self) -> TupList: + """ + Returns a TupList with the employees and the timeslots they have to work on + For example: [("2021-09-06T08:00", 1), ("2021-09-06T09:00", 1) ...] + """ + availability = self.get_employees_ts_availability() + fixed_worktable = self.get_fixed_worktable() + + return fixed_worktable.vfilter(lambda v: v in availability) + def get_employee_preference_hours(self) -> SuperDict: """ Returns a SuperDict with the date and employee tuple as key @@ -992,3 +1363,21 @@ def get_requirement(self, rq): Returns the activation value of a given requirement """ return self.data["requirements"].get(rq, True) + + def get_requirements(self): + """ + Returns the activation values of the requirements + """ + return self.data["requirements"] + + def get_penalty(self, rq): + """ + Returns the penalty value of a given requirement + """ + return (self.get_requirement(rq) == "soft") * self.data["penalties"].get(rq, 1) + + def get_penalties(self): + """ + Returns the penalties values of the requirement + """ + return self.data["penalties"] diff --git a/cornflow-dags/DAG/rostering/core/solution.py b/cornflow-dags/DAG/rostering/core/solution.py index 7df549a6d..ad4f3a7af 100644 --- a/cornflow-dags/DAG/rostering/core/solution.py +++ b/cornflow-dags/DAG/rostering/core/solution.py @@ -10,9 +10,6 @@ from cornflow_client import SolutionCore from cornflow_client.core.tools import load_json -# Imports from internal modules -from .tools import get_week_from_string - class Solution(SolutionCore): schema = load_json( @@ -21,7 +18,6 @@ class Solution(SolutionCore): @classmethod def from_dict(cls, data: dict) -> "Solution": - data_p = { el: {(v["id_employee"], v["time_slot"]): v for v in data[el]} for el in ["works"] @@ -63,7 +59,11 @@ def get_hours_worked_per_week(self) -> SuperDict: """ return ( TupList( - {"id_employee": id_employee, "ts": ts, "week": get_week_from_string(ts)} + { + "id_employee": id_employee, + "ts": ts, + "week": self.get_week_from_datetime_string(ts), + } for (id_employee, ts) in self.data["works"] ) .to_dict(result_col="ts", indices=["week", "id_employee"]) diff --git a/cornflow-dags/DAG/rostering/core/tools.py b/cornflow-dags/DAG/rostering/core/tools.py index 8daffd6bc..625cb4a75 100644 --- a/cornflow-dags/DAG/rostering/core/tools.py +++ b/cornflow-dags/DAG/rostering/core/tools.py @@ -1,47 +1,16 @@ from datetime import datetime, timedelta -def get_date_from_string(string: str) -> datetime: - return datetime.strptime(string, "%Y-%m-%d") +def get_hour_string_from_date_time(ts: datetime) -> str: + """Returns the hour string for the given time slot""" + return ts.strftime("%H:%M") -def get_date_time_from_string(string: str) -> datetime: - return datetime.strptime(string, "%Y-%m-%dT%H%M") - - -def get_date_string_from_ts(ts: datetime) -> str: - """Returns the string of a given date""" - return datetime.strftime(ts, "%Y-%m-%d") - - -def get_date_string_from_ts_string(ts: str) -> str: - return ts[0:10] - - -def get_hour_from_date_time(ts: datetime) -> float: - """Returns the hours (in number) of the given time slot""" - return float(ts.hour + ts.minute / 60) - - -def get_hour_from_string(string: str) -> float: - return get_hour_from_date_time(get_date_time_from_string(string)) +def get_hour_string_from_hour_minute(hour: int, minute: int) -> str: + """Returns the hour string for the given time slot""" + return datetime.now().replace(hour=hour, minute=minute).strftime("%H:%M") def get_one_date(starting_date: datetime, weeks: int = 0, days: int = 0) -> datetime: """Returns a date from a starting date adding weeks and days""" return starting_date + timedelta(days=weeks * 7 + days) - - -def get_time_slot_string(ts: datetime) -> str: - """Returns the string of a given time slot""" - return datetime.strftime(ts, "%Y-%m-%dT%H%M") - - -def get_week_from_string(string: str) -> int: - """ "Returns the integer value of the week for the given string""" - return get_week_from_ts(get_date_time_from_string(string)) - - -def get_week_from_ts(ts: datetime) -> int: - """Returns the integer value of the week for the given time slot""" - return ts.isocalendar()[1] diff --git a/cornflow-dags/DAG/rostering/data/test_instance_1.json b/cornflow-dags/DAG/rostering/data/test_instance_1.json index 3232a1d65..adfd64353 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_1.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_1.json @@ -25,20 +25,20 @@ { "id": 1, "name": "morning", - "start": 8, - "end": 15 + "start": "08:00", + "end": "15:00" }, { "id": 2, "name": "afternoon", - "start": 13, - "end": 20 + "start": "13:00", + "end": "20:00" }, { "id": 3, "name": "full_day", - "start": 8, - "end": 20 + "start": "08:00", + "end": "20:00" } ], "contracts": [ @@ -48,8 +48,8 @@ "id_shift": 3, "start_contract": "2021-09-06", "end_contract": null, - "weekly_hours": 40, - "days_worked": 5 + "weekly_hours": 32, + "days_worked": 4 }, { "id": 12, @@ -91,347 +91,369 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 30 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 40 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 35 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 30 } ], "weekly_schedule": [ { "week_day": 1, - "starting_hour": 8, - "ending_hour": 15 + "starting_hour": "08:00", + "ending_hour": "15:00" }, { "week_day": 1, - "starting_hour": 15, - "ending_hour": 20 + "starting_hour": "15:00", + "ending_hour": "20:00" }, { "week_day": 2, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "schedule_exceptions": [ { "date": "2021-09-07", - "starting_hour": 8, - "ending_hour": 15 + "starting_hour": "08:00", + "ending_hour": "15:00" }, { "date": "2021-09-07", - "starting_hour": 15, - "ending_hour": 20 + "starting_hour": "15:00", + "ending_hour": "20:00" + } + ], + "employee_schedule": [ + { + "id_employee": 1, + "id_contract": 11, + "week_day": 1 + }, + { + "id_employee": 1, + "id_contract": 11, + "week_day": 2 + }, + { + "id_employee": 1, + "id_contract": 11, + "week_day": 3 + }, + { + "id_employee": 1, + "id_contract": 11, + "week_day": 5 } ], "parameters": { @@ -442,11 +464,33 @@ "min_resting_hours": 12 }, "requirements": { - "rq09": true, - "rq10": true, - "rq11": true, - "rq12": true, - "rq13": true, - "rq14": true + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "strict", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "soft", + "rq14": "soft", + "rq15": "soft", + "rq16": "strict" + }, + "penalties": { + "rq02": 1, + "rq03": 1, + "rq05": 1, + "rq06": 1, + "rq07": 4, + "rq08": 2, + "rq09": 2, + "rq10": 1, + "rq13": 1, + "rq14": 1, + "rq15": 1, + "rq16": 5 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_instance_2.json b/cornflow-dags/DAG/rostering/data/test_instance_2.json index 248696103..c31eeef68 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_2.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_2.json @@ -30,20 +30,20 @@ { "id": 1, "name": "morning", - "start": 8, - "end": 15 + "start": "08:00", + "end": "15:00" }, { "id": 2, "name": "afternoon", - "start": 13, - "end": 20 + "start": "13:00", + "end": "20:00" }, { "id": 3, "name": "full_day", - "start": 8, - "end": 20 + "start": "08:00", + "end": "20:00" } ], "contracts": [ @@ -105,302 +105,302 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 30 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 40 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 35 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 30 } ], @@ -413,28 +413,28 @@ "weekly_schedule": [ { "week_day": 1, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 2, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "parameters": { @@ -445,11 +445,33 @@ "min_resting_hours": 12 }, "requirements": { - "rq09": true, - "rq10": true, - "rq11": true, - "rq12": true, - "rq13": true, - "rq14": true + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "strict", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "soft", + "rq14": "soft", + "rq15": "strict", + "rq16": "strict" + }, + "penalties": { + "rq02": 1, + "rq03": 1, + "rq05": 1, + "rq06": 1, + "rq07": 4, + "rq08": 2, + "rq09": 2, + "rq10": 1, + "rq13": 1, + "rq14": 1, + "rq15": 1, + "rq16": 5 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_instance_3.json b/cornflow-dags/DAG/rostering/data/test_instance_3.json index 7633bbe6e..c87d2b1a9 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_3.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_3.json @@ -25,20 +25,20 @@ { "id": 1, "name": "morning", - "start": 8, - "end": 15 + "start": "08:00", + "end": "15:00" }, { "id": 2, "name": "afternoon", - "start": 13, - "end": 20 + "start": "13:00", + "end": "20:00" }, { "id": 3, "name": "full_day", - "start": 8, - "end": 20 + "start": "08:00", + "end": "20:00" } ], "contracts": [ @@ -91,302 +91,302 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 30 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 40 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 35 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 30 } ], @@ -413,13 +413,13 @@ "skill_demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 } @@ -427,28 +427,28 @@ "weekly_schedule": [ { "week_day": 1, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 2, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "parameters": { @@ -459,11 +459,33 @@ "min_resting_hours": 12 }, "requirements": { - "rq09": true, - "rq10": true, - "rq11": true, - "rq12": true, - "rq13": true, - "rq14": true + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "strict", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "soft", + "rq14": "soft", + "rq15": "strict", + "rq16": "strict" + }, + "penalties": { + "rq02": 1, + "rq03": 1, + "rq05": 1, + "rq06": 1, + "rq07": 4, + "rq08": 2, + "rq09": 2, + "rq10": 1, + "rq13": 1, + "rq14": 1, + "rq15": 1, + "rq16": 5 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_instance_4.json b/cornflow-dags/DAG/rostering/data/test_instance_4.json index 05ff25f6c..8ce86da33 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_4.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_4.json @@ -50,20 +50,20 @@ { "id": 1, "name": "Mañana", - "start": 6, - "end": 15 + "start": "06:00", + "end": "15:00" }, { "id": 2, "name": "Tarde", - "start": 13, - "end": 22 + "start": "13:00", + "end": "22:00" }, { "id": 3, "name": "Completo", - "start": 6, - "end": 22 + "start": "06:00", + "end": "22:00" } ], "contracts": [ @@ -152,330 +152,330 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 30 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 40 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 35 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 30 } ], "weekly_schedule": [ { "week_day": 1, - "starting_hour": 6, - "ending_hour": 22 + "starting_hour": "06:00", + "ending_hour": "22:00" }, { "week_day": 2, - "starting_hour": 6, - "ending_hour": 22 + "starting_hour": "06:00", + "ending_hour": "22:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "parameters": { @@ -486,11 +486,33 @@ "min_resting_hours": 12 }, "requirements": { - "rq09": true, - "rq10": true, - "rq11": true, - "rq12": true, - "rq13": true, - "rq14": true + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "strict", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "soft", + "rq14": "soft", + "rq15": "strict", + "rq16": "strict" + }, + "penalties": { + "rq02": 1, + "rq03": 1, + "rq05": 1, + "rq06": 1, + "rq07": 4, + "rq08": 2, + "rq09": 2, + "rq10": 1, + "rq13": 1, + "rq14": 1, + "rq15": 1, + "rq16": 5 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_instance_5.json b/cornflow-dags/DAG/rostering/data/test_instance_5.json index 957c85ec3..30f01cce0 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_5.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_5.json @@ -30,20 +30,20 @@ { "id": 1, "name": "morning", - "start": 8, - "end": 15 + "start": "08:00", + "end": "15:00" }, { "id": 2, "name": "afternoon", - "start": 13, - "end": 20 + "start": "13:00", + "end": "20:00" }, { "id": 3, "name": "full_day", - "start": 8, - "end": 20 + "start": "08:00", + "end": "20:00" } ], "contracts": [ @@ -105,302 +105,302 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 30 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 30 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 25 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 20 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 40 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 35 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 25 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 20 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 10 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 20 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 15 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 10 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 15 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 20 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 25 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 30 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 35 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 30 } ], @@ -421,28 +421,28 @@ "weekly_schedule": [ { "week_day": 1, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 2, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "parameters": { @@ -453,11 +453,33 @@ "min_resting_hours": 12 }, "requirements": { - "rq09": true, - "rq10": true, - "rq11": true, - "rq12": true, - "rq13": true, - "rq14": true + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "strict", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "soft", + "rq14": "soft", + "rq15": "strict", + "rq16": "strict" + }, + "penalties": { + "rq02": 1, + "rq03": 1, + "rq05": 1, + "rq06": 1, + "rq07": 4, + "rq08": 2, + "rq09": 2, + "rq10": 1, + "rq13": 1, + "rq14": 1, + "rq15": 1, + "rq16": 5 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_instance_6.json b/cornflow-dags/DAG/rostering/data/test_instance_6.json index 61e52dbcd..bb85137a2 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_6.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_6.json @@ -75,20 +75,20 @@ { "id": 1, "name": "Mañana", - "start": 8, - "end": 15 + "start": "08:00", + "end": "15:00" }, { "id": 2, "name": "Tarde", - "start": 13, - "end": 20 + "start": "13:00", + "end": "20:00" }, { "id": 3, "name": "Completo", - "start": 8, - "end": 20 + "start": "08:00", + "end": "20:00" } ], "contracts": [ @@ -346,22389 +346,22389 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 227 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 293 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 203 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 269 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 243 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 288 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 287 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 295 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 260 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 235 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 240 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 272 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 266 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 250 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 275 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 275 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 274 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 297 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 242 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 212 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 281 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 207 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 268 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 225 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 276 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 283 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 221 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 289 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 230 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 233 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 297 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 214 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 226 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 284 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 207 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 200 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 288 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 203 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 292 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 208 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 241 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 221 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 281 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 251 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 232 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 298 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 267 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 241 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 294 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 211 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 240 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 270 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-13", - "hour": 8, + "hour": "08:00", "demand": 247 }, { "day": "2021-09-13", - "hour": 9, + "hour": "09:00", "demand": 228 }, { "day": "2021-09-13", - "hour": 10, + "hour": "10:00", "demand": 270 }, { "day": "2021-09-13", - "hour": 11, + "hour": "11:00", "demand": 214 }, { "day": "2021-09-13", - "hour": 12, + "hour": "12:00", "demand": 292 }, { "day": "2021-09-13", - "hour": 13, + "hour": "13:00", "demand": 274 }, { "day": "2021-09-13", - "hour": 14, + "hour": "14:00", "demand": 214 }, { "day": "2021-09-13", - "hour": 15, + "hour": "15:00", "demand": 235 }, { "day": "2021-09-13", - "hour": 16, + "hour": "16:00", "demand": 244 }, { "day": "2021-09-13", - "hour": 17, + "hour": "17:00", "demand": 258 }, { "day": "2021-09-13", - "hour": 18, + "hour": "18:00", "demand": 278 }, { "day": "2021-09-13", - "hour": 19, + "hour": "19:00", "demand": 270 }, { "day": "2021-09-13", - "hour": 20, + "hour": "20:00", "demand": 224 }, { "day": "2021-09-14", - "hour": 8, + "hour": "08:00", "demand": 299 }, { "day": "2021-09-14", - "hour": 9, + "hour": "09:00", "demand": 248 }, { "day": "2021-09-14", - "hour": 10, + "hour": "10:00", "demand": 264 }, { "day": "2021-09-14", - "hour": 11, + "hour": "11:00", "demand": 240 }, { "day": "2021-09-14", - "hour": 12, + "hour": "12:00", "demand": 210 }, { "day": "2021-09-14", - "hour": 13, + "hour": "13:00", "demand": 242 }, { "day": "2021-09-14", - "hour": 14, + "hour": "14:00", "demand": 300 }, { "day": "2021-09-14", - "hour": 15, + "hour": "15:00", "demand": 293 }, { "day": "2021-09-14", - "hour": 16, + "hour": "16:00", "demand": 263 }, { "day": "2021-09-14", - "hour": 17, + "hour": "17:00", "demand": 253 }, { "day": "2021-09-14", - "hour": 18, + "hour": "18:00", "demand": 237 }, { "day": "2021-09-14", - "hour": 19, + "hour": "19:00", "demand": 279 }, { "day": "2021-09-14", - "hour": 20, + "hour": "20:00", "demand": 201 }, { "day": "2021-09-15", - "hour": 8, + "hour": "08:00", "demand": 213 }, { "day": "2021-09-15", - "hour": 9, + "hour": "09:00", "demand": 298 }, { "day": "2021-09-15", - "hour": 10, + "hour": "10:00", "demand": 268 }, { "day": "2021-09-15", - "hour": 11, + "hour": "11:00", "demand": 286 }, { "day": "2021-09-15", - "hour": 12, + "hour": "12:00", "demand": 267 }, { "day": "2021-09-15", - "hour": 13, + "hour": "13:00", "demand": 274 }, { "day": "2021-09-15", - "hour": 14, + "hour": "14:00", "demand": 250 }, { "day": "2021-09-15", - "hour": 15, + "hour": "15:00", "demand": 248 }, { "day": "2021-09-15", - "hour": 16, + "hour": "16:00", "demand": 282 }, { "day": "2021-09-15", - "hour": 17, + "hour": "17:00", "demand": 253 }, { "day": "2021-09-15", - "hour": 18, + "hour": "18:00", "demand": 227 }, { "day": "2021-09-15", - "hour": 19, + "hour": "19:00", "demand": 216 }, { "day": "2021-09-15", - "hour": 20, + "hour": "20:00", "demand": 208 }, { "day": "2021-09-16", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-16", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-17", - "hour": 8, + "hour": "08:00", "demand": 233 }, { "day": "2021-09-17", - "hour": 9, + "hour": "09:00", "demand": 248 }, { "day": "2021-09-17", - "hour": 10, + "hour": "10:00", "demand": 275 }, { "day": "2021-09-17", - "hour": 11, + "hour": "11:00", "demand": 300 }, { "day": "2021-09-17", - "hour": 12, + "hour": "12:00", "demand": 210 }, { "day": "2021-09-17", - "hour": 13, + "hour": "13:00", "demand": 268 }, { "day": "2021-09-17", - "hour": 14, + "hour": "14:00", "demand": 207 }, { "day": "2021-09-17", - "hour": 15, + "hour": "15:00", "demand": 293 }, { "day": "2021-09-17", - "hour": 16, + "hour": "16:00", "demand": 273 }, { "day": "2021-09-17", - "hour": 17, + "hour": "17:00", "demand": 202 }, { "day": "2021-09-17", - "hour": 18, + "hour": "18:00", "demand": 278 }, { "day": "2021-09-17", - "hour": 19, + "hour": "19:00", "demand": 243 }, { "day": "2021-09-17", - "hour": 20, + "hour": "20:00", "demand": 232 }, { "day": "2021-09-18", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-18", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-19", - "hour": 8, + "hour": "08:00", "demand": 257 }, { "day": "2021-09-19", - "hour": 9, + "hour": "09:00", "demand": 240 }, { "day": "2021-09-19", - "hour": 10, + "hour": "10:00", "demand": 263 }, { "day": "2021-09-19", - "hour": 11, + "hour": "11:00", "demand": 201 }, { "day": "2021-09-19", - "hour": 12, + "hour": "12:00", "demand": 285 }, { "day": "2021-09-19", - "hour": 13, + "hour": "13:00", "demand": 239 }, { "day": "2021-09-19", - "hour": 14, + "hour": "14:00", "demand": 240 }, { "day": "2021-09-19", - "hour": 15, + "hour": "15:00", "demand": 200 }, { "day": "2021-09-19", - "hour": 16, + "hour": "16:00", "demand": 239 }, { "day": "2021-09-19", - "hour": 17, + "hour": "17:00", "demand": 243 }, { "day": "2021-09-19", - "hour": 18, + "hour": "18:00", "demand": 285 }, { "day": "2021-09-19", - "hour": 19, + "hour": "19:00", "demand": 240 }, { "day": "2021-09-19", - "hour": 20, + "hour": "20:00", "demand": 227 }, { "day": "2021-09-20", - "hour": 8, + "hour": "08:00", "demand": 279 }, { "day": "2021-09-20", - "hour": 9, + "hour": "09:00", "demand": 280 }, { "day": "2021-09-20", - "hour": 10, + "hour": "10:00", "demand": 229 }, { "day": "2021-09-20", - "hour": 11, + "hour": "11:00", "demand": 298 }, { "day": "2021-09-20", - "hour": 12, + "hour": "12:00", "demand": 261 }, { "day": "2021-09-20", - "hour": 13, + "hour": "13:00", "demand": 258 }, { "day": "2021-09-20", - "hour": 14, + "hour": "14:00", "demand": 300 }, { "day": "2021-09-20", - "hour": 15, + "hour": "15:00", "demand": 267 }, { "day": "2021-09-20", - "hour": 16, + "hour": "16:00", "demand": 286 }, { "day": "2021-09-20", - "hour": 17, + "hour": "17:00", "demand": 289 }, { "day": "2021-09-20", - "hour": 18, + "hour": "18:00", "demand": 265 }, { "day": "2021-09-20", - "hour": 19, + "hour": "19:00", "demand": 274 }, { "day": "2021-09-20", - "hour": 20, + "hour": "20:00", "demand": 260 }, { "day": "2021-09-21", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-21", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-22", - "hour": 8, + "hour": "08:00", "demand": 256 }, { "day": "2021-09-22", - "hour": 9, + "hour": "09:00", "demand": 270 }, { "day": "2021-09-22", - "hour": 10, + "hour": "10:00", "demand": 209 }, { "day": "2021-09-22", - "hour": 11, + "hour": "11:00", "demand": 219 }, { "day": "2021-09-22", - "hour": 12, + "hour": "12:00", "demand": 229 }, { "day": "2021-09-22", - "hour": 13, + "hour": "13:00", "demand": 234 }, { "day": "2021-09-22", - "hour": 14, + "hour": "14:00", "demand": 269 }, { "day": "2021-09-22", - "hour": 15, + "hour": "15:00", "demand": 252 }, { "day": "2021-09-22", - "hour": 16, + "hour": "16:00", "demand": 256 }, { "day": "2021-09-22", - "hour": 17, + "hour": "17:00", "demand": 201 }, { "day": "2021-09-22", - "hour": 18, + "hour": "18:00", "demand": 211 }, { "day": "2021-09-22", - "hour": 19, + "hour": "19:00", "demand": 269 }, { "day": "2021-09-22", - "hour": 20, + "hour": "20:00", "demand": 235 }, { "day": "2021-09-23", - "hour": 8, + "hour": "08:00", "demand": 243 }, { "day": "2021-09-23", - "hour": 9, + "hour": "09:00", "demand": 253 }, { "day": "2021-09-23", - "hour": 10, + "hour": "10:00", "demand": 263 }, { "day": "2021-09-23", - "hour": 11, + "hour": "11:00", "demand": 296 }, { "day": "2021-09-23", - "hour": 12, + "hour": "12:00", "demand": 258 }, { "day": "2021-09-23", - "hour": 13, + "hour": "13:00", "demand": 256 }, { "day": "2021-09-23", - "hour": 14, + "hour": "14:00", "demand": 279 }, { "day": "2021-09-23", - "hour": 15, + "hour": "15:00", "demand": 238 }, { "day": "2021-09-23", - "hour": 16, + "hour": "16:00", "demand": 222 }, { "day": "2021-09-23", - "hour": 17, + "hour": "17:00", "demand": 264 }, { "day": "2021-09-23", - "hour": 18, + "hour": "18:00", "demand": 272 }, { "day": "2021-09-23", - "hour": 19, + "hour": "19:00", "demand": 273 }, { "day": "2021-09-23", - "hour": 20, + "hour": "20:00", "demand": 202 }, { "day": "2021-09-24", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-24", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-25", - "hour": 8, + "hour": "08:00", "demand": 285 }, { "day": "2021-09-25", - "hour": 9, + "hour": "09:00", "demand": 203 }, { "day": "2021-09-25", - "hour": 10, + "hour": "10:00", "demand": 258 }, { "day": "2021-09-25", - "hour": 11, + "hour": "11:00", "demand": 258 }, { "day": "2021-09-25", - "hour": 12, + "hour": "12:00", "demand": 283 }, { "day": "2021-09-25", - "hour": 13, + "hour": "13:00", "demand": 297 }, { "day": "2021-09-25", - "hour": 14, + "hour": "14:00", "demand": 232 }, { "day": "2021-09-25", - "hour": 15, + "hour": "15:00", "demand": 211 }, { "day": "2021-09-25", - "hour": 16, + "hour": "16:00", "demand": 206 }, { "day": "2021-09-25", - "hour": 17, + "hour": "17:00", "demand": 258 }, { "day": "2021-09-25", - "hour": 18, + "hour": "18:00", "demand": 228 }, { "day": "2021-09-25", - "hour": 19, + "hour": "19:00", "demand": 222 }, { "day": "2021-09-25", - "hour": 20, + "hour": "20:00", "demand": 263 }, { "day": "2021-09-26", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-26", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-27", - "hour": 8, + "hour": "08:00", "demand": 298 }, { "day": "2021-09-27", - "hour": 9, + "hour": "09:00", "demand": 277 }, { "day": "2021-09-27", - "hour": 10, + "hour": "10:00", "demand": 257 }, { "day": "2021-09-27", - "hour": 11, + "hour": "11:00", "demand": 210 }, { "day": "2021-09-27", - "hour": 12, + "hour": "12:00", "demand": 218 }, { "day": "2021-09-27", - "hour": 13, + "hour": "13:00", "demand": 254 }, { "day": "2021-09-27", - "hour": 14, + "hour": "14:00", "demand": 286 }, { "day": "2021-09-27", - "hour": 15, + "hour": "15:00", "demand": 265 }, { "day": "2021-09-27", - "hour": 16, + "hour": "16:00", "demand": 296 }, { "day": "2021-09-27", - "hour": 17, + "hour": "17:00", "demand": 279 }, { "day": "2021-09-27", - "hour": 18, + "hour": "18:00", "demand": 242 }, { "day": "2021-09-27", - "hour": 19, + "hour": "19:00", "demand": 254 }, { "day": "2021-09-27", - "hour": 20, + "hour": "20:00", "demand": 295 }, { "day": "2021-09-28", - "hour": 8, + "hour": "08:00", "demand": 233 }, { "day": "2021-09-28", - "hour": 9, + "hour": "09:00", "demand": 247 }, { "day": "2021-09-28", - "hour": 10, + "hour": "10:00", "demand": 275 }, { "day": "2021-09-28", - "hour": 11, + "hour": "11:00", "demand": 251 }, { "day": "2021-09-28", - "hour": 12, + "hour": "12:00", "demand": 288 }, { "day": "2021-09-28", - "hour": 13, + "hour": "13:00", "demand": 219 }, { "day": "2021-09-28", - "hour": 14, + "hour": "14:00", "demand": 252 }, { "day": "2021-09-28", - "hour": 15, + "hour": "15:00", "demand": 296 }, { "day": "2021-09-28", - "hour": 16, + "hour": "16:00", "demand": 260 }, { "day": "2021-09-28", - "hour": 17, + "hour": "17:00", "demand": 238 }, { "day": "2021-09-28", - "hour": 18, + "hour": "18:00", "demand": 266 }, { "day": "2021-09-28", - "hour": 19, + "hour": "19:00", "demand": 247 }, { "day": "2021-09-28", - "hour": 20, + "hour": "20:00", "demand": 290 }, { "day": "2021-09-29", - "hour": 8, + "hour": "08:00", "demand": 258 }, { "day": "2021-09-29", - "hour": 9, + "hour": "09:00", "demand": 273 }, { "day": "2021-09-29", - "hour": 10, + "hour": "10:00", "demand": 242 }, { "day": "2021-09-29", - "hour": 11, + "hour": "11:00", "demand": 241 }, { "day": "2021-09-29", - "hour": 12, + "hour": "12:00", "demand": 220 }, { "day": "2021-09-29", - "hour": 13, + "hour": "13:00", "demand": 235 }, { "day": "2021-09-29", - "hour": 14, + "hour": "14:00", "demand": 237 }, { "day": "2021-09-29", - "hour": 15, + "hour": "15:00", "demand": 238 }, { "day": "2021-09-29", - "hour": 16, + "hour": "16:00", "demand": 268 }, { "day": "2021-09-29", - "hour": 17, + "hour": "17:00", "demand": 273 }, { "day": "2021-09-29", - "hour": 18, + "hour": "18:00", "demand": 265 }, { "day": "2021-09-29", - "hour": 19, + "hour": "19:00", "demand": 270 }, { "day": "2021-09-29", - "hour": 20, + "hour": "20:00", "demand": 297 }, { "day": "2021-09-30", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-30", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-10-01", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-10-02", - "hour": 8, + "hour": "08:00", "demand": 298 }, { "day": "2021-10-02", - "hour": 9, + "hour": "09:00", "demand": 220 }, { "day": "2021-10-02", - "hour": 10, + "hour": "10:00", "demand": 259 }, { "day": "2021-10-02", - "hour": 11, + "hour": "11:00", "demand": 221 }, { "day": "2021-10-02", - "hour": 12, + "hour": "12:00", "demand": 277 }, { "day": "2021-10-02", - "hour": 13, + "hour": "13:00", "demand": 231 }, { "day": "2021-10-02", - "hour": 14, + "hour": "14:00", "demand": 269 }, { "day": "2021-10-02", - "hour": 15, + "hour": "15:00", "demand": 297 }, { "day": "2021-10-02", - "hour": 16, + "hour": "16:00", "demand": 268 }, { "day": "2021-10-02", - "hour": 17, + "hour": "17:00", "demand": 244 }, { "day": "2021-10-02", - "hour": 18, + "hour": "18:00", "demand": 243 }, { "day": "2021-10-02", - "hour": 19, + "hour": "19:00", "demand": 229 }, { "day": "2021-10-02", - "hour": 20, + "hour": "20:00", "demand": 279 }, { "day": "2021-10-03", - "hour": 8, + "hour": "08:00", "demand": 215 }, { "day": "2021-10-03", - "hour": 9, + "hour": "09:00", "demand": 293 }, { "day": "2021-10-03", - "hour": 10, + "hour": "10:00", "demand": 281 }, { "day": "2021-10-03", - "hour": 11, + "hour": "11:00", "demand": 266 }, { "day": "2021-10-03", - "hour": 12, + "hour": "12:00", "demand": 282 }, { "day": "2021-10-03", - "hour": 13, + "hour": "13:00", "demand": 299 }, { "day": "2021-10-03", - "hour": 14, + "hour": "14:00", "demand": 226 }, { "day": "2021-10-03", - "hour": 15, + "hour": "15:00", "demand": 282 }, { "day": "2021-10-03", - "hour": 16, + "hour": "16:00", "demand": 212 }, { "day": "2021-10-03", - "hour": 17, + "hour": "17:00", "demand": 246 }, { "day": "2021-10-03", - "hour": 18, + "hour": "18:00", "demand": 274 }, { "day": "2021-10-03", - "hour": 19, + "hour": "19:00", "demand": 290 }, { "day": "2021-10-03", - "hour": 20, + "hour": "20:00", "demand": 236 }, { "day": "2021-10-04", - "hour": 8, + "hour": "08:00", "demand": 266 }, { "day": "2021-10-04", - "hour": 9, + "hour": "09:00", "demand": 225 }, { "day": "2021-10-04", - "hour": 10, + "hour": "10:00", "demand": 289 }, { "day": "2021-10-04", - "hour": 11, + "hour": "11:00", "demand": 236 }, { "day": "2021-10-04", - "hour": 12, + "hour": "12:00", "demand": 230 }, { "day": "2021-10-04", - "hour": 13, + "hour": "13:00", "demand": 207 }, { "day": "2021-10-04", - "hour": 14, + "hour": "14:00", "demand": 249 }, { "day": "2021-10-04", - "hour": 15, + "hour": "15:00", "demand": 222 }, { "day": "2021-10-04", - "hour": 16, + "hour": "16:00", "demand": 265 }, { "day": "2021-10-04", - "hour": 17, + "hour": "17:00", "demand": 277 }, { "day": "2021-10-04", - "hour": 18, + "hour": "18:00", "demand": 210 }, { "day": "2021-10-04", - "hour": 19, + "hour": "19:00", "demand": 249 }, { "day": "2021-10-04", - "hour": 20, + "hour": "20:00", "demand": 224 }, { "day": "2021-10-05", - "hour": 8, + "hour": "08:00", "demand": 267 }, { "day": "2021-10-05", - "hour": 9, + "hour": "09:00", "demand": 291 }, { "day": "2021-10-05", - "hour": 10, + "hour": "10:00", "demand": 204 }, { "day": "2021-10-05", - "hour": 11, + "hour": "11:00", "demand": 290 }, { "day": "2021-10-05", - "hour": 12, + "hour": "12:00", "demand": 277 }, { "day": "2021-10-05", - "hour": 13, + "hour": "13:00", "demand": 291 }, { "day": "2021-10-05", - "hour": 14, + "hour": "14:00", "demand": 284 }, { "day": "2021-10-05", - "hour": 15, + "hour": "15:00", "demand": 240 }, { "day": "2021-10-05", - "hour": 16, + "hour": "16:00", "demand": 224 }, { "day": "2021-10-05", - "hour": 17, + "hour": "17:00", "demand": 263 }, { "day": "2021-10-05", - "hour": 18, + "hour": "18:00", "demand": 243 }, { "day": "2021-10-05", - "hour": 19, + "hour": "19:00", "demand": 232 }, { "day": "2021-10-05", - "hour": 20, + "hour": "20:00", "demand": 239 }, { "day": "2021-10-06", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-10-06", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-10-07", - "hour": 8, + "hour": "08:00", "demand": 274 }, { "day": "2021-10-07", - "hour": 9, + "hour": "09:00", "demand": 243 }, { "day": "2021-10-07", - "hour": 10, + "hour": "10:00", "demand": 207 }, { "day": "2021-10-07", - "hour": 11, + "hour": "11:00", "demand": 270 }, { "day": "2021-10-07", - "hour": 12, + "hour": "12:00", "demand": 290 }, { "day": "2021-10-07", - "hour": 13, + "hour": "13:00", "demand": 243 }, { "day": "2021-10-07", - "hour": 14, + "hour": "14:00", "demand": 216 }, { "day": "2021-10-07", - "hour": 15, + "hour": "15:00", "demand": 248 }, { "day": "2021-10-07", - "hour": 16, + "hour": "16:00", "demand": 280 }, { "day": "2021-10-07", - "hour": 17, + "hour": "17:00", "demand": 217 }, { "day": "2021-10-07", - "hour": 18, + "hour": "18:00", "demand": 283 }, { "day": "2021-10-07", - "hour": 19, + "hour": "19:00", "demand": 285 }, { "day": "2021-10-07", - "hour": 20, + "hour": "20:00", "demand": 243 }, { "day": "2021-10-08", - "hour": 8, + "hour": "08:00", "demand": 207 }, { "day": "2021-10-08", - "hour": 9, + "hour": "09:00", "demand": 224 }, { "day": "2021-10-08", - "hour": 10, + "hour": "10:00", "demand": 290 }, { "day": "2021-10-08", - "hour": 11, + "hour": "11:00", "demand": 212 }, { "day": "2021-10-08", - "hour": 12, + "hour": "12:00", "demand": 300 }, { "day": "2021-10-08", - "hour": 13, + "hour": "13:00", "demand": 209 }, { "day": "2021-10-08", - "hour": 14, + "hour": "14:00", "demand": 258 }, { "day": "2021-10-08", - "hour": 15, + "hour": "15:00", "demand": 227 }, { "day": "2021-10-08", - "hour": 16, + "hour": "16:00", "demand": 245 }, { "day": "2021-10-08", - "hour": 17, + "hour": "17:00", "demand": 246 }, { "day": "2021-10-08", - "hour": 18, + "hour": "18:00", "demand": 250 }, { "day": "2021-10-08", - "hour": 19, + "hour": "19:00", "demand": 250 }, { "day": "2021-10-08", - "hour": 20, + "hour": "20:00", "demand": 246 }, { "day": "2021-10-09", - "hour": 8, + "hour": "08:00", "demand": 236 }, { "day": "2021-10-09", - "hour": 9, + "hour": "09:00", "demand": 223 }, { "day": "2021-10-09", - "hour": 10, + "hour": "10:00", "demand": 219 }, { "day": "2021-10-09", - "hour": 11, + "hour": "11:00", "demand": 293 }, { "day": "2021-10-09", - "hour": 12, + "hour": "12:00", "demand": 243 }, { "day": "2021-10-09", - "hour": 13, + "hour": "13:00", "demand": 290 }, { "day": "2021-10-09", - "hour": 14, + "hour": "14:00", "demand": 215 }, { "day": "2021-10-09", - "hour": 15, + "hour": "15:00", "demand": 202 }, { "day": "2021-10-09", - "hour": 16, + "hour": "16:00", "demand": 234 }, { "day": "2021-10-09", - "hour": 17, + "hour": "17:00", "demand": 291 }, { "day": "2021-10-09", - "hour": 18, + "hour": "18:00", "demand": 279 }, { "day": "2021-10-09", - "hour": 19, + "hour": "19:00", "demand": 220 }, { "day": "2021-10-09", - "hour": 20, + "hour": "20:00", "demand": 240 }, { "day": "2021-10-10", - "hour": 8, + "hour": "08:00", "demand": 233 }, { "day": "2021-10-10", - "hour": 9, + "hour": "09:00", "demand": 293 }, { "day": "2021-10-10", - "hour": 10, + "hour": "10:00", "demand": 272 }, { "day": "2021-10-10", - "hour": 11, + "hour": "11:00", "demand": 300 }, { "day": "2021-10-10", - "hour": 12, + "hour": "12:00", "demand": 247 }, { "day": "2021-10-10", - "hour": 13, + "hour": "13:00", "demand": 280 }, { "day": "2021-10-10", - "hour": 14, + "hour": "14:00", "demand": 220 }, { "day": "2021-10-10", - "hour": 15, + "hour": "15:00", "demand": 247 }, { "day": "2021-10-10", - "hour": 16, + "hour": "16:00", "demand": 227 }, { "day": "2021-10-10", - "hour": 17, + "hour": "17:00", "demand": 216 }, { "day": "2021-10-10", - "hour": 18, + "hour": "18:00", "demand": 218 }, { "day": "2021-10-10", - "hour": 19, + "hour": "19:00", "demand": 257 }, { "day": "2021-10-10", - "hour": 20, + "hour": "20:00", "demand": 224 }, { "day": "2021-10-11", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-10-11", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-10-12", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-10-13", - "hour": 8, + "hour": "08:00", "demand": 233 }, { "day": "2021-10-13", - "hour": 9, + "hour": "09:00", "demand": 248 }, { "day": "2021-10-13", - "hour": 10, + "hour": "10:00", "demand": 278 }, { "day": "2021-10-13", - "hour": 11, + "hour": "11:00", "demand": 275 }, { "day": "2021-10-13", - "hour": 12, + "hour": "12:00", "demand": 294 }, { "day": "2021-10-13", - "hour": 13, + "hour": "13:00", "demand": 258 }, { "day": "2021-10-13", - "hour": 14, + "hour": "14:00", "demand": 233 }, { "day": "2021-10-13", - "hour": 15, + "hour": "15:00", "demand": 228 }, { "day": "2021-10-13", - "hour": 16, + "hour": "16:00", "demand": 262 }, { "day": "2021-10-13", - "hour": 17, + "hour": "17:00", "demand": 251 }, { "day": "2021-10-13", - "hour": 18, + "hour": "18:00", "demand": 252 }, { "day": "2021-10-13", - "hour": 19, + "hour": "19:00", "demand": 204 }, { "day": "2021-10-13", - "hour": 20, + "hour": "20:00", "demand": 233 }, { "day": "2021-10-14", - "hour": 8, + "hour": "08:00", "demand": 255 }, { "day": "2021-10-14", - "hour": 9, + "hour": "09:00", "demand": 267 }, { "day": "2021-10-14", - "hour": 10, + "hour": "10:00", "demand": 225 }, { "day": "2021-10-14", - "hour": 11, + "hour": "11:00", "demand": 208 }, { "day": "2021-10-14", - "hour": 12, + "hour": "12:00", "demand": 244 }, { "day": "2021-10-14", - "hour": 13, + "hour": "13:00", "demand": 208 }, { "day": "2021-10-14", - "hour": 14, + "hour": "14:00", "demand": 207 }, { "day": "2021-10-14", - "hour": 15, + "hour": "15:00", "demand": 275 }, { "day": "2021-10-14", - "hour": 16, + "hour": "16:00", "demand": 274 }, { "day": "2021-10-14", - "hour": 17, + "hour": "17:00", "demand": 281 }, { "day": "2021-10-14", - "hour": 18, + "hour": "18:00", "demand": 219 }, { "day": "2021-10-14", - "hour": 19, + "hour": "19:00", "demand": 230 }, { "day": "2021-10-14", - "hour": 20, + "hour": "20:00", "demand": 281 }, { "day": "2021-10-15", - "hour": 8, + "hour": "08:00", "demand": 266 }, { "day": "2021-10-15", - "hour": 9, + "hour": "09:00", "demand": 222 }, { "day": "2021-10-15", - "hour": 10, + "hour": "10:00", "demand": 294 }, { "day": "2021-10-15", - "hour": 11, + "hour": "11:00", "demand": 226 }, { "day": "2021-10-15", - "hour": 12, + "hour": "12:00", "demand": 209 }, { "day": "2021-10-15", - "hour": 13, + "hour": "13:00", "demand": 256 }, { "day": "2021-10-15", - "hour": 14, + "hour": "14:00", "demand": 228 }, { "day": "2021-10-15", - "hour": 15, + "hour": "15:00", "demand": 217 }, { "day": "2021-10-15", - "hour": 16, + "hour": "16:00", "demand": 223 }, { "day": "2021-10-15", - "hour": 17, + "hour": "17:00", "demand": 228 }, { "day": "2021-10-15", - "hour": 18, + "hour": "18:00", "demand": 213 }, { "day": "2021-10-15", - "hour": 19, + "hour": "19:00", "demand": 275 }, { "day": "2021-10-15", - "hour": 20, + "hour": "20:00", "demand": 203 }, { "day": "2021-10-16", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-10-16", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-10-17", - "hour": 8, + "hour": "08:00", "demand": 223 }, { "day": "2021-10-17", - "hour": 9, + "hour": "09:00", "demand": 224 }, { "day": "2021-10-17", - "hour": 10, + "hour": "10:00", "demand": 218 }, { "day": "2021-10-17", - "hour": 11, + "hour": "11:00", "demand": 238 }, { "day": "2021-10-17", - "hour": 12, + "hour": "12:00", "demand": 253 }, { "day": "2021-10-17", - "hour": 13, + "hour": "13:00", "demand": 221 }, { "day": "2021-10-17", - "hour": 14, + "hour": "14:00", "demand": 201 }, { "day": "2021-10-17", - "hour": 15, + "hour": "15:00", "demand": 258 }, { "day": "2021-10-17", - "hour": 16, + "hour": "16:00", "demand": 210 }, { "day": "2021-10-17", - "hour": 17, + "hour": "17:00", "demand": 252 }, { "day": "2021-10-17", - "hour": 18, + "hour": "18:00", "demand": 247 }, { "day": "2021-10-17", - "hour": 19, + "hour": "19:00", "demand": 284 }, { "day": "2021-10-17", - "hour": 20, + "hour": "20:00", "demand": 228 } ], "skill_demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-13", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-13", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-14", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-14", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-14", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-14", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-14", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-14", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-15", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-15", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-15", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-15", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-15", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-15", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-17", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-17", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-18", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-18", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-18", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-18", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-18", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-18", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-19", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-19", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-19", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-19", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-19", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-19", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-20", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-20", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-20", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-20", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-20", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-20", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-21", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-21", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-21", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-21", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-21", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-21", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-22", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-22", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-22", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-22", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-22", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-22", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-23", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-23", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-23", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-23", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-23", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-23", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-24", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-24", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-24", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-24", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-24", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-24", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-25", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-25", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-25", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-25", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-25", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-25", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-26", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-26", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-26", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-26", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-26", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-26", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-27", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-27", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-27", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-27", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-27", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-27", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-28", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-28", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-28", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-28", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-28", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-28", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-29", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-29", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-29", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-29", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-29", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-29", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-30", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-30", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-30", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-30", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-30", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-30", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-01", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-01", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-01", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-01", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-01", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-01", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-02", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-02", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-02", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-02", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-02", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-02", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-03", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-03", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-03", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-03", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-03", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-03", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-04", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-04", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-04", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-04", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-04", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-04", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-05", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-05", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-05", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-05", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-05", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-05", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-07", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-07", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-07", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-07", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-13", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-13", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-13", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-14", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-14", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-14", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-14", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-14", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-14", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-15", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-15", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-15", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-15", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-15", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-15", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-16", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-10-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-10-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-10-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-10-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-10-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-10-17", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 } @@ -22736,35 +22736,35 @@ "weekly_schedule": [ { "week_day": 1, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 2, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "schedule_exceptions": [ { "date": "2021-09-07", - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "parameters": { @@ -22774,12 +22774,34 @@ "min_working_hours": 4, "min_resting_hours": 12 }, - "requirements": { - "rq09": false, - "rq10": true, - "rq11": true, - "rq12": true, - "rq13": false, - "rq14": false + "requirements": { + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "soft", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "deactivated", + "rq14": "soft", + "rq15": "strict", + "rq16": "strict" + }, + "penalties": { + "rq02": 1, + "rq03": 1, + "rq05": 1, + "rq06": 1, + "rq07": 4, + "rq08": 2, + "rq09": 2, + "rq10": 1, + "rq13": 1, + "rq14": 1, + "rq15": 1, + "rq16": 5 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_instance_7.json b/cornflow-dags/DAG/rostering/data/test_instance_7.json index 3d4874717..a71e4bccd 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_7.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_7.json @@ -75,20 +75,20 @@ { "id": 1, "name": "Mañana", - "start": 8, - "end": 15 + "start": "08:00", + "end": "15:00" }, { "id": 2, "name": "Tarde", - "start": 13, - "end": 20 + "start": "13:00", + "end": "20:00" }, { "id": 3, "name": "Completo", - "start": 8, - "end": 20 + "start": "08:00", + "end": "20:00" } ], "contracts": [ @@ -346,3734 +346,3734 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 227 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 293 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 203 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 269 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 243 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 288 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 287 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 295 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 260 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 235 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 240 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 272 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 266 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 250 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 275 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 275 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 274 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 297 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 242 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 212 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 281 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 207 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 268 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 225 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 276 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 283 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 221 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 289 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 230 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 233 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 297 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 214 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 226 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 284 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 207 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 200 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 288 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 203 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 292 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 208 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 241 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 221 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 281 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 251 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 232 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 298 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 267 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 241 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 294 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 211 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 240 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 270 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0 } ], "skill_demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 } @@ -4081,35 +4081,35 @@ "weekly_schedule": [ { "week_day": 1, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 2, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "schedule_exceptions": [ { "date": "2021-09-07", - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "employee_preferences": [ @@ -4117,13 +4117,13 @@ "id_employee": 1, "day": "2021-09-07", "hours": 6, - "start": 14 + "start": "14:00" }, { "id_employee": 2, "day": "2021-09-08", "hours": 7, - "start": 8 + "start": "08:00" } ], "parameters": { @@ -4134,11 +4134,33 @@ "min_resting_hours": 12 }, "requirements": { - "rq09": true, - "rq10": true, - "rq11": true, - "rq12": true, - "rq13": true, - "rq14": true + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "strict", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "soft", + "rq14": "soft", + "rq15": "strict", + "rq16": "strict" + }, + "penalties": { + "rq02": 1, + "rq03": 1, + "rq05": 1, + "rq06": 1, + "rq07": 4, + "rq08": 2, + "rq09": 2, + "rq10": 1, + "rq13": 1, + "rq14": 1, + "rq15": 1, + "rq16": 5 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_instance_8.json b/cornflow-dags/DAG/rostering/data/test_instance_8.json index cdfca2ddd..e5dabbd15 100644 --- a/cornflow-dags/DAG/rostering/data/test_instance_8.json +++ b/cornflow-dags/DAG/rostering/data/test_instance_8.json @@ -75,20 +75,20 @@ { "id": 1, "name": "Mañana", - "start": 8, - "end": 15 + "start": "08:00", + "end": "15:00" }, { "id": 2, "name": "Tarde", - "start": 13, - "end": 20 + "start": "13:00", + "end": "20:00" }, { "id": 3, "name": "Completo", - "start": 8, - "end": 20 + "start": "08:00", + "end": "20:00" } ], "contracts": [ @@ -346,3734 +346,3734 @@ "demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 227 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 293 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 203 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 269 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 243 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 288 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 287 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 295 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 260 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 235 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 240 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 272 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 266 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 250 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 275 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 275 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 274 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 297 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 242 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 212 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 281 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 207 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 268 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 225 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 276 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 283 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 221 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 289 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 230 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 233 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 297 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 214 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 226 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 284 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 207 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 200 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 288 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 203 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 292 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 208 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 241 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 221 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 281 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 251 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 232 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 298 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 267 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 241 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 294 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 211 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 240 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 270 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0 } ], "skill_demand": [ { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-06", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-07", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-08", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-09", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 9, + "hour": "09:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 11, + "hour": "11:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 14, + "hour": "14:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 15, + "hour": "15:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 16, + "hour": "16:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 1 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 5 }, { "day": "2021-09-10", - "hour": 20, + "hour": "20:00", "demand": 1, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-11", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 8, + "hour": "08:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 9, + "hour": "09:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 10, + "hour": "10:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 11, + "hour": "11:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 12, + "hour": "12:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 13, + "hour": "13:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 14, + "hour": "14:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 15, + "hour": "15:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 16, + "hour": "16:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 17, + "hour": "17:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 18, + "hour": "18:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 19, + "hour": "19:00", "demand": 0, "id_skill": 6 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 1 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 2 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 3 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 4 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 5 }, { "day": "2021-09-12", - "hour": 20, + "hour": "20:00", "demand": 0, "id_skill": 6 } @@ -4081,35 +4081,35 @@ "weekly_schedule": [ { "week_day": 1, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 2, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 3, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 4, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" }, { "week_day": 5, - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "schedule_exceptions": [ { "date": "2021-09-07", - "starting_hour": 8, - "ending_hour": 20 + "starting_hour": "08:00", + "ending_hour": "20:00" } ], "employee_preferences": [ @@ -4117,13 +4117,20 @@ "id_employee": 1, "day": "2021-09-07", "hours": 6, - "start": 14 + "start": "14:00" }, { "id_employee": 2, "day": "2021-09-08", "hours": 7, - "start": 8 + "start": "08:00" + } + ], + "fixed_worktables": [ + { + "id_employee": 1, + "date": "2021-09-06", + "hour": "18:00" } ], "employee_holidays": [ @@ -4154,11 +4161,33 @@ "min_resting_hours": 12 }, "requirements": { - "rq09": false, - "rq10": false, - "rq11": false, - "rq12": false, - "rq13": false, - "rq14": false + "rq02": "strict", + "rq03": "strict", + "rq05": "strict", + "rq06": "strict", + "rq07": "strict", + "rq08": "strict", + "rq09": "strict", + "rq10": "strict", + "rq11": "strict", + "rq12": "strict", + "rq13": "soft", + "rq14": "soft", + "rq15": "strict", + "rq16": "strict" + }, + "penalties": { + "rq02": 4, + "rq03": 4, + "rq05": 5, + "rq06": 4, + "rq07": 5, + "rq08": 3, + "rq09": 1, + "rq10": 5, + "rq13": 1, + "rq14": 1, + "rq15": 5, + "rq16": 2 } } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_solution_1.json b/cornflow-dags/DAG/rostering/data/test_solution_1.json index 35d442941..c405bbd2a 100644 --- a/cornflow-dags/DAG/rostering/data/test_solution_1.json +++ b/cornflow-dags/DAG/rostering/data/test_solution_1.json @@ -1,551 +1,555 @@ { "indicators": { - "fo": 136 + "objective_function": 136, + "only_one_employee_percentage": 40.0, + "mean_demand": 10.152777777777779, + "max_demand": 15.0, + "min_demand": 5.0 }, "works": [ { "id_employee": 4, - "time_slot": "2021-09-06T0800" + "time_slot": "2021-09-06T08:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T0900" + "time_slot": "2021-09-06T09:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1000" + "time_slot": "2021-09-06T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1100" + "time_slot": "2021-09-06T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1100" + "time_slot": "2021-09-06T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1100" + "time_slot": "2021-09-06T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1200" + "time_slot": "2021-09-06T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1200" + "time_slot": "2021-09-06T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1200" + "time_slot": "2021-09-06T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1500" + "time_slot": "2021-09-06T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1500" + "time_slot": "2021-09-06T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1500" + "time_slot": "2021-09-06T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1600" + "time_slot": "2021-09-06T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1600" + "time_slot": "2021-09-06T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1700" + "time_slot": "2021-09-06T17:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1800" + "time_slot": "2021-09-06T18:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1900" + "time_slot": "2021-09-06T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T0800" + "time_slot": "2021-09-07T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T0900" + "time_slot": "2021-09-07T09:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1000" + "time_slot": "2021-09-07T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1100" + "time_slot": "2021-09-07T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1100" + "time_slot": "2021-09-07T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1100" + "time_slot": "2021-09-07T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1200" + "time_slot": "2021-09-07T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1200" + "time_slot": "2021-09-07T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1200" + "time_slot": "2021-09-07T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1300" + "time_slot": "2021-09-07T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1300" + "time_slot": "2021-09-07T13:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1300" + "time_slot": "2021-09-07T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1300" + "time_slot": "2021-09-07T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1400" + "time_slot": "2021-09-07T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1400" + "time_slot": "2021-09-07T14:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1400" + "time_slot": "2021-09-07T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1400" + "time_slot": "2021-09-07T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1500" + "time_slot": "2021-09-07T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1500" + "time_slot": "2021-09-07T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1500" + "time_slot": "2021-09-07T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1600" + "time_slot": "2021-09-07T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1600" + "time_slot": "2021-09-07T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1600" + "time_slot": "2021-09-07T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1700" + "time_slot": "2021-09-07T17:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1700" + "time_slot": "2021-09-07T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1700" + "time_slot": "2021-09-07T17:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1800" + "time_slot": "2021-09-07T18:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1900" + "time_slot": "2021-09-07T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T0800" + "time_slot": "2021-09-08T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T0900" + "time_slot": "2021-09-08T09:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1000" + "time_slot": "2021-09-08T10:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1000" + "time_slot": "2021-09-08T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1100" + "time_slot": "2021-09-08T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1100" + "time_slot": "2021-09-08T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1100" + "time_slot": "2021-09-08T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1200" + "time_slot": "2021-09-08T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1200" + "time_slot": "2021-09-08T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1200" + "time_slot": "2021-09-08T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1500" + "time_slot": "2021-09-08T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1500" + "time_slot": "2021-09-08T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1500" + "time_slot": "2021-09-08T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1600" + "time_slot": "2021-09-08T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1600" + "time_slot": "2021-09-08T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1600" + "time_slot": "2021-09-08T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1700" + "time_slot": "2021-09-08T17:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1700" + "time_slot": "2021-09-08T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1700" + "time_slot": "2021-09-08T17:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1800" + "time_slot": "2021-09-08T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1800" + "time_slot": "2021-09-08T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1900" + "time_slot": "2021-09-08T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T0800" + "time_slot": "2021-09-09T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T0900" + "time_slot": "2021-09-09T09:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1000" + "time_slot": "2021-09-09T10:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1100" + "time_slot": "2021-09-09T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1200" + "time_slot": "2021-09-09T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1500" + "time_slot": "2021-09-09T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1500" + "time_slot": "2021-09-09T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1500" + "time_slot": "2021-09-09T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1600" + "time_slot": "2021-09-09T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1600" + "time_slot": "2021-09-09T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1600" + "time_slot": "2021-09-09T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1700" + "time_slot": "2021-09-09T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1700" + "time_slot": "2021-09-09T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1800" + "time_slot": "2021-09-09T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1900" + "time_slot": "2021-09-09T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T0800" + "time_slot": "2021-09-10T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T0900" + "time_slot": "2021-09-10T09:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1000" + "time_slot": "2021-09-10T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1100" + "time_slot": "2021-09-10T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1100" + "time_slot": "2021-09-10T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1100" + "time_slot": "2021-09-10T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1200" + "time_slot": "2021-09-10T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1200" + "time_slot": "2021-09-10T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1200" + "time_slot": "2021-09-10T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1300" + "time_slot": "2021-09-10T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1300" + "time_slot": "2021-09-10T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1300" + "time_slot": "2021-09-10T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1400" + "time_slot": "2021-09-10T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1400" + "time_slot": "2021-09-10T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1400" + "time_slot": "2021-09-10T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1500" + "time_slot": "2021-09-10T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1500" + "time_slot": "2021-09-10T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1500" + "time_slot": "2021-09-10T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1600" + "time_slot": "2021-09-10T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1600" + "time_slot": "2021-09-10T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1600" + "time_slot": "2021-09-10T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1700" + "time_slot": "2021-09-10T17:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1700" + "time_slot": "2021-09-10T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1700" + "time_slot": "2021-09-10T17:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1800" + "time_slot": "2021-09-10T18:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1800" + "time_slot": "2021-09-10T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1800" + "time_slot": "2021-09-10T18:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1900" + "time_slot": "2021-09-10T19:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1900" + "time_slot": "2021-09-10T19:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1900" + "time_slot": "2021-09-10T19:00" } ] } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/data/test_solution_3.json b/cornflow-dags/DAG/rostering/data/test_solution_3.json index a05bca9fa..ea8ac174b 100644 --- a/cornflow-dags/DAG/rostering/data/test_solution_3.json +++ b/cornflow-dags/DAG/rostering/data/test_solution_3.json @@ -1,551 +1,555 @@ { "indicators": { - "fo": 136 + "objective_function": 136, + "only_one_employee_percentage": 36.666666666666664, + "mean_demand": 9.965277777777779, + "max_demand": 15.0, + "min_demand": 5.0 }, "works": [ { "id_employee": 1, - "time_slot": "2021-09-06T0800" + "time_slot": "2021-09-06T08:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T0900" + "time_slot": "2021-09-06T09:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1000" + "time_slot": "2021-09-06T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1100" + "time_slot": "2021-09-06T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1100" + "time_slot": "2021-09-06T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1100" + "time_slot": "2021-09-06T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1200" + "time_slot": "2021-09-06T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1200" + "time_slot": "2021-09-06T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1200" + "time_slot": "2021-09-06T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1300" + "time_slot": "2021-09-06T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1400" + "time_slot": "2021-09-06T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-06T1500" + "time_slot": "2021-09-06T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1500" + "time_slot": "2021-09-06T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1500" + "time_slot": "2021-09-06T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1600" + "time_slot": "2021-09-06T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1600" + "time_slot": "2021-09-06T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-06T1700" + "time_slot": "2021-09-06T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1700" + "time_slot": "2021-09-06T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1800" + "time_slot": "2021-09-06T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-06T1900" + "time_slot": "2021-09-06T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T0800" + "time_slot": "2021-09-07T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T0900" + "time_slot": "2021-09-07T09:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1000" + "time_slot": "2021-09-07T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1100" + "time_slot": "2021-09-07T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1100" + "time_slot": "2021-09-07T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1100" + "time_slot": "2021-09-07T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1200" + "time_slot": "2021-09-07T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1200" + "time_slot": "2021-09-07T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1200" + "time_slot": "2021-09-07T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1300" + "time_slot": "2021-09-07T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1300" + "time_slot": "2021-09-07T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1300" + "time_slot": "2021-09-07T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1400" + "time_slot": "2021-09-07T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-07T1400" + "time_slot": "2021-09-07T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1400" + "time_slot": "2021-09-07T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1500" + "time_slot": "2021-09-07T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1500" + "time_slot": "2021-09-07T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1500" + "time_slot": "2021-09-07T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1600" + "time_slot": "2021-09-07T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1600" + "time_slot": "2021-09-07T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1600" + "time_slot": "2021-09-07T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-07T1700" + "time_slot": "2021-09-07T17:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1700" + "time_slot": "2021-09-07T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1700" + "time_slot": "2021-09-07T17:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1800" + "time_slot": "2021-09-07T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-07T1800" + "time_slot": "2021-09-07T18:00" }, { "id_employee": 3, - "time_slot": "2021-09-07T1900" + "time_slot": "2021-09-07T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T0800" + "time_slot": "2021-09-08T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T0900" + "time_slot": "2021-09-08T09:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1000" + "time_slot": "2021-09-08T10:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1000" + "time_slot": "2021-09-08T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1100" + "time_slot": "2021-09-08T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1100" + "time_slot": "2021-09-08T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1100" + "time_slot": "2021-09-08T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1200" + "time_slot": "2021-09-08T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1200" + "time_slot": "2021-09-08T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1200" + "time_slot": "2021-09-08T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1300" + "time_slot": "2021-09-08T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1400" + "time_slot": "2021-09-08T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1500" + "time_slot": "2021-09-08T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1500" + "time_slot": "2021-09-08T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1500" + "time_slot": "2021-09-08T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1600" + "time_slot": "2021-09-08T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1600" + "time_slot": "2021-09-08T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1600" + "time_slot": "2021-09-08T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1700" + "time_slot": "2021-09-08T17:00" }, { "id_employee": 3, - "time_slot": "2021-09-08T1700" + "time_slot": "2021-09-08T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1700" + "time_slot": "2021-09-08T17:00" }, { "id_employee": 1, - "time_slot": "2021-09-08T1800" + "time_slot": "2021-09-08T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1800" + "time_slot": "2021-09-08T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-08T1900" + "time_slot": "2021-09-08T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T0800" + "time_slot": "2021-09-09T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T0900" + "time_slot": "2021-09-09T09:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1000" + "time_slot": "2021-09-09T10:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1100" + "time_slot": "2021-09-09T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1200" + "time_slot": "2021-09-09T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1300" + "time_slot": "2021-09-09T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1400" + "time_slot": "2021-09-09T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1500" + "time_slot": "2021-09-09T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1500" + "time_slot": "2021-09-09T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1500" + "time_slot": "2021-09-09T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1600" + "time_slot": "2021-09-09T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-09T1600" + "time_slot": "2021-09-09T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1600" + "time_slot": "2021-09-09T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1700" + "time_slot": "2021-09-09T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-09T1700" + "time_slot": "2021-09-09T17:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1800" + "time_slot": "2021-09-09T18:00" }, { "id_employee": 1, - "time_slot": "2021-09-09T1900" + "time_slot": "2021-09-09T19:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T0800" + "time_slot": "2021-09-10T08:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T0900" + "time_slot": "2021-09-10T09:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1000" + "time_slot": "2021-09-10T10:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1100" + "time_slot": "2021-09-10T11:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1100" + "time_slot": "2021-09-10T11:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1100" + "time_slot": "2021-09-10T11:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1200" + "time_slot": "2021-09-10T12:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1200" + "time_slot": "2021-09-10T12:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1200" + "time_slot": "2021-09-10T12:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1300" + "time_slot": "2021-09-10T13:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1300" + "time_slot": "2021-09-10T13:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1300" + "time_slot": "2021-09-10T13:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1400" + "time_slot": "2021-09-10T14:00" }, { "id_employee": 2, - "time_slot": "2021-09-10T1400" + "time_slot": "2021-09-10T14:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1400" + "time_slot": "2021-09-10T14:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1500" + "time_slot": "2021-09-10T15:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1500" + "time_slot": "2021-09-10T15:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1500" + "time_slot": "2021-09-10T15:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1600" + "time_slot": "2021-09-10T16:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1600" + "time_slot": "2021-09-10T16:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1600" + "time_slot": "2021-09-10T16:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1700" + "time_slot": "2021-09-10T17:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1700" + "time_slot": "2021-09-10T17:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1700" + "time_slot": "2021-09-10T17:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1800" + "time_slot": "2021-09-10T18:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1800" + "time_slot": "2021-09-10T18:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1800" + "time_slot": "2021-09-10T18:00" }, { "id_employee": 1, - "time_slot": "2021-09-10T1900" + "time_slot": "2021-09-10T19:00" }, { "id_employee": 3, - "time_slot": "2021-09-10T1900" + "time_slot": "2021-09-10T19:00" }, { "id_employee": 4, - "time_slot": "2021-09-10T1900" + "time_slot": "2021-09-10T19:00" } ] } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/schemas/instance.json b/cornflow-dags/DAG/rostering/schemas/instance.json index 3082a8bc0..24806b4f1 100644 --- a/cornflow-dags/DAG/rostering/schemas/instance.json +++ b/cornflow-dags/DAG/rostering/schemas/instance.json @@ -46,51 +46,183 @@ }, "requirements": { "type": "object", - "description": "Boolean values to activate or deactivate different requirements of the problem", + "description": "Parameters to activate or deactivate different requirements of the problem", "show": true, "filterable": false, "sortable": true, "properties": { + "rq02": { + "type": "string", + "title": "Weekly hours", + "description": "The employees weekly hours are respected", + "enum": ["strict", "soft", "deactivated"] + }, + "rq03": { + "type": "string", + "title": "Max daily hours", + "description": "The employees maximum daily hours are respected", + "enum": ["strict", "soft", "deactivated"] + }, + "rq05": { + "type": "string", + "title": "Work days", + "description": "The employees max numbers of days worked per week are respected", + "enum": ["strict", "soft", "deactivated"] + }, + "rq06": { + "type": "string", + "title": "Min daily hours", + "description": "The employees minimum daily hours are respected", + "enum": ["strict", "soft", "deactivated"] + }, + "rq07": { + "type": "string", + "title": "Rest hours", + "description": "The employees rest hours are respected", + "enum": ["strict", "soft", "deactivated"] + }, + "rq08": { + "type": "string", + "title": "Managers", + "description": "A manager should be present into the store at all times", + "enum": ["strict", "soft", "deactivated"] + }, "rq09": { - "type": "boolean", + "type": "string", "title": "Skills", - "description": "The demand of skills has to be covered" + "description": "The demand of skills has to be covered", + "enum": ["strict", "soft", "deactivated"] }, "rq10": { - "type": "boolean", + "type": "string", "title": "Employee holidays", - "description": "The employee holidays are respected" + "description": "The employee holidays are respected", + "enum": ["strict", "soft", "deactivated"] }, "rq11": { - "type": "boolean", + "type": "string", "title": "Store holidays", - "description": "The days when a store is closed are respected" + "description": "The days when a store is closed are respected", + "enum": ["strict", "deactivated"] }, "rq12": { - "type": "boolean", + "type": "string", "title": "Employee downtime", - "description": "The employee downtime is respected" + "description": "The employee downtime is respected", + "enum": ["strict", "deactivated"] }, "rq13": { - "type": "boolean", + "type": "string", "title": "Employee starting hour preference", - "description": "The employee starting hour is respected" + "description": "The employee starting hour is respected", + "enum": ["strict", "soft", "deactivated"] }, "rq14": { - "type": "boolean", + "type": "string", "title": "Employee max hours worked", - "description": "The employee maximum hours worked preference is respected" + "description": "The employee maximum hours worked preference is respected", + "enum": ["strict", "soft", "deactivated"] + }, + "rq15": { + "type": "string", + "title": "Employee work days", + "description": "The employee work days are respected", + "enum": ["strict", "soft", "deactivated"] + }, + "rq16": { + "type": "string", + "title": "Fixed worktable", + "description": "The employees fixed work table is respected", + "enum": ["strict", "soft", "deactivated"] } }, "required": [ + "rq02", + "rq03", + "rq05", + "rq06", + "rq07", + "rq08", "rq09", "rq10", "rq11", "rq12", "rq13", - "rq14" + "rq14", + "rq15", + "rq16" ] }, + "penalties": { + "type": "object", + "description": "Parameters to activate or deactivate different requirements of the problem", + "show": true, + "filterable": false, + "sortable": true, + "properties": { + "rq02": { + "type": "integer", + "title": "Weekly hours", + "description": "The penalty when the employees weekly hours are not respected" + }, + "rq03": { + "type": "integer", + "title": "Max daily hours", + "description": "The penalty when the employees maximum daily hours are not respected" + }, + "rq05": { + "type": "integer", + "title": "Work days", + "description": "The penalty when the employees max numbers of days worked per week are not respected" + }, + "rq06": { + "type": "integer", + "title": "Min daily hours", + "description": "The penalty when the employees minimum daily hours are not respected" + }, + "rq07": { + "type": "integer", + "title": "Rest hours", + "description": "The penalty when the employees rest hours are not respected" + }, + "rq08": { + "type": "integer", + "title": "Managers", + "description": "The penalty when there is not a manager present into the store at all times" + }, + "rq09": { + "type": "integer", + "title": "Skills", + "description": "The penalty when skill demand is not covered" + }, + "rq10": { + "type": "integer", + "title": "Employee holidays", + "description": "The penalty when the employee holidays are not respected" + }, + "rq13": { + "type": "integer", + "title": "Employee starting hour preference", + "description": "The penalty when the employee starting hour is not respected" + }, + "rq14": { + "type": "integer", + "title": "Employee max hours worked", + "description": "The penalty when the employee maximum hours worked preference is not respected" + }, + "rq15": { + "type": "integer", + "title": "Employee work days", + "description": "The penalty when the employee work days are not respected" + }, + "rq16": { + "type": "integer", + "title": "Fixed worktable", + "description": "The penalty when the employees fixed work table is respected" + } + }, + "required": [] + }, "employees": { "type": "array", "description": "Table with the employee master information", @@ -162,14 +294,14 @@ "start": { "description": "The earliest hour that an employee assigned to this shift can start working.", "title": "Starting hour", - "type": "integer", + "type": "string", "sortable": true, "filterable": true }, "end": { "description": "The latest hour that an employee assigned to this shift can stop working.", "title": "Ending hour", - "type": "integer", + "type": "string", "sortable": true, "filterable": true } @@ -276,7 +408,7 @@ "hour": { "description": "The hour of the demand.", "title": "Hour", - "type": "number", + "type": "string", "sortable": true, "filterable": true }, @@ -315,14 +447,14 @@ "starting_hour": { "description": "The hour the work center opens", "title": "Opening hour", - "type": "number", + "type": "string", "sortable": true, "filterable": true }, "ending_hour": { "description": "The hour the work center closes", "title": "Closing hour", - "type": "number", + "type": "string", "sortable": true, "filterable": true } @@ -354,14 +486,14 @@ "starting_hour": { "description": "The hour the work center opens", "title": "Opening hour", - "type": "number", + "type": "string", "sortable": true, "filterable": true }, "ending_hour": { "description": "The hour the work center closes", "title": "Closing hour", - "type": "number", + "type": "string", "sortable": true, "filterable": true } @@ -449,7 +581,7 @@ "hour": { "description": "The hour of the skill demand.", "title": "Hour", - "type": "number", + "type": "string", "sortable": true, "filterable": true }, @@ -591,12 +723,79 @@ "start": { "description": "The start hour time.", "title": "Start", - "type": "integer", + "type": "string", "sortable": true, "filterable": true } } } + }, + "employee_schedule": { + "type": "array", + "title": "Employees schedules", + "description": "Table with the week days worked by the employees. If an employee isn't in the table, it will be assumed that they can work every day of the week.", + "show": true, + "filterable": true, + "sortable": true, + "items": { + "type": "object", + "properties": { + "id_employee": { + "description": "The unique identifier of the employee", + "title": "Employee id.", + "type": "integer", + "sortable": true, + "filterable": true + }, + "week_day": { + "description": "Day of the week in number. 1 is Monday", + "title": "Day of week", + "type": "number", + "$comment": "Day. Monday 1", + "sortable": true, + "filterable": true + } + }, + "required": ["id_employee", "week_day"] + } + }, + "fixed_worktables": { + "type": "array", + "description": "Table with the fixed worktables indicating for each employee in which time slots they have to work", + "show": true, + "filterable": true, + "sortable": true, + "items": { + "type": "object", + "properties": { + "id_employee": { + "type": "integer", + "description": "The unique identifier for each employee.", + "title": "Employee id.", + "sortable": true, + "filterable": true + }, + "date": { + "type": "string", + "title": "Date", + "description": "The date the employee has to work on", + "sortable": true, + "filterable": true + }, + "hour": { + "title": "Hour", + "type": "string", + "description": "The hour the employee has to work on.", + "sortable": true, + "filterable": true + } + }, + "required": [ + "id_employee", + "date", + "hour" + ] + } } }, "required": [ diff --git a/cornflow-dags/DAG/rostering/schemas/instance_checks.json b/cornflow-dags/DAG/rostering/schemas/instance_checks.json index ad4fd4aa9..9d8bf8c41 100644 --- a/cornflow-dags/DAG/rostering/schemas/instance_checks.json +++ b/cornflow-dags/DAG/rostering/schemas/instance_checks.json @@ -25,7 +25,188 @@ "required": ["primary_table", "foreign_table", "key", "value"], "additionalProperties": false } + }, + "missing_data": { + "type": "array", + "title": "Missing data", + "description": "Table containing the data about missing input data. The entry with {key}={value} from table {primary_table} does not have an associated entry in {foreign_table}.", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "primary_table": { + "type": "string" + }, + "foreign_table": { + "type": "string" + }, + "key": { + "type": "string" + }, + "value": { + "type": ["integer", "string"] + } + }, + "required": ["primary_table", "foreign_table", "key", "value"], + "additionalProperties": false + } + }, + "timeslot_length": { + "type": "object", + "title": "Timeslot length", + "is_warning": false, + "description": "Timeslot length should be 15, 30 or 60.", + "properties": { + "timeslot_length": { + "type": "number", + "title": "Timeslot length", + "description": "The timeslot length provided by the user." + } + }, + "required": [] + }, + "weekly_schedule_timeslots": { + "type": "array", + "title": "Weekly schedule timeslots", + "is_warning": true, + "description": "The hours provided in the weekly schedule table are not coherent with the timeslot length. The opening hours will be rounded to match timeslot length.", + "items": { + "type": "object", + "properties": { + "weekday": { + "type": "integer", + "title": "Weekday", + "description": "The day of the week" + }, + "hour": { + "type": "string", + "title": "Hour", + "description": "The hour of the incoherence" + } + }, + "required": ["weekday", "hour"] + } + }, + "schedule_exceptions_timeslots": { + "type": "array", + "title": "Schedule exceptions timeslots", + "is_warning": true, + "description": "The hours provided in the schedule exceptions table are not coherent with the timeslot length. The opening hours will be rounded to match timeslot length.", + "items": { + "type": "object", + "properties": { + "date": { + "type": "integer", + "title": "Date", + "description": "The date of the problem" + }, + "hour": { + "type": "string", + "title": "Hour", + "description": "The hour of the incoherence" + } + }, + "required": ["date", "hour"] + } + }, + "shift_hours_timeslots": { + "type": "array", + "title": "Contracts timeslots", + "is_warning": true, + "description": "The hours provided in the contracts table are not coherent with the timeslot length. The opening hours will be rounded to match timeslot length.", + "items": { + "type": "object", + "properties": { + "date": { + "type": "integer", + "title": "Date", + "description": "The date of the problem" + }, + "employee": { + "type": "integer", + "title": "Employee", + "description": "The employee with the problem" + }, + "hour": { + "type": "string", + "title": "Hour", + "description": "The hour of the incoherence" + } + }, + "required": ["week", "employee", "hour"] + } + }, + "employee_preferences_timeslots": { + "type": "array", + "title": "Employee preferences timeslots", + "is_warning": true, + "description": "The hours provided in the employees preferences table are not coherent with the timeslot length. The opening hours will be rounded to match timeslot length.", + "items": { + "type": "object", + "properties": { + "week": { + "type": "integer", + "title": "Week", + "description": "The week of the problem" + }, + "employee": { + "type": "integer", + "title": "Employee", + "description": "The employee with the problem" + }, + "hour": { + "type": "string", + "title": "Hour", + "description": "The hour of the incoherence" + } + }, + "required": ["week", "employee", "hour"] + } + }, + "fixed_worktable_timeslots": { + "type": "array", + "title": "Fixed worktable timeslots", + "is_warning": true, + "description": "The hours provided in the fixed worktable table are not coherent with the timeslot length. The hours will be rounded to match timeslot length.", + "items": { + "type": "object", + "properties": { + "week": { + "type": "integer", + "title": "Week", + "description": "The week of the problem" + }, + "employee": { + "type": "integer", + "title": "Employee", + "description": "The employee with the problem" + }, + "hour": { + "type": "string", + "title": "Hour", + "description": "The hour of the incoherence" + } + }, + "required": ["week", "employee", "hour"] + } + }, + "penalties": { + "type": "array", + "title": "Penalties", + "description": "Some soft constraints do not have a penalty defined. They will be assigned the default value 1.", + "is_warning": true, + "items": { + "type": "object", + "properties": { + "requirement": { + "type": "string", + "title": "Requirement", + "description": "The name of the requirement for which the penalty is not defined" + } + }, + "required": ["requirement"] + } } }, - "required": ["incoherent_foreign_keys"] + "required": [] } \ No newline at end of file diff --git a/cornflow-dags/DAG/rostering/schemas/solution_checks.json b/cornflow-dags/DAG/rostering/schemas/solution_checks.json index 949865f5e..983d65fd1 100644 --- a/cornflow-dags/DAG/rostering/schemas/solution_checks.json +++ b/cornflow-dags/DAG/rostering/schemas/solution_checks.json @@ -111,6 +111,232 @@ "required": ["timeslot", "id_skill", "number_missing"], "additionalProperties": false } + }, + "days_worked_per_week": { + "type": "array", + "title": "Max work days", + "description": "Table containing the information about weeks when an employee works more days than their work days", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "week": { + "type": "integer", + "title": "Week", + "description": "The week of the issue." + }, + "id_employee": { + "type": "integer", + "title": "Id employee", + "description": "The unique identifier of the employee." + }, + "nb_days_worked": { + "type": "integer", + "title": "Nb days worked", + "description": "The number of days worked by the employee on that week." + }, + "max_days_week": { + "type": "integer", + "title": "Max days week", + "description": "The number of work days of the employee." + } + }, + "required": ["week", "id_employee", "nb_days_worked", "max_days_week"], + "additionalProperties": false + } + }, + "min_hours_worked_per_day": { + "type": "array", + "title": "Min hours worked", + "description": "Table containing information about the days when an employee works less than the minimum work day duration.", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "date": { + "type": "string", + "title": "Date", + "description": "The date of the issue." + }, + "id_employee": { + "type": "integer", + "title": "Id employee", + "description": "The unique identifier of the employee." + }, + "nb_hours_worked": { + "type": "number", + "title": "Nb hours worked", + "description": "The number of hours worked by the employee on that day." + }, + "min_hours_day": { + "type": "integer", + "title": "Min hours day", + "description": "The minimum number of hours worked by the employee of the employee." + } + }, + "required": ["date", "id_employee", "nb_hours_worked", "min_hours_day"], + "additionalProperties": false + } + }, + "employee_holidays": { + "type": "array", + "title": "Employee holidays", + "description": "Table containing information about the dates when an employee is working while they should be on holidays.", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "date": { + "type": "string", + "title": "Date", + "description": "The date of the issue." + }, + "id_employee": { + "type": "integer", + "title": "Id employee", + "description": "The unique identifier of the employee." + } + }, + "required": ["date", "id_employee"], + "additionalProperties": false + } + }, + "employee_downtime": { + "type": "array", + "title": "Employee downtime", + "description": "Table containing information about the dates when an employee is working while they are on downtime.", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "properties": { + "date": { + "type": "string", + "title": "Date", + "description": "The date of the issue." + }, + "id_employee": { + "type": "integer", + "title": "Id employee", + "description": "The unique identifier of the employee." + } + }, + "required": ["date", "id_employee"], + "additionalProperties": false + } + } + }, + "start_hour_preference": { + "type": "array", + "title": "Preferences - start hour", + "description": "Table containing information about the employees preferences about their starting hours that are not respected.", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "date": { + "type": "string", + "title": "Date", + "description": "The date of the issue." + }, + "id_employee": { + "type": "integer", + "title": "Id employee", + "description": "The unique identifier of the employee." + }, + "start_hour": { + "type": "string", + "title": "Start hour", + "description": "The start hour of the employee." + } + } + }, + "required": ["date", "id_employee", "start_hour"], + "additionalProperties": false + } + }, + "number_hours_preferences": { + "type": "array", + "title": "Preferences - number of hours", + "description": "Table containing information about the employees preferences about their number of hours that are not respected.", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "date": { + "type": "string", + "title": "Date", + "description": "The date of the issue." + }, + "id_employee": { + "type": "integer", + "title": "Id employee", + "description": "The unique identifier of the employee." + }, + "number_hours_worked": { + "type": "number", + "title": "Number hours worked", + "description": "The number of hours worked by the employee on that day." + } + }, + "required": ["date", "id_employee", "number_hours_worked"], + "additionalProperties": false + }, + "employee_work_days": { + "type": "array", + "title": "Employee work days", + "description": "Table containing the information about dates when the employees work days are not respected.", + "is_warning": false, + "items": { + "type": "object", + "properties": { + "date": { + "type": "string", + "title": "Date", + "description": "The date of the issue." + }, + "id_employee": { + "type": "integer", + "title": "Id employee", + "description": "The unique identifier of the employee." + } + }, + "required": [ + "date", + "id_employee" + ], + "additionalProperties": false + } + }, + "fixed_worktable": { + "type": "array", + "description": "Table containing information about the parts of the fixed worktable that are not respected.", + "show": true, + "filterable": true, + "sortable": true, + "items": { + "type": "object", + "properties": { + "id_employee": { + "type": "integer", + "description": "The unique identifier for each employee.", + "title": "Employee id.", + "sortable": true, + "filterable": true + }, + "time_slot": { + "type": "string", + "title": "Time slot", + "description": "The time slot the employee should be working on", + "sortable": true, + "filterable": true + } + }, + "required": [ + "id_employee", + "time_slot" + ] + } } }, "required": [], diff --git a/cornflow-dags/DAG/rostering/solvers/mip_model.py b/cornflow-dags/DAG/rostering/solvers/mip_model.py index 989f0103f..05d90458c 100644 --- a/cornflow-dags/DAG/rostering/solvers/mip_model.py +++ b/cornflow-dags/DAG/rostering/solvers/mip_model.py @@ -36,18 +36,34 @@ def __init__(self, instance, solution=None): self.first_ts_day_employee = SuperDict() self.demand = SuperDict() self.ts_demand_employee_skill = SuperDict() + self.ts_employees_holidays = TupList() + self.ts_employees_rest_days = TupList() + self.ts_skill_demand = TupList() self.preference_starts_ts = SuperDict() self.preference_hours_employee = SuperDict() self.preference_slots = SuperDict() + self.employees_rest_days = TupList() + self.fixed_schedule = TupList() # Variables self.works = SuperDict() self.starts = SuperDict() + self.unmet_skill_demand = SuperDict() + self.unmet_preference_start = SuperDict() + self.unmet_preference_hours = SuperDict() + self.unmet_manager_constraint = SuperDict() + self.unmet_rest_hours_constraint = SuperDict() + self.unmet_employee_holidays_constraint = SuperDict() + self.unmet_min_daily_hours_constraint = SuperDict() + self.unmet_max_weekly_work_days_constraint = SuperDict() + self.unmet_max_daily_hours_constraint = SuperDict() + self.unmet_weekly_hours_constraint = SuperDict() + self.unmet_employee_schedule = SuperDict() + self.unmet_fixed_schedule_constraint = SuperDict() self.initialize() def solve(self, options: dict) -> dict: - model = pl.LpProblem("rostering", pl.LpMaximize) # Variables: self.create_variables() @@ -62,7 +78,9 @@ def solve(self, options: dict) -> dict: solver_name = "PULP_CBC_CMD" options["solver"] = f"{prefix}.{solver_name}" - solver = pl.getSolver(solver_name, **self.get_solver_config(options, lib="pulp")) + solver = pl.getSolver( + solver_name, **self.get_solver_config(options, lib="pulp") + ) # Solver and solve status = model.solve(solver) @@ -106,12 +124,18 @@ def initialize(self): self.ts_demand_employee_skill = self.instance.get_ts_demand_employees_skill( self.employee_ts_availability ) + self.ts_skill_demand = self.instance.get_ts_skill_demand( + self.ts_demand_employee_skill.keys_tl() + ) + self.ts_employees_holidays = self.instance.get_employee_time_slots_holidays() self.preference_starts_ts = self.instance.get_employee_preference_start_ts() self.preference_hours_employee = self.instance.get_employee_preference_hours() self.preference_slots = self.instance.get_employee_time_slots_preferences() + self.ts_employees_rest_days = self.instance.get_employee_time_slots_rest_days() + self.employees_rest_days = self.instance.get_employees_rest_days(self.ts_employees_rest_days) + self.fixed_schedule = self.instance.get_employee_fixed_worktable() def create_variables(self): - self.works = pl.LpVariable.dicts( "works", self.employee_ts_availability, @@ -132,11 +156,163 @@ def create_variables(self): self.starts = SuperDict(self.starts) + # RQ02 + self.unmet_weekly_hours_constraint = pl.LpVariable.dicts( + "unmet_weekly_hours_constraint", + self.max_working_ts_week.keys_l(), + lowBound=0, + cat=pl.LpContinuous, + ) + self.unmet_weekly_hours_constraint = SuperDict( + self.unmet_weekly_hours_constraint + ) + + # RQ03 + self.unmet_max_daily_hours_constraint = pl.LpVariable.dicts( + "unmet_max_daily_hours_constraint", + self.workable_ts_day.keys_l(), + lowBound=0, + cat=pl.LpContinuous, + ) + self.unmet_max_daily_hours_constraint = SuperDict( + self.unmet_max_daily_hours_constraint + ) + + # RQ05 + self.unmet_max_weekly_work_days_constraint = pl.LpVariable.dicts( + "unmet_max_weekly_work_days_constraint", + self.workable_ts_week.keys_l(), + lowBound=0, + cat=pl.LpContinuous, + ) + self.unmet_max_weekly_work_days_constraint = SuperDict( + self.unmet_max_weekly_work_days_constraint + ) + + # RQ06 + self.unmet_min_daily_hours_constraint = pl.LpVariable.dicts( + "unmet_min_daily_hour_constraint", + self.workable_ts_day.keys_l(), + lowBound=0, + cat=pl.LpContinuous, + ) + self.unmet_min_daily_hours_constraint = SuperDict( + self.unmet_min_daily_hours_constraint + ) + + # RQ07 + self.unmet_rest_hours_constraint = pl.LpVariable.dicts( + "unmet_rest_hours_constraint", + self.incompatible_ts_employee, + lowBound=0, + upBound=1, + cat=pl.LpContinuous, + ) + self.unmet_rest_hours_constraint = SuperDict(self.unmet_rest_hours_constraint) + + # RQ08 + self.unmet_manager_constraint = pl.LpVariable.dicts( + "unmet_manager_constraints", + self.ts_managers.keys_l(), + lowBound=0, + upBound=1, + cat=pl.LpContinuous, + ) + self.unmet_manager_constraint = SuperDict(self.unmet_manager_constraint) + + # RQ09 + self.unmet_skill_demand = pl.LpVariable.dicts( + "unmet_skill_demand", self.ts_skill_demand, lowBound=0, cat=pl.LpContinuous + ) + self.unmet_skill_demand = SuperDict(self.unmet_skill_demand) + + # RQ10 + self.unmet_employee_holidays_constraint = pl.LpVariable.dicts( + "unmet_employees_holidays_constraint", + self.ts_employees_holidays, + lowBound=0, + upBound=1, + cat=pl.LpContinuous, + ) + self.unmet_employee_holidays_constraint = SuperDict( + self.unmet_employee_holidays_constraint + ) + + # RQ13 + self.unmet_preference_start = pl.LpVariable.dicts( + "unmet_preference_start", + self.preference_starts_ts.keys_l(), + lowBound=0, + upBound=1, + cat=pl.LpContinuous, + ) + self.unmet_preference_start = SuperDict(self.unmet_preference_start) + + # RQ14 + self.unmet_preference_hours = pl.LpVariable.dicts( + "unmet_preference_hours", + self.preference_slots.keys_l(), + lowBound=0, + cat=pl.LpContinuous, + ) + self.unmet_preference_hours = SuperDict(self.unmet_preference_hours) + + # RQ15 + self.unmet_employee_schedule = pl.LpVariable.dicts( + "unmet_employee_schedule", + self.employees_rest_days, + lowBound=0, + upBound=1, + cat=pl.LpContinuous + ) + self.unmet_employee_schedule = SuperDict(self.unmet_employee_schedule) + + # RQ16 + self.unmet_fixed_schedule_constraint = pl.LpVariable.dicts( + "unmet_fixed_schedule_constraint", + self.fixed_schedule, + lowBound=0, + upBound=1, + cat=pl.LpContinuous + ) + self.unmet_fixed_schedule_constraint = SuperDict(self.unmet_fixed_schedule_constraint) + def create_constraints(self, model): # RQ00: objective function - minimize working hours + big_m = ( + sum( + len(self.ts_employees) * max(self.demand.values()) for _ in self.ts_open + ) + / 10 + ) model += pl.lpSum( pl.lpSum(self.works[ts, e] for e in self.ts_employees[ts]) * self.demand[ts] for ts in self.ts_open + ) - big_m * ( + self.instance.get_penalty("rq02") + * pl.lpSum(self.unmet_weekly_hours_constraint.values()) + + self.instance.get_penalty("rq03") + * pl.lpSum(self.unmet_max_daily_hours_constraint.values()) + + self.instance.get_penalty("rq05") + * pl.lpSum(self.unmet_max_weekly_work_days_constraint.values()) + + self.instance.get_penalty("rq06") + * pl.lpSum(self.unmet_min_daily_hours_constraint.values()) + + self.instance.get_penalty("rq07") + * pl.lpSum(self.unmet_rest_hours_constraint.values()) + + self.instance.get_penalty("rq08") + * pl.lpSum(self.unmet_manager_constraint.values()) + + self.instance.get_penalty("rq09") + * pl.lpSum(self.unmet_skill_demand.values()) + + self.instance.get_penalty("rq10") + * pl.lpSum(self.unmet_employee_holidays_constraint.values()) + + self.instance.get_penalty("rq13") + * pl.lpSum(self.unmet_preference_start.values()) + + self.instance.get_penalty("rq14") + * pl.lpSum(self.unmet_preference_hours.values()) + + self.instance.get_penalty("rq15") + * pl.lpSum(self.unmet_employee_schedule.values()) + + self.instance.get_penalty("rq16") + * pl.lpSum(self.unmet_fixed_schedule_constraint.values()) ) # RQ01: at least one employee at all times @@ -144,21 +320,27 @@ def create_constraints(self, model): model += pl.lpSum(self.works[ts, e] for e in _employees) >= 1 # RQ02: employees work their weekly hours - for (w, e), max_slots in self.max_working_ts_week.items(): - model += ( - pl.lpSum(self.works[ts, e] for ts in self.workable_ts_week[w, e]) - == max_slots - ) + if self.instance.get_requirement("rq02") != "deactivated": + for (w, e), max_slots in self.max_working_ts_week.items(): + model += ( + pl.lpSum(self.works[ts, e] for ts in self.workable_ts_week[w, e]) + - (self.instance.get_requirement("rq02") == "soft") + * self.unmet_weekly_hours_constraint[w, e] + == max_slots + ) # RQ03: employees can not exceed their daily hours - for (d, e), slots in self.workable_ts_day.items(): - model += ( - pl.lpSum(self.works[ts, e] for ts in slots) - <= self.max_working_ts_day[d, e] - ) + if self.instance.get_requirement("rq03") != "deactivated": + for (d, e), slots in self.workable_ts_day.items(): + model += ( + pl.lpSum(self.works[ts, e] for ts in slots) + - (self.instance.get_requirement("rq03") == "soft") + * self.unmet_max_daily_hours_constraint[d, e] + <= self.max_working_ts_day[d, e] + ) # RQ04A: starts if does not work in one ts but in the next it does - for (ts, ts2, e) in self.ts_ts_employee: + for ts, ts2, e in self.ts_ts_employee: model += self.works[ts, e] >= self.works[ts2, e] - self.starts[ts2, e] # RQ04B: starts on first time slot @@ -170,48 +352,103 @@ def create_constraints(self, model): model += pl.lpSum(self.starts[ts, e] for ts in slots) <= 1 # RQ05: max days worked per week - for (w, e), slots in self.workable_ts_week.items(): - model += ( - pl.lpSum(self.starts[ts, e] for ts in slots) - <= self.max_working_days[w, e] - ) + if self.instance.get_requirement("rq05") != "deactivated": + for (w, e), slots in self.workable_ts_week.items(): + model += ( + pl.lpSum(self.starts[ts, e] for ts in slots) + - (self.instance.get_requirement("rq05") == "soft") + * self.unmet_max_weekly_work_days_constraint[w, e] + <= self.max_working_days[w, e] + ) # RQ06: employees at least work the minimum hours - for (d, e), slots in self.workable_ts_day.items(): - model += pl.lpSum( - self.works[ts, e] for ts in slots - ) >= self.min_working_ts_day[d, e] * pl.lpSum( - self.starts[ts, e] for ts in slots - ) + if self.instance.get_requirement("rq06") != "deactivated": + for (d, e), slots in self.workable_ts_day.items(): + model += pl.lpSum(self.works[ts, e] for ts in slots) + ( + self.instance.get_requirement("rq06") == "soft" + ) * self.unmet_min_daily_hours_constraint[ + d, e + ] >= self.min_working_ts_day[ + d, e + ] * pl.lpSum( + self.starts[ts, e] for ts in slots + ) # RQ07: employees at least have to rest an amount of hours between working days. - for (ts, ts2, e) in self.incompatible_ts_employee: - model += self.works[ts, e] + self.works[ts2, e] <= 1 + if self.instance.get_requirement("rq07") != "deactivated": + for ts, ts2, e in self.incompatible_ts_employee: + model += ( + self.works[ts, e] + + self.works[ts2, e] + - (self.instance.get_requirement("rq07") == "soft") + * self.unmet_rest_hours_constraint[ts, ts2, e] + <= 1 + ) # RQ08: a manager has to be working at all times - for ts, _employees in self.ts_managers.items(): - model += pl.lpSum(self.works[ts, e] for e in _employees) >= 1 + if self.instance.get_requirement("rq08") != "deactivated": + for ts, _employees in self.ts_managers.items(): + model += ( + pl.lpSum(self.works[ts, e] for e in _employees) + + (self.instance.get_requirement("rq08") == "soft") + * self.unmet_manager_constraint[ts] + >= 1 + ) # RQ09: The demand for each skill is covered - if self.instance.get_requirement("rq09"): + if self.instance.get_requirement("rq09") != "deactivated": for ( ts, id_skill, skill_demand, ), employees in self.ts_demand_employee_skill.items(): - model += pl.lpSum(self.works[ts, e] for e in employees) >= skill_demand + model += ( + pl.lpSum(self.works[ts, e] for e in employees) + + (self.instance.get_requirement("rq09") == "soft") + * self.unmet_skill_demand[ts, id_skill] + >= skill_demand + ) + + # RQ10: Employee holidays + if self.instance.get_requirement("rq10") == "soft": + for ts, e in self.ts_employees_holidays: + model += ( + self.works[ts, e] <= self.unmet_employee_holidays_constraint[ts, e] + ) # RQ13: Starting hour preference - if self.instance.get_requirement("rq13"): + if self.instance.get_requirement("rq13") != "deactivated": for (d, e), slots in self.preference_starts_ts.items(): - model += pl.lpSum(self.starts[ts, e] for ts in slots) == 1 + model += ( + pl.lpSum(self.starts[ts, e] for ts in slots) + + (self.instance.get_requirement("rq13") == "soft") + * self.unmet_preference_start[d, e] + == 1 + ) # RQ14: max preference hours - if self.instance.get_requirement("rq14"): + if self.instance.get_requirement("rq14") != "deactivated": for (d, e), slots in self.preference_slots.items(): model += ( pl.lpSum(self.works[ts, e] for ts in slots) + - (self.instance.get_requirement("rq14") == "soft") + * self.unmet_preference_hours[d, e] <= self.preference_hours_employee[d, e] ) + # RQ15: Employee schedule + if self.instance.get_requirement("rq15") == "soft": + for (ts, d, e) in self.ts_employees_rest_days: + model += self.works[ts, e] <= self.unmet_employee_schedule[d, e] + + # RQ16: Fixed schedule + if self.instance.get_requirement("rq16") != "deactivated": + for (ts, e) in self.fixed_schedule: + model += ( + self.works[ts, e] + + (self.instance.get_requirement("rq16") == "soft") + * self.unmet_fixed_schedule_constraint[ts, e] + == 1 + ) + return model diff --git a/cornflow-dags/DAG/run_deployed_dags.py b/cornflow-dags/DAG/run_deployed_dags.py new file mode 100644 index 000000000..d2738eb84 --- /dev/null +++ b/cornflow-dags/DAG/run_deployed_dags.py @@ -0,0 +1,126 @@ +import json +import logging +import time +from datetime import datetime, timedelta + +from airflow import DAG +from airflow.models import Variable +from airflow.operators.python import PythonOperator +from airflow.secrets.environment_variables import EnvironmentVariablesBackend +from airflow.utils.db import create_session +from cornflow_client import CornFlowApiError +from cornflow_client.airflow.dag_utilities import connect_to_cornflow + +default_args = { + "owner": "baobab", + "depends_on_past": False, + "start_date": datetime(2020, 2, 1), + "email": [""], + "email_on_failure": False, + "email_on_retry": False, + "retries": -1, + "retry_delay": timedelta(minutes=1), + "catchup": False, +} + +logger = logging.getLogger("airflow.task") + + +def run_examples(**kwargs): + with create_session() as session: + current_examples = { + var.key: json.loads(var.get_val())["instance_1"] + for var in session.query(Variable) + if "_examples" in var.key + } + + current_examples = {k: v for k, v in current_examples.items() if v != {}} + + cf_client = connect_to_cornflow(EnvironmentVariablesBackend()) + executions = [] + + for key, instance in current_examples.items(): + schema = key.split("z_")[1].split("_examples")[0] + + try: + response = cf_client.create_instance( + data=instance, name=f"Automatic_instance_run_{schema}", schema=schema + ) + except CornFlowApiError as e: + logger.info(e) + logger.info( + f"Instance example for schema {schema} had an error on creation" + ) + continue + + instance_id = response["id"] + + config = {"timeLimit": 60, "msg": True, "seconds": 60} + + try: + response = cf_client.create_execution( + instance_id=instance_id, + config=config, + name=f"Automatic_execution_run_{schema}", + schema=schema, + ) + except CornFlowApiError as e: + logger.info(e) + logger.info( + f"Execution example for schema {schema} had an error on creation" + ) + continue + + execution_id = response["id"] + executions.append((execution_id, schema)) + + limit = (len(executions) + 1) * 60 + start = datetime.utcnow() + + while executions and datetime.utcnow() - start < timedelta(seconds=limit): + for index, (execution, schema) in enumerate(executions): + try: + response = cf_client.get_status(execution_id=execution) + except CornFlowApiError as e: + logger.info(e) + logger.info( + f"Execution {execution} of schema {schema} had an error on status retrieval" + ) + executions.pop(index) + continue + + if response["state"] in (1, 2): + logger.info( + f"Execution {execution} of schema {schema} finished successfully" + ) + executions.pop(index) + elif response["state"] in (-1, -2, -3, -4, -5, -6): + logger.info(f"Execution {execution} of schema {schema} failed") + executions.pop(index) + else: + continue + + time.sleep(15) + + if len(executions): + for execution, schema in executions: + logger.info( + f"Execution {execution} of schema {schema} could not be checked" + ) + + logger.info("Automatic test process finished") + + +dag = DAG( + "run_deployed_models", + default_args=default_args, + schedule_interval=None, + catchup=False, +) + +run_examples_task = PythonOperator( + task_id="run_examples", + python_callable=run_examples, + provide_context=True, + dag=dag, +) diff --git a/cornflow-dags/DAG/tsp/__init__.py b/cornflow-dags/DAG/tsp/__init__.py index de3723557..eaad6ee0a 100644 --- a/cornflow-dags/DAG/tsp/__init__.py +++ b/cornflow-dags/DAG/tsp/__init__.py @@ -5,7 +5,7 @@ from typing import List, Dict import os -from .solvers import TSPNaive, ACOpy, OrToolsCP +from .solvers import TSPNaive, OrToolsCP from .core import Instance, Solution @@ -13,7 +13,7 @@ class TspApp(ApplicationCore): name = "tsp" instance = Instance solution = Solution - solvers = dict(naive=TSPNaive, aco=ACOpy, cpsat=OrToolsCP) + solvers = dict(naive=TSPNaive, cpsat=OrToolsCP) schema = load_json(os.path.join(os.path.dirname(__file__), "schemas/config.json")) @property diff --git a/cornflow-dags/DAG/tsp/schemas/config.json b/cornflow-dags/DAG/tsp/schemas/config.json index 3df23efe3..a62dcb567 100644 --- a/cornflow-dags/DAG/tsp/schemas/config.json +++ b/cornflow-dags/DAG/tsp/schemas/config.json @@ -8,7 +8,7 @@ "gap": {"type": "number"}, "solver": { "type": "string", - "enum": ["naive", "aco", "cpsat"], + "enum": ["naive", "cpsat"], "default": "naive" } } diff --git a/cornflow-dags/DAG/tsp/solvers/ACOpy.py b/cornflow-dags/DAG/tsp/solvers/ACOpy.py deleted file mode 100644 index 456d3c982..000000000 --- a/cornflow-dags/DAG/tsp/solvers/ACOpy.py +++ /dev/null @@ -1,18 +0,0 @@ -from ..core import Experiment, Solution -from pytups import TupList -import acopy as aco -from cornflow_client.constants import SOLUTION_STATUS_FEASIBLE, STATUS_UNDEFINED - - -class ACOpy(Experiment): - def solve(self, options: dict): - solver = aco.Solver(rho=options.get("rho", 0.03), q=options.get("q", 1)) - timeLimit_plugin = aco.plugins.TimeLimit(options.get("timeLimit", 10)) - solver.add_plugin(timeLimit_plugin) - colony = aco.Colony(alpha=options.get("alpha", 1), beta=options.get("beta", 3)) - problem = self.instance.to_tsplib95() - G = problem.get_graph() - tour = solver.solve(G, colony, limit=100) - solution = TupList(dict(pos=pos, node=el) for pos, el in enumerate(tour.nodes)) - self.solution = Solution(dict(route=solution)) - return dict(status_sol=SOLUTION_STATUS_FEASIBLE, status=STATUS_UNDEFINED) diff --git a/cornflow-dags/DAG/tsp/solvers/__init__.py b/cornflow-dags/DAG/tsp/solvers/__init__.py index bf5a4df5f..4e05d4b71 100644 --- a/cornflow-dags/DAG/tsp/solvers/__init__.py +++ b/cornflow-dags/DAG/tsp/solvers/__init__.py @@ -1,3 +1,2 @@ -from .ACOpy import ACOpy from .naive import TSPNaive from .cp_model import OrToolsCP diff --git a/cornflow-dags/DAG/two_dimension_bin_packing/core/experiment.py b/cornflow-dags/DAG/two_dimension_bin_packing/core/experiment.py index 1877c1cf9..479d1535b 100644 --- a/cornflow-dags/DAG/two_dimension_bin_packing/core/experiment.py +++ b/cornflow-dags/DAG/two_dimension_bin_packing/core/experiment.py @@ -1,15 +1,25 @@ import os +import sys from typing import Dict from cornflow_client import ExperimentCore from cornflow_client.core.tools import load_json -from matplotlib import pyplot as plt -from matplotlib.collections import PatchCollection -from matplotlib.patches import Rectangle from pytups import SuperDict + from .instance import Instance from .solution import Solution +try: + from matplotlib import pyplot as plt + from matplotlib.collections import PatchCollection + from matplotlib.patches import Rectangle +except ModuleNotFoundError: + pass +except NameError: + pass +except ImportError: + pass + class Experiment(ExperimentCore): schema_checks = load_json( @@ -43,6 +53,11 @@ def check_solution(self, *args, **kwargs) -> Dict[str, Dict]: return dict() def plot_solution(self): + if "matplotlib" not in sys.modules: + raise ModuleNotFoundError( + "Matplotlib has to be installed to be able to plot!" + ) + rectangles = [ Rectangle( (el["x"], el["y"]), diff --git a/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py b/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py index 4386b74f9..06808399a 100644 --- a/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py +++ b/cornflow-dags/DAG/two_dimension_bin_packing/solvers/right_corner_model.py @@ -2,7 +2,7 @@ STATUS_TIME_LIMIT, SOLUTION_STATUS_FEASIBLE, SOLUTION_STATUS_INFEASIBLE, - PYOMO_STOP_MAPPING + PYOMO_STOP_MAPPING, ) from pytups import SuperDict from two_dimension_bin_packing.core import Experiment, Solution @@ -257,6 +257,7 @@ def solve(self, options): _, solver_name = solver_name.split(".") # Setting solver + # TODO: review solver options translation if solver_name == "gurobi": opt = SolverFactory(solver_name, solver_io="python") else: @@ -274,14 +275,12 @@ def solve(self, options): # Check status if status in ["error", "unknown", "warning"]: return dict( - status=termination_condition, - status_sol=SOLUTION_STATUS_INFEASIBLE + status=termination_condition, status_sol=SOLUTION_STATUS_INFEASIBLE ) elif status == "aborted": if termination_condition != STATUS_TIME_LIMIT: return dict( - status=termination_condition, - status_sol=SOLUTION_STATUS_INFEASIBLE + status=termination_condition, status_sol=SOLUTION_STATUS_INFEASIBLE ) solution_dict = SuperDict() @@ -304,7 +303,4 @@ def solve(self, options): self.solution = Solution.from_dict(solution_dict) # self.plot_solution() - return dict( - status=termination_condition, - status_sol=SOLUTION_STATUS_FEASIBLE - ) + return dict(status=termination_condition, status_sol=SOLUTION_STATUS_FEASIBLE) diff --git a/cornflow-dags/DAG/update_all_schemas.py b/cornflow-dags/DAG/update_all_schemas.py index b9464791e..1ee819994 100644 --- a/cornflow-dags/DAG/update_all_schemas.py +++ b/cornflow-dags/DAG/update_all_schemas.py @@ -1,20 +1,15 @@ -# General imports import importlib as il import os import sys - -# Partial imports -from airflow.operators.python import PythonOperator -from airflow.models import Variable -from airflow import DAG -from airflow.utils.db import create_session from datetime import datetime, timedelta from typing import List -# Import from cornflow environment +from airflow import DAG +from airflow.models import Variable +from airflow.operators.python import PythonOperator +from airflow.utils.db import create_session from cornflow_client import ApplicationCore - default_args = { "owner": "baobab", "depends_on_past": False, diff --git a/cornflow-dags/DAG/update_dag_registry.py b/cornflow-dags/DAG/update_dag_registry.py index adc95ccda..909b4576d 100644 --- a/cornflow-dags/DAG/update_dag_registry.py +++ b/cornflow-dags/DAG/update_dag_registry.py @@ -1,15 +1,13 @@ -# Full imports - - # Partial imports +from datetime import datetime, timedelta + from airflow import DAG from airflow.models import DagModel from airflow.operators.python import PythonOperator from airflow.secrets.environment_variables import EnvironmentVariablesBackend from airflow.utils.db import create_session -from cornflow_client import CornFlow from cornflow_client.airflow.dag_utilities import connect_to_cornflow -from datetime import datetime, timedelta + from update_all_schemas import get_new_apps default_args = { @@ -27,7 +25,6 @@ def update_dag_registry(**kwargs): with create_session() as session: - model_dags = [ dag for dag in session.query(DagModel) diff --git a/cornflow-dags/README.rst b/cornflow-dags/README.rst index d5f8124bc..95e0a9e19 100644 --- a/cornflow-dags/README.rst +++ b/cornflow-dags/README.rst @@ -1,3 +1,4 @@ +=============== Cornflow-dags =============== @@ -9,7 +10,7 @@ Uploading a new app / solver Setting the environment ------------------------ -This project requires python 3.5 or above:: +This project requires python 3.7 or above:: python -m venv venv venv/Scripts/activate @@ -20,149 +21,278 @@ Introduction There are several things that are needed when submitting a new solver. -1. a `solve` function. -2. a `name` string. -3. an `instance` dictionary. -4. an `solution` dictionary. -5. a `test_cases` function that returns a list of dictionaries. +1. an `Instance` class. +2. a `Solution` class. +3. an `Experiment class` +4. a `Solver` class +5. an `Application class` -In its most minimalistic form: an app constitutes one dag file that contains all of this. +In its most minimalistic form: an app constitutes one file that contains all of this. In the following lines we will explain each of these concepts while using the graph-coloring example dag. This example can be found in the `DAG/graph_coloring` directory. -The solver ------------- +The Instance class +----------------------------------------- +The Instance class is used to process the input data. +It inherits the class `InstanceCore`, that can be found in cornflow_client.core. -The solver comes in the form of a python function that takes exactly two arguments: `data` and `config`. The first one is a python dictionary with the input data to solve the problem. The second one is also a dictionary with the execution configuration. +In its most basic form, the Instance class should contain at least two fields: schema, and schema_checks. +Those fields should contain the jsonschema used to verify the format of the input data and the input data checks. -This function needs to be named `solve` and returns three things: a python dictionary with the output data, a string that stores the whole log, and a dictionary with the log information processed. Only the first needs to have a value. +In the case of the graph-coloring, the class is defined as:: -The function for the graph-coloring case is:: + import os + from cornflow_client import InstanceCore, get_empty_schema + from cornflow_client.core.tools import load_json + import pytups as pt - from ortools.sat.python import cp_model + + class Instance(InstanceCore): + schema = load_json(os.path.join(os.path.dirname(__file__), "../schemas/input.json")) + schema_checks = get_empty_schema() + + def get_pairs(self): + return pt.TupList((el["n1"], el["n2"]) for el in self.data["pairs"]) + +The class can also define a check() method, that should execute verifications on the input data and return a +dictionary with the errors. +If it defined, this method will be ran before every execution of the solver, to check that the +input data doesn't contain infeasibilities. + +From this class, the input data can be accessed through the `data` field. + +The Solution class +----------------------------------------- +The Solution class is used to process the output data. +It inherits the class `SolutionCore`, that can be found in cornflow_client.core. + +In its most basic form, the Solution class should contain at least one field: schema. +This fields should contain the jsonschema used to verify the format of the output data. + +In the case of the graph-coloring, the class is defined as:: + + import os + from cornflow_client import SolutionCore + from cornflow_client.core.tools import load_json import pytups as pt - from timeit import default_timer as timer - - - def solve(data, config): - """ - :param data: json for the problem - :param config: execution configuration, including solver - :return: solution and log - """ - start = timer() - model = cp_model.CpModel() - input_data = pt.SuperDict.from_dict(data) - pairs = input_data["pairs"] - n1s = pt.TupList(pairs).vapply(lambda v: v["n1"]) - n2s = pt.TupList(pairs).vapply(lambda v: v["n2"]) - nodes = (n1s + n2s).unique2() - max_colors = len(nodes) - 1 - - # variable declaration: - color = pt.SuperDict( - { - node: model.NewIntVar(0, max_colors, "color_{}".format(node)) - for node in nodes - } - ) - for pair in pairs: - model.Add(color[pair["n1"]] != color[pair["n2"]]) - # model.AddAllDifferent(color[n] for n in nodes) - - # TODO: identify maximum cliques and apply constraint on the cliques instead of on pairs - - obj_var = model.NewIntVar(0, max_colors, "total_colors") - model.AddMaxEquality(obj_var, color.values()) - model.Minimize(obj_var) - solver = cp_model.CpSolver() - solver.parameters.max_time_in_seconds = config.get("timeLimit", 10) - status = solver.Solve(model) - if status not in [cp_model.OPTIMAL, cp_model.FEASIBLE]: - return status - color_sol = color.vapply(solver.Value) - - assign_list = color_sol.items_tl().vapply(lambda v: dict(node=v[0], color=v[1])) - solution = dict(assignment=assign_list) - log = "" - status_conv = {4: "Optimal", 2: "Feasible", 3: "Infeasible", 0: "Unknown"} - log = dict( - time=timer() - start, - solver="ortools", - status=status_conv.get(status, "Unknown"), + + + class Solution(SolutionCore): + schema = load_json( + os.path.join(os.path.dirname(__file__), "../schemas/output.json") ) - return solution, "", log -Name and configuration ------------------------ + def get_assignments(self): + return pt.SuperDict({v["node"]: v["color"] for v in self.data["assignment"]}) -You need to choose a name for the solution method, as well as the configuration schema. A quick way of creating a configuration is just creating an empty schema and add some parameters. In the graph-coloring example we add a `timeLimit` property to stop the solver after X seconds:: - name = "graph_coloring" - config = get_empty_schema() - config["properties"] = dict(timeLimit=dict(type="number")) +From this class, the input data can be accessed through the `data` field. -The input schema and output schema +The Experiment class ----------------------------------------- +The Experiment class is used to work on the union of input and output_data. +It inherits the class `ExperimentCore`, that can be found in cornflow_client.core. +An Experiment object is linked to an Instance and a Solution object and can therefore use their data. -Both schemas are built and deployed similarly so we present how the input schema is done. +In its most basic form, the Experiment class should contain at least one field and two methods: +schema_checks, get_objective(), check_solution(). +The method check_solution() should execute verifications on the output data and return a +dictionary with the errors. The method get_objective() should calculate and return the value of the +objective function given the current Instance and Solution. +The field schema_checks should contain the jsonschema used to verify the format of the output data. -The input schema is a json schema file (https://json-schema.org/) that includes all the characteristics of the input data for each dag. This file can be built with many tools (a regular text editor could be enough). +In the case of the graph-coloring, the class is defined as:: -In order to upload it, you need to have an `instance` variable available in your dag file. + from cornflow_client import ExperimentCore + from cornflow_client.core.tools import load_json + from .instance import Instance + from .solution import Solution + import os -In the case of the graph-coloring, these variables are imported from the package:: - with open(os.path.join(os.path.dirname(__file__), "input.json"), "r") as f: - instance = json.load(f) - with open(os.path.join(os.path.dirname(__file__), "output.json"), "r") as f: - solution = json.load(f) + class Experiment(ExperimentCore): + schema_checks = load_json( + os.path.join(os.path.dirname(__file__), "../schemas/solution_checks.json") + ) -This just imports the `input.json` and `output.json` files as python dictionaries. You can check either file to see how they are structured. + @property + def instance(self) -> Instance: + return super().instance -Airflow functions and name ------------------------------ -There are some basic functions and declarations that need to be created. The easiest is to just copy the ones from and example and adapt them if needed:: + @property + def solution(self) -> Solution: + return super().solution - from airflow import DAG - from airflow.operators.python import PythonOperator - import cornflow_client.airflow.dag_utilities as utils + @solution.setter + def solution(self, value): + self._solution = value - dag = DAG(name, default_args=utils.default_args, schedule_interval=None) - def solve_hk(**kwargs): - return utils.cf_solve(solve, name, EnvironmentVariablesBackend(), **kwargs) + def get_objective(self) -> float: + return self.solution.get_assignments().values_tl().unique().len() - graph_coloring = PythonOperator(task_id=name, python_callable=solve_hk, dag=dag) + def check_solution(self, *args, **kwargs) -> dict: + # if a pair of nodes have the same colors: that's a problem + colors = self.solution.get_assignments() + pairs = self.instance.get_pairs() + errors = [ + {"n1": n1, "n2": n2} for (n1, n2) in pairs if colors[n1] == colors[n2] + ] + return dict(pairs=errors) -Unit tests +From this class, the instance can be accessed through the `instance` field, and the solution can be +accessed through the `solution` field. + +The solver ------------ -The `test_cases` function is used in the unittests to be sure the solver works as intended. In the graph-coloring example we read the examples from the the `data` directory and transform them to the correct format:: +The solver is the part of the app that takes care of the resolution of the problem. An app can contain +several ones. +The solver comes in the form of a python class. It inherits the Experiment class. As such, it is also +linked to an Instance and a Solution object and can therefore use their data. + +In its most basic form, the Solver class should contain at least a `solve()` method. This method should +take exactly one argument: a dictionary with the execution configuration. It should return a dictionary +with two keys: `status` and `status_sol`. `status` should contain the status of the execution (optimal, +unbounded, time_limit...) while `status_sol` should return the information of whether the execution +has found a solution or not. The mappings of both these statuses are defined in +cornflow_client.constants. + +The class for the graph-coloring case is:: + + from ortools.sat.python import cp_model + from cornflow_client.constants import ( + ORTOOLS_STATUS_MAPPING, + SOLUTION_STATUS_FEASIBLE, + SOLUTION_STATUS_INFEASIBLE, + ) + import pytups as pt + from ..core import Solution, Experiment + + class OrToolsCP(Experiment): + def solve(self, options: dict): + model = cp_model.CpModel() + input_data = pt.SuperDict.from_dict(self.instance.data) + pairs = input_data["pairs"] + n1s = pt.TupList(pairs).vapply(lambda v: v["n1"]) + n2s = pt.TupList(pairs).vapply(lambda v: v["n2"]) + nodes = (n1s + n2s).unique2() + max_colors = len(nodes) - 1 + + # variable declaration: + color = pt.SuperDict( + { + node: model.NewIntVar(0, max_colors, "color_{}".format(node)) + for node in nodes + } + ) + for pair in pairs: + model.Add(color[pair["n1"]] != color[pair["n2"]]) + + obj_var = model.NewIntVar(0, max_colors, "total_colors") + model.AddMaxEquality(obj_var, color.values()) + model.Minimize(obj_var) + solver = cp_model.CpSolver() + solver.parameters.max_time_in_seconds = options.get("timeLimit", 10) + termination_condition = solver.Solve(model) + if termination_condition not in [cp_model.OPTIMAL, cp_model.FEASIBLE]: + return dict( + status=ORTOOLS_STATUS_MAPPING.get(termination_condition), + status_sol=SOLUTION_STATUS_INFEASIBLE + ) + color_sol = color.vapply(solver.Value) + + assign_list = color_sol.items_tl().vapply(lambda v: dict(node=v[0], color=v[1])) + self.solution = Solution(dict(assignment=assign_list)) + + return dict( + status=ORTOOLS_STATUS_MAPPING.get(termination_condition), + status_sol=SOLUTION_STATUS_FEASIBLE + ) + +The class can also defined a string field `log`. If it does, +the log will be saved in cornflow at the end of the execution with the solution data, so that it +can be consulted by the user. + +The Application +----------------------- + +The Application class is the base of the app. It links the different resolution methods and takes care +of the connection with the server. +It inherits the class `ApplicationCore`, that can be found in cornflow_client.core. + +An Application should contain several fields: - def test_cases(): - file_dir = os.path.join(os.path.dirname(__file__), "..", "data") - files = os.listdir(file_dir) - test_files = pt.TupList(files).vfilter(lambda v: v.startswith("gc_")) - return [read_file(os.path.join(file_dir, fileName)) for fileName in test_files] +- a string `name` +- an `instance` object that contains the Instance class defined earlier +- a `solution` object that contains the Solution class defined earlier +- a `solvers` dictionary that contains a mapping to the different solvers defined earlier +- a `schema` object that contains the jsonschema corresponding to the configuration dictionaries. +A quick way of creating a configuration is just creating an empty schema and add some parameters. +In the graph-coloring example we add a `timeLimit` property to stop the solver after X seconds. +- a `test_cases` property that should return a list of test instance datasets. +The `test_cases` function is used in the unittests to be sure the solver works as intended. +In the graph-coloring example we read the examples from the the `data` directory and transform +them to the correct format. +The class for the graph-coloring case is:: + + from cornflow_client import get_empty_schema, ApplicationCore + from typing import List, Dict + import pytups as pt + import os + + from .solvers import OrToolsCP + from .core import Instance, Solution - def read_file(filePath): - with open(filePath, "r") as f: - contents = f.read().splitlines() - pairs = ( - pt.TupList(contents[1:]) - .vapply(lambda v: v.split(" ")) - .vapply(lambda v: dict(n1=int(v[0]), n2=int(v[1]))) + class GraphColoring(ApplicationCore): + name = "graph_coloring" + instance = Instance + solution = Solution + solvers = dict(default=OrToolsCP) + schema = get_empty_schema( + properties=dict(timeLimit=dict(type="number")), solvers=list(solvers.keys()) ) - return dict(pairs=pairs) -To be sure that the the the solution method is tested, you need to edit the `tests/test_dags.py` file and add a reference to your solver:: + @property + def test_cases(self) -> List[Dict]: + def read_file(filePath): + with open(filePath, "r") as f: + contents = f.read().splitlines() + + pairs = ( + pt.TupList(contents[1:]) + .vapply(lambda v: v.split(" ")) + .vapply(lambda v: dict(n1=int(v[0]), n2=int(v[1]))) + ) + return dict(pairs=pairs) + + file_dir = os.path.join(os.path.dirname(__file__), "data") + files = os.listdir(file_dir) + test_files = pt.TupList(files).vfilter(lambda v: v.startswith("gc_")) + return [read_file(os.path.join(file_dir, fileName)) for fileName in test_files] + +The jsonschemas +----------------------------------------- + +All jsonschemas are built and deployed similarly so we present how the input schema is done. +A jsonschema is a json schema file (https://json-schema.org/) that includes all the characteristics of the data for each dag. +This file can be built with many tools (a regular text editor could be enough). +You can check the `DAG/graph_coloring/schemas` directory to see how they are structured. + +Unit tests +------------ + +To be sure that the the the solution method is tested, you need to edit the `tests/test_dags.py` file +and add a reference to your solver:: class GraphColor(BaseDAGTests.SolvingTests): def setUp(self): super().setUp() - self.app = _import_file("graph_coloring") + from DAG.graph_coloring import GraphColoring + + self.app = GraphColoring() + self.config = dict(msg=False) Then, you can execute the unittests for your solver with the following command:: diff --git a/cornflow-dags/requirements-dev.txt b/cornflow-dags/requirements-dev.txt index b66996219..54d6b0ac7 100644 --- a/cornflow-dags/requirements-dev.txt +++ b/cornflow-dags/requirements-dev.txt @@ -1,5 +1,4 @@ -r requirements.txt -apache-airflow>=2.0.1 coverage -numpyencoder==0.3.0 -openpyxl==3.0.9 +numpyencoder +matplotlib diff --git a/cornflow-dags/requirements.txt b/cornflow-dags/requirements.txt index 9dc65e018..a67663a50 100644 --- a/cornflow-dags/requirements.txt +++ b/cornflow-dags/requirements.txt @@ -1,14 +1,11 @@ -cornflow-client -orloge>=0.13 -PuLP>=2.3 -pandas>=1.0 +cornflow-client<=1.0.16 +orloge<=0.17.2 +PuLP<=2.7 +pandas<=2.1.1 hackathonbaobab2020[solvers] @ git+https://github.com/baobabsoluciones/hackathonbaobab2020@main -marshmallow -pytups -ortools -xmltodict -openpyxl -pyomo -acopy -tsplib95 -matplotlib \ No newline at end of file +pytups<=0.86.2 +ortools<=9.7.2996 +xmltodict<=0.13.0 +openpyxl<=3.1.2 +pyomo<=6.6.2 +tsplib95<=0.7.1 diff --git a/cornflow-dags/tests/test_dags.py b/cornflow-dags/tests/test_dags.py index 96c2d2ee9..57dedced2 100644 --- a/cornflow-dags/tests/test_dags.py +++ b/cornflow-dags/tests/test_dags.py @@ -162,9 +162,6 @@ def setUp(self): self.app = TspApp() - def test_solve_aco(self): - return self.test_try_solving_testcase(dict(solver="aco", **self.config)) - def test_solve_cpsat(self): return self.test_try_solving_testcase(dict(solver="cpsat", **self.config)) diff --git a/cornflow-server/Dockerfile b/cornflow-server/Dockerfile index e490fa427..79e31140a 100644 --- a/cornflow-server/Dockerfile +++ b/cornflow-server/Dockerfile @@ -1,15 +1,15 @@ -# VERSION 2.0.2 +# VERSION 1.0.8 # AUTHOR: sistemas@baobabsoluciones.es -FROM python:3.8-slim-buster -LABEL maintainer="sistemas@baobabsoluciones" +FROM python:3.10-slim-buster +LABEL maintainer="cornflow@baobabsoluciones" # Never prompt the user for choices on installation/configuration of packages ENV DEBIAN_FRONTEND noninteractive ENV TERM linux # CORNFLOW vars -ARG CORNFLOW_VERSION=1.0.7 +ARG CORNFLOW_VERSION=1.0.8 # install linux pkg RUN apt update -y && apt-get install -y --no-install-recommends \ @@ -39,6 +39,11 @@ RUN mkdir -p /usr/src/app/log # create folder for custom ssh keys RUN mkdir /usr/src/app/.ssh +# user cornflow on application +RUN useradd -ms /bin/bash -d /usr/src/app cornflow +RUN chown -R cornflow: /usr/src/app +USER cornflow + EXPOSE 5000 # execute python init script diff --git a/cornflow-server/README.rst b/cornflow-server/README.rst index c22b3c3fe..47df840c0 100644 --- a/cornflow-server/README.rst +++ b/cornflow-server/README.rst @@ -40,19 +40,33 @@ Cornflow helps you formalize your problem by proposing development guidelines. I Installation instructions ------------------------------- -Cornflow is tested with Ubuntu 20.04, python >= 3.5 and git. +Cornflow is tested with Ubuntu 20.04, python >= 3.8 and git. Download the Cornflow project and install requirements:: - git clone git@github.com:baobabsoluciones/cornflow.git - cd cornflow-server python3 -m venv venv - venv/bin/pip3 install -r requirements-dev.txt + venv/bin/pip3 install cornflow + +initialize the sqlite database:: + + source venv/bin/activate + export FLASK_APP=cornflow.app + export DATABASE_URL=sqlite:///cornflow.db + flask db upgrade + flask access_init + flask create_service_user -u airflow -e airflow_test@admin.com -p airflow_test_password + flask create_admin_user -u cornflow -e cornflow_admin@admin.com -p cornflow_admin_password + activate the virtual environment and run Cornflow:: source venv/bin/activate export FLASK_APP=cornflow.app + export SECRET_KEY=THISNEEDSTOBECHANGED + export DATABASE_URL=sqlite:///cornflow.db + export AIRFLOW_URL=http://127.0.0.1:8080/ + export AIRFLOW_USER=airflow_user + export AIRFLOW_PWD=airflow_pwd flask run **Cornflow needs a running installation of Airflow to operate and more configuration**. Check `the installation docs `_ for more details on installing airflow, configuring the application and initializing the database. @@ -135,8 +149,7 @@ Using cornflow to deploy a solution method To deploy a cornflow solution method, the following tasks need to be accomplished: -#. Create I/O schemas for the new problem (e.g., “TSP format”). -#. Create a solve function (e.g., a 2-opt heuristic). +#. Create an Application for the new problem #. Do a PR to a compatible repo linked to a server instance (e.g., like `this one `_). For more details on each part, check the `deployment guide `_. diff --git a/cornflow-server/airflow_config/Dockerfile b/cornflow-server/airflow_config/Dockerfile index 40aaefb74..f0ae2ca64 100644 --- a/cornflow-server/airflow_config/Dockerfile +++ b/cornflow-server/airflow_config/Dockerfile @@ -1,60 +1,24 @@ -# VERSION 2.x.x -# AUTHOR: sistemas@baobabsoluciones.es -# DESCRIPTION: Airflow 2.x.x image personalized for use with Cornflow (from puckel/docker-airflow https://github.com/puckel/docker-airflow by "Puckel_") +# VERSION 2.7.1 +# AUTHOR: cornflow@baobabsoluciones.es +# DESCRIPTION: Airflow 2.7.1 image personalized for use with Cornflow (from baobabsoluciones/pysolver image) +# baobab code version is 1.0.8 -FROM python:3.8-slim-buster -LABEL maintainer="sistemas@baobabsoluciones" +FROM baobabsoluciones/pysolver:1.0 +LABEL maintainer="cornflow@baobabsoluciones" # Never prompt the user for choices on installation/configuration of packages ENV DEBIAN_FRONTEND noninteractive ENV TERM linux # Airflow vars -ARG AIRFLOW_VERSION=2.2.4 +ARG AIRFLOW_VERSION=2.7.1 ARG AIRFLOW_USER_HOME=/usr/local/airflow -ARG CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-3.8.txt" +ARG CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-3.10.txt" ARG AIRFLOW__CORE__LOAD_EXAMPLES=False ENV AIRFLOW_HOME=${AIRFLOW_USER_HOME} -# install Airflow requirements -RUN apt update -y && apt-get install -y --no-install-recommends \ - apt-utils \ - default-jre \ - default-jdk \ - g++ \ - gcc \ - git \ - freetds-bin \ - krb5-user \ - ldap-utils \ - libffi6 \ - libffi-dev \ - libldap2-dev \ - libpq-dev \ - libprotobuf-dev \ - libsasl2-2 \ - libsasl2-dev \ - libsasl2-modules \ - libssl1.1 \ - libssl-dev \ - locales \ - lsb-release \ - make \ - pkg-config \ - protobuf-compiler \ - python3-dev \ - sasl2-bin \ - slapd \ - sqlite3 \ - ssh \ - unixodbc \ - wget - # install Airflow and extras: celery,postgres and redis -RUN pip install "apache-airflow[celery,google,postgres,redis]==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" -RUN pip install python-ldap -RUN pip install GitPython -RUN pip install cmake +RUN pip install "apache-airflow[celery,google,postgres,redis,sendgrid]==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" # copy init script and config to container COPY scripts ${AIRFLOW_HOME}/scripts @@ -64,20 +28,13 @@ COPY webserver_ldap.py ${AIRFLOW_HOME}/webserver_ldap.py # create folder for custom ssh keys RUN mkdir ${AIRFLOW_HOME}/.ssh -# user airflow on application -RUN useradd -ms /bin/bash -d ${AIRFLOW_HOME} airflow -RUN chown -R airflow: ${AIRFLOW_HOME} - -# execute installation solvers script -RUN python ${AIRFLOW_HOME}/scripts/solver_installation.py -ENV GUROBI_HOME=${AIRFLOW_HOME}/gurobi/linux64 -ENV PATH=${PATH}:${GUROBI_HOME}/bin -ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib -ENV GRB_LICENSE_FILE=${AIRFLOW_HOME}/gurobi.lic +# rights for user cornflow on application +RUN chown -R cornflow: ${AIRFLOW_HOME} EXPOSE 8080 5555 8793 -USER airflow +# change user to cornflow +USER cornflow WORKDIR ${AIRFLOW_HOME} ENTRYPOINT ["python", "scripts/init_airflow_service.py"] diff --git a/cornflow-server/airflow_config/Dockerfile.base b/cornflow-server/airflow_config/Dockerfile.base new file mode 100644 index 000000000..6281549a1 --- /dev/null +++ b/cornflow-server/airflow_config/Dockerfile.base @@ -0,0 +1,66 @@ +# VERSION 1.0 +# AUTHOR: cornflow@baobabsoluciones.es + +FROM python:3.10-slim-buster +LABEL maintainer="cornflow@baobabsoluciones" + +# Never prompt the user for choices on installation/configuration of packages +ENV DEBIAN_FRONTEND noninteractive +ENV TERM linux + +# solver vars +ENV SOLVER_DIR=/usr/local/solvers + +# install linux requirements +RUN apt update -y && apt-get install -y --no-install-recommends \ + apt-utils \ + default-jre \ + default-jdk \ + g++ \ + gcc \ + git \ + freetds-bin \ + krb5-user \ + ldap-utils \ + libffi6 \ + libffi-dev \ + libldap2-dev \ + libpq-dev \ + libprotobuf-dev \ + libsasl2-2 \ + libsasl2-dev \ + libsasl2-modules \ + libssl1.1 \ + libssl-dev \ + locales \ + lsb-release \ + make \ + pkg-config \ + protobuf-compiler \ + python3-dev \ + sasl2-bin \ + slapd \ + sqlite3 \ + ssh \ + unixodbc \ + wget + +RUN pip install python-ldap +RUN pip install GitPython +RUN pip install cmake + +# copy init script and config to container +COPY scripts ${SOLVER_DIR}/scripts + +# add user cornflow on application +RUN useradd -ms /bin/bash -d ${SOLVER_DIR} cornflow +RUN chown -R cornflow: ${SOLVER_DIR} + +# execute installation solvers script +RUN python ${SOLVER_DIR}/scripts/solver_installation.py +ENV GUROBI_HOME=${SOLVER_DIR}/gurobi/linux64 +ENV PATH=${PATH}:${GUROBI_HOME}/bin +ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${GUROBI_HOME}/lib +ENV GRB_LICENSE_FILE=${GUROBI_HOME}/gurobi.lic + +WORKDIR ${SOLVER_DIR} \ No newline at end of file diff --git a/cornflow-server/airflow_config/airflow_local_settings.py b/cornflow-server/airflow_config/airflow_local_settings.py new file mode 100644 index 000000000..daa7c99e4 --- /dev/null +++ b/cornflow-server/airflow_config/airflow_local_settings.py @@ -0,0 +1,23 @@ +# AIRFLOW custom UI colors for CornflowEnv + +STATE_COLORS = { + "deferred": "#7c4fe0", + "failed": "#c9301c", + "queued": "#656d78", + "removed": "#7bdcb5", + "restarting": "#9b51e0", + "running": "#01FF70", + "scheduled": "#fcb900", + "shutdown": "blue", + "skipped": "darkorchid", + "success": "#00d084", + "up_for_reschedule": "#f78da7", + "up_for_retry": "yellow", + "upstream_failed": "#b31e1e", +} + +from airflow.www.utils import UIAlert + +DASHBOARD_UIALERTS = [ + UIAlert("Welcome! This is the backend of your Cornflow environment. Airflow™ is a platform created by the community to programmatically author, schedule and monitor workflows."), +] \ No newline at end of file diff --git a/cornflow-server/airflow_config/logs/README.rst b/cornflow-server/airflow_config/logs/README.rst new file mode 100644 index 000000000..b61608dfa --- /dev/null +++ b/cornflow-server/airflow_config/logs/README.rst @@ -0,0 +1,10 @@ +Airflow LOGS +-------------- + +Users can specify the directory to place log files in airflow.cfg using base_log_folder. By default, logs are placed in the AIRFLOW_HOME directory. + +The following convention is followed while naming logs: {dag_id}/{task_id}/{execution_date}/{try_number}.log + +In addition, users can supply a remote location to store current logs and backups. + +In the Airflow Web UI, local logs take precedence over remote logs. If local logs can not be found or accessed, the remote logs will be displayed. Note that logs are only sent to remote storage once a task is complete (including failure); In other words, remote logs for running tasks are unavailable. \ No newline at end of file diff --git a/cornflow-server/airflow_config/scripts/solver_installation.py b/cornflow-server/airflow_config/scripts/solver_installation.py index 75347662f..a63cba0ba 100644 --- a/cornflow-server/airflow_config/scripts/solver_installation.py +++ b/cornflow-server/airflow_config/scripts/solver_installation.py @@ -8,11 +8,11 @@ # * MIPCL: https://github.com/onebitbrain/MIPCL/blob/master/bin/mps_mipcl # * glpk: https://www.gnu.org/software/glpk/ # * Gurobi optimizer: https://www.gurobi.com/ -available_solver = ["HiGHS", "CBC", "CHOCO", "glpk", "gurobi"] +available_solver = "HiGHS,CBC,CHOCO,glpk,gurobi" +default_solvers = "HiGHS,CBC,gurobi" # list of solvers that will be installed -solver_list = os.getenv("SOLVER_LIST", "CBC,glpk,HiGHS,CHOCO,MIPCL,gurobi").split(",") - +solver_list = os.getenv("SOLVER_LIST", default_solvers).split(",") def install(s): if s in "CBC": diff --git a/cornflow-server/airflow_config/scripts/solvers/get_choco.py b/cornflow-server/airflow_config/scripts/solvers/get_choco.py index f7aa0118c..b25790ced 100644 --- a/cornflow-server/airflow_config/scripts/solvers/get_choco.py +++ b/cornflow-server/airflow_config/scripts/solvers/get_choco.py @@ -30,7 +30,7 @@ def install(): ) output_choco = choco_install.stdout print(output_choco) - uid = pwd.getpwnam("airflow").pw_uid + uid = pwd.getpwnam("cornflow").pw_uid gid = grp.getgrnam("root").gr_gid choco_path = "/usr/local/bin/choco.jar" os.chown(choco_path, uid, gid) diff --git a/cornflow-server/airflow_config/scripts/solvers/get_gurobi.py b/cornflow-server/airflow_config/scripts/solvers/get_gurobi.py index 7b22e413d..8a77af20f 100644 --- a/cornflow-server/airflow_config/scripts/solvers/get_gurobi.py +++ b/cornflow-server/airflow_config/scripts/solvers/get_gurobi.py @@ -19,15 +19,16 @@ def install(): try: - install_dir = "/usr/local/airflow/gurobi" - os.chdir("/usr/local/airflow") + solver_dir = os.getenv("SOLVER_DIR") + install_dir = solver_dir+"/gurobi" + os.chdir(solver_dir) subprocess.check_output( - ["wget", "https://packages.gurobi.com/9.5/gurobi9.5.0_linux64.tar.gz"] + ["wget", "https://packages.gurobi.com/10.0/gurobi10.0.1_linux64.tar.gz"] ) - subprocess.check_output(["tar", "-xvf", "gurobi9.5.0_linux64.tar.gz"]) - os.rename("gurobi950", "gurobi") - uid = pwd.getpwnam("airflow").pw_uid - gid = grp.getgrnam("airflow").gr_gid + subprocess.check_output(["tar", "-xvf", "gurobi10.0.1_linux64.tar.gz"]) + os.rename("gurobi1001", "gurobi") + uid = pwd.getpwnam("cornflow").pw_uid + gid = grp.getgrnam("cornflow").gr_gid os.chown(install_dir, uid, gid) os.chdir(f"{install_dir}/linux64") gurobi_install = subprocess.run( diff --git a/cornflow-server/airflow_config/scripts/solvers/get_highs.py b/cornflow-server/airflow_config/scripts/solvers/get_highs.py index 9fc7240ef..6a0cf1d4b 100644 --- a/cornflow-server/airflow_config/scripts/solvers/get_highs.py +++ b/cornflow-server/airflow_config/scripts/solvers/get_highs.py @@ -29,7 +29,7 @@ def install(): subprocess.check_output("make") subprocess.check_output(["cp", "bin/highs", "/usr/local/bin/highs"]) subprocess.check_output(["chmod", "+x", "/usr/local/bin/highs"]) - uid = pwd.getpwnam("airflow").pw_uid + uid = pwd.getpwnam("cornflow").pw_uid gid = grp.getgrnam("root").gr_gid highs_path = "/usr/local/bin/highs" os.chown(highs_path, uid, gid) diff --git a/cornflow-server/airflow_config/scripts/solvers/get_mipcl.py b/cornflow-server/airflow_config/scripts/solvers/get_mipcl.py index bd6224411..8dc7aa9d2 100644 --- a/cornflow-server/airflow_config/scripts/solvers/get_mipcl.py +++ b/cornflow-server/airflow_config/scripts/solvers/get_mipcl.py @@ -25,7 +25,7 @@ def install(): os.chdir(f"{MIPCL.working_dir}/bin") subprocess.check_output(["cp", "mps_mipcl", "/usr/local/bin/mps_mipcl"]) subprocess.check_output(["chmod", "+x", "/usr/local/bin/mps_mipcl"]) - uid = pwd.getpwnam("airflow").pw_uid + uid = pwd.getpwnam("cornflow").pw_uid gid = grp.getgrnam("root").gr_gid mips_path = "/usr/local/bin/mps_mipcl" os.chown(mips_path, uid, gid) diff --git a/cornflow-server/changelog.rst b/cornflow-server/changelog.rst index b799408e4..c6fc41feb 100644 --- a/cornflow-server/changelog.rst +++ b/cornflow-server/changelog.rst @@ -1,3 +1,18 @@ +version 1.0.8 +-------------- + +- released: 2023-10-20 +- description: new version of cornflow with new features and bug fixes. +- changelog: + - This version of cornflow is only compatible with Python versions 3.8 or higher, with the desired version for deployment being Python version 3.10 (preferred version for baobab development as well). + - This version of cornflow updates the version of airflow to 2.7.1. + - Almost all library versions have been fixed to avoid dependency problems in future deployments. + - In the ApplicationCore you can define a new class-level argument (like schemas) which is notify. This argument, when True, automatically adds a callback that will send us an email with the log attached in case the model fails when running in Airflow. + - There is a new default DAG (run_deployed_models) that allows us to automatically launch all the models that we have deployed and for which we have defined a test instance in the ApplicationCore definition, so that once deployed we can do a quick test of the correct functioning of the model. + - If we create an execution and in the configuration we have not included all the information, the default values defined in the configuration json schema are taken. + - A command that used to convert models from an external app to jsonschemas is now disabled. + + version 1.0.7 -------------- diff --git a/cornflow-server/cornflow/app.py b/cornflow-server/cornflow/app.py index 613d9e2a2..314a7627b 100644 --- a/cornflow-server/cornflow/app.py +++ b/cornflow-server/cornflow/app.py @@ -49,6 +49,7 @@ def create_app(env_name="development", dataconn=None): dictConfig(log_config(app_config[env_name].LOG_LEVEL)) app = Flask(__name__) + app.json.sort_keys = False app.logger.setLevel(app_config[env_name].LOG_LEVEL) app.config.from_object(app_config[env_name]) diff --git a/cornflow-server/cornflow/cli/schemas.py b/cornflow-server/cornflow/cli/schemas.py index 5f523a217..3c24d7462 100644 --- a/cornflow-server/cornflow/cli/schemas.py +++ b/cornflow-server/cornflow/cli/schemas.py @@ -25,7 +25,7 @@ def schemas(): @schemas.command( name="generate_from_schema", - help="Command to generate models, endpoints and schemas from a jsonschema" + help="Command to generate models, endpoints and schemas from a jsonschema", ) @click.option( "--path", "-p", type=str, help="The absolute path to the JSONSchema", required=True @@ -70,7 +70,13 @@ def schemas(): required=False, ) def generate_from_schema( - path, app_name, output_path, remove_methods, one, endpoints_methods, endpoints_access + path, + app_name, + output_path, + remove_methods, + one, + endpoints_methods, + endpoints_access, ): """ This method is executed for the command and creates all the files for the REST API from the provided JSONSchema @@ -126,59 +132,64 @@ def generate_from_schema( output_path=output_path, options=methods_to_add, name_table=name_table, - endpoints_access=dict_endpoints_access + endpoints_access=dict_endpoints_access, ).main() -@schemas.command(name="schema_from_models", help="Command to generate a jsonschema from a set of models") -@click.option( - "--path", - "-p", - type=str, - help="The absolute path to folder containing the models", - required=True, -) -@click.option("--output-path", "-o", type=str, help="The output path", required=False) -@click.option( - "--ignore-files", - "-i", - type=str, - help="Files that will be ignored (with the .py extension). " - "__init__.py files are automatically ignored. Ex: 'instance.py'", - multiple=True, - required=False, -) -@click.option( - "--leave-bases/--no-leave-bases", - "-l/-nl", - default=False, - help="Use this option to leave the bases classes BaseDataModel, " - "EmptyModel and TraceAttributes in the schema. By default, they will be deleted", -) -def schema_from_models(path, output_path, ignore_files, leave_bases): - """ - - :param str path: the path to the folder that contains the models - :param output_path: the output path where the JSONSchema should be placed - :param str ignore_files: files to be ignored. - :param str leave_bases: if the JSONSchema should have abstract classes used as the base for other clases. - :return: a click status code - :rtype: int - """ - path = path.replace("\\", "/") - output = None - if output_path: - output = output_path.replace("\\", "/") - - if ignore_files: - ignore_files = list(ignore_files) - - click.echo("Generating JSONSchema file from the REST API") - click.echo(f"The path to the JSONSchema is {path}") - click.echo(f"The output_path is {output}") - click.echo(f"The ignore_files is {ignore_files}") - click.echo(f"The leave_bases is {leave_bases}") - - SchemaGenerator( - path, output_path=output, ignore_files=ignore_files, leave_bases=leave_bases - ).main() +# @schemas.command( +# name="schema_from_models", +# help="Command to generate a jsonschema from a set of models", +# ) +# @click.option( +# "--path", +# "-p", +# type=str, +# help="The absolute path to folder containing the models", +# required=True, +# ) +# @click.option("--output-path", "-o", type=str, help="The output path", required=False) +# @click.option( +# "--ignore-files", +# "-i", +# type=str, +# help="Files that will be ignored (with the .py extension). " +# "__init__.py files are automatically ignored. Ex: 'instance.py'", +# multiple=True, +# required=False, +# ) +# @click.option( +# "--leave-bases/--no-leave-bases", +# "-l/-nl", +# default=False, +# help="Use this option to leave the bases classes BaseDataModel, " +# "EmptyModel and TraceAttributes in the schema. By default, they will be deleted", +# ) +# def schema_from_models(path, output_path, ignore_files, leave_bases): +# """ +# +# :param str path: the path to the folder that contains the models +# :param output_path: the output path where the JSONSchema should be placed +# :param str ignore_files: files to be ignored. +# :param str leave_bases: if the JSONSchema should have abstract classes used as the base for other clases. +# :return: a click status code +# :rtype: int +# """ +# path = path.replace("\\", "/") +# output = None +# if output_path: +# output = output_path.replace("\\", "/") +# +# if ignore_files: +# ignore_files = list(ignore_files) +# +# click.echo("Generating JSONSchema file from the REST API") +# click.echo(f"The path to the JSONSchema is {path}") +# click.echo(f"The output_path is {output}") +# click.echo(f"The ignore_files is {ignore_files}") +# click.echo(f"The leave_bases is {leave_bases}") +# +# SchemaGenerator( +# path, output_path=output, ignore_files=ignore_files, leave_bases=leave_bases +# ).main() +# +# return True diff --git a/cornflow-server/cornflow/cli/tools/schema_generator.py b/cornflow-server/cornflow/cli/tools/schema_generator.py index a9cc3276a..890e840f0 100644 --- a/cornflow-server/cornflow/cli/tools/schema_generator.py +++ b/cornflow-server/cornflow/cli/tools/schema_generator.py @@ -6,6 +6,8 @@ import importlib.util from distutils.dir_util import copy_tree from unittest.mock import MagicMock + +import click from flask_sqlalchemy import SQLAlchemy import shutil from pytups import TupList, SuperDict @@ -15,7 +17,6 @@ class SchemaGenerator: def __init__(self, path, output_path=None, ignore_files=None, leave_bases=False): - self.path = path self.tmp_path = os.path.join(os.getcwd(), "tmp_files") self.output_path = output_path or "./output_schema.json" @@ -76,7 +77,6 @@ def parse(self, files): db = SQLAlchemy() try: for file_path, file_name in files: - spec = importlib.util.spec_from_file_location(file_name, file_path) mod = importlib.util.module_from_spec(spec) @@ -142,7 +142,7 @@ def parse(self, files): db.session.close() except Exception as err: - print(err) + click.echo(err) def inherit(self): all_classes = set(self.parents.keys()) diff --git a/cornflow-server/cornflow/endpoints/execution.py b/cornflow-server/cornflow/endpoints/execution.py index 8f6ddd7f4..579eb71dc 100644 --- a/cornflow-server/cornflow/endpoints/execution.py +++ b/cornflow-server/cornflow/endpoints/execution.py @@ -39,7 +39,11 @@ EXEC_STATE_QUEUED, ) from cornflow.shared.exceptions import AirflowError, ObjectDoesNotExist, InvalidData -from cornflow.shared.validators import json_schema_validate_as_string +from cornflow.shared.validators import ( + json_schema_validate_as_string, + json_schema_extend_and_validate_as_string, +) + class ExecutionEndpoint(BaseMetaResource): """ @@ -76,12 +80,10 @@ def get(self, **kwargs): ] running_executions = [ - execution for execution in executions - if execution.state in [ - EXEC_STATE_RUNNING, - EXEC_STATE_QUEUED, - EXEC_STATE_UNKNOWN - ] + execution + for execution in executions + if execution.state + in [EXEC_STATE_RUNNING, EXEC_STATE_QUEUED, EXEC_STATE_UNKNOWN] ] for execution in running_executions: @@ -146,14 +148,6 @@ def post(self, **kwargs): user=self.get_user(), idx=execution.instance_id ) - if instance is None: - err = "The instance to solve does not exist" - raise ObjectDoesNotExist( - error=err, - log_txt=f"Error while user {self.get_user()} tries to create an execution " - f"for instance {execution.instance_id}. " + err, - ) - current_app.logger.debug(f"The request is: {request.args.get('run')}") # this allows testing without airflow interaction: if request.args.get("run", "1") == "0": @@ -184,7 +178,9 @@ def post(self, **kwargs): # Validate config before running the dag config_schema = DeployedDAG.get_one_schema(config, schema, CONFIG_SCHEMA) - config_errors = json_schema_validate_as_string(config_schema, kwargs["config"]) + new_config, config_errors = json_schema_extend_and_validate_as_string( + config_schema, kwargs["config"] + ) if config_errors: execution.update_state( EXEC_STATE_ERROR_START, @@ -197,6 +193,8 @@ def post(self, **kwargs): log_txt=f"Error while user {self.get_user()} tries to create an execution. " f"Configuration data does not match the jsonschema.", ) + elif new_config != kwargs["config"]: + execution.update_config(new_config) # Validate instance data before running the dag instance_schema = DeployedDAG.get_one_schema(config, schema, INSTANCE_SCHEMA) @@ -326,7 +324,9 @@ def post(self, idx, **kwargs): }, 201 # Validate config before running the dag - config_schema = DeployedDAG.get_one_schema(config, kwargs["schema"], CONFIG_SCHEMA) + config_schema = DeployedDAG.get_one_schema( + config, kwargs["schema"], CONFIG_SCHEMA + ) config_errors = json_schema_validate_as_string(config_schema, kwargs["config"]) if config_errors: raise InvalidData( @@ -444,14 +444,18 @@ def put(self, idx, **data): schema = ExecutionModel.get_one_object(user=self.get_user(), idx=idx).schema if data.get("data") is not None and schema is not None: - data_jsonschema = DeployedDAG.get_one_schema(config, schema, SOLUTION_SCHEMA) - validation_errors = json_schema_validate_as_string(data_jsonschema, data["data"]) + data_jsonschema = DeployedDAG.get_one_schema( + config, schema, SOLUTION_SCHEMA + ) + validation_errors = json_schema_validate_as_string( + data_jsonschema, data["data"] + ) if validation_errors: raise InvalidData( payload=dict(jsonschema_errors=validation_errors), log_txt=f"Error while user {self.get_user()} tries to edit execution {idx}. " - f"Solution data does not match the jsonschema.", + f"Solution data does not match the jsonschema.", ) current_app.logger.info(f"User {self.get_user()} edits execution {idx}") diff --git a/cornflow-server/cornflow/models/dag.py b/cornflow-server/cornflow/models/dag.py index a45aeaf3d..40124c359 100644 --- a/cornflow-server/cornflow/models/dag.py +++ b/cornflow-server/cornflow/models/dag.py @@ -71,7 +71,8 @@ def get_one_schema(config, dag_name, schema=INSTANCE_SCHEMA): jsonschema = item.instance_checks_schema elif schema == SOLUTION_CHECKS_SCHEMA: jsonschema = item.solution_checks_schema - else: # schema == CONFIG_SCHEMA + # schema == CONFIG_SCHEMA + else: jsonschema = item.config_schema if jsonschema is None: diff --git a/cornflow-server/cornflow/models/execution.py b/cornflow-server/cornflow/models/execution.py index 680923ddf..fe17aa94e 100644 --- a/cornflow-server/cornflow/models/execution.py +++ b/cornflow-server/cornflow/models/execution.py @@ -99,6 +99,16 @@ def update(self, data): self.checks = None super().update(data) + def update_config(self, config: dict): + """ + Method to update the config of the execution after extending with default values + + :param dict config: The config to store + :return: nothing + """ + self.config = config + super().update({}) + def update_state(self, code, message=None): """ Method to update the state code and message of an execution diff --git a/cornflow-server/cornflow/shared/validators.py b/cornflow-server/cornflow/shared/validators.py index 49c6ae97d..550cb9de1 100644 --- a/cornflow-server/cornflow/shared/validators.py +++ b/cornflow-server/cornflow/shared/validators.py @@ -4,8 +4,9 @@ import re from typing import Tuple, Union -from jsonschema import Draft7Validator +from jsonschema import Draft7Validator, validators from disposable_email_domains import blocklist +from jsonschema.protocols import Validator def is_special_character(character): @@ -66,6 +67,27 @@ def check_email_pattern(email: str) -> Tuple[bool, Union[str, None]]: return True, None +def extend_with_default(validator_class): + """ + Method to extend a validator, so it extends the data with the default values defined on the jsonschema + """ + validate_properties = validator_class.VALIDATORS["properties"] + + def set_defaults(validator, properties, instance, schema): + for prop, sub in properties.items(): + if "default" in sub: + instance.setdefault(prop, sub["default"]) + for error in validate_properties( + validator, + properties, + instance, + schema, + ): + yield error + + return validators.extend(validator_class, {"properties": set_defaults}) + + def json_schema_validate(schema: dict, data: dict) -> list: """ Method to validate some data against a json schema @@ -81,6 +103,23 @@ def json_schema_validate(schema: dict, data: dict) -> list: return [] +def json_schema_extend_and_validate(schema: dict, data: dict) -> Tuple[dict, list]: + """ + Method to validate som data, extend it with default values and give back the processed errors + + :param dict schema: the json schema in dict format. + :param dict data: the data to validate in dict format + :return: a tuple with the data extended and the errors found + :rtype: tuple + """ + data_cp = dict(data) + default_validator = extend_with_default(Draft7Validator) + validator = default_validator(schema) + if not validator.is_valid(data_cp): + return data_cp, [e for e in validator.iter_errors(data_cp)] + return data_cp, [] + + def json_schema_validate_as_string(schema: dict, data: dict) -> list: """ Method to validate some data against a json schema @@ -91,3 +130,18 @@ def json_schema_validate_as_string(schema: dict, data: dict) -> list: :rtype: list """ return [str(e) for e in json_schema_validate(schema, data)] + + +def json_schema_extend_and_validate_as_string( + schema: dict, data: dict +) -> Tuple[dict, list]: + """ + Method to extend the schema with default values and give back the processed error + + :param dict schema: the json schema in dict format. + :param dict data: the data to validate in dict format + :return: a tuple with the data extended and the errors found + :rtype: tuple + """ + data_cp, errors = json_schema_extend_and_validate(schema, data) + return data_cp, [str(e) for e in errors] diff --git a/cornflow-server/cornflow/tests/const.py b/cornflow-server/cornflow/tests/const.py index 7063b589e..4f774b228 100644 --- a/cornflow-server/cornflow/tests/const.py +++ b/cornflow-server/cornflow/tests/const.py @@ -16,6 +16,8 @@ def _get_file(relative_path): INSTANCE_FILE_FAIL = _get_file("./unit/test_instances.py") EXECUTION_PATH = _get_file("./data/new_execution.json") +BAD_EXECUTION_PATH = _get_file("./data/bad_execution.json") +EXECUTION_SOLUTION_PATH = _get_file("./data/new_execution_solution.json") EXECUTIONS_LIST = [EXECUTION_PATH, _get_file("./data/new_execution_2.json")] EXECUTION_URL = PREFIX + "/execution/" EXECUTION_URL_NORUN = EXECUTION_URL + "?run=0" @@ -63,6 +65,8 @@ def _get_file(relative_path): ALARMS_URL = PREFIX + "/alarms/" MAIN_ALARMS_URL = PREFIX + "/main-alarms/" +LICENSES_URL = PREFIX + "/licences/" + PUBLIC_DAGS = [ "solve_model_dag", "gc", diff --git a/cornflow-server/cornflow/tests/data/bad_execution.json b/cornflow-server/cornflow/tests/data/bad_execution.json new file mode 100644 index 000000000..d18a303cb --- /dev/null +++ b/cornflow-server/cornflow/tests/data/bad_execution.json @@ -0,0 +1,19 @@ +{"config": { + "solver": 100, + "mip": true, + "msg": true, + "warmStart": true, + "timeLimit": 10, + "options": [""], + "keepFiles": 0, + "gapRel": 0.1, + "gapAbs": 1, + "maxMemory": 1000, + "maxNodes": 1, + "threads": 1, + "logPath": "test_export_solver_json.log" +}, +"name": "execution_1", +"description": "This is a test for the executions", +"schema": "solve_model_dag" +} diff --git a/cornflow-server/cornflow/tests/data/new_execution_solution.json b/cornflow-server/cornflow/tests/data/new_execution_solution.json new file mode 100644 index 000000000..1059cbb7c --- /dev/null +++ b/cornflow-server/cornflow/tests/data/new_execution_solution.json @@ -0,0 +1,123 @@ +{ + "objective": { + "name": "obj", + "coefficients": [ + { + "name": "x", + "value": 1 + }, + { + "name": "y", + "value": 4 + }, + { + "name": "z", + "value": 9 + } + ] + }, + "constraints": [ + { + "sense": -1, + "pi": null, + "constant": -5, + "name": "c1", + "coefficients": [ + { + "name": "x", + "value": 1 + }, + { + "name": "y", + "value": 1 + } + ] + }, + { + "sense": 1, + "pi": null, + "constant": -10, + "name": "c2", + "coefficients": [ + { + "name": "x", + "value": 1 + }, + { + "name": "z", + "value": 1 + } + ] + }, + { + "sense": 0, + "pi": null, + "constant": -7, + "name": "c3", + "coefficients": [ + { + "name": "y", + "value": -1 + }, + { + "name": "z", + "value": 1 + } + ] + }, + { + "sense": 1, + "pi": null, + "constant": 0, + "name": "c4", + "coefficients": [ + { + "name": "w", + "value": 1 + } + ] + } + ], + "variables": [ + { + "lowBound": 0, + "upBound": null, + "cat": "Continuous", + "varValue": 0, + "dj": null, + "name": "w" + }, + { + "lowBound": 0, + "upBound": 4, + "cat": "Continuous", + "varValue": 3, + "dj": null, + "name": "x" + }, + { + "lowBound": -1, + "upBound": 1, + "cat": "Continuous", + "varValue": 0, + "dj": null, + "name": "y" + }, + { + "lowBound": 0, + "upBound": null, + "cat": "Continuous", + "varValue": 7, + "dj": null, + "name": "z" + } + ], + "parameters": { + "name": "test_export_json_LP", + "sense": 1, + "status": 1, + "sol_status": 1 + }, + "sos1": [], + "sos2": [] +} diff --git a/cornflow-server/cornflow/tests/unit/test_executions.py b/cornflow-server/cornflow/tests/unit/test_executions.py index b9e175ebd..d7a94ee4c 100644 --- a/cornflow-server/cornflow/tests/unit/test_executions.py +++ b/cornflow-server/cornflow/tests/unit/test_executions.py @@ -16,6 +16,8 @@ EXECUTION_URL_NORUN, INSTANCE_URL, DAG_URL, + BAD_EXECUTION_PATH, + EXECUTION_SOLUTION_PATH, ) from cornflow.tests.custom_test_case import CustomTestCase, BaseTestCases from cornflow.tests.unit.tools import patch_af_client @@ -38,7 +40,9 @@ def load_file_fk(_file): return temp self.payload = load_file_fk(EXECUTION_PATH) + self.bad_payload = load_file_fk(BAD_EXECUTION_PATH) self.payloads = [load_file_fk(f) for f in EXECUTIONS_LIST] + self.solution = load_file_fk(EXECUTION_SOLUTION_PATH) def test_new_execution(self): self.create_new_row(self.url, self.model, payload=self.payload) @@ -49,6 +53,55 @@ def test_new_execution_run(self, af_client_class): self.create_new_row(EXECUTION_URL, self.model, payload=self.payload) + @patch("cornflow.endpoints.execution.Airflow") + def test_new_execution_bad_config(self, af_client_class): + patch_af_client(af_client_class) + response = self.create_new_row( + EXECUTION_URL, + self.model, + payload=self.bad_payload, + expected_status=400, + check_payload=False, + ) + self.assertIn("error", response) + self.assertIn("jsonschema_errors", response) + + @patch("cornflow.endpoints.execution.Airflow") + def test_new_execution_partial_config(self, af_client_class): + patch_af_client(af_client_class) + self.payload["config"].pop("solver") + response = self.create_new_row( + EXECUTION_URL, self.model, payload=self.payload, check_payload=False + ) + self.assertIn("solver", response["config"]) + self.assertEqual(response["config"]["solver"], "cbc") + + @patch("cornflow.endpoints.execution.Airflow") + def test_new_execution_with_solution(self, af_client_class): + patch_af_client(af_client_class) + self.payload["data"] = self.solution + response = self.create_new_row( + EXECUTION_URL, + self.model, + payload=self.payload, + check_payload=False, + ) + + @patch("cornflow.endpoints.execution.Airflow") + def test_new_execution_with_solution_bad(self, af_client_class): + patch_af_client(af_client_class) + patch_af_client(af_client_class) + self.payload["data"] = {"message": "THIS IS NOT A VALID SOLUTION"} + response = self.create_new_row( + EXECUTION_URL, + self.model, + payload=self.payload, + check_payload=False, + expected_status=400, + ) + self.assertIn("error", response) + self.assertIn("jsonschema_errors", response) + def test_new_execution_no_instance(self): payload = dict(self.payload) payload["instance_id"] = "bad_id" @@ -281,11 +334,7 @@ def test_update_one_row_data(self): def test_stop_execution(self, af_client_class): patch_af_client(af_client_class) - idx = self.create_new_row( - EXECUTION_URL, - self.model, - payload=self.payload - ) + idx = self.create_new_row(EXECUTION_URL, self.model, payload=self.payload) response = self.client.post( self.url + str(idx) + "/", @@ -347,11 +396,13 @@ def setUp(self): @patch("cornflow.endpoints.execution.Airflow") def test_get_one_status(self, af_client_class): patch_af_client(af_client_class) - + idx = self.create_new_row(EXECUTION_URL, self.model, self.payload) payload = dict(self.payload) payload["id"] = idx - data = self.get_one_row(EXECUTION_URL + idx + "/status/", payload, check_payload=False) + data = self.get_one_row( + EXECUTION_URL + idx + "/status/", payload, check_payload=False + ) self.assertEqual(data["state"], 1) @patch("cornflow.endpoints.execution.Airflow") diff --git a/cornflow-server/cornflow/tests/unit/test_licenses.py b/cornflow-server/cornflow/tests/unit/test_licenses.py new file mode 100644 index 000000000..c68743643 --- /dev/null +++ b/cornflow-server/cornflow/tests/unit/test_licenses.py @@ -0,0 +1,45 @@ +from cornflow.endpoints import LicensesEndpoint +from cornflow.tests.const import LICENSES_URL, _get_file +from cornflow.tests.custom_test_case import CustomTestCase + + +class TestLicensesListEndpoint(CustomTestCase): + @staticmethod + def read_requirements(): + with open(_get_file("../../requirements.txt")) as req: + content = req.read() + requirements = content.split("\n") + + requirements = [ + r.split("=")[0].split(">")[0].split("<")[0].lower() + for r in requirements + if r != "" + ] + return requirements + + def setUp(self): + super().setUp() + self.roles_with_access = LicensesEndpoint.ROLES_WITH_ACCESS + self.libraries = self.read_requirements() + + def tearDown(self): + super().tearDown() + + def test_get_licenses(self): + for role in self.roles_with_access: + self.token = self.create_user_with_role(role) + response = self.client.get( + LICENSES_URL, + follow_redirects=True, + headers={ + "Content-Type": "application/json", + "Authorization": "Bearer " + self.token, + }, + ) + + self.assertEqual(200, response.status_code) + self.assertIsInstance(response.json, list) + libraries = [k["library"].lower() for k in response.json] + + for lib in self.libraries: + self.assertIn(lib, libraries) diff --git a/cornflow-server/cornflow/tests/unit/test_schema_from_models.py b/cornflow-server/cornflow/tests/unit/test_schema_from_models.py index 8e39ab04c..e91d7dd2a 100644 --- a/cornflow-server/cornflow/tests/unit/test_schema_from_models.py +++ b/cornflow-server/cornflow/tests/unit/test_schema_from_models.py @@ -1,124 +1,135 @@ -import unittest -import json -import os - -from click.testing import CliRunner - -from cornflow.cli import cli - -path_to_tests = os.path.dirname(os.path.abspath(__file__)) - - -class SchemaFromModelsTests(unittest.TestCase): - def setUp(self): - super().setUp() - self.models_path = self._get_path("../data/models") - self.output_path = self._get_path(os.path.join(os.getcwd(), "test_output.json")) - - @staticmethod - def import_schema(path): - with open(path, "r") as fd: - schema = json.load(fd) - return schema - - @staticmethod - def _get_path(rel_path): - return os.path.join(path_to_tests, rel_path) - - def tearDown(self): - if os.path.exists(self.output_path): - os.remove(self.output_path) - - def test_base(self): - runner = CliRunner() - result = runner.invoke( - cli, - [ - "schemas", - "schema_from_models", - "-p", - self.models_path, - "-o", - self.output_path - ] - ) - - self.assertEqual(result.exit_code, 0) - - schema = self.import_schema(self._get_path(self.output_path)) - - tables = { - "instances": { - "id": "string", - "data": "object", - "checks": "object", - "name": "string", - "description": "string", - }, - "actions": {"id": "integer", "name": "string"}, - "permission_dag": { - "id": "integer", - "dag_id": "string", - "user_id": "integer", - }, - "permission_view": { - "id": "integer", - "action_id": "integer", - "api_view_id": "integer", - "role_id": "integer", - }, - } - required_instance = {"id", "name", "data_hash"} - foreign_keys = [ - ("permission_dag", "dag_id", "deployed_dags.id"), - ("permission_dag", "user_id", "users.id"), - ("permission_view", "action_id", "actions.id"), - ("permission_view", "api_view_id", "api_view.id"), - ] - for tab_name, tab_checks in tables.items(): - # All tables exist - self.assertIn(tab_name, schema["properties"]) - # The properties have correct types - for prop, type_prop in tab_checks.items(): - table_props = schema["properties"][tab_name]["items"]["properties"] - self.assertIn(prop, table_props) - self.assertIn("type", table_props.get(prop, {}).keys()) - self.assertEqual( - type_prop, table_props.get(prop, {}).get("type", "null") - ) - # The foreign keys are correct - for tab, key, foreign_key in foreign_keys: - self.assertIn( - "foreign_key", schema["properties"][tab]["items"]["properties"][key] - ) - self.assertEqual( - schema["properties"][tab]["items"]["properties"][key]["foreign_key"], - foreign_key, - ) - # The required property is correct - self.assertEqual( - required_instance, - set(schema["properties"]["instances"]["items"]["required"]), - ) - - def test_ignore(self): - runner = CliRunner() - result = runner.invoke( - cli, - [ - "schemas", - "schema_from_models", - "-p", - self.models_path, - "-o", - self.output_path, - "-i", - "instance.py" - ] - ) - - self.assertEqual(result.exit_code, 0) - - schema = self.import_schema(self.output_path) - - self.assertNotIn("instances", schema["properties"].keys()) +# import json +# import os +# import unittest +# +# from click.testing import CliRunner +# from flask_testing import TestCase +# +# from cornflow.app import create_app +# from cornflow.cli import cli +# from cornflow.shared import db +# +# path_to_tests = os.path.dirname(os.path.abspath(__file__)) +# +# +# class SchemaFromModelsTests(TestCase): +# def create_app(self): +# app = create_app("testing") +# return app +# +# def setUp(self): +# db.create_all() +# self.models_path = self._get_path("../../models") +# print(self.models_path) +# self.output_path = self._get_path(os.path.join(os.getcwd(), "test_output.json")) +# print(self.output_path) +# +# @staticmethod +# def import_schema(path): +# with open(path, "r") as fd: +# schema = json.load(fd) +# return schema +# +# @staticmethod +# def _get_path(rel_path): +# return os.path.join(path_to_tests, rel_path) +# +# def tearDown(self): +# db.session.remove() +# db.drop_all() +# if os.path.exists(self.output_path): +# os.remove(self.output_path) +# +# def test_base(self): +# runner = CliRunner() +# result = runner.invoke( +# cli, +# [ +# "schemas", +# "schema_from_models", +# "-p", +# self.models_path, +# "-o", +# self.output_path, +# ], +# ) +# +# self.assertEqual(result.exit_code, True) +# +# schema = self.import_schema(self._get_path(self.output_path)) +# +# tables = { +# "instances": { +# "id": "string", +# "data": "object", +# "checks": "object", +# "name": "string", +# "description": "string", +# }, +# "actions": {"id": "integer", "name": "string"}, +# "permission_dag": { +# "id": "integer", +# "dag_id": "string", +# "user_id": "integer", +# }, +# "permission_view": { +# "id": "integer", +# "action_id": "integer", +# "api_view_id": "integer", +# "role_id": "integer", +# }, +# } +# required_instance = {"id", "name", "data_hash"} +# foreign_keys = [ +# ("permission_dag", "dag_id", "deployed_dags.id"), +# ("permission_dag", "user_id", "users.id"), +# ("permission_view", "action_id", "actions.id"), +# ("permission_view", "api_view_id", "api_view.id"), +# ] +# for tab_name, tab_checks in tables.items(): +# # All tables exist +# self.assertIn(tab_name, schema["properties"]) +# # The properties have correct types +# for prop, type_prop in tab_checks.items(): +# table_props = schema["properties"][tab_name]["items"]["properties"] +# self.assertIn(prop, table_props) +# self.assertIn("type", table_props.get(prop, {}).keys()) +# self.assertEqual( +# type_prop, table_props.get(prop, {}).get("type", "null") +# ) +# # The foreign keys are correct +# for tab, key, foreign_key in foreign_keys: +# self.assertIn( +# "foreign_key", schema["properties"][tab]["items"]["properties"][key] +# ) +# self.assertEqual( +# schema["properties"][tab]["items"]["properties"][key]["foreign_key"], +# foreign_key, +# ) +# # The required property is correct +# self.assertEqual( +# required_instance, +# set(schema["properties"]["instances"]["items"]["required"]), +# ) +# +# def test_ignore(self): +# runner = CliRunner() +# result = runner.invoke( +# cli, +# [ +# "schemas", +# "schema_from_models", +# "-p", +# self.models_path, +# "-o", +# self.output_path, +# "-i", +# "instance.py", +# ], +# ) +# +# self.assertEqual(result.exit_code, True) +# +# schema = self.import_schema(self.output_path) +# +# self.assertNotIn("instances", schema["properties"].keys()) diff --git a/cornflow-server/docs/source/dev/cornflow_client.rst b/cornflow-server/docs/source/dev/cornflow_client.rst index 841a41db0..5d68b9f8b 100644 --- a/cornflow-server/docs/source/dev/cornflow_client.rst +++ b/cornflow-server/docs/source/dev/cornflow_client.rst @@ -65,9 +65,12 @@ Solving status .. data:: cornflow_client.constants.STATUS_INFEASIBLE .. data:: cornflow_client.constants.STATUS_UNBOUNDED .. data:: cornflow_client.constants.STATUS_UNDEFINED -.. data:: cornflow_client.constants.STATUS_TIME_LIMIT +.. data:: cornflow_client.constants.STATUS_FEASIBLE .. data:: cornflow_client.constants.STATUS_MEMORY_LIMIT .. data:: cornflow_client.constants.STATUS_NODE_LIMIT +.. data:: cornflow_client.constants.STATUS_TIME_LIMIT +.. data:: cornflow_client.constants.STATUS_LICENSING_PROBLEM +.. data:: cornflow_client.constants.STATUS_QUEUED ============================================================ ========== Constant Value @@ -77,9 +80,12 @@ Constant Value :data:`cornflow_client.constants.STATUS_INFEASIBLE` -1 :data:`cornflow_client.constants.STATUS_UNBOUNDED` -2 :data:`cornflow_client.constants.STATUS_UNDEFINED` -3 -:data:`cornflow_client.constants.STATUS_TIME_LIMIT` 2 +:data:`cornflow_client.constants.STATUS_FEASIBLE` 2 :data:`cornflow_client.constants.STATUS_MEMORY_LIMIT` 3 :data:`cornflow_client.constants.STATUS_NODE_LIMIT` 4 +:data:`cornflow_client.constants.STATUS_TIME_LIMIT` 5 +:data:`cornflow_client.constants.STATUS_LICENSING_PROBLEM` -5 +:data:`cornflow_client.constants.STATUS_QUEUED` -7 ============================================================ ========== diff --git a/cornflow-server/docs/source/guides/deploy_solver_new.rst b/cornflow-server/docs/source/guides/deploy_solver_new.rst index 16f49b60e..aa2def821 100644 --- a/cornflow-server/docs/source/guides/deploy_solver_new.rst +++ b/cornflow-server/docs/source/guides/deploy_solver_new.rst @@ -30,18 +30,29 @@ We will go over each of the required properties below. Instance class --------------- -This is just a subclass of :py:class:`~cornflow_client.core.instance.InstanceCore`. There are many default methods that can be overwritten (``to_dict``, ``from_dict``, etc.). The only required property is the ``schema``. Here we have just imported a file with the corresponding json-schema. If you want to know how to define a json-schema, check the section :ref:`Write a json-schema`. +This is just a subclass of :py:class:`~cornflow_client.core.instance.InstanceCore`. There are many default methods that can be overwritten (``to_dict``, ``from_dict``, etc.). The only required properties are the ``schema`` and ``schema_checks``. Here we have just imported a file with the corresponding json-schema for the ``schema``, and defined an empty schema for the ``schema_checks``. If you want to know how to define a json-schema, check the section :ref:`Write a json-schema`. +The instance can also define a check() method. .. code-block:: python class Instance(InstanceCore): schema = load_json(os.path.join(os.path.dirname(__file__), "input.json")) + schema_checks = get_empty_schema() + +check +***************** + +``check`` returns a dictionary of lists. Each key in the dictionary represents a specific validation. Each entry of the list represents a violation of the requirement checked in this validation. + +schema_checks +***************** +``schema_checks`` returns a jsonschema corresponding to the output of the ``check`` method. Solution class --------------- -Very similar to the Instance. The Solution is just a subclass of :py:class:`~cornflow_client.core.solution.SolutionCore`. +Very similar to the Instance. The Solution is just a subclass of :py:class:`~cornflow_client.core.solution.SolutionCore`. The only required property is the ``schema``. .. code-block:: python @@ -51,7 +62,7 @@ Very similar to the Instance. The Solution is just a subclass of :py:class:`~cor Experiment class ----------------- -Although not strictly necessary, it is usually good practice to define an Experiment class that subclasses :py:class:`~cornflow_client.core.experiment.ExperimentCore`. This class takes as input an :ref:`Instance class` and a :ref:`Solution class`. Its purpose is to evaluate and validate a given solution. To achieve this, the class should implement at least two methods ``get_objective`` and ``check_solution``. +Although not strictly necessary, it is usually good practice to define an Experiment class that subclasses :py:class:`~cornflow_client.core.experiment.ExperimentCore`. This class takes as input an :ref:`Instance class` and a :ref:`Solution class`. Its purpose is to evaluate and validate a given solution. To achieve this, the class should implement at least two methods ``get_objective`` and ``check_solution`` and a field ``schema_checks``. get_objective ***************** @@ -62,30 +73,21 @@ get_objective check_solution ***************** -``check_solution`` returns a dictionary of dictionaries. Each key in the first dictionary represents a specific validation. Each key in the second dictionary represents the domain of a given validation where the solution violates its requirement. The value of the second dictionary represents the extent of the violation. +``check_solution`` returns a dictionary of lists. Each key in the dictionary represents a specific validation. Each entry of the list represents a violation of the requirement checked in this validation. In the example below for the TSP, a possible value for ``check_solution()`` could be: .. code-block:: python { - "missing_nodes": {5: 1, 6: 1} + "missing_nodes": [{"node": 5}, {"node": 6}] } -Which implies that the node 5 and node 6 have not been visited in the solution. The value 1 in this case is not used. - - -It's important that there should not be more than two dictionary indentation. For example, this would be invalid: - -.. code-block:: python - - { - "missing_nodes": { - "missing_nodes_1": {5: 1, 6: 1}, - "missing_nodes_2": {1: 1, 2: 2}, - } - } +Which implies that the node 5 and node 6 have not been visited in the solution. +schema_checks +***************** +``schema_checks`` returns a jsonschema corresponding to the output of the ``check_solution`` method. Example @@ -95,6 +97,8 @@ Example class Experiment(ExperimentCore): + schema_checks = get_empty_schema() + def get_objective(self) -> float: # we get a sorted list of nodes by position route = ( @@ -112,9 +116,9 @@ Example def check_solution(self, *args, **kwargs) -> dict: nodes_in = TupList(v["n1"] for v in self.instance.data["arcs"]).to_set() nodes_out = TupList(n["node"] for n in self.solution.data["route"]).to_set() - missing_nodes = {n: 1 for n in (nodes_in - nodes_out)} + missing_nodes = [{"node": n} for n in (nodes_in - nodes_out)] positions = TupList(n["pos"] for n in self.solution.data["route"]).to_set() - missing_positions = {p: 1 for p in set(range(len(nodes_in))) - positions} + missing_positions = [{"position": p} for p in set(range(len(nodes_in))) - positions] return SuperDict( missing_nodes=missing_nodes, missing_positions=missing_positions ) @@ -136,8 +140,12 @@ Each solver is a subclass of the :ref:`Experiment class` and should define one a .kvapply(lambda k, v: dict(pos=k, node=v)) ) self.solution = Solution(dict(route=nodes)) - return {} + return dict( + status_sol=SOLUTION_STATUS_FEASIBLE, + status=STATUS_UNDEFINED + ) +The output of the ``solve`` method should be a dictionary contains the state of the resolution. The status mapping can be found in ``cornflow_client.constants``. The ``status_sol`` item should indicate whether the execution has found a solution or not, while the ``status`` item should return the state of the resolution (optimal, stopped because of time limit, unfeasible...). More than one solution method can be defined. This is why they are given in a dictionary to the :ref:`Application class`. We use them as a catalogue when deciding to solve a problem. @@ -237,6 +245,7 @@ In this example we put everything inside the ``__init__.py`` (except the json-sc class Instance(InstanceCore): schema = load_json(os.path.join(os.path.dirname(__file__), "input.json")) + schema_checks = get_empty_schema() class Solution(SolutionCore): @@ -244,6 +253,8 @@ In this example we put everything inside the ``__init__.py`` (except the json-sc class Experiment(ExperimentCore): + schema_checks = get_empty_schema() + def get_objective(self) -> float: # we get a sorted list of nodes by position route = ( @@ -278,7 +289,10 @@ In this example we put everything inside the ``__init__.py`` (except the json-sc .kvapply(lambda k, v: dict(pos=k, node=v)) ) self.solution = Solution(dict(route=nodes)) - return {} + return dict( + status_sol=SOLUTION_STATUS_FEASIBLE, + status=STATUS_UNDEFINED + ) class TspApp(ApplicationCore): diff --git a/cornflow-server/docs/source/main/architecture.rst b/cornflow-server/docs/source/main/architecture.rst index 122e25957..19f309df5 100644 --- a/cornflow-server/docs/source/main/architecture.rst +++ b/cornflow-server/docs/source/main/architecture.rst @@ -54,17 +54,17 @@ Main data flows Create instance (data): #. Client calls Cornflow and sends instance. -#. Cornflow asks airflow for the schema of the instance and validates the instance matches the schema. +#. Cornflow validates the instance matches the app's jsonschema. #. Cornflow saves the instance and returns the instance code to client. Solve instance (instance, config, dag): -#. Client calls Cornflow and gives instance code and execution configuration. -#. Cornflow asks cornflow for schema and validates the instance matches the dag to execute. +#. Client calls Cornflow and gives instance code, execution configuration and eventually an existing solution. +#. Cornflow validates the instance matches the jsonschema of the dag to execute. #. Cornflow calls airflow dag and assigns dagrun code to execution. #. Cornflow creates execution and returns the execution code to client. #. Airflow creates a rundag for the selected dag and sends it to a worker. -#. The worker asks Cornflow for the instance and the config. +#. The worker asks Cornflow for the instance, the config, and eventually the solution data. #. The worker solves the problem. #. The worker sends Cornflow the results (solution and log) of the execution. @@ -97,7 +97,7 @@ Retrieve status (execution): Retrieve schema: #. Client asks Cornflow for the schema to a problem. -#. Cornflow asks Airflow for the schema of a problem. +#. If Cornflow does not know it: it asks Airflow for the schema of a problem. #. Airflow returns the schema if it exists. Get instance data: diff --git a/cornflow-server/docs/source/main/install.rst b/cornflow-server/docs/source/main/install.rst index 48a5a99e1..f33849956 100644 --- a/cornflow-server/docs/source/main/install.rst +++ b/cornflow-server/docs/source/main/install.rst @@ -12,21 +12,20 @@ Install cornflow Cornflow consists of two projects: cornflow (itself) and airflow (from apache). They are conceived to be deployed independently. Here we will explain the "development deploy" that consists on installing them in the same machine. -Download the Cornflow project:: +Create and activate the virtual environment:: - git clone git@github.com:baobabsoluciones/cornflow.git - cd cornflow-server python3 -m venv venv - venv/bin/pip3 install -r requirements-dev.txt - -activate the virtual environment:: - source venv/bin/activate or, in windows:: + python3 -m venv venv venv/Scripts/activate +Install the Cornflow library:: + + venv/bin/pip3 install cornflow + Setup cornflow database ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/cornflow-server/requirements.txt b/cornflow-server/requirements.txt index ca4395140..185d44355 100644 --- a/cornflow-server/requirements.txt +++ b/cornflow-server/requirements.txt @@ -1,7 +1,7 @@ alembic==1.9.2 apispec<=6.2.0 click<=8.1.3 -cornflow-client<=1.0.14 +cornflow-client<=1.0.16 cryptography<=39.0.2 disposable-email-domains>=0.0.86 Flask==2.3.2 @@ -14,7 +14,8 @@ Flask-Migrate<=4.0.4 Flask-RESTful<=0.3.9 Flask-SQLAlchemy==2.5.1 gevent==23.9.1 -greenlet<=2.0.2 +greenlet<=2.0.2;python_version<"3.11" +greenlet==3.0.0;python_version>="3.11" gunicorn<=20.1.0 jsonpatch<=1.32 ldap3<=2.9.1 diff --git a/cornflow-server/setup.py b/cornflow-server/setup.py index 88ed3a1a9..9cb3f0b27 100644 --- a/cornflow-server/setup.py +++ b/cornflow-server/setup.py @@ -9,7 +9,7 @@ setuptools.setup( name="cornflow", - version="1.0.7", + version="1.0.8", author="baobab soluciones", author_email="cornflow@baobabsoluciones.es", description="Cornflow is an open source multi-solver optimization server with a REST API built using flask.", diff --git a/docker-compose-cornflow-celery.yml b/docker-compose-cornflow-celery.yml index ee6ec2681..8e530ef44 100644 --- a/docker-compose-cornflow-celery.yml +++ b/docker-compose-cornflow-celery.yml @@ -1,136 +1,212 @@ -version: '3' +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Basic Airflow cluster configuration for CeleryExecutor with Redis and PostgreSQL. +# +# WARNING: This configuration is for local development. Do not use it in a production deployment. +# +# This configuration supports basic configuration using environment variables or an .env file +# The following variables are supported: +# +# Feel free to modify this file to suit your needs. +version: '3.8' + +x-airflow-common: + &airflow-common + # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # Comment the image line and uncomment the "build" and "context" lines below, Then run `docker-compose build` to build the images. + image: baobabsoluciones/airflow:latest + platform: linux/amd64 + #build: + #context: ./cornflow-server/airflow_config + environment: + &airflow-common-env + AIRFLOW_USER: admin + AIRFLOW_PWD: admin + AIRFLOW_DB_HOST: airflow_db + AIRFLOW_DB_PORT: 5432 + AIRFLOW_DB_USER: airflow + AIRFLOW_DB_PASSWORD: airflow + AIRFLOW_DB: airflow + AIRFLOW__CORE__FERNET_KEY: '' + EXECUTOR: Celery + AIRFLOW__WEBSERVER__INSTANCE_NAME: CornflowEnv + AIRFLOW__WEBSERVER__NAVBAR_COLOR: '#0693e3' + volumes: + - ./cornflow-dags/DAG:/usr/local/airflow/dags + - ./cornflow-dags/requirements.txt:/requirements.txt + - ./cornflow-server/airflow_config/logs:/usr/local/airflow/logs + - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins + - ./cornflow-server/airflow_config/airflow_local_settings.py:/usr/local/airflow/config/airflow_local_settings.py + depends_on: + &airflow-common-depends-on + redis: + condition: service_healthy + airflow_db: + condition: service_healthy + +x-cornflow-common: + &cornflow-common + # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # Comment the image line and uncomment the "build" and "context" lines below, Then run `docker-compose build` to build the images. + image: baobabsoluciones/cornflow:release-v1.0.7 + platform: linux/amd64 + #build: + #context: ./cornflow-server + environment: + &cornflow-common-env + CORNFLOW_ADMIN_USER: cornflow_admin + CORNFLOW_ADMIN_PWD: Cornflow_admin1234 + CORNFLOW_SERVICE_USER: service_user + CORNFLOW_SERVICE_PWD: Service_user1234 + CORNFLOW_DB_HOST: cornflow_db + CORNFLOW_DB_PORT: 5432 + CORNFLOW_DB_USER: cornflow + CORNFLOW_DB_PASSWORD: cornflow + CORNFLOW_DB: cornflow + depends_on: + &cornflow-common-depends-on + cornflow_db: + condition: service_healthy + webserver: + condition: service_healthy services: cornflow: - build: - context: ./cornflow-server - dockerfile: Dockerfile + <<: *cornflow-common restart: always ports: - 5000:5000 + healthcheck: + test: ["CMD-SHELL", "[ -f /usr/src/app/gunicorn.pid ]"] + interval: 30s + timeout: 30s + retries: 5 environment: - - CORNFLOW_ADMIN_USER=cornflow_admin - - CORNFLOW_ADMIN_PWD=Cornflow_admin1234 - - CORNFLOW_SERVICE_USER=service_user - - CORNFLOW_SERVICE_PWD=Service_user1234 - - CORNFLOW_DB_HOST=cornflow_db - - CORNFLOW_DB_PORT=5432 - - CORNFLOW_DB_USER=cornflow - - CORNFLOW_DB_PASSWORD=cornflow - - CORNFLOW_DB=cornflow + <<: *cornflow-common-env depends_on: - - cornflow_db - - webserver + <<: *cornflow-common-depends-on cornflow_db: - image: postgres + image: postgres:15.4 environment: - POSTGRES_USER=cornflow - POSTGRES_PASSWORD=cornflow - POSTGRES_DB=cornflow + healthcheck: + test: ["CMD", "pg_isready", "-U", "cornflow"] + interval: 10s + retries: 5 + start_period: 5s + restart: always volumes: - postgres_cf_data:/var/lib/postgresql/data/ + + airflow_db: + image: postgres:15.4 + environment: + - POSTGRES_USER=airflow + - POSTGRES_PASSWORD=airflow + - POSTGRES_DB=airflow + healthcheck: + test: ["CMD", "pg_isready", "-U", "airflow"] + interval: 10s + retries: 5 + start_period: 5s + volumes: + - postgres_af_data:/var/lib/postgresql/data/ webserver: - build: - context: ./cornflow-server/airflow_config - dockerfile: Dockerfile - restart: always - volumes: - - ./cornflow-dags/DAG:/usr/local/airflow/dags - - ./cornflow-dags/requirements.txt:/requirements.txt - - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins - environment: - - AIRFLOW_USER=admin - - AIRFLOW_PWD=admin - - AIRFLOW_DB_HOST=airflow_db - - AIRFLOW_DB_PORT=5432 - - AIRFLOW_DB_USER=airflow - - AIRFLOW_DB_PASSWORD=airflow - - AIRFLOW_DB=airflow - - AIRFLOW__CORE__FERNET_KEY=L5Z7WRVv5zaexK0OL3pS2stYUF-gx_UmfDBqWQ4br6Y= - - EXECUTOR=Celery + <<: *airflow-common + command: webserver ports: - 8080:8080 - depends_on: - - airflow_db - - redis - command: webserver healthcheck: test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"] interval: 30s timeout: 30s retries: 5 + environment: + <<: *airflow-common-env + restart: always + depends_on: + <<: *airflow-common-depends-on scheduler: - build: - context: ./cornflow-server/airflow_config - dockerfile: Dockerfile + <<: *airflow-common + command: scheduler + healthcheck: + test: ["CMD", "curl", "--fail", "http://localhost:8974/health"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + environment: + <<: *airflow-common-env restart: always depends_on: - - webserver - volumes: - - ./cornflow-dags/DAG:/usr/local/airflow/dags - - ./cornflow-dags/requirements.txt:/requirements.txt - - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins - environment: - - AIRFLOW_USER=admin - - AIRFLOW_PWD=admin - - AIRFLOW_DB_HOST=airflow_db - - AIRFLOW_DB_PORT=5432 - - AIRFLOW_DB_USER=airflow - - AIRFLOW_DB_PASSWORD=airflow - - AIRFLOW_DB=airflow - - AIRFLOW__CORE__FERNET_KEY=L5Z7WRVv5zaexK0OL3pS2stYUF-gx_UmfDBqWQ4br6Y= - - EXECUTOR=Celery - command: scheduler + <<: *airflow-common-depends-on + # You can enable flower by adding "--profile flower" option e.g. docker-compose --profile flower up + # or by explicitly targeted on the command line e.g. docker-compose up flower. + # See: https://docs.docker.com/compose/profiles/ flower: - build: - context: ./cornflow-server/airflow_config - dockerfile: Dockerfile - restart: always - depends_on: - - redis - environment: - - AIRFLOW_DB_HOST=airflow_db - - AIRFLOW_DB_USER=airflow - - AIRFLOW_DB_PASSWORD=airflow - - EXECUTOR=Celery - ports: - - "5555:5555" + <<: *airflow-common command: flower - - airflow_db: - image: postgres + profiles: + - flower + ports: + - "5555:5555" + healthcheck: + test: ["CMD", "curl", "--fail", "http://localhost:5555/"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s environment: - - POSTGRES_USER=airflow - - POSTGRES_PASSWORD=airflow - - POSTGRES_DB=airflow - volumes: - - postgres_af_data:/var/lib/postgresql/data/ + <<: *airflow-common-env + restart: always + depends_on: + <<: *airflow-common-depends-on redis: - image: redis:5.0.5 + image: redis:latest + expose: + - 6379 + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 30s + retries: 50 + start_period: 30s + restart: always worker: - build: - context: ./cornflow-server/airflow_config - dockerfile: Dockerfile + <<: *airflow-common + command: worker + environment: + <<: *airflow-common-env + # Required to handle warm shutdown of the celery workers properly + # See https://airflow.apache.org/docs/docker-stack/entrypoint.html#signal-propagation + DUMB_INIT_SETSID: "0" restart: always depends_on: - - scheduler - volumes: - - ./cornflow-dags/DAG:/usr/local/airflow/dags - - ./cornflow-dags/requirements.txt:/requirements.txt - - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins - environment: - - AIRFLOW_DB_HOST=airflow_db - - AIRFLOW_DB_USER=airflow - - AIRFLOW_DB_PASSWORD=airflow - - AIRFLOW__CORE__FERNET_KEY=L5Z7WRVv5zaexK0OL3pS2stYUF-gx_UmfDBqWQ4br6Y= - - EXECUTOR=Celery - command: worker + <<: *airflow-common-depends-on volumes: postgres_cf_data: diff --git a/docker-compose-cornflow-ldap.yml b/docker-compose-cornflow-ldap.yml index 79735357e..4457dd588 100644 --- a/docker-compose-cornflow-ldap.yml +++ b/docker-compose-cornflow-ldap.yml @@ -1,79 +1,160 @@ -version: '3' + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Basic Airflow cluster configuration for development purposes with LDAP Auth. +# +# WARNING: This configuration is for local development. Do not use it in a production deployment. +# +# This configuration supports basic configuration using environment variables or an .env file +# The following variables are supported: +# +# Feel free to modify this file to suit your needs. +version: '3.8' + +x-airflow-common: + &airflow-common + # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # Comment the image line and uncomment the "build" and "context" lines below, Then run `docker-compose build` to build the images. + image: baobabsoluciones/airflow:latest + platform: linux/amd64 + #build: + #context: ./cornflow-server/airflow_config + environment: + &airflow-common-env + AIRFLOW_DB_HOST: airflow_db + AIRFLOW_DB_PORT: 5432 + AIRFLOW_DB_USER: airflow + AIRFLOW_DB_PASSWORD: airflow + AIRFLOW_DB: airflow + AIRFLOW__WEBSERVER__INSTANCE_NAME: CornflowEnv + AIRFLOW__WEBSERVER__NAVBAR_COLOR: '#0693e3' + AIRFLOW_LDAP_ENABLE: 'True' + AIRFLOW_LDAP_URI: ldap://openldap:389 + AIRFLOW_LDAP_SEARCH: ou=users,dc=example,dc=org + AIRFLOW_LDAP_BIND_USER: cn=admin,dc=example,dc=org + AIRFLOW_LDAP_BIND_PASSWORD: admin + AIRFLOW_LDAP_UID_FIELD: cn + # cornflow user and password from LDAP credentials file in cornflow-server/airflow_config/ldapbootstrap.ldif + CORNFLOW_SERVICE_USER: cornflow + CORNFLOW_SERVICE_PWD: cornflow1234 + volumes: + - ./cornflow-dags/DAG:/usr/local/airflow/dags + - ./cornflow-dags/requirements.txt:/requirements.txt + - ./cornflow-server/airflow_config/logs:/usr/local/airflow/logs + - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins + - ./cornflow-server/airflow_config/airflow_local_settings.py:/usr/local/airflow/config/airflow_local_settings.py + depends_on: + &airflow-common-depends-on + airflow_db: + condition: service_healthy + +x-cornflow-common: + &cornflow-common + # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # Comment the image line and uncomment the "build" and "context" lines below, Then run `docker-compose build` to build the images. + image: baobabsoluciones/cornflow:release-v1.0.7 + platform: linux/amd64 + #build: + #context: ./cornflow-server + environment: + &cornflow-common-env + CORNFLOW_DB_HOST: cornflow_db + CORNFLOW_DB_PORT: 5432 + CORNFLOW_DB_USER: cornflow + CORNFLOW_DB_PASSWORD: cornflow + CORNFLOW_DB: cornflow + AUTH_TYPE: 2 + LDAP_HOST: ldap://openldap:389 + LDAP_BIND_DN: cn=admin,dc=example,dc=org + LDAP_BIND_PASSWORD: admin + LDAP_SERVICE_BASE: ou=service,dc=example,dc=org + CORNFLOW_SERVICE_USER: cornflow + # airflow user and password from LDAP credentials file in cornflow-server/airflow_config/ldapbootstrap.ldif + AIRFLOW_USER: administrator + AIRFLOW_PWD: administrator1234 + depends_on: + &cornflow-common-depends-on + cornflow_db: + condition: service_healthy + webserver: + condition: service_healthy services: cornflow: - build: - context: ./cornflow-server - dockerfile: Dockerfile + <<: *cornflow-common restart: always ports: - 5000:5000 + healthcheck: + test: ["CMD-SHELL", "[ -f /usr/src/app/gunicorn.pid ]"] + interval: 30s + timeout: 30s + retries: 5 environment: - - CORNFLOW_DB_HOST=cornflow_db - - CORNFLOW_DB_PORT=5432 - - CORNFLOW_DB_USER=cornflow - - CORNFLOW_DB_PASSWORD=cornflow - - CORNFLOW_DB=cornflow - - AUTH_TYPE=2 - - LDAP_HOST=ldap://openldap:389 - - LDAP_BIND_DN=cn=admin,dc=example,dc=org - - LDAP_BIND_PASSWORD=admin - - LDAP_SERVICE_BASE=ou=service,dc=example,dc=org - - CORNFLOW_SERVICE_USER=cornflow + <<: *cornflow-common-env depends_on: - - cornflow_db - - webserver + <<: *cornflow-common-depends-on cornflow_db: - image: postgres + image: postgres:15.4 environment: - POSTGRES_USER=cornflow - POSTGRES_PASSWORD=cornflow - POSTGRES_DB=cornflow + healthcheck: + test: ["CMD", "pg_isready", "-U", "cornflow"] + interval: 10s + retries: 5 + start_period: 5s + restart: always volumes: - postgres_cf_data:/var/lib/postgresql/data/ + + airflow_db: + image: postgres:15.4 + environment: + - POSTGRES_USER=airflow + - POSTGRES_PASSWORD=airflow + - POSTGRES_DB=airflow + healthcheck: + test: ["CMD", "pg_isready", "-U", "airflow"] + interval: 10s + retries: 5 + start_period: 5s + volumes: + - postgres_af_data:/var/lib/postgresql/data/ webserver: - build: - context: ./cornflow-server/airflow_config - dockerfile: Dockerfile - restart: always - volumes: - - ./cornflow-dags/DAG:/usr/local/airflow/dags - - ./cornflow-dags/requirements.txt:/requirements.txt - - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins - environment: - - AIRFLOW_DB_HOST=airflow_db - - AIRFLOW_DB_PORT=5432 - - AIRFLOW_DB_USER=airflow - - AIRFLOW_DB_PASSWORD=airflow - - AIRFLOW_DB=airflow - - AIRFLOW_LDAP_ENABLE=True - - AIRFLOW_LDAP_URI=ldap://openldap:389 - - AIRFLOW_LDAP_SEARCH=ou=users,dc=example,dc=org - - AIRFLOW_LDAP_BIND_USER=cn=admin,dc=example,dc=org - - AIRFLOW_LDAP_BIND_PASSWORD=admin - - AIRFLOW_LDAP_UID_FIELD=cn + <<: *airflow-common + command: webserver ports: - 8080:8080 - depends_on: - - airflow_db - - openldap - command: webserver healthcheck: test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"] interval: 30s timeout: 30s retries: 5 - - airflow_db: - image: postgres environment: - - POSTGRES_USER=airflow - - POSTGRES_PASSWORD=airflow - - POSTGRES_DB=airflow - volumes: - - postgres_af_data:/var/lib/postgresql/data/ + <<: *airflow-common-env + restart: always + depends_on: + <<: *airflow-common-depends-on openldap: image: osixia/openldap diff --git a/docker-compose.yml b/docker-compose.yml index 2b4c99695..9308d8226 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,77 +1,148 @@ -version: '3' +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Basic Airflow cluster configuration for development purposes. +# +# WARNING: This configuration is for local development. Do not use it in a production deployment. +# +# This configuration supports basic configuration using environment variables or an .env file +# The following variables are supported: +# +# Feel free to modify this file to suit your needs. +version: '3.8' + +x-airflow-common: + &airflow-common + # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # Comment the image line and uncomment the "build" and "context" lines below, Then run `docker-compose build` to build the images. + image: baobabsoluciones/airflow:latest + platform: linux/amd64 + #build: + #context: ./cornflow-server/airflow_config + environment: + &airflow-common-env + AIRFLOW_USER: admin + AIRFLOW_PWD: admin + AIRFLOW_DB_HOST: airflow_db + AIRFLOW_DB_PORT: 5432 + AIRFLOW_DB_USER: airflow + AIRFLOW_DB_PASSWORD: airflow + AIRFLOW_DB: airflow + AIRFLOW__WEBSERVER__INSTANCE_NAME: CornflowEnv + AIRFLOW__WEBSERVER__NAVBAR_COLOR: '#0693e3' + volumes: + - ./cornflow-dags/DAG:/usr/local/airflow/dags + - ./cornflow-dags/requirements.txt:/requirements.txt + - ./cornflow-server/airflow_config/logs:/usr/local/airflow/logs + - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins + - ./cornflow-server/airflow_config/airflow_local_settings.py:/usr/local/airflow/config/airflow_local_settings.py + depends_on: + &airflow-common-depends-on + airflow_db: + condition: service_healthy + +x-cornflow-common: + &cornflow-common + # In order to add custom dependencies or upgrade provider packages you can use your extended image. + # Comment the image line and uncomment the "build" and "context" lines below, Then run `docker-compose build` to build the images. + image: baobabsoluciones/cornflow:release-v1.0.7 + platform: linux/amd64 + #build: + #context: ./cornflow-server + environment: + &cornflow-common-env + CORNFLOW_ADMIN_USER: cornflow_admin + CORNFLOW_ADMIN_PWD: Cornflow_admin1234 + CORNFLOW_SERVICE_USER: service_user + CORNFLOW_SERVICE_PWD: Service_user1234 + CORNFLOW_DB_HOST: cornflow_db + CORNFLOW_DB_PORT: 5432 + CORNFLOW_DB_USER: cornflow + CORNFLOW_DB_PASSWORD: cornflow + CORNFLOW_DB: cornflow + depends_on: + &cornflow-common-depends-on + cornflow_db: + condition: service_healthy + webserver: + condition: service_healthy services: cornflow: - build: - context: ./cornflow-server - dockerfile: Dockerfile + <<: *cornflow-common restart: always ports: - 5000:5000 + healthcheck: + test: ["CMD-SHELL", "[ -f /usr/src/app/gunicorn.pid ]"] + interval: 30s + timeout: 30s + retries: 5 environment: - - CORNFLOW_ADMIN_USER=cornflow_admin - - CORNFLOW_ADMIN_PWD=Cornflow_admin1234 - - CORNFLOW_SERVICE_USER=service_user - - CORNFLOW_SERVICE_PWD=Service_user1234 - - CORNFLOW_DB_HOST=cornflow_db - - CORNFLOW_DB_PORT=5432 - - CORNFLOW_DB_USER=cornflow - - CORNFLOW_DB_PASSWORD=cornflow - - CORNFLOW_DB=cornflow - - CF_ALARMS_ENDPOINT=0 + <<: *cornflow-common-env depends_on: - - cornflow_db - - webserver + <<: *cornflow-common-depends-on cornflow_db: - image: postgres + image: postgres:15.4 environment: - POSTGRES_USER=cornflow - POSTGRES_PASSWORD=cornflow - POSTGRES_DB=cornflow + healthcheck: + test: ["CMD", "pg_isready", "-U", "cornflow"] + interval: 10s + retries: 5 + start_period: 5s + restart: always volumes: - postgres_cf_data:/var/lib/postgresql/data/ + + airflow_db: + image: postgres:15.4 + environment: + - POSTGRES_USER=airflow + - POSTGRES_PASSWORD=airflow + - POSTGRES_DB=airflow + healthcheck: + test: ["CMD", "pg_isready", "-U", "airflow"] + interval: 10s + retries: 5 + start_period: 5s + volumes: + - postgres_af_data:/var/lib/postgresql/data/ webserver: - build: - context: ./cornflow-server/airflow_config - dockerfile: Dockerfile - restart: always - volumes: - - ./cornflow-dags/DAG:/usr/local/airflow/dags - - ./cornflow-dags/requirements.txt:/requirements.txt - - ./cornflow-server/airflow_config/plugins:/usr/local/airflow/plugins - environment: - - AIRFLOW_USER=admin - - AIRFLOW_PWD=admin - - CORNFLOW_SERVICE_USER=service_user - - CORNFLOW_SERVICE_PWD=Service_user1234 - - AIRFLOW_DB_HOST=airflow_db - - AIRFLOW_DB_PORT=5432 - - AIRFLOW_DB_USER=airflow - - AIRFLOW_DB_PASSWORD=airflow - - AIRFLOW_DB=airflow + <<: *airflow-common + command: webserver ports: - 8080:8080 - depends_on: - - airflow_db - command: webserver healthcheck: test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"] interval: 30s timeout: 30s retries: 5 - - airflow_db: - image: postgres environment: - - POSTGRES_USER=airflow - - POSTGRES_PASSWORD=airflow - - POSTGRES_DB=airflow - volumes: - - postgres_af_data:/var/lib/postgresql/data/ + <<: *airflow-common-env + restart: always + depends_on: + <<: *airflow-common-depends-on volumes: postgres_cf_data: postgres_af_data: - diff --git a/libs/client/README.rst b/libs/client/README.rst index 6a8f537a7..d5f781520 100644 --- a/libs/client/README.rst +++ b/libs/client/README.rst @@ -6,7 +6,7 @@ The aim of this repository is to have a client to use to connect to a deployed c Requirements ~~~~~~~~~~~~ -* python >= 3.6 +* python >= 3.8 Install cornflow-client ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/libs/client/changelog.rst b/libs/client/changelog.rst index 1f8571d94..f741ec520 100644 --- a/libs/client/changelog.rst +++ b/libs/client/changelog.rst @@ -1,3 +1,19 @@ +version 1.0.16 +--------------- + +- released: 2023-10-20 +- description: Small fixes to the cornflow-client +- changelog: + +version 1.0.15 +--------------- + +- released: 2023-10-04 +- description: dropped Python 3.7 support +- changelog: + - dropped python 3.7 support as will the rest of components. + + version 1.0.14 --------------- diff --git a/libs/client/cornflow_client/airflow/dag_utilities.py b/libs/client/cornflow_client/airflow/dag_utilities.py index 8b803dd4d..741b148e6 100644 --- a/libs/client/cornflow_client/airflow/dag_utilities.py +++ b/libs/client/cornflow_client/airflow/dag_utilities.py @@ -10,7 +10,6 @@ from datetime import datetime, timedelta from urllib.parse import urlparse, urljoin - # Imports from modules from cornflow_client import CornFlow, CornFlowApiError @@ -79,7 +78,7 @@ def connect_to_cornflow(secrets): """ # This secret comes from airflow configuration print("Getting connection information from ENV VAR=CF_URI") - uri = secrets.get_conn_uri("CF_URI") + uri = secrets.get_conn_value("CF_URI") conn = urlparse(uri) scheme = conn.scheme if scheme == "cornflow": @@ -314,6 +313,38 @@ def cf_check(fun, dag_name, secrets, **kwargs): ) +def callback_email(context): + from airflow.utils.email import send_email + from airflow.secrets.environment_variables import EnvironmentVariablesBackend + + path_to_log = ( + f"./logs/dag_id={context['dag'].dag_id}/run_id={context['run_id']}" + f"/task_id={context['ti'].task_id}/attempt=1.log" + ) + + environment = EnvironmentVariablesBackend().get_variable("ENVIRONMENT") + notification_email = EnvironmentVariablesBackend().get_variable( + "NOTIFICATION_EMAIL" + ) + environment_name = os.getenv("AIRFLOW__WEBSERVER__INSTANCE_NAME", "CornflowEnv") + + title = f"Airflow. {environment_name} ({environment}). DAG/task error: {context['dag'].dag_id}/{context['ti'].task_id} Failed" + body = f""" + The DAG/task {context['dag'].dag_id}/{context['ti'].task_id} has failed. +
+ The log is attached. + """ + + send_email( + to=[ + notification_email, + ], + subject=title, + html_content=body, + files=[path_to_log], + ) + + class NoSolverException(Exception): pass diff --git a/libs/client/cornflow_client/core/application.py b/libs/client/cornflow_client/core/application.py index b076d66e8..6230b9d9d 100644 --- a/libs/client/cornflow_client/core/application.py +++ b/libs/client/cornflow_client/core/application.py @@ -33,6 +33,13 @@ class ApplicationCore(ABC): """ The application template. """ + # We create a new attribute controlling the use of the notification mail function + def __init__(self): + self._notify = False + + @property + def notify(self) -> bool: + return self._notify @property @abstractmethod diff --git a/libs/client/cornflow_client/core/instance_solution.py b/libs/client/cornflow_client/core/instance_solution.py index 3659b77b9..f856606cb 100644 --- a/libs/client/cornflow_client/core/instance_solution.py +++ b/libs/client/cornflow_client/core/instance_solution.py @@ -366,7 +366,7 @@ def get_week_from_date_string(string: str) -> int: @staticmethod def get_week_from_datetime_string(string: str) -> int: """Returns the integer value of the week for the given string""" - datetime_object = datetime.strptime(string, "%Y-%m-%dT%H:%M:%S") + datetime_object = datetime.strptime(string, "%Y-%m-%dT%H:%M") return datetime_object.isocalendar()[1] @staticmethod diff --git a/libs/client/cornflow_client/tests/unit/test_dag_utilities.py b/libs/client/cornflow_client/tests/unit/test_dag_utilities.py index fdaa33abb..6469dd850 100644 --- a/libs/client/cornflow_client/tests/unit/test_dag_utilities.py +++ b/libs/client/cornflow_client/tests/unit/test_dag_utilities.py @@ -31,8 +31,8 @@ def test_env_connection_vars(self, CornFlow): ] client_instance = CornFlow.return_value client_instance.login.return_value = "" - for (conn_str, user_info, url) in conn_uris: - secrets.get_conn_uri.return_value = conn_str + for conn_str, user_info, url in conn_uris: + secrets.get_conn_value.return_value = conn_str du.connect_to_cornflow(secrets) client_instance.login.assert_called_with( username=user_info[0], pwd=user_info[1] diff --git a/libs/client/cornflow_client/tests/unit/test_instance_solution_methods.py b/libs/client/cornflow_client/tests/unit/test_instance_solution_methods.py index 1ab096b99..36123cca4 100644 --- a/libs/client/cornflow_client/tests/unit/test_instance_solution_methods.py +++ b/libs/client/cornflow_client/tests/unit/test_instance_solution_methods.py @@ -278,7 +278,7 @@ def test_get_week_from_date_string(self): self.assertEqual(result, expected) def test_get_week_from_datetime_string(self): - string = "2022-01-01T12:00:00" + string = "2022-01-01T12:00" result = InstanceSolutionCore.get_week_from_datetime_string(string) expected = 52 self.assertEqual(result, expected) diff --git a/libs/client/requirements.txt b/libs/client/requirements.txt index 38f84b9fc..dc103daed 100644 --- a/libs/client/requirements.txt +++ b/libs/client/requirements.txt @@ -1,8 +1,8 @@ -requests -genson -jsonschema -marshmallow -pytups -ortools +requests<=2.31.0 +genson<=1.2.2 +jsonschema<=4.19.1 +marshmallow<=3.19.0 +pytups<=0.86.2 +ortools<=9.7.2996 pandas>=1.5.2 -PuLP>=2.3 \ No newline at end of file +PuLP<=2.7.0 \ No newline at end of file diff --git a/libs/client/setup.py b/libs/client/setup.py index bb72b26bc..6f2a9fcc5 100644 --- a/libs/client/setup.py +++ b/libs/client/setup.py @@ -12,7 +12,7 @@ setuptools.setup( name="cornflow-client", - version="1.0.15", + version="1.0.16", author="baobab soluciones", author_email="sistemas@baobabsoluciones.es", description="Client to connect to a cornflow server",