API d'ordonnancement jobshoplib

Table des matières

  • A quoi sert cette API ?

  • Comment rapidement utiliser l'API ?

    • Avant toute chose : token d'utilisation

  • Exemple au format JSON

    • Appel en cURL

    • Appel en python

  • Exemple au format CSV

    • Appel en cURL

    • Appel en python

  • Exemple au format XLSX

    • Appel en cURL

    • Appel en python

A quoi sert cette API ?

JobShopLib est une API d'ordonnancement interrogeable avec un accès limité. Pour se procurer un token d'utilisation, merci de contacter l'équipe Cross Data (support-api@crossdata.tech).

jobshoplib permet de réaliser un ordonnancement de ressources sans aucune installation logicielle nécessaire.

Pour utiliser l'API, trois éléments sont nécessaires :

  1. Un header contenant le type de fichier envoyé et votre token d'utilisation.

  2. Le(s) jeu(x) de données au bon format.

  3. Un fichier de configuration envoyé sous le format de data.

Comment rapidement utiliser l'API ?

L'API a besoin de recevoir l'ensemble des ordres de fabrication afi de réaliser l'ordonnancement. Les ordres de fabrication peuvent être envoyés en plusieurs formats : JSON, Excel (.xlsx) ou CSV. Dans le cas où vous envoyez un CSV ou XLSX le nom du fichier doit forcément être job.

Il faut envoyer ces données à un endpoint de l'API qui va faire le calcul. Ensuite grâce à l'id utilisateur que vous recevrez vous pourrez, en appelant le même endpoint mais avec "/job_id" en plus, récupérer les résultats.

Exemple :

# Make the schedule and store it in a queue
response = requests.post(
    url,
    headers=headers,
    files={
        "job": open("yours_datas.csv", "rb"),
    },
)

# Get the result when the task is done
job_id = response.json()["job_id"]
response = requests.get(
    url/job_id
)

Avant toute chose : token d'utilisation

warning

Pour utiliser l'API, vous aurez besoin d'utiliser un token d'utilisation fourni par Cross Data. Pour s'en procurer un, merci de contacter l'équipe Cross Data. :warning:

Exemple au format JSON

Le format d'entrée pour les références à ordonnancer est le suivant :

"references": [
     {
             "id": "ref_1",
             "id_previous": [
                     ""
             ],
             "id_machine": [
                     "mach_D",
                     "mach_B"
             ],
             "duration": "15",
             "start": "11/02/2022 00:00",
             "end": "02/03/2022 00:00"
     },
     {
             "id": "ref_2",
             "id_previous": [
                     "ref_1"
             ],
             "id_machine": [
                     "mach_C",
                     "mach_A"
             ],
             "duration": "35",
             "start": "11/02/2022 00:00",
             "end": "02/03/2022 00:00"
     },
    ]

Vous retrouverez ici un exemple téléchargeable.

Pour appeler l'API avec ce format, suivez les instruction ci-dessous en Python ou en cURL.

Appel en cURL

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: JSON" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./my-data.json"
$ curl -X GET -H "Authorization: Token my-wonderful-token" -H "TYPE: JSON" https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

import requests
from urllib import request
from datetime import datetime



# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"

# Some test data url (you may change with your own)
URL = "https://cloud.crossdata.tech/s/pnmM56NCTj7szzT/download/format_api_ordo.json"
response = request.urlretrieve(URL, "jobs.json")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "JSON", "Authorization": "Token my-wonderful-token"}

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

config = {
    "JIT": "True",
    "START": now,
}

# Query for scheduling
response = requests.post(
    BASE, headers=headers, files={"job" : open("jobs.json", "rb")}, data=config,
)

response.raise_for_status()
print(response.json())

job_id = response.json()["job_id"]

# Query to get the result
response = requests.get(
    BASE + f"/{job_id}",
    headers=headers
)
response.raise_for_status()
print(response.json())

Exemple au format CSV

Vous retrouverez ici un exemple détaillant le format de données demandé téléchargeable.

Pour appeler l'API avec ce format, suivez les instruction ci-dessous en Python ou en cURL.

Appel en cURL

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: CSV" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./your-datas.csv"
$ curl -X -H "Authorization: Token my-wonderful-token" -H "TYPE: CSV" GET https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"

