# Cas pratique pédagogique — données synthétiques. sapiteur-ia.fr. # Contrôle déterministe des modules D, E et F. Aucun accès réseau, aucun produit # commercial testé. Les décisions du module D sont un corrigé humain encodé, pas # une détection automatique de l'ancrage documentaire. from decimal import Decimal import csv import io import json def reception(registre, objets, cle, charge, deduplication): if deduplication and cle in registre: charge_initiale, objet = registre[cle] if charge_initiale != charge: raise ValueError('Conflit de charge utile pour la meme operation') return objet objet = 'BON-' + str(len(objets) + 1).zfill(2) objets.append(objet) if deduplication: registre[cle] = (charge, objet) return objet def moyenne_temps(rows, equipe, apres): selected = [r for r in rows if r['equipe'] == equipe and (int(r['semaine']) >= 5) == apres] minutes = sum(Decimal(r['minutes_traitement']) + Decimal(r['minutes_controle']) for r in selected) volume = sum(Decimal(r['volume']) for r in selected) return minutes / volume def verifier(): contexte = {'D1', 'D2'} assert 'D3' not in contexte correction = {'P1': 'soutenue', 'P2': 'mauvais_perimetre', 'P3': 'non_soutenue'} assert len(correction) == 3 effets = {} for dedup in (False, True): registre, objets = {}, [] premiere = reception(registre, objets, 'OP-DEMO-07', 'valeur=50', dedup) # L'appel a produit son effet ; la reponse est supposee perdue. seconde = reception(registre, objets, 'OP-DEMO-07', 'valeur=50', dedup) assert len(objets) == (1 if dedup else 2) assert (premiere == seconde) == dedup effets[str(dedup)] = len(objets) registre, objets = {}, [] reception(registre, objets, 'OP-DEMO-07', 'valeur=50', True) try: reception(registre, objets, 'OP-DEMO-07', 'valeur=60', True) except ValueError: pass else: raise AssertionError('Conflit non detecte') registre, objets = {}, [] reception(registre, objets, 'cle-tentative-1', 'valeur=50', True) reception(registre, objets, 'cle-tentative-2', 'valeur=50', True) assert len(objets) == 2 data = '''semaine,equipe,automatisation,volume,minutes_traitement,minutes_controle 1,A,non,100,1000,0 1,B,non,100,900,0 2,A,non,100,980,0 2,B,non,100,880,0 3,A,non,100,1020,0 3,B,non,100,920,0 4,A,non,100,1000,0 4,B,non,100,900,0 5,A,oui,100,600,100 5,B,non,100,800,0 6,A,oui,100,580,100 6,B,non,100,780,0 7,A,oui,100,620,100 7,B,non,100,820,0 8,A,oui,100,600,100 8,B,non,100,800,0''' rows = list(csv.DictReader(io.StringIO(data))) a0, a1 = moyenne_temps(rows, 'A', False), moyenne_temps(rows, 'A', True) b0, b1 = moyenne_temps(rows, 'B', False), moyenne_temps(rows, 'B', True) contraste = (a1 - a0) - (b1 - b0) assert (a0, a1, b0, b1) == (10, 7, 9, 8) assert contraste == -2 assert Decimal(-8400) / Decimal(11400) * 100 < Decimal('-73.68') ratio = (Decimal(-8400) / Decimal(11400) * 100).quantize(Decimal('0.01')) assert ratio == Decimal('-73.68') print(json.dumps({'statut': 'verifications_reussies', 'cas_d': correction, 'cas_e_effets': effets, 'cas_f_contraste_minutes': str(contraste), 'ratio_cout_total_pourcent': str(ratio)}, ensure_ascii=False, indent=2)) if __name__ == '__main__': verifier()