File size: 2,241 Bytes
c9329ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aa1cf8a
c9329ee
 
 
 
 
 
 
 
 
 
 
 
aa1cf8a
 
 
c9329ee
 
 
 
aa1cf8a
c9329ee
 
 
 
aa1cf8a
c9329ee
aa1cf8a
c9329ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import pandas as pd
from datetime import datetime, timedelta
import bisect

JOUR_OFFSET = {
    'Monday':    0, 'Tuesday':   1, 'Wednesday': 2, 'Thursday':  3,
    'Friday':    4, 'Saturday':  5, 'Sunday':    6
}
BASE_DATE = datetime(2025, 1, 6)

def parse_slot(slot_str):
    jour, horaire = slot_str.split()
    horaire = horaire.replace(';', ':')
    h, m = map(int, horaire.split(':'))
    date = BASE_DATE + timedelta(days=JOUR_OFFSET[jour])
    return datetime(date.year, date.month, date.day, h, m)

def format_slot(dt):
    return f"{dt.strftime('%A')} {dt.strftime('%H:%M')}"


def add_request(df_fixed, new_slot_str):
    new_dt     = parse_slot(new_slot_str)
    desired_dt = new_dt - timedelta(minutes=5)

    # on récupère les adjusted existants triés
    slots_dt = sorted(parse_slot(s) for s in df_fixed['adjusted_time'])

    # on commence par placer final_dt = desired_dt, puis on recule au besoin
    final_dt = desired_dt

    # boucle tant que final_dt viole au moins une contrainte d'espacement
    while True:
        conflict = False

        # 1) avec le schedule_time
        if new_dt - final_dt < timedelta(minutes=5):
            # on recule pour avoir exactement 7mi d'avance
            final_dt = new_dt - timedelta(minutes=5)
            conflict = True

        # 2) avec chaque adjusted existant
        for slot in slots_dt:
            if abs((slot - final_dt).total_seconds()) < 5*60:
                # on recule de 7min par rapport à cet adjusted
                # si slot > final, on repousse final à slot -7min
                # sinon (slot < final), on recule encore de 7min
                if slot > final_dt:
                    final_dt = slot - timedelta(minutes=5)
                else:
                    final_dt = slot - timedelta(minutes=5)
                conflict = True
                break

        if not conflict:
            break  # on a trouvé un créneau valide

    final_str = format_slot(final_dt)
    df_fixed = pd.concat([
        df_fixed,
        pd.DataFrame([{
            'schedule_time': new_slot_str,
            'adjusted_time': final_str
        }])
    ], ignore_index=True)

    return df_fixed.sort_values('adjusted_time').reset_index(drop=True),final_str