# Some test data url (you may change with your own)
URL = "https://cloud.crossdata.tech/s/9JMjHXaHZKC4Xkt/download/format_api_ordo.csv"
response = request.urlretrieve(URL, "jobs.csv")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "CSV", "Authorization": "Token my-wonderful-token"}

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Set parameters
config = {
    "JIT": "True",
    "START": now,
}

# Query
response = requests.post(
BASE, headers=headers, files={"job": open("jobs.csv", "rb")}, data=config
)



response.raise_for_status()
print(response.json())

job_id = response.json()["job_id"]

BASE_RES = "https://services.crossdata.tech/jobshop/v1/jobshop"
# Query to get the result
response = requests.get(
    BASE_RES + f"/{job_id}",
    headers=headers
)
response.raise_for_status()
print(response.json())

Exemple au format XLSX

Vous retrouverez ici un exemple détaillant le format de données demandé téléchargeable.

Pour appeler l'API avec ce format, suivez les instruction ci-dessous en Python ou en cURL.

Appel en cURL

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: XLSX" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./your-datas.xlsx"
$ curl -X -H "Authorization: Token my-wonderful-token" -H "TYPE: XLSX" GET https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"

# Some test data url (you may change with your own)
URL = "https://cloud.crossdata.tech/s/54TaDgmQz8i62Jd/download/format_api_ordo.xlsx"
response = request.urlretrieve(URL, "jobs.xlsx")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Set parameters
config = {
    "JIT": "True",
    "START": now,
}

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "XLSX", "Authorization": "Token my-wonderful-token"}


# Query
response = requests.post(
BASE, headers=headers, files={"job": open("jobs.xlsx", "rb")}, data=config
)

response.raise_for_status()
print(response.json())

job_id = response.json()["job_id"]

BASE_RES = "https://services.crossdata.tech/jobshop/v1/jobshop"
# Query to get the result
response = requests.get(
    BASE_RES + f"/{job_id}",
    headers=headers
)
response.raise_for_status()
print(response.json())

Planning d'indisponibilité des machines

La contrainte d'indisponibilité des machines est disponible sur le moteur. Il suffit de renseigner les informations dans le bon format en fonction du format d'entré.

Json

Pour le format json il suffit d'ajouter une clef au fichier. La clef planning_machines. Le format des données dans la clef machine est :

"planning_machines": [
    {
     "id_machine": "mach_A",
     "start": "11/02/2022 00:00",
     "end": "12/02/2022 00:00"
    },
    {
     "id_machine": "mach_A",
     "start": "13/02/2022 00:00",
     "end": "14/02/2022 00:00"
    },
    {
     "id_machine": "mach_B",
     "start": "13/02/2022 00:00",
     "end": "15/02/2022 00:00"
    },
    {
     "id_machine": "mach_C",
     "start": "12/02/2022 00:00",
     "end": "13/02/2022 00:00"
    },
    {
     "id_machine": "mach_D",
     "start": "14/02/2022 00:00",
     "end": "14/02/2022 12:00"
    }
]

Vous retrouverez ici un exemple complet de données.

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: JSON" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./my-data-with-planning.json"
$ curl -X GET -H "Authorization: Token my-wonderful-token" -H "TYPE: JSON" https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"

# Some test data url (you may change with your own)
URL = "https://cloud.crossdata.tech/s/M5wkr5sw2Q3xxdj/download/format_api_ordo_planning.json"
response = request.urlretrieve(URL, "jobs.json")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "JSON", "Authorization": "Token my-wonderful-token"}

# Set parameters
config = {
    "JIT": True,
    "START": now
}

# Query
response = requests.post(
    BASE, headers=headers, files={"job" : open("jobs.json", "rb")}, data=data,
)

response.raise_for_status()

print(response.json())
id_utilisateur = response.json()["job_id"]

# Query to get the result
response = requests.get(
    BASE + f"/{id_utilisateur}",
    headers=headers
)
response.raise_for_status()
print(response.json())

CSV

Pour le format CSV il faut envoyer deux fichiers. Un fichier contenant les tâches, qu'il faut envoyer avec la clef job. Un autre contenant les indisponiblités des machines, avec la clef planning. Vous retrouverez ici un exemple détaillant le format de données pour les plannings demandé téléchargeable.

Appel en cURL

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: CSV" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./your-datas.csv" -F "planning=@./planning_machine.csv"
$ curl -X -H "Authorization: Token my-wonderful-token" -H "TYPE: CSV" GET https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"


# Some test data url (you may change with your own) for jobs
URL = "https://cloud.crossdata.tech/s/9JMjHXaHZKC4Xkt/download/format_api_ordo.csv"
response = request.urlretrieve(URL, "jobs.csv")

# Some test data url (you may change with your own) for planning
URL = "https://cloud.crossdata.tech/s/pAkdtRtX3oqWTbo/download/planning_machine.csv"
response = request.urlretrieve(URL, "planning_machine.csv")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "CSV", "Authorization": "Token my-wonderful-token"}

# Set parameters
data = {
    "JIT": True,
    "START": now
}

# Query
response = requests.post(
    BASE, headers=headers,
    files={
     "job": open("jobs.csv", "rb"),
     "planning": open("planning_machine.csv", "rb")
     },
    data = config
)

response.raise_for_status()
print(response.json())

id_utilisateur = response.json()["job_id"]

BASE_RES = "https://services.crossdata.tech/jobshop/v1/jobshop"
# Query to get the result
response = requests.get(
    BASE_RES + f"/{id_utilisateur}",
    headers=headers
)
response.raise_for_status()
print(response.json())

XLSX

Pour le format XLSX il faut envoyer deux fichiers. Un fichier contenant les tâches, qu'il faut envoyer avec la clef job. Un autre contenant les indisponiblités des machines, avec la clef planning. Vous retrouverez ici un exemple détaillant le format de données pour les plannings demandé téléchargeable.

Appel en cURL

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: XLSX" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./your-datas.xlsx" -F "planning=@./planning_machine.xlsx"
$ curl -X -H "Authorization: Token my-wonderful-token" -H "TYPE: XLSX" GET https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"


# Some test data url (you may change with your own) for jobs
URL = "https://cloud.crossdata.tech/s/54TaDgmQz8i62Jd/download/format_api_ordo.xlsx"
response = request.urlretrieve(URL, "jobs.xlsx")

# Some test data url (you may change with your own) for planning
URL = "https://cloud.crossdata.tech/s/Pr2T6MSfCwjWxm6/download/planning_machine.xlsx"
response = request.urlretrieve(URL, "planning_machine.csv")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "XLSX", "Authorization": "Token my-wonderful-token"}

# Set parameters
config = {
    "JIT": True,
    "START": now
}
# Query
response = requests.post(
    BASE, headers=headers,
    files={
     "job": open("jobs.xlsx", "rb"),
     "planning": open("planning_machine.xlsx", "rb")
     },
    data=config
)

response.raise_for_status()

print(response.json())
id_utilisateur = response.json()["job_id"]

# Query to get the result
response = requests.get(
    BASE + f"/{id_utilisateur}",
    headers=headers
)
response.raise_for_status()
print(response.json())

Ressources Humaines

Grâce à un fichier contenant des informations à propos des opérateurs et des machines, il est possible d'instancier une notion d'affectation d'une tâche à un opérateur.

Json

Pour le format json il suffit d'ajouter une clef au fichier. La clef operator. Le format des données dans la clef machine est :

"operator": [
    {
     "id_operator": "ope1",
     "id_machine": [
             "mach_A",
             "mach_B"
     ]
    },
    {
     "id_operator": "ope2",
     "id_machine": [
             "mach_C",
             "mach_B"
     ]
    },
    {
     "id_operator": "ope3",
     "id_machine": [
             "mach_C",
             "mach_D"
     ]
    },
    {
     "id_operator": "ope4",
     "id_machine": [
             "mach_D"
     ]
    },
    {
     "id_operator": "ope5",
     "id_machine": [
             "mach_C"
     ]
    },
    {
     "id_operator": "ope6",
     "id_machine": [
             "mach_A"
     ]
    }
]

Vous retrouverez ici un exemple complet de données.

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: JSON" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./my-data-operator.json"
$ curl -X GET -H "Authorization: Token my-wonderful-token" -H "TYPE: JSON" https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"

# Some test data url (you may change with your own)
URL = "https://cloud.crossdata.tech/s/ccLtZkBpn3TsPkZ/download/dataset_10refs_planning_operator.json"
response = request.urlretrieve(URL, "jobs.json")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "JSON", "Authorization": "Token my-wonderful-token"}

# Set parameters
config = {
    "JIT": True,
    "START": now
}

# Query
response = requests.post(
    BASE, headers=headers, files={"job" : open("jobs.json", "rb")}, data=data,
)

response.raise_for_status()

print(response.json())
id_utilisateur = response.json()["job_id"]

# Query to get the result
response = requests.get(
    BASE + f"/{id_utilisateur}",
    headers=headers
)
response.raise_for_status()
print(response.json())

CSV

Pour le format CSV il faut envoyer trois fichiers. Un fichier contenant les tâches, qu'il faut envoyer avec la clef job. Un autre contenant les indisponiblités des machines, avec la clef planning. Et un dernier avec la clef operator. Vous retrouverez ici un exemple détaillant le format de données pour les operateurs téléchargeable.

Appel en cURL

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: CSV" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./your-datas.csv" -F "planning=@./planning_machine.csv" -F "operator=@./operator.csv"
$ curl -X -H "Authorization: Token my-wonderful-token" -H "TYPE: CSV" GET https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"


# Some test data url (you may change with your own) for jobs
URL = "https://cloud.crossdata.tech/s/9JMjHXaHZKC4Xkt/download/format_api_ordo.csv"
response = request.urlretrieve(URL, "jobs.csv")

# Some test data url (you may change with your own) for planning
URL = "https://cloud.crossdata.tech/s/pAkdtRtX3oqWTbo/download/planning_machine.csv"
response = request.urlretrieve(URL, "planning_machine.csv")

URL = "https://cloud.crossdata.tech/s/nNiKzCMTxexgj9d/download/operator.csv"
response = request.urlretrieve(URL, "operator.csv")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "CSV", "Authorization": "Token my-wonderful-token"}

# Set parameters
config = {
    "JIT": True,
    "START": now
}

# Query
response = requests.post(
    BASE, headers=headers,
    files={
     "job": open("jobs.csv", "rb"),
     "planning": open("planning_machine.csv", "rb"),
     "operator": open("operator.csv", "rb")
     },
    data = config
)

response.raise_for_status()
print(response.json())

id_utilisateur = response.json()["job_id"]

BASE_RES = "https://services.crossdata.tech/jobshop/v1/jobshop"
# Query to get the result
response = requests.get(
    BASE_RES + f"/{id_utilisateur}",
    headers=headers
)
response.raise_for_status()
print(response.json())

XLSX

Pour le format XLSX il faut envoyer deux fichiers. Un fichier contenant les tâches, qu'il faut envoyer avec la clef job. Un autre contenant les indisponiblités des machines, avec la clef planning. Un autre contenant les indisponiblités des machines, avec la clef planning. Et un dernier avec la clef operator. Vous retrouverez ici un exemple détaillant le format de données pour les opérateurs téléchargeable.

Appel en cURL

$ curl -X POST -H "Authorization: Token my-wonderful-token" -H "TYPE: XLSX" https://services.crossdata.tech/jobshop/v1/jobshop -F "job=@./your-datas.xlsx" -F "planning=@./planning_machine.xlsx" -F "operator=@./operator.xlsx"
$ curl -X -H "Authorization: Token my-wonderful-token" -H "TYPE: XLSX" GET https://services.crossdata.tech/jobshop/v1/jobshop/id_utilisateur

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"


# Some test data url (you may change with your own) for jobs
URL = "https://cloud.crossdata.tech/s/54TaDgmQz8i62Jd/download/format_api_ordo.xlsx"
response = request.urlretrieve(URL, "jobs.xlsx")

# Some test data url (you may change with your own) for planning
URL = "https://cloud.crossdata.tech/s/Pr2T6MSfCwjWxm6/download/planning_machine.xlsx"
response = request.urlretrieve(URL, "planning_machine.xlsx")

URL = "https://cloud.crossdata.tech/s/XJdWRs7Fc6eepAs/download/operator.xlsx"
response = request.urlretrieve(URL, "operator.xlsx")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "XLSX", "Authorization": "Token my-wonderful-token"}

# Set parameters
config = {
    "JIT": True,
    "START": now
}
# Query
response = requests.post(
    BASE, headers=headers,
    files={
     "job": open("jobs.xlsx", "rb"),
     "planning": open("planning_machine.xlsx", "rb"),
     "operator": open("operator.xlsx", "rb")
     },
    data=config
)

response.raise_for_status()

print(response.json())
id_utilisateur = response.json()["job_id"]

# Query to get the result
response = requests.get(
    BASE + f"/{id_utilisateur}",
    headers=headers
)
response.raise_for_status()
print(response.json())

Planning pour les opérateurs

Comme pour les machines, il est possible de préciser des intervals où les opérateurs ne pourront pas opérer. Pour ce faire il suffit d'envoyer un autre fichier ou d'ajouter une clef au fichier json au nom "planning_operator".

Pour appeler l'API avec un planning pour les opérateurs il est nécessaire d'avoir envoyé un fichier opérateur avant.

JSON

Pour le format json il suffit d'ajouter une clef au fichier, la clef doit se présenter sous ce format :

"planning_operator": [
        {
            "id_operator": "ope1",
            "start": "27/07/2022 00:00",
            "end": "29/07/2022 00:00"
        },
        {
            "id_operator": "ope2",
            "start": "27/07/2022 00:00",
            "end": "29/07/2022 00:00"
        },
        {
            "id_operator": "ope3",
            "start": "27/07/2022 00:00",
            "end": "29/07/2022 00:00"
        },
        {
            "id_operator": "ope4",
            "start": "30/07/2022 00:00",
            "end": "07/08/2022 00:00"
        },
        {
            "id_operator": "ope1",
            "start": "30/07/2022 00:00",
            "end": "02/08/2022 00:00"
        }
    ]

De la même manière que précédement il suffit d'envoyer le fichier json avec les bonnes clefs au moment de la requête. Vous pouvez télécharger un exemple de fichier ici.

CSV

Pour le format CSV il sera nécessaire d'ajouter un fichier avec le nom "planning_operator", comme précédement avec "operator". Vous pouvez télécharger un fichier d'exemple de format ici.

# Query
response = requests.post(
    BASE, headers=headers,
    files={
     "job": open("jobs.csv", "rb"),
     "planning": open("planning_machine.csv", "rb"),
     "operator": open("operator.csv", "rb"),
     "planning_operator": open("operator.csv", "rb")
     },
    data=config
)

XLSX

Pour le format XLSX il sera nécessaire d'ajouter un fichier avec le nom "planning_operator", comme précédement avec "operator". Vous pouvez télécharger un fichier d'exemple de format ici.

# Query
response = requests.post(
    BASE, headers=headers,
    files={
     "job": open("jobs.xlsx", "rb"),
     "planning": open("planning_machine.xlsx", "rb"),
     "operator": open("operator.xlsx", "rb"),
     "planning_operator": open("operator.xlsx", "rb")
     },
    data=config
)

Fichier de configuration

Il est possible d'ajouter des paramètres pour personnaliser le calcul. Ces paramètres sont transmis à l'API via l'informatio "data", comme dans les exemple ci-dessus. Deux paramètres sont disponbiles pour le moment :

  • "JIT", qui signifie "just in time" qui va pénaliser les retards et les avances de positionnement des tâches. Just in time est détillé ici. Ce paramètre prends soit "TRUE" soit "FALSE" en valeur qui doivent être des chaines de caractères.

  • "START" qui est un paramètre qui permet de donner une date (au bon format et en chaine de caractère), cette date sera la date de début des opérations.

Appel en python

from datetime import datetime
import requests
from urllib import request


# API url
BASE = "https://services.crossdata.tech/jobshop/v1/jobshop"


# Some test data url (you may change with your own) for jobs
URL = "https://cloud.crossdata.tech/s/54TaDgmQz8i62Jd/download/format_api_ordo.xlsx"
response = request.urlretrieve(URL, "jobs.xlsx")

# Some test data url (you may change with your own) for planning
URL = "https://cloud.crossdata.tech/s/Pr2T6MSfCwjWxm6/download/planning_machine.xlsx"
response = request.urlretrieve(URL, "planning_machine.xlsx")

URL = "https://cloud.crossdata.tech/s/XJdWRs7Fc6eepAs/download/operator.xlsx"
response = request.urlretrieve(URL, "operator.xlsx")

# Today's date in good format
now = datetime.now().strftime("%d/%m/%Y %H:%M")

# Header with CSV sent, fill the token part with yours
headers = {"TYPE": "XLSX", "Authorization": "Token my-wonderful-token"}

# Set parameters
config = {
    "JIT": True,
    "START": now
}

# Query
response = requests.post(
    BASE, headers=headers,
    files={
     "job": open("jobs.xlsx", "rb"),
     "planning": open("planning_machine.xlsx", "rb"),
     "operator": open("operator.xlsx", "rb")
     },
    data=config
)

response.raise_for_status()

print(response.json())
id_utilisateur = response.json()["job_id"]

# Query to get the result
response = requests.get(
    BASE + f"/{id_utilisateur}",
    headers=headers
)
response.raise_for_status()
print(response.json())