PageSourceSearch

https://www.mytime.fr/presentation-de-la-solution-de-pointeuse-virtuelle

html mytime.fr collected 2026-10-01 14:20:24 UTC 162,932 bytes, 3,229 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
3<head>
4	
4<script>
5		window.dataLayer = window.dataLayer || [];
6		function gtag() { dataLayer.push(arguments); }
7		gtag('consent', 'default', {
8			'ad_user_data': 'denied',
9			'ad_personalization': 'denied',
10			'ad_storage': 'denied',
11			'analytics_storage': 'denied',
12			'wait_for_update': 2000,
13		});
14		dataLayer.push({'gtm.start': new Date().getTime(), 'event': 'gtm.js'});
15	</script>
15
16
17	<!-- Google Tag Manager -->
18	
18<script>
vendor: 346 bytes, lines 18-23
18
19		(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
20			new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
21			j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
22			'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
23		})(window,document,'script','dataLayer','
23GTM-PHZQP63
vendor: 6 bytes, lines 23-24
23');
24	
24</script>
24
25	<!-- End Google Tag Manager -->
26
27	<!-- Meta Pixel Code -->
28	
28<script>
vendor: 432 bytes, lines 28-37
28
29		!function(f,b,e,v,n,t,s)
30		{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
31			n.callMethod.apply(n,arguments):n.queue.push(arguments)};
32			if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
33			n.queue=[];t=b.createElement(e);t.async=!0;
34			t.src=v;s=b.getElementsByTagName(e)[0];
35			s.parentNode.insertBefore(t,s)}(window, document,'script',
36			'https://connect.facebook.net/en_US/fbevents.js');
37		fbq('init', '
371594851535529088
vendor: 35 bytes, lines 37-39
37');
38		fbq('track', 'PageView');
39	
39</script>
39
40	<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1594851535529088&ev=PageView&noscript=1" /></noscript>
41	<!-- End Meta Pixel Code -->
42
43	<!--<base href="https://www.mytime.fr">-->
44	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
45
46	<!-- robots -->
47	<meta name="robots" content="all" />
48	<meta name="revisit-after" content="7 days" />
49	<meta name="google-site-verification" content="cdATs3ZxnZOZyKVzxRF9ckZEVJcCTZ8eNrY7rFw_P28" />
50
51	<!-- website infos -->
52	<meta name="author" content="MYTIME" />
53
54	<!-- lang -->
55	<link rel="alternate" hreflang="fr" href="https://www.mytime.fr" />
56
57	<!-- title / desc / keywords-->
58	<title>myTime - Service de pointage par téléphone, application, NFC, flashcode… adapté à votre besoin</title>
59	<meta name="description" content="" />
60	<meta name="keywords" content="pointeuse virtuelle, logiciel de gestion des heures travaillées, pointeuse  mobile, sirh, logiciel temps travail" />
61	<link rel="canonical" href="https://www.mytime.fr/presentation-de-la-solution-de-pointeuse-virtuelle" />
62
63	<!-- affichage -->
64	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
65	<!--<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no" />-->
66	<meta name="HandheldFriendly" content="True">
67	<meta name="MobileOptimized" content="320">
68	<!--[if lt IE 9]><meta http-equiv="X-UA-Compatible" content="IE=edge" /><![endif]-->
69
70	<!-- icons & favicon -->
71	<link rel="icon" type="image/x-icon" href="/images/favicon.ico" />
72	<!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="/images/favicon.ico" /><![endif]-->
73
74	<link rel="icon" type="image/png" sizes="16x16" href="/images/logo/favicon-16x16.png" />
75	<link rel="icon" type="image/png" sizes="32x32" href="/images/logo/favicon-32x32.png" />
76	<link rel="icon" type="image/png" sizes="96x96" href="/images/logo/favicon-96x96.png" />
77	<link rel="icon" sizes="196x196" href="/images/logo.png" />
78	<link rel="manifest" href="/images/logo/manifest.json" />
79
80	
81	<!-- Paramétrages Apple (splashscreen) -->
82		<meta name="mobile-web-app-capable" content="yes" />
83	<meta name="apple-mobile-web-app-capable" content="yes" />
84	<meta name="apple-mobile-web-app-status-bar-style" content="default" />
85
86	<!-- Paramétrages Windows -->
87	<meta name="msapplication-TileColor" content="#265983">
88	<meta name="msapplication-TileImage" content="/images/logo/ms-icon-144x144.png">
89
90	<!-- preconnect -->
91	<link rel="preconnect" href="//www.google.com" />
92	<link rel="preconnect" href="//fonts.googleapis.com" />
93	<link rel="preconnect" href="//fonts.gstatic.com" crossorigin />
94	<link rel="preconnect" href="//chat.chatra.io" />
95
96	<!-- font -->
97	<link href="https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&family=Pacifico&family=Poppins:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet" />
98
99	<!-- fichiers CSS -->
100	<link rel="preload" href="/dist/app.bundle.css?1787867340" as="style" />
101
102	<link rel="stylesheet" href="/dist/app.bundle.css?1787867340"/>
103
104	<!-- fichiers JS -->
105	<link rel="preload" href="/dist/jquery.bundle.js?1787867340" as="script"/>
106	<link rel="preload" href="/dist/runtime.bundle.js?1787867340" as="script"/>
107	<link rel="preload" href="/dist/vendors.bundle.js?1787867340" as="script"/>
108	<link rel="preload" href="/dist/commons.bundle.js?1787867340" as="script"/>
109	<link rel="preload" href="/dist/app.bundle.js?1787867340" as="script"/>
110	<link rel="preload" href="/dist/init.bundle.js?1787867340" as="script"/>
111	
111<script src="/dist/jquery.bundle.js?1787867340"></script>
111
112<!--	
112<script defer src="--><!--js/lib/bootstrap-select-1.14.0-dev/js/bootstrap-select_v1.14.0-beta4.js"></script>
112-->
113	
114		
114<script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"SoftwareApplication","name":"MyTime","applicationCategory":"BusinessApplication","operatingSystem":"Android, iOS, Web","offers":{"@type":"Offer","price":"5.50","priceCurrency":"EUR"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.8","reviewCount":"40"}}</script>
114
115
116</head>
117<body class=" d-flex flex-column h-100">
118	<!-- Google Tag Manager (noscript) -->
vendor: 70 bytes, lines 118-119
118
119	<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
119GTM-PHZQP63
vendor: 85 bytes, lines 119-120
119" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
120	
120<!-- End Google Tag Manager (noscript) -->
121
122
123	
124	
125			<nav class="navbar navbar-main navbar-expand-lg" style=" ">
126			<div class="container">
127				<div class="navbar-header float-start">
128					<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-main" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
129						<span class="navbar-toggler-icon"></span>
130					</button>
131					<a href="/" class="lien_logo_img" title="myTime, Votre pointeuse virtuelle">
132						<img loading="lazy" src="/images/logo/mytime.png" alt="" title="myTime" />
133					</a>
134					<a href="/" class="lien_logo_txt police_mytime" title="myTime, Votre pointeuse virtuelle">
135						myTime
136					</a>
137				</div>
138
139				<div class="collapse navbar-collapse" id="navbar-main">
140					<ul class="nav navbar-nav m-auto">
141						<li class="nav-item dropdown">
142							<a class="nav-link solution" href="/presentation-de-la-solution-de-pointeuse-virtuelle" data-bs-toggle="dropdown">Fonctionnalités</a>
143							<div class="dropdown-menu"></div>
144						</li>
145						<li class="nav-item"><a class="nav-link" href="/demo-du-systeme-de-pointage">Démo</a></li>
146						<li class="nav-item"><a class="nav-link" href="/tarifs-du-service-de-pointage-par-telephone">Tarifs</a></li>
147<!--						<li class="nav-item get_demo"><a class="nav-link hide_btn_before_init" href="#" data-bs-toggle="modal" data-bs-target="#modal_get_demo">Planifier une démo</a></li>-->
148					</ul>
149				</div>
150
151				<div class="float-end">
152					<a href="#" class="btn btn-outline blue hide_btn_before_init me-2" data-bs-toggle="modal" data-bs-target="#modal_user_login">Se connecter</a>
153					<a href="#" class="btn btn-filled blue hide_btn_before_init" data-bs-toggle="modal" data-bs-target="#modal_user_subscribe">Essai gratuit</a>
154				</div>
155			</div><!-- /.container-fluid -->
156		</nav>
157		<div class="cl"></div>
158		<main class="public">
159
160	
161
162<div class="solution">
163	<div class="colored-card grey-card purple-ellipse pb-0">
164		<div class="row">
165			<div class="col-md-6">
166				<br><br><br><br>
167				<span class="button-label green">La Solution</span>
168				<br><br>
169				<div class="text-presentation-title mb-2">
170					Révolutionnez votre Gestion RH
171				</div>
172				<h1 class="text-presentation">
173					Digitalisez le Pointage avec MyTime
174				</h1>
175				<br>
176				<div>
177	<a href="#" class="btn btn-filled blue hide_btn_before_init me-2" data-bs-toggle="modal" data-bs-target="#modal_user_subscribe">Essai gratuit <i class="fas fa-chevron-right ms-5"></i></a>
178	<a href="#" class="btn btn-outline blue hide_btn_before_init" data-bs-toggle="modal" data-bs-target="#modal_get_demo">Planifier une Démo <i class="fas fa-chevron-right ms-5"></i></a>
179	<br>
180	<div class="text-info-small mt-1">
181		<img src="/images/icons/no-credit-card.svg" alt="" /> Pas de carte bancaire requise
182	</div>
183	<br>
184
185	<div class="row mt-2 mb-4">
186		<div class="col-md-6">
187			<div class="hreview-aggregate">
188				<span class="fn" style="display: none">myTime</span>
189				<div class="mb-1">
190					<span class="rating_stars" data-note="4.8"></span> &nbsp;
191					<span class="rating">
192						<span class="average">4.8</span>/<span class="best">5</span> sur <span class="votes">40</span> avis récents
193					</span>
194				</div>
195			</div>
196		</div>
197		<div class="col-md-6">
198			<div class="app_links">
199				<a href="https://play.google.com/store/apps/details?id=com.osimatic.mytime" class="url_app_android"><i class="fab fa-google-play"></i> Google Play</a>
200				<a href="https://itunes.apple.com/fr/app/mytime-pointeuse-virtuelle/id988395830" class=""><span class="available"><i class="fab fa-apple"></i> Apple Store</a>
201			</div>
202		</div>
203	</div>
204</div>			</div>
205			<div class="col-md-6">
206				<img src="/images/home/app_calendar3.png" alt="" class="w-100 floatRight">
207			</div>
208		</div>
209	</div>
210
211	<div class="colored-card grey-card mt-4 pt-4 pb-0">
212		<div class="text-presentation text-center mt-2">
213			Le pointage vraiment flexible
214		</div>
215		<div class="text-precision text-center mt-1 w-50 m-auto">
216			Découvrez comment MyTime révolutionne la gestion et le suivi des temps de travail.
217			Notre solution complète vous offre un contrôle absolu sur votre gestion des ressources humaines.
218			Contrôlez précisément les entrées et sorties de vos salariés à distance, où que vous soyez, à tout moment.
219		</div>
220
221		<img src="/images/home/calendar3.png" alt="" class="w-100" />
222	</div>
223
224	
225	<div class="usages-list mt-5 p-3">
226		<div class="text-center">
227			<span class="button-label blue">Que pouvons-nous faire</span>
228			<div class="text-presentation text-center mt-2 w-50 m-auto">
229				Découvrez tout ce que myTime peut faire pour vous
230			</div>
231		</div>
232
233					<div class="row usage" id="tableau_de_bord">
234				<div class="col-md-1"></div>
235				<div class="col-md-5 text left order-first">
236					<div class="detail">
237						<h3>Une supervision optimale de vos employés</h3>
238						<div class="desc">
239															<p>Soyez sûr que vos employés sont bien arrivés sur leur lieu de travail à l’heure prévue. Bénéficiez d’un système de contrôle par géolocalisation, par adresse IP et par photo lors du pointage.</p>
240															<p>Le contrôle par géolocalisation vous permet de vérifier que vos employés sont bien présents sur le site où ils sont censés être. Le contrôle par adresse IP vous permet de confirmer que les pointages sont bien effectués depuis l’adresse IP de l’entreprise. Enfin, le contrôle par photo permet de s’assurer que la personne qui pointe est bien l’employé en question.</p>
241															<p>MyTime est particulièrement utile pour les entreprises qui supervisent des équipes à distance ou qui ont des employés isolés. Vous pouvez ainsi superviser vos équipes à distance tout en ayant l’esprit tranquille.</p>
242															<p>Avec MyTime, vous avez accès à une solution de gestion des temps complète et sécurisée. </p>
243													</div>
244					</div>
245				</div>
246				<div class="col-md-5 order-last">
247					<div class="image green w-80 m-auto">
248						<img src="/images/home/usage_listing.png" class="image-bg1" alt="">
249					</div>
250				</div>
251			</div>
252					<div class="row usage" id="planning">
253				<div class="col-md-1"></div>
254				<div class="col-md-5 text right order-last">
255					<div class="detail">
256						<h3>Optimisez la productivité grâce à une gestion efficace des horaires </h3>
257						<div class="desc">
258															<p>La gestion du temps et des plannings est une tâche essentielle pour toute entreprise. Les salariés doivent savoir à l’avance quand ils travaillent, combien d’heures ils doivent effectuer et quels sont les horaires de travail. C’est pourquoi MyTime vous offre une fonctionnalité de gestion du temps et des plannings complète pour vous aider à gérer facilement les horaires de travail de vos salariés.</p>
259															<p>Avec MyTime, planifiez les horaires de vos salariés en quelques clics. Grâce à une interface intuitive, les managers peuvent facilement affecter des heures de travail à chaque salarié en fonction des disponibilités. </p>
260															<p>De plus, vos salariés peuvent facilement consulter leur planning depuis l’application MyTime et être informés en temps réel des modifications apportées à leur emploi du temps.</p>
261															<p>MyTime permet également de calculer précisément les temps de travail des salariés, y compris les heures supplémentaires, les heures de nuit, les heures de week-end et les heures de déplacement. </p>
262															<p>Enfin, MyTime est capable de remonter les écarts de planning, ce qui permet aux managers de détecter rapidement les erreurs et les retards. Cette fonctionnalité est un atout majeur pour les entreprises qui cherchent à optimiser leur productivité et à réduire les coûts liés aux retards et aux erreurs.</p>
263															<p>Essayez dès maintenant MyTime pour optimiser la gestion de vos équipes et de vos plannings.</p>
264													</div>
265					</div>
266				</div>
267				<div class="col-md-5 order-first">
268					<div class="image blue w-80 m-auto">
269						<img src="/images/home/calendar.png" class="image-bg2" alt="">
270					</div>
271				</div>
272			</div>
273					<div class="row usage" id="alerts">
274				<div class="col-md-1"></div>
275				<div class="col-md-5 text left order-first">
276					<div class="detail">
277						<h3>Garantissez la ponctualité, évitez les erreurs et optimisez vos coûts</h3>
278						<div class="desc">
279															<p>Les alertes en temps réel permettent aux superviseurs de recevoir des alertes instantanées en cas de non pointage, de pointage en dehors des horaires autorisés ou de non-respect de la durée de travail. Ces alertes permettent aux superviseurs de réagir rapidement en cas de problème et de prendre les mesures nécessaires.</p>
280															<p>Grâce à cette fonctionnalité, les entreprises peuvent éviter les retards, les erreurs et les dépassements de coûts liés aux heures supplémentaires. Les superviseurs peuvent également avoir une vue d’ensemble des heures travaillées par chaque salarié et s’assurer que chaque salarié respecte sa durée de travail.</p>
281															<p>Nous vous invitons à planifier une démo dès maintenant afin de découvrir toutes les fonctionnalités qui vous aideront à optimiser la gestion de vos équipes.</p>
282													</div>
283					</div>
284				</div>
285				<div class="col-md-5 order-last">
286					<div class="image green w-80 m-auto">
287						<img src="/images/home/surveillance.png" class="image-bg3" alt="">
288					</div>
289				</div>
290			</div>
291					<div class="row usage" id="holidays">
292				<div class="col-md-1"></div>
293				<div class="col-md-5 text right order-last">
294					<div class="detail">
295						<h3>
295Gestion des Congés et Absences : Facilitez la Vie de Vos Employés</h3>
296						<div class="desc">
297															<p>La gestion des congés et des absences est une tâche complexe pour les entreprises qui doivent suivre de près les demandes de leurs salariés et s’assurer que chacun bénéficie de ses jours de congés. MyTime offre une fonctionnalité de gestion des congés et des absences complète pour faciliter cette tâche.</p>
298															<p>Grâce à MyTime, les salariés peuvent facilement effectuer leur demande de congés et d’absences via l’application mobile MyTime ou via leur espace RH. Les superviseurs peuvent ensuite accepter ou refuser les demandes en quelques clics et être informés des congés et des absences de chaque salarié grâce au planning.</p>
299															<p>Un compteur de congés payés, RTT et de récupération est également disponible pour chaque salarié. Cela permet aux superviseurs de vérifier rapidement le nombre de congés restants pour chaque collaborateur et de s’assurer que chacun bénéficie de ses jours de congés dans le respect des règles en vigueur.</p>
300															<p>Enfin, MyTime offre un calendrier complet avec les absences, les arrêts et les congés de chaque salarié. Cela permet aux superviseurs d’avoir une vue d’ensemble de l’activité de leur entreprise et de mieux organiser les horaires de travail en fonction des congés et des absences de chaque salarié.</p>
301															<p>N’hésitez pas à nous contacter pour plus d’informations ou pour planifier une démonstration avec un expert.</p>
302													</div>
303					</div>
304				</div>
305				<div class="col-md-5 order-first">
306					<div class="image blue w-80 m-auto">
307						<img src="/images/home/conges.png" class="image-bg4" alt="">
308					</div>
309				</div>
310			</div>
311					<div class="row usage" id="trip">
312				<div class="col-md-1"></div>
313				<div class="col-md-5 text left order-first">
314					<div class="detail">
315						<h3>Optimisez les déplacements et réduisez les coûts avec MyTime</h3>
316						<div class="desc">
317															<p>Pour les entreprises dont les salariés sont amenés à se déplacer régulièrement sur le terrain, la gestion des trajets et des déplacements peut être une tâche complexe et chronophage. C’est pourquoi MyTime offre une fonctionnalité de gestion des trajets et des déplacements complète pour faciliter cette tâche.</p>
318															<p>Grâce au pointage avec géolocalisation, MyTime peut calculer précisément les distances entre deux lieux d’intervention et comptabiliser les heures et les distances de trajets. Les superviseurs peuvent ainsi avoir une vue d’ensemble des trajets effectués par leurs salariés et s’assurer que les coûts liés aux déplacements sont correctement calculés.</p>
319															<p>La gestion des déplacements peut également être automatisée selon la configuration du superviseur. MyTime permet en effet de définir des règles spécifiques pour chaque salarié en fonction de ses habitudes de déplacement. </p>
320															<p>Les heures et les distances de petits et grands déplacements peuvent ainsi être comptabilisées automatiquement, ce qui facilite la tâche des superviseurs et réduit les risques d’erreurs de saisie.</p>
321															<p>En outre, MyTime permet la gestion des déplacements automatiques entre plusieurs lieux de pointage. Les salariés peuvent ainsi indiquer leur point de départ et leur point d’arrivée, et MyTime calculera automatiquement le trajet le plus court entre les deux points.</p>
322															<p>Enfin, la gestion des trajets et des déplacements est prise en compte dans le calcul des variables de paie, ce qui permet aux superviseurs de gérer facilement les coûts horaires et les coûts kilométriques associés aux déplacements.</p>
323															<p>Essayez MyTime dès maintenant et planifiez une démo avec un expert pour découvrir toutes les fonctionnalités.</p>
324													</div>
325					</div>
326				</div>
327				<div class="col-md-5 order-last">
328					<div class="image green w-80 m-auto">
329						<img src="/images/home/deplacement.png" class="image-bg5" alt="">
330					</div>
331				</div>
332			</div>
333					<div class="row usage" id="listing">
334				<div class="col-md-1"></div>
335				<div class="col-md-5 text right order-last">
336					<div class="detail">
337						<h3>Fini les Feuilles d’Heures Papier, exportez vos rapports en ligne !</h3>
338						<div class="desc">
339															<p>Pour les entreprises souhaitant suivre de près l’activité de leurs salariés, cette fonctionnalité est un outil indispensable. Elle permet aux superviseurs de consulter facilement les pointages et la durée de travail de leurs équipes, et d’exporter les rapports d’activités en PDF ou CSV pour les imprimer ou les importer dans leur logiciel métier.</p>
340															<p>Les rapports d’activités peuvent être exportés par chantier, client et mission, ce qui permet aux superviseurs de suivre précisément l’activité de leur entreprise en fonction des projets en cours. Les rapports peuvent également être envoyés automatiquement par e-mail aux superviseurs, ce qui leur permet de rester informés de l’activité de leur entreprise en temps réel.</p>
341															<p>Le rapport d’activité des employés met en évidence les heures supplémentaires, les heures manquées et toutes les variables de paie des salariés : heures de nuit, heures de week-end, heures de jours fériés, heures de déplacement, heures de congés payés et de récupération. Cela permet aux superviseurs de calculer facilement les coûts liés aux variables de paie et de s’assurer que chaque salarié est payé en fonction de son temps de travail</p>
342															<p>Contactez-nous pour plus d’informations ou pour planifier une démo en ligne avec un expert. </p>
343													</div>
344					</div>
345				</div>
346				<div class="col-md-5 order-first">
347					<div class="image blue w-80 m-auto">
348						<img src="/images/home/listing_jour.png" class="image-bg6" alt="">
349					</div>
350				</div>
351			</div>
352					<div class="row usage" id="documents">
353				<div class="col-md-1"></div>
354				<div class="col-md-5 text left order-first">
355					<div class="detail">
356						<h3>Simplifiez Votre Communication et stockez vos Documents</h3>
357						<div class="desc">
358															<p>La gestion de documents est une tâche essentielle pour les entreprises qui s
358ouhaitent gérer efficacement leur activité et leurs ressources humaines. Cependant, cela peut rapidement devenir une tâche fastidieuse et chronophage. C’est pourquoi MyTime offre une fonctionnalité dédiée à la de gestion des documents pour permettre aux entreprises de gagner du temps et de l’efficacité.</p>
359															<p>Grâce à la gestion de documents de MyTime, toutes les informations importantes sont centralisées sur une seule plateforme. Les superviseurs et les salariés peuvent facilement accéder aux fiches de paie, aux contrats, aux justificatifs d’absences et à tous les autres documents importants. Les documents sont stockés de manière sécurisée et sont facilement accessibles depuis n’importe quel ordinateur.</p>
360															<p>Enfin, MyTime permet aux entreprises de partager des documents avec leurs clients, tels que des factures ou des rapports d’activité. Cela facilite la communication et permet aux entreprises de gagner du temps en évitant d’avoir à envoyer des documents par e-mail ou par courrier.</p>
361															<p>Contactez-nous dès maintenant pour bénéficiez d’une démonstration avec un expert.</p>
362													</div>
363					</div>
364				</div>
365				<div class="col-md-5 order-last">
366					<div class="image green w-80 m-auto">
367						<img src="/images/home/documents.png" class="image-bg7" alt="">
368					</div>
369				</div>
370			</div>
371					<div class="row usage" id="api">
372				<div class="col-md-1"></div>
373				<div class="col-md-5 text right order-last">
374					<div class="detail">
375						<h3>Intégration Transparente avec l’API Web MyTime</h3>
376						<div class="desc">
377															<p>Pour les entreprises qui souhaitent intégrer MyTime à leur système d’information existant, notre API Web est une solution idéale. L’API Web de MyTime permet aux entreprises de récupérer en temps réel tous les pointages dans leur base de données.</p>
378															<p>Grâce à cette fonctionnalité, les entreprises peuvent récupérer toutes les données de MyTime dans leur base de données, y compris les pointages, les temps de travail, les absences et les congés. Les superviseurs peuvent ainsi suivre de près l’activité de leurs salariés et gérer leur temps de travail de manière efficace.</p>
379															<p>MyTime offre une documentation technique complète pour faciliter l’intégration de l’API Web. Les développeurs peuvent ainsi suivre facilement les étapes d’implémentation de l’API Web et assurer une intégration efficace sans erreur.</p>
380															<p>Contactez-nous nous pour en savoir plus.</p>
381													</div>
382					</div>
383				</div>
384				<div class="col-md-5 order-first">
385					<div class="image blue w-80 m-auto">
386						<img src="/images/home/dashboard.png" class="image-bg8" alt="">
387					</div>
388				</div>
389			</div>
390			</div>
391
392	<div class="bg-grey mt-4 mb-4">
393		<div class="assistance p-5">
394	<div class="container">
395		<div class="row">
396			<div class="col-md-4">
397				<div class="illustration">
398					<img src="/images/home/assistance2.jpg" class="customer" alt="" />
399					<div class="colored-card white-card infobulle text-start">
400						<div class="icon-thumbnail floatLeft"><i class="fas fa-phone-alt "></i></div>
401						<div class="title fw-bold mt-1">Expert MyTime</div>
402						<div class="text-precision">En quoi puis-je vous aider ?</div>
403					</div>
404				</div>
405
406			</div>
407			<div class="col-md-8 ps-5 pt-4 pb-4">
408				<span class="button-label blue">Accompagnement</span>
409				<div class="text-presentation mt-3">Qu’attendez-vous pour <span class="text-purple">planifier une démo ?</span></div>
410				<br>
411
412				<div class="row text-center mt-4">
413					<div class="col-md-4 avantage">
414						<div class="icon-thumbnail icon-blue icon-bg-blue"><i class="fas fa-headset"></i></div>
415						<div class="title">Démo</div>
416						<div class="text-precision">Par téléphone ou visio</div>
417					</div>
418					<div class="col-md-4 avantage">
419						<div class="icon-thumbnail icon-blue icon-bg-blue"><i class="far fa-clock"></i></div>
420						<div class="title">30 minutes</div>
421						<div class="text-precision">Pour nous découvrir</div>
422					</div>
423					<div class="col-md-4 avantage">
424						<div class="icon-thumbnail icon-blue icon-bg-blue"><i class="fas fa-calendar-alt"></i></div>
425						<div class="title">14 jours</div>
426						<div class="text-precision">De test gratuit dès maintenant</div>
427					</div>
428				</div>
429
430				<div class="mt-5">
431					<a href="#" class="btn btn-filled blue hide_btn_before_init" data-bs-toggle="modal" data-bs-target="#modal_get_demo">Planifier une Démo <i class="fas fa-chevron-right ms-5"></i></a>
432				</div>
433			</div>
434		</div>
435	</div>
436</div>	</div>
437
438
439	
440	<div class="bg-from-white-to-grey pt-5 pb-1">
441		<div class="colored-card blue-card light pt-5">
442			<div class="clock-event-methods-list">
443	<span class="button-label green">Méthode de pointage</span>
444	<h2 class="text-presentation text-white w-75 mt-3 mb-2">Quelle méthode de pointage souhaitez-vous pour vos employés ?</h2>
445
446	<a href="#" class="btn btn-outline white hide_btn_before_init floatRight ms-5" data-bs-toggle="modal" data-bs-target="#modal_user_subscribe">Commencer <i class="fas fa-chevron-right ms-5"></i></a>
447
448	<div class="text-precision mt-3 mb-4">
449		Multipliez les options selon vos préférences !
450	</div>
451	<div class="cl"></div>
452
453	<div class="row mt-2">
454		<div class="col-md-7">
455			<div class="clock-event-method colored-card white-card pb-0">
456				<img src="/images/home/iphone.png" class="floatRight ms-5" alt="">
457
458				<div class="explication">
459					<div class="card-title">Pointer par application mobile</div>
460					<div class="desc">Téléchargez l’application myTime et cliquez sur pointer</div>
461					<a href="/demo-du-systeme-de-pointage" class="blue-link">Voir plus <i class="fas fa-arrow-right ms-2"></i></a>
462				</div>
463				<div class="cl"></div>
464			</div>
465		</div>
466		<div class="col-md-5">
467			<div class="clock-event-method colored-card white-card pb-0">
468				<img src="/images/home/qr_code.png" class="floatLeft me-5" alt="">
469
470				<div class="explication">
471					<div class="card-title">Pointer par flashcode</div>
472					<div class="desc">Téléchargez l’application myTime et cliquez sur scanner un code barre</div>
473					<a href="/demo-du-systeme-de-pointage" class="blue-link">Voir plus <i class="fas fa-arrow-right ms-2"></i></a>
474				</div>
475				<div class="cl"></div>
476			</div>
477		</div>
478	</div>
479	<div class="row">
480		<div class="col-md-4">
481			<div class="clock-event-method colored-card white-card">
482				<div class="text-center">
483					<img src="/images/home/nfc.png" class="" alt="">
484				</div>
485
486				<div class="explication pb-0">
487					<div class="card-title">Pointer par NFC</div>
488					<div class="desc">Disposez votre smartphone sur la puce NFC et pointer</div>
489					<a href="/demo-du-systeme-de-pointage" class="blue-link">Voir plus <i class="fas fa-arrow-right ms-2"></i></a>
490				</div>
491				<div class="cl"></div>
492			</div>
493		</div>
494		<div class="col-md-4">
495			<div class="clock-event-method colored-card white-card">
496				<div class="text-center">
497					<img src="/images/home/phone_call.png" class="" alt="">
498				</div>
499
500				<div class="explication pb-0">
501					<div class="card-title">Pointer par appel téléphonique</div>
502					<div class="desc">Appelez le numéro pour pointer et tapez le code employé</div>
503					<a href="/demo-du-systeme-de-pointage" class="blue-link">Voir plus <i class="fas fa-arrow-right ms-2"></i></a>
504				</div>
505				<div class="cl"></div>
506			</div>
507		</div>
508		<div class="col-md-4">
509			<div class="clock-event-method colored-card white-card">
510				<div class="text-center">
511					<img src="/images/home/clock_in_url.png" class="" alt="">
512				</div>
513				<div class="explication pb-0">
514					<div class="card-title">Pointer par internet</div>
515					<div class="desc">Rendez-vous sur l’URL de pointage et indiquez le code employé</div>
516					<a href="/demo-du-systeme-de-pointage" class="blue-link">Voir plus <i class="fas fa-arrow-right ms-2"></i></a>
517				</div>
518				<div class="cl"></div>
519			</div>
520		</div>
521	</div>
522</div>		</div>
523	</div>
524
525	<div class="bg-from-grey-to-white pt-5">
526		<div class="temoignages">
527	<div class="container">
528		<div class="text-center w-50 m-auto mb-4">
529			<div class="pt-2">
530				<span class="button-label blue">Témoignages</span>
531			</div>
532			<h2 class="text-presentation mt-3">Ils nous font confiance</h2>
533			<div class="text-precision text-center">Découvrez comment nos clients transforment la gestion des temps, planifient et simplifient l’organisation du travail de leurs équipes grâce à myTime.</div>
534		</div>
535
536		
537		<div class="tab-content">
538							<div class="tab-pane fade show active fade" id="temoignage_0" role="tabpanel">
539					<div class="row temoignage">
540						<div class="col-md-6">
541							<div class="colored-card white-card p-5">
542								<i class="fas fa-quote-left"></i>
543								<div class="activity">Travaux d’installation électrique</div>
544								<div class="text">Comment MyTime a révolutionné la gestion des temps de travail de cette entreprise industrielle.</div>
545								<hr>
546								<img src="/images/logo_customer/industrelec.png" class="logo" alt="">
547							</div>
548						</div>
549						<div class="col-md-6">
550							<img src="/images/customer/customer_05.jpg" class="customer" alt="">
551						</div>
552					</div>
553				</div>
554							<div class="tab-pane fade  fade" id="temoignage_1" role="tabpanel">
555					<div class="row temoignage">
556						<div class="col-md-6">
557							<div class="colored-card white-card p-5">
558								<i class="fas fa-quote-left"></i>
559								<div class="activity">Services de nettoyage professionnels</div>
560								<div class="text">Comment myTime permet de gérer efficacement la facturation en fonction des sites d’intervention.</div>
561								<hr>
562								<img src="/images/logo_customer/aps.jpg" class="logo" alt="">
563							</div>
564						</div>
565						<div class="col-md-6">
566							<img src="/images/customer/customer_07.jpg" class="customer" alt="">
567						</div>
568					</div>
569				</div>
570							<div class="tab-pane fade  fade" id="temoignage_2" role="tabpanel">
571					<div class="row temoignage">
572						<div class="col-md-6">
573							<div class="colored-card white-card p-5">
574								<i class="fas fa-quote-left"></i>
575								<div class="activity">Marché des gaz de pétrole liquéfiés</div>
576								<div class="text">Comment la souplesse et la flexibilité de MyTime a permis une transition vers le pointage numérique.</div>
577								<hr>
578								<img src="/images/logo_customer/butagaz.png" class="logo" alt="">
579							</div>
580						</div>
581						<div class="col-md-6">
582							<img src="/images/customer/customer_08.jpg" class="customer" alt="">
583						</div>
584					</div>
585				</div>
586							<div class="tab-pane fade  fade" id="temoignage_3" role="tabpanel">
587					<div class="row temoignage">
588						<div class="col-md-6">
589							<div class="colored-card white-card p-5">
590								<i class="fas fa-quote-left"></i>
591								<div class="activity">Accueil en entreprise et événementiel</div>
592								<div class="text">Comment myTime a renforcé notre transparence en offrant un accès à nos clients.</div>
593								<hr>
594								<img src="/images/logo_customer/demeter.png" class="logo" alt="">
595							</div>
596						</div>
597						<div class="col-md-6">
598							<img src="/images/customer/customer_06.jpg" class="customer" alt="">
599						</div>
600					</div>
601				</div>
602							<div class="tab-pane fade  fade" id="temoignage_4" role="tabpanel">
603					<div class="row temoignage">
604						<div class="col-md-6">
605							<div class="colored-card white-card p-5">
606								<i class="fas fa-quote-left"></i>
607								<div class="activity">Location de véhicule électrique</div>
608								<div class="text">Comment MyTime simplifie le calcul des heures de nuit et la gestion des repos compensateur.</div>
609								<hr>
610								<img src="/images/logo_customer/cityscoot.png" class="logo" alt="">
611							</div>
612						</div>
613						<div class="col-md-6">
614							<img src="/images/customer/customer_06.jpg" class="customer" alt="">
615						</div>
616					</div>
617				</div>
618					</div>
619
620		<ul class="nav nav-pills">
621							<li class="nav-item" role="presentation">
622					<button class="nav-link active" data-bs-toggle="pill" data-bs-target="#temoignage_0" type="button" role="tab" aria-selected="false">1</button>
623				</li>
624							<li class="nav-item" role="presentation">
625					<button class="nav-link " data-bs-toggle="pill" data-bs-target="#temoignage_1" type="button" role="tab" aria-selected="false">2</button>
626				</li>
627							<li class="nav-item" role="presentation">
628					<button class="nav-link " data-bs-toggle="pill" data-bs-target="#temoignage_2" type="button" role="tab" aria-selected="false">3</button>
629				</li>
630							<li class="nav-item" role="presentation">
631					<button class="nav-link " data-bs-toggle="pill" data-bs-target="#temoignage_3" type="button" role="tab" aria-selected="false">4</button>
632				</li>
633							<li class="nav-item" role="presentation">
634					<button class="nav-link " data-bs-toggle="pill" data-bs-target="#temoignage_4" type="button" role="tab" aria-selected="false">5</button>
635				</li>
636					</ul>
637	</div>
638</div>	</div>
639
640</div>
641
642<script>
643	$(function() {
644		if (User.isLogged()) {
645			window.location.href = URL_TABLEAU_DE_BORD;
646			return;
647		}
648
649
650
651		console.log('Coucou');
652		function diff(a, b) {
653			function notContainedIn(arr) {
654				return element => arr.indexOf(element) === -1;
655			}
656			return a.filter(notContainedIn(b)).concat(b.filter(notContainedIn(a)));
657		}
658		console.log(diff([1, 2, 3, 5], [1, 2, 4, 5]));
659	})
660</script>
660
661
662
663
664	
665		</main>
666		<footer>
667			<div class="pre-footer">
668				<div class="container">
669					<div class="colored-card blue-card">
670						<div class="row">
671							<div class="col-md-6 presentation">
672								<div class="text-presentation">Choisissez <span class="text-white">myTime pour un suivi optimal</span> des temps de travail.</div>
673
674								<a href="#" class="btn btn-filled white hide_btn_before_init me-2" data-bs-toggle="modal" data-bs-target="#modal_user_subscribe">Essai gratuit <i class="fas fa-chevron-right ms-5"></i></a>
675								<a href="#" class="btn btn-outline white hide_btn_before_init" data-bs-toggle="modal" data-bs-target="#modal_get_demo">Planifier une Démo <i class="fas fa-chevron-right ms-5"></i></a>
676								<br>
677								<div class="text-info-small mt-3">
678									<img src="/images/icons/no-credit-card.svg" alt="" class="me-1" /> Pas de carte bancaire requise
679								</div>
680							</div>
681							<div class="col-md-6 illustration">
682								<img loading="lazy" src="/images/home/calendar2.png" class="" alt="" />
683							</div>
684						</div>
685
686					</div>
687				</div>
688			</div>
689
690			<div class="footer_content">
691				<div class="container">
692					<div class="row">
693						<div class="col-md-3">
694							<a href="/" class="lien_logo_img" title="myTime, Votre pointeuse virtuelle">
695								<img loading="lazy" src="/images/logo/mytime.png" alt="" title="myTime" />
696							</a>
697							<a href="/" class="lien_logo_txt police_mytime" title="myTime, Votre pointeuse virtuelle">
698								myTime
699							</a>
700						</div>
701						<div class="col-md-9">
702							<div class="text-presentation">Vos Ressources avec Précision, Où que Vous Soyez</div>
703						</div>
704					</div>
705					<hr>
706					<div class="row">
707						<div class="col-md-3">
708							<div class="title">La solution</div>
709							<ul class="liens">
710								<li><a href="/presentation-de-la-solution-de-pointeuse-virtuelle#planning">Gestion des temps et planning</a><li>
711								<li><a href="/presentation-de-la-solution-de-pointeuse-virtuelle#planning">Contrôle des présences</a><li>
712								<li><a href="/presentation-de-la-solution-de-pointeuse-virtuelle#alerts">Alertes en temps réel</a><li>
713								<li><a href="/presentation-de-la-solution-de-pointeuse-virtuelle#holidays">Congés et absences</a><li>
714								<li><a href="/presentation-de-la-solution-de-pointeuse-virtuelle#trip">Trajets et déplacements</a><li>
715								<li><a href="/presentation-de-la-solution-de-pointeuse-virtuelle#documents">Communication et documents</a><li>
716								<li><a href="/presentation-de-la-solution-de-pointeuse-virtuelle#api">API Web</a><li>
717							</ul>
718						</div>
719						<div class="col-md-3">
720							<div class="title">Support</div>
721							<ul class="liens">
722								<li><a href="/tarifs-du-service-de-pointage-par-telephone#faq">Centre d'aide</a><li>
723								<li><a href="#" onclick="Chatra('openChat', true); return false;">Tchatter avec nous</a><li>
724								<li><a href="/demo-du-systeme-de-pointage">Démo gratuite</a><li>
725								<li><a href="#" data-bs-toggle="modal" data-bs-target="#modal_contact_us" class="hide_btn_before_init">Nous contacter</a><li>
726								<li><a href="#" data-bs-toggle="modal" data-bs-target="#modal_bug_report" class="hide_btn_before_init">Signaler un bug</a><li>
727							</ul>
728						</div>
729						<div class="col-md-3">
730							<div class="title">Ressources</div>
731							<ul class="liens">
732								<li><a href="/">Blog</a><li>
733								<li><a href="https://mytime-documentation.notion.site/">Guide pratique</a><li>
734								<li><a href="#" data-bs-toggle="modal" data-bs-target="#modal_get_commercial_documentation" class="hide_btn_before_init">Documentation commerciale</a><li>
735							</ul>
736						</div>
737						<div class="col-md-3">
738							<div class="title">Clients</div>
739							<ul class="liens">
740								<li><a href="/">Témoignages</a><li>
741								<li><a href="https://www.ekomi.fr/avis-clients-mytimefr.html">Avis clients</a><li>
742							</ul>
743							<div class="hreview-aggregate">
744								<span class="fn" style="display: none">myTime</span>
745								<p class="mb-1">
746									<span class="rating_img" data-note="4.8"></span> &nbsp;
747									<span class="rating">
748										<span class="average">4.8</span>/<span class="best">5</span>
749									</span>
750								</p>
751								<p class="nb_avis_and_periode">
752									(<span class="votes">40</span> avis sur les 12 derniers mois) <br>
753								</p>
754							</div>
755						</div>
756					</div>
757					<hr>
758
759					<div class="row">
760						<div class="col-md-9 copyright">
761							Copyright &copy; 2026 MYTIME. Tous droits réservés.
762							<br class="d-md-none">
763							<a href="#" data-bs-toggle="modal" data-bs-target="#modal_contact_us">Contact</a>
764							<a href="/cgv">CGV</a>
765							<a href="/legal-notices">Mentions légales</a>
766							<a href="/data-policy">Protection des données</a>
767
768							<div style="display:none;">
769								<div class="title">Contact</div>
770								<p>
771									<span class="phone-number">+33170813111</span><br>
772									[email protected]								</p>
773								<p>
774									<a href="#" data-bs-toggle="modal" data-bs-target="#modal_get_demo" class="btn btn-light hide_btn_before_init">Planifier une démo</a>
775								</p>
776								<p>
777									<a href="#" data-bs-toggle="modal" data-bs-target="#modal_contact_us" class="hide_btn_before_init">Nous contacter</a>
778								</p>
779							</div>
780						</div>
781						<div class="col-md-3 social_networks">
782							<a href="#"><i class="fab fa-twitter"></i></a>
783							<a href="https://www.linkedin.com/company/mytime---votre-pointeuse-virtuelle"><i class="fab fa-linkedin"></i></a>
784							<a href="https://www.instagram.com/mytime.fr/"><i class="fab fa-facebook"></i></a>
785							<a href="#" data-bs-toggle="modal" data-bs-target="#modal_contact_share"><i class="fas fa-share-alt"></i></a>
786						</div>
787					</div>
788				</div>
789			</div>
790
791		</footer>
792
793	
794	<div id="bottom"></div>
795
796	
797<script>
798</script>
798
799
800	
801<fieldset class="modal_export_and_display period hide">
802	<legend>Période</legend>
803	<div class="form-group">
804		<div class="form-inline">
805			Du &nbsp; <input type="date" name="start_date" class="form-control" value="" />
806			&nbsp; au &nbsp; <input type="date" name="end_date" class="form-control" value="" />
807		</div>
808	</div>
809</fieldset>
810<fieldset class="modal_export_and_display table_columns hide">
811	<legend>Colonnes tableau</legend>
812	<div class="table_columns form-group">
813		<div>
814			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Liste des colonnes à afficher dans le tableau."></i>&nbsp; <label>Colonnes affichées :&nbsp;</label>
815			<a href="#" class="check_all float-end">Sélectionner tout</a>
816			<ul class="table_columns_list sortable-list"></ul>
817		</div>
818		<li class="hide table_column_block_base item">
819			<div class="item_content">
820				<div class="form-check">
821					<label class="form-check-label"><input type="checkbox" name="export_fields[]" value="" checked="checked" class="form-check-input" /></label>
822				</div>
823			</div>
824			<i class="fas fa-grip-lines dragging-icon hide"></i>
825		</li>
826	</div>
827</fieldset>
828<fieldset class="modal_export_and_display employee hide">
829	<legend>Employés</legend>
830	<div class="row">
831		<div class="col-md-6 form-group">
832			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Format d’affichage des employés. Choix possible : <ul class='mb-0'><li><code>Prénom Nom</code> : affichage du prénom avant le nom</li> <li><code>Nom Prénom</code> : affichage du prénom après le nom</li></ul>"></i>&nbsp; <label class="control-label">Format d’affichage :&nbsp;</label>
833							<div class="form-check">
834					<label class="form-check-label"><input type="radio" class="form-check-input" name="employee_display_type" value="first_and_last_name" />Prénom Nom</label>
835				</div>
836							<div class="form-check">
837					<label class="form-check-label"><input type="radio" class="form-check-input" name="employee_display_type" value="last_and_first_name" />Nom Prénom</label>
838				</div>
839					</div>
840	</div>
841</fieldset>
842<fieldset class="modal_export_and_display date_time hide">
843	<legend>Dates &amp; Heures</legend>
844	<div class="row">
845		<div class="col-md-6 form-group">
846			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Format d’affichage des dates. Choix possible : <ul class='mb-0'><li><code>Synthétique</code> : affichage sous la forme <em>jj/mm/aaaa</em> (exemple : 01/06/2000)</li> <li><code>En lettres</code> : affichage avec le jour de la semaine et le mois en lettre (exemple : Mardi 1er juin 2000)</li></ul>"></i>&nbsp; <label class="control-label">Format des dates :&nbsp;</label>
847							<div class="form-check">
848					<label class="form-check-label"><input type="radio" class="form-check-input" name="date_display_type" value="synthetic" />Synthétique (jj/mm/aaaa)</label>
849				</div>
850							<div class="form-check">
851					<label class="form-check-label"><input type="radio" class="form-check-input" name="date_display_type" value="in_letters" />En lettres</label>
852				</div>
853					</div>
854		<div class="col-md-6 form-group">
855			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Format d’affichage des heures. Choix possible : <ul class='mb-0'><li><code>Classique</code> : affichage sous la forme <em>hh:mm</em> (exemple : 09:30)</li> <li><code>Chronomètre</code> : affichage sous la forme <em>hh:mm:ss</em> (exemple : 09:30:00) </li></ul>"></i>&nbsp; <label>Format des heures :&nbsp;</label>
856							<div class="form-check">
857					<label class="form-check-label"><input type="radio" class="form-check-input" name="time_display_type" value="string" />Classique</label>
858				</div>
859							<div class="form-check">
860					<label class="form-check-label"><input type="radio" class="form-check-input" name="time_display_type" value="chrono" />Chronomètre</label>
861				</div>
862					</div>
863	</div>
864</fieldset>
865<fieldset class="modal_export_and_display duration hide">
866	<legend>Durées</legend>
867	<div class="row">
868		<div class="col-md-3 form-group">
869			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Format d’affichage des durées. Choix possible : <ul class='mb-0'><li><code>Classique</code> : affichage sous la forme <em>hh:mm.ss</em> (exemple : 02:15.00)</li> <li><code>En centième d’heure</code> : affichage en nombre d’heure décimale (exemple : 2,25H) </li> <li><code>En secondes</code> : affichage en nombre de secondes (exemple : 8100) </li></ul>"></i>&nbsp; <label>Format des durées :</label>
870							<div class="form-check">
871					<label class="form-check-label"><input type="radio" class="form-check-input" name="duration_display_type" value="default" />Classique (avec secondes)</label>
872				</div>
873							<div class="form-check">
874					<label class="form-check-label"><input type="radio" class="form-check-input" name="duration_display_type" value="default_no_seconds" />Classique (sans secondes)</label>
875				</div>
876							<div class="form-check">
877					<label class="form-check-label"><input type="radio" class="form-check-input" name="duration_display_type" value="centieme" />En centième d’heure</label>
878				</div>
879							<div class="form-check">
880					<label class="form-check-label"><input type="radio" class="form-check-input" name="duration_display_type" value="seconds" />En secondes</label>
881				</div>
882					</div>
883		<div class="col-md-6 form-group">
884			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Choix pour arrondir les durées."></i>&nbsp; <label>Arrondissement des durées :</label><br>
885			<div class="form-inline">
886				Arrondir &nbsp;
887				<select name="duration_round_precision" class="form-control">
888											<option value="0">0</option>
889											<option value="1">1</option>
890											<option value="5">5</option>
891											<option value="10">10</option>
892											<option value="15">15</option>
893									</select>
894				&nbsp; minutes au &nbsp;
895				<select name="duration_round_mode" class="form-control">
896											<option value="up">au dessus</option>
897											<option value="down">au dessous</option>
898											<option value="close">au plus près</option>
899									</select>
900			</div>
901		</div>
902		<div class="col-md-3 form-group">
903			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Choix pour afficher les durées valant 0. Choix possible : <ul class='mb-0'><li><code>Durée à 0</code> : affichage normal (comme une durée quelconque)</li> <li><code>Champ vide</code>
903 : affichage d’un champ vide </li></ul>"></i>&nbsp; <label>Affichage des durées valant 0 :</label><br>
904							<div class="form-check-inline">
905					<label class="form-check-label"><input type="radio" class="form-check-input" name="duration_blank_if_empty" value="0" /> Durée à 0</label>
906				</div>
907							<div class="form-check-inline">
908					<label class="form-check-label"><input type="radio" class="form-check-input" name="duration_blank_if_empty" value="1" /> Champ vide</label>
909				</div>
910					</div>
911	</div>
912</fieldset>
913<fieldset class="modal_export_and_display location distance location_and_distance hide">
914	<legend class="location hide">Lieux</legend>
915	<legend class="distance hide">Distances</legend>
916	<legend class="location_and_distance hide">Lieux & Distances</legend>
917	<div class="row">
918		<div class="col-md-6 form-group location_field">
919			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Format d’affichage des positions géographiques. Choix possible : <ul class='mb-0'><li><code>Adresse postale</code> : affichage sous la forme d’une adresse postale (rue, code postal, ville) </li> <li><code>Coordonnées GPS</code> : affichage sous la forme de coordonnée GPS (latitude et longitude)</li></ul>"></i>&nbsp; <label>Format des positions géographiques :&nbsp;</label>
920			<div>
921									<div class="form-check form-check-inline">
922						<label class="form-check-label"><input type="radio" class="form-check-input" name="location_display_type" value="ADDRESS" /> Adresse postale</label>
923					</div>
924									<div class="form-check form-check-inline">
925						<label class="form-check-label"><input type="radio" class="form-check-input" name="location_display_type" value="COORDINATES" /> Coordonnées GPS</label>
926					</div>
927							</div>
928		</div>
929		<div class="col-md-3 form-group distance_field">
930			<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Choix pour afficher les distances valant 0. Choix possible : <ul class='mb-0'><li><code>Distance à 0</code> : affichage normal (comme une distance quelconque)</li> <li><code>Champ vide</code> : affichage d’un champ vide </li></ul>"></i>&nbsp; <label>Affichage des distances valant 0 :</label><br>
931							<div class="form-check-inline">
932					<label class="form-check-label"><input type="radio" class="form-check-input" name="distance_blank_if_empty" value="0" /> Distance à 0</label>
933				</div>
934							<div class="form-check-inline">
935					<label class="form-check-label"><input type="radio" class="form-check-input" name="distance_blank_if_empty" value="1" /> Champ vide</label>
936				</div>
937					</div>
938	</div>
939</fieldset>
940
941<div id="modal_filter_data" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
942	<div class="modal-dialog modal-lg">
943		<div class="modal-content">
944			<div class="modal-header">
945				<h5 class="modal-title">
946					<span class="title_select_displayed_columns">Critères / Filtres</span>
947				</h5>
948				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
949			</div>
950			<form action="#" method="post">
951				<div class="modal-body">
952					<div class="form_content"></div>
953				</div>
954				<div class="modal-footer">
955					<button type="submit" name="valider" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Valider</button>
956					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
957				</div>
958			</form>
959		</div>
960	</div>
961</div>
962
963<div id="modal_export_and_display_params" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
964	<div class="modal-dialog modal-lg">
965		<div class="modal-content">
966			<div class="modal-header">
967				<h5 class="modal-title">
968					<span class="title_select_displayed_columns">Paramètres d’affichage de la page</span>
969					<span class="title_export">Paramètres d’affichage pour l’export <span class="type_export"></span></span>
970				</h5>
971				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
972			</div>
973			<form action="#" method="post">
974				<div class="modal-body">
975					<div class="form_errors_content"></div>
976					<div class="center custom_filters_field hide">
977						<div class="form-check form-check-inline">
978							<label class="form-check-label"><input type="radio" class="form-check-input" name="custom_filters" value="
9780" /> Filtres actuels</label>
979						</div>
980						<div class="form-check form-check-inline">
981							<label class="form-check-label"><input type="radio" class="form-check-input" name="custom_filters" value="1" /> Autres filtres</label>
982						</div>
983					</div>
984					<fieldset class="fieldset_filters_content hide">
985						<legend>Filtres</legend>
986						<div class="filters_content"></div>
987					</fieldset>
988					<fieldset class="fieldset_format_csv hide">
989						<legend>Type de CSV</legend>
990						<div class="center mb-2">
991							<div class="form-check form-check-inline">
992								<label class="form-check-label"><input type="radio" class="form-check-input" name="csv_type" value="standard" /> CSV classique</label>
993							</div>
994							<div class="form-check form-check-inline">
995								<label class="form-check-label"><input type="radio" class="form-check-input" name="csv_type" value="excel" /> CSV pour Excel</label>
996							</div>
997						</div>
998					</fieldset>
999					<div class="plugins_content"></div>
1000					<fieldset class="export_file hide">
1001						<legend>Fichier final</legend>
1002						<div class="row">
1003							<div class="col-md-12 form-group">
1004								<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content=""></i>&nbsp;<label>Titre :</label><br>
1005								<input type="text" name="export_file_title" class="form-control" value="" />
1006								<div class="form-text">Laisser vide pour le titre par défaut</div>
1007							</div>
1008							<div class="col-md-12 form-group">
1009								<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content=""></i>&nbsp;<label>Nom de fichier :</label><br>
1010								<div class="alert alert-warning hide pt-1 pb-1 mb-1">
1011									<span class="warning_message_no_employee_variable hide">Veuillez ajouter le texte <code>{employee}</code> (variable nom employé) dans le nom de fichier pour que chaque nom de fichier soit distinct et présent dans le fichier ZIP.</span>
1012									<span class="warning_message_no_company_variable hide">Veuillez ajouter le texte <code>{company}</code> (variable nom société) dans le nom de fichier pour que chaque nom de fichier soit distinct et présent dans le fichier ZIP.</span>
1013									<span class="warning_message_no_task_variable hide">Veuillez ajouter le texte <code>{task}</code> (variable nom mission) dans le nom de fichier pour que chaque nom de fichier soit distinct et présent dans le fichier ZIP.</span>
1014								</div>
1015								<input type="text" name="export_file_name" class="form-control" value="" />
1016								<div class="form-text">Laisser vide pour le nom de fichier par défaut</div>
1017							</div>
1018
1019							<div class="col-md-12 form-group exported_files hide">
1020								<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content=""></i>&nbsp;<label>Types de fichier à inclure dans l’archive :</label><br>
1021								<div class="">
1022									<div class="form-check form-check-inline">
1023										<label class="form-check-label"><input type="checkbox" class="form-check-input" name="exported_file_types[]" value="csv" /> CSV</label>
1024									</div>
1025									<div class="form-check form-check-inline">
1026										<label class="form-check-label"><input type="checkbox" class="form-check-input" name="exported_file_types[]" value="pdf" /> PDF</label>
1027									</div>
1028								</div>
1029							</div>
1030
1031							<div class="col-md-12 form-group export_email hide">
1032								<i class="fas fa-info-circle" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Cocher oui pour recevoir l’export automatiquement par email une fois généré."></i>&nbsp;<label>Envoi par email :</label><br>
1033																	<div class="form-check form-check-inline"><label class="form-check-label"><input type="radio" class="form-check-input" name="export_send_email" value="0" />Non</label></div>
1034																	<div class="form-check form-check-inline"><label class="form-check-label"><input type="radio" class="form-check-input" name="export_send_email" value="1" />Oui</label></div>
1035																<div class="hide export_email_params">
1036									<div class="form-text">Adresse email :</div>
1037									<input type="email" name="email_to" class="form-control" autocomplete="email" inputmode="email" />
1038									<div class="form-text">
1039										L’export sera envoyé automatiquement à cette adresse une fois généré.
1040									</div>
1041								</div>
1042							</div>
1043
1044						</div>
1045					</fieldset>
1046					<div class="text-end save_choice">
1047						<div class="form-check form-check form-check-inline">
1048							<label class="form-check-label"><input type="checkbox" class="form-check-input" name="save_choice" value="1" checked="checked" /> Sauvegarder ces paramètres</label>
1049						</div>
1050					</div>
1051				</div>
1052				<div class="modal-footer">
1053					<button type="submit" name="valider" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Valider</button>
1054					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
1055				</div>
1056			</form>
1057		</div>
1058	</div>
1059</div>
1060
1061<script>
1062	$(function() {
1063		if ($('.data_table_wrapper').length > 0) {
1064			CustomDataTable.initDisplayParams();
1065		}
1066
1067		$('div#modal_filter_data').on('show.bs.modal', function (event) {
1068			// 13/12/2019 : bug car le glyphicon info signe déclenche un event show.bs.modal
1069			if (typeof event.relatedTarget == 'undefined') {
1070				return;
1071			}
1072
1073			let button = $(event.relatedTarget);
1074			const modal = Modal.init($(this));
1075
1076			// 06/02/2023 : remplacé par button.closest('.data_table_wrapper'); car ne fonctionnait pas pour les table sans data-display_items mais avec filtres (comme l'onglet vue d'ensemble des droits d'acces par exemple)
1077			//let div = button.closest('[data-display_items][data-display_items!=""]');
1078			let div = button.closest('.data_table_wrapper');
1079			if (!button.data('filter_standalone') && div.length === 0) {
1080				return false;
1081			}
1082
1083			// Init du modal
1084			CustomDataTable.initFilterModal(div, button, modal);
1085
1086			let btnSubmit = FormHelper.buttonLoader(modal.find('form button[type="submit"]'), 'reset');
1087			btnSubmit.off('click').click(function(e) {
1088				e.preventDefault();
1089				FormHelper.buttonLoader($(this), 'loading');
1090
1091				if (!CustomDataTable.submitFilterModal(div, button, modal)) {
1092					// Réactivation du bouton car il y a des erreurs
1093					FormHelper.buttonLoader($(this), 'reset');
1094				}
1095				else {
1096					// Retrait du modal
1097					modal.modal('hide');
1098				}
1099
1100				return false;
1101			});
1102		});
1103
1104		$('div#modal_export_and_display_params').on('show.bs.modal', function (event) {
1105			// 13/12/2019 : bug car le glyphicon info signe déclenche un event show.bs.modal
1106			if (typeof event.relatedTarget == 'undefined') {
1107				return;
1108			}
1109
1110			let button = $(event.relatedTarget);
1111			const modal = Modal.init($(this));
1112
1113			//let div = button.closest('[data-display_items][data-display_items!=""]');
1114			let div = button.closest('.data_table_wrapper');
1115			if (div.length === 0) {
1116				return false;
1117			}
1118
1119			// Init du modal
1120			CustomDataTable.initDisplayOrExportModal(div, button, modal);
1121
1122			let btnSubmit = FormHelper.buttonLoader(modal.find('form button[type="submit"]'), 'reset');
1123			btnSubmit.off('click').click(function(e) {
1124				e.preventDefault();
1125				FormHelper.buttonLoader($(this), 'loading');
1126
1127				if (!CustomDataTable.submitDisplayOrExportModal(div, button, modal)) {
1128					// Réactivation du bouton car il y a des erreurs
1129					FormHelper.buttonLoader($(this), 'reset');
1130				}
1131				else {
1132					// Retrait du modal
1133					modal.modal('hide');
1134				}
1135
1136				return false;
1137			});
1138
1139		});
1140	});
1141</script>
1141
1142	<div id="modal_contact_us" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1143	<div class="modal-dialog modal-xl">
1144		<div class="modal-content">
1145			<div class="modal-header">
1146				<h5 class="modal-title">Nous contacter</h5>
1147				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1148			</div>
1149			<div class="modal-body">
1150				<div class="row">
1151					<div class="col-md-6">
1152						<div class="card">
1153							<div class="card-body">
1154								<h5 class="card-title">Contact immédiat par téléphone</h5>
1155								<div class="alert alert-info">
1156									Indiquez votre numéro de téléphone et validez, vous recevrez dans quelques secondes un appel vous mettant en relation directe avec notre service client.<br/>
1157									Le coût de la communication est entièrement à notre charge.
1158								</div>
1159
1160								<form method="post" action="#" class="contact_by_phone">
1161									<input type="hidden" name="landing_page" value="" />
1162									<input type="hidden" name="url_referer" value="" />
1163									<input type="hidden" name="user_agent" value="" />
1164									<input type="hidden" name="accept_language" value="" />
1165									<input type="hidden" name="ip_address" value="" />
1166
1167									<div class="form-group">
1168										<label for="contact_by_phone_email">Adresse email :</label>
1169										<input type="text" id="contact_by_phone_email" name="email" class="form-control" size="40" />
1170									</div>
1171									<div class="form-group">
1172										<label for="contact_by_phone_phone_number">Numéro de téléphone :</label><br>
1173										<input type="text" id="contact_by_phone_phone_number" name="phone_number" class="form-control" size="15" />
1174									</div>
1175									<div class="form-group">
1176										<div id="contact_by_phone_grecaptcha" class="grecaptcha"></div>
1177									</div>
1178									<div class="center">
1179										<button type="submit" class="btn btn-primary" name="validate" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" id="contact_us_phone_button">Être rappelé par téléphone</button>
1180									</div>
1181								</form>
1182							</div>
1183						</div>
1184
1185						<table class="coordonnees mt-3">
1186							<tr>
1187								<td>
1188									<img loading="lazy" src="/images/icons/icon_location.png" class="icon float-end" alt="">
1189								</td>
1190								<td>
1191									MYTIME SAS<br/>
1192									22 Rue Henri-Théodore Pigozzi<br/>78300 Poissy<br/>France								</td>
1193							</tr>
1194							<tr>
1195								<td>
1196									<img loading="lazy" src="/images/icons/icon_phone.png" class="icon float-end" alt="">
1197								</td>
1198								<td>
1199									<span class="phone-number">+33170813111</span>
1200								</td>
1201							</tr>
1202							<tr>
1203								<td>
1204									<img loading="lazy" src="/images/icons/icon_message.png" class="icon float-end" alt="">
1205								</td>
1206								<td>
1207									[email protected]								</td>
1208							</tr>
1209						</table>
1210					</div>
1211
1212					<div class="col-md-6">
1213						<div class="card">
1214							<div class="card-body">
1215								<h5 class="card-title">Contact par email</h5>
1216
1217								<form action="#" method="post" class="contact_by_email">
1218									<div class="alert alert-info">
1219										Vous pouvez nous contacter en remplissant ce formulaire. Nous vous répondrons dans les plus brefs délais.
1220									</div>
1221									<div class="form-group">
1222										<label for="contact_by_email_company_name">Société :&nbsp;</label>
1223										<input type="text" id="contact_by_email_company_name" name="company_name" class="form-control" value="" />
1224									</div>
1225									<div class="row">
1226										<div class="col-md-2">
1227											<div class="form-group">
1228												<label for="contact_by_email_title">Civilité :</label>
1229												<select id="contact_by_email_title" name="gender" class="form-control">
1230													<option value="0">-</option>
1231													<option value="1">M.</option>
1232													<option value="2">Mme</option>
1233												</select>
1234											</div>
1235										</div>
1236										<div class="col-md-5">
1237											<div class="form-group">
1238												<label for="contact_by_email_first_name">Prénom :&nbsp;</label>
1239												<input type="text" id="contact_by_email_first_name" name="first_name" class="form-control" value="" />
1240											</div>
1241										</div>
1242										<div class="col-md-5">
1243											<div class="form-group">
1244												<label for="contact_by_email_last_name">Nom :&nbsp;</label>
1245												<input type="text" id="contact_by_email_last_name" name="last_name" class="form-control" value="" />
1246											</div>
1247										</div>
1248									</div>
1249									<div class="row">
1250										<div class="col-md-6">
1251											<div class="form-group">
1252												<label for="contact_by_email_email">Adresse email :&nbsp;</label>
1253												<input type="text" id="contact_by_email_email" name="email" size="40" class="form-control" value="" />
1254											</div>
1255										</div>
1256										<div class="col-md-6">
1257											<div class="form-group">
1258												<label for="contact_by_email_phone_number">Téléphone :&nbsp;</label>
1259												<input type="text" id="contact_by_email_phone_number" name="phone_number" class="form-control" value="" />
1260											</div>
1261										</div>
1262									</div>
1263																		<div class="form-group">
1264										<label for="contact_by_email_street">Adresse :&nbsp;</label>
1265										<input type="text" id="contact_by_email_street" name="street" class="form-control" value="" placeholder="Rue" />
1266									</div>
1267									<div class="row">
1268										<div class="col-md-3">
1269											<div class="form-group">
1270												<input type="text" id="contact_by_email_zip_code" name="post_code" size="5" class="form-control" value="" placeholder="Code postal" />
1271											</div>
1272										</div>
1273										<div class="col-md-5">
1274											<div class="form-group">
1275												<input type="text" id="contact_by_email_city" name="city" class="form-control" value="" placeholder="Ville" />
1276											</div>
1277										</div>
1278										<div class="col-md-4">
1279											<div class="form-group">
1280												<select id="contact_by_email_country" name="country" class="form-control"></select>
1281											</div>
1282										</div>
1283									</div>
1284									<div class="form-group">
1285										<label for="contact_by_email_message">Message ou commentaires :&nbsp;</label>
1286										<textarea id="contact_by_email_message" name="message" cols="40" rows="7" class="form-control"></textarea>
1287									</div>
1288									<div class="form-group">
1289										<div id="contact_by_email_grecaptcha" class="grecaptcha"></div>
1290									</div>
1291									<div class="center">
1292										<button type="submit" class="btn btn-primary" name="validate" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" id="contact_us_email_button">Envoyer</button>
1293									</div>
1294									<div class="form-text mt-3">Conformément à la loi Informatique et Libertés n°78-17 en date du 6 janvier 1978, modifiée par la loi n°2004-801 du 6 août 2004, vous disposez d’un droit d’accès, de rectification, de modification et de suppression des données qui vous concernent.</div>
1295								</form>
1296							</div>
1297						</div>
1298					</div>
1299				</div>
1300			</div>
1301			<div class="modal-footer">
1302				<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
1303			</div>
1304		</div>
1305	</div>
1306</div>
1307
1308<script>
1309	$('div#modal_contact_us').on('show.bs.modal', function (event) {
1310		let button = $(event.relatedTarget);
1311		const modal = Modal.init($(this));
1312
1313
1314		// ---------- Form contact par téléphone ----------
1315
1316		let contactByPhoneForm = FormHelper.init(modal.find('form.contact_by_phone'), (form, btnSubmit) => {
1317			contactByPhoneForm.find('input[name="phone_number"]').val(TelephoneNumber.getEnteredNumberInInternationalFormat(contactByPhonePhoneNumberFieldIti));
1318
1319			HTTPClient.request('POST', URL_API+'/contact/by-phone', FormHelper.getFormData(form),
1320				() => {
1321					const email = Email.normalize(form.find('input[name="email"]').val());
1322					const phoneNumber = form.find('input[name="phone_number"]').val();
1323					Appvizer.conversion('AP-27154');
1324					// Conversion Google Ads "Contact callback" déclenchée explicitement ici plutôt que par un trigger GTM basé sur la visibilité d'un élément du DOM (peu fiable, l'élément étant créé puis retiré 6 secondes après par FlashMessage)
1325					dataLayer.push({'event': 'contact_by_phone', 'enhanced_conversion_data': {'email': email, 'phone_number': phoneNumber}});
1326					FlashMessage.displaySuccess("Vous allez être mis en relation avec notre hotline.", false, modal);
1327				},
1328				(response) => Api.displayError(response, modal),
1329				(json) => {
1330					if (contactByPhoneCaptchaEnabled) {
1331						GoogleRecaptcha.reset('contact_by_phone_grecaptcha');
1332					}
1333					FormHelper.displayFormErrors(form, btnSubmit, json);
1334				},
1335			);
1336		});
1337
1338		contactByPhoneForm.find('input[name="landing_page"]').val('www.mytime.fr/presentation-de-la-solution-de-pointeuse-virtuelle');
1339		contactByPhoneForm.find('input[name="url_referer"]').val('');
1340		contactByPhoneForm.find('input[name="user_agent"]').val('Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PageSourceSearchBot/1.0; +https://pagesourcesearch.com/bot) Chrome/128.0.0.0 Safari/537.36');
1341		contactByPhoneForm.find('input[name="accept_language"]').val('en-US,en;q=0.9');
1342		contactByPhoneForm.find('input[name="ip_address"]').val('81.16.3.32');
1343
1344		// Phone number
1345		let contactByPhonePhoneNumberFieldIti = TelephoneNumber.setIntlTelInput(contactByPhoneForm.find('input[name="phone_number"]'));
1346
1347		// Captcha
1348		let contactByPhoneCaptchaEnabled = contactByPhoneForm.find('#contact_by_phone_grecaptcha').length;
1349		if (contactByPhoneCaptchaEnabled) {
1350			GoogleRecaptcha.reset('contact_by_phone_grecaptcha');
1351		}
1352
1353		// ---------- Form contact par email ----------
1354
1355		let contactByEmailForm = FormHelper.init(modal.find('form.contact_by_email'), (form, btnSubmit) => {
1356			contactByEmailForm.find('input[name="phone_number"]').val(TelephoneNumber.getEnteredNumberInInternationalFormat(contactByEmailPhoneNumberFieldIti));
1357
1358			HTTPClient.request('POST', URL_API+'/contact/by-email', FormHelper.getFormData(form),
1359				() => {
1360					const email = Email.normalize(form.find('input[name="email"]').val());
1361					const phoneNumber = form.find('input[name="phone_number"]').val();
1362					Appvizer.conversion('AP-27154');
1363					// Conversion Google Ads "Contact email" déclenchée explicitement ici plutôt que par un trigger GTM basé sur la visibilité d'un élément du DOM (peu fiable, l'élément étant créé puis retiré 6 secondes après par FlashMessage)
1364					dataLayer.push({'event': 'contact_by_email', 'enhanced_conversion_data': {'email': email, 'phone_number': phoneNumber, 'first_name': form.find('input[name="first_name"]').val(), 'last_name': form.find('input[name="last_name"]').val()}});
1365					FlashMessage.displaySuccess("Votre message a été envoyé avec succès !<br/>Nous nous efforcerons de vous répondre dans les plus brefs délais.", false, modal);
1366				},
1367				(response) => Api.displayError(response, modal),
1368				(json) => {
1369					if (contactByEmailCaptchaEnabled) {
1370						GoogleRecaptcha.reset('contact_by_email_grecaptcha');
1371					}
1372					FormHelper.displayFormErrors(form, btnSubmit, json);
1373				},
1374			);
1375		});
1376
1377		contactByEmailForm.find('[name="gender"]').val('0');
1378
1379		// Phone number
1380		let contactByEmailPhoneNumberFieldIti = TelephoneNumber.setIntlTelInput(contactByEmailForm.find('input[name="phone_number"]'));
1381
1382		// Pays
1383		Country.fillSelectWithFlags(contactByEmailForm.find('select[name="country"]'), 'FR');
1384
1385		// Captcha
1386		let contactByEmailCaptchaEnabled = contactByEmailForm.find('#contact_by_email_grecaptcha').length;
1387		if (contactByEmailCaptchaEnabled) {
1388			GoogleRecaptcha.reset('contact_by_email_grecaptcha');
1389		}
1390	});
1391</script>
1391
1392
1393<div id="modal_about_us" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1394	<div class="modal-dialog modal-lg">
1395		<div class="modal-content">
1396			<div class="modal-header">
1397				<h5 class="modal-title">À propos</h5>
1398				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1399			</div>
1400			<div class="modal-body">
1401				<div class="mb-1">
1402					<img loading="lazy" src="/images/logo/mytime.png" alt="" title="myTime" class="logo" />
1403					<span class="police_mytime">myTime</span>
1404				</div>
1405				<p>
1406					myTime v. <a href="#" data-bs-toggle="modal" data-bs-target="#modal_versions"><span class="current_version"></span></a>
1407				</p>
1408				<p>
1409					Téléphone : <span class="phone-number">+33170813111</span><br>
1410					Adresse email : [email protected]				</p>
1411				<p>myTime est un service de la société :</p>
1412				<p>
1413					MYTIME SAS<br>
1414					22 Rue Henri-Théodore Pigozzi<br>78300 Poissy<br>France				</p>
1415				<div class="copyright">
1416					Copyright &copy; 2026 MYTIME. Tous droits réservés.
1417				</div>
1418			</div>
1419			<div class="modal-footer">
1420				<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
1421			</div>
1422		</div>
1423	</div>
1424</div>
1425<script>
1426	$('div#modal_about_us').on('show.bs.modal', function (event) {
1427		let button = $(event.relatedTarget);
1428		const modal = Modal.init($(this));
1429
1430		modal.find('span.current_version').text(CURRENT_VERSION);
1431	});
1432</script>
1432
1433
1434<div id="modal_bug_report" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1435	<div class="modal-dialog  modal-lg ">
1436		<div class="modal-content">
1437			<div class="modal-header">
1438				<h5 class="modal-title"><i class="fas fa-bug me-2 text-danger"></i> Signaler un bug</h5>
1439				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1440			</div>
1441			<form method="post" action="#">
1442				<div class="modal-body">
1443					<div class="alert alert-info">
1444						Merci de préciser autant d’informations que possible pour nous aider à reproduire et corriger le problème. Il sera vérifié et résolu dans les meilleurs délais.
1445					</div>
1446					<div class="form_errors_content"></div>
1447
1448					<div class="row">
1449						<div class="col-md-8 form-group">
1450							<label for="bug_report_summary" class="form-label">Titre du bug <span class="text-danger">*</span></label>
1451							<input type="text" id="bug_report_summary" name="summary" class="form-control" required maxlength="120" placeholder="Résumé court (ex: Erreur 500 lors de l’enregistrement)">
1452						</div>
1453
1454						<div class="col-md-4 form-group">
1455							<label for="bug_report_severity" class="form-label">Sévérité <span class="text-danger">*</span></label>
1456							<select id="bug_report_severity" name="severity" class="form-select" required>
1457								<option value="">Sélectionner...</option>
1458								<option value="critical">Critique — bloque l’utilisation</option>
1459								<option value="high">Haute — fonctionnalité indisponible</option>
1460								<option value="medium">Moyenne — gêne importante</option>
1461								<option value="low">Faible — amélioration souhaitée</option>
1462							</select>
1463						</div>
1464
1465						<div class="col-12 form-group">
1466							<label for="bug_report_description" class="form-label">Description détaillée <span class="text-danger">*</span></label>
1467							<textarea id="bug_report_description" name="description" class="form-control" rows="4" required placeholder="Décrivez ce qui se passe, ce que vous attendiez, et tout message d’erreur affiché."></textarea>
1468						</div>
1469
1470						<div class="col-md-6 form-group">
1471							<label for="bug_report_steps" class="form-label">Étapes pour reproduire</label>
1472							<textarea id="bug_report_steps" name="steps" class="form-control" rows="3" placeholder="1) Aller à ...&#10;2) Cliquer sur ..."></textarea>
1473						</div>
1474
1475						<div class="col-md-6 form-group">
1476							<label for="bug_report_expected" class="form-label">Résultat attendu</label>
1477							<textarea id="bug_report_expected" name="expected" class="form-control" rows="3" placeholder="Que devrait-il se passer ?"></textarea>
1478						</div>
1479
1480						<div class="col-md-4 form-group">
1481							<label for="bug_report_component" class="form-label">Composant / Module</label>
1482							<input id="bug_report_component" name="component" class="form-control" placeholder="Ex: Pointage, Planning, Authentification">
1483						</div>
1484
1485						<div class="col-md-4 form-group">
1486							<label for="bug_report_priority" class="form-label">Priorité</label>
1487							<select id="bug_report_priority" name="priority" class="form-select">
1488								<option value="normal">Normal</option>
1489								<option value="urgent">Urgent</option>
1490								<option value="low">Bas</option>
1491							</select>
1492						</div>
1493
1494						<div class="col-md-4 form-group">
1495							<label class="form-label d-block">OS / Navigateur</label>
1496							<div class="small text-muted" id="bug_report_env_info">Détecte automatiquement...</div>
1497						</div>
1498
1499						<!-- File upload area -->
1500						<div class="col-12 form-group">
1501							<label class="form-label">Capture d’écran / Fichiers (images, logs)</label>
1502							<input id="bug_report_files_input" type="file" multiple accept="image/*,.log,.txt,.zip" class="hide">
1503							<div class="form-text text-muted mt-1">Formats acceptés : jpg, png, gif, txt, log, zip. Max 5 fichiers. Taille max : 8MB / fichier.</div>
1504						</div>
1505
1506						<div class="user_identity">
1507							<div class="col-md-4 form-group">
1508								<label for="bug_report_identity" class="form-label">Votre nom</label>
1509								<input id="bug_report_identity" name="identity" class="form-control" placeholder="Nom (optionnel)">
1510							</div>
1511							<div class="col-md-4 form-group">
1512								<label for="bug_report_email" class="form-label">Votre adresse email</label>
1513								<input id="bug_report_email" name="email" type="email" class="form-control" placeholder="[email protected]">
1514							</div>
1515							<div class="col-md-4 form-group">
1516								<label for="bug_report_phone_number" class="form-label">Votre numéro de téléphone</label>
1517								<input id="bug_report_phone_number" name="phone_number" class="form-control" placeholder="[email protected]">
1518							</div>
1519						</div>
1520					</div>
1521					<div class="form-group">
1522						<div id="bug_report_grecaptcha" class="grecaptcha"></div>
1523					</div>
1524					<input type="hidden" name="url" value="" />
1525					<input type="hidden" name="user_agent" value="" />
1526				</div>
1527				<div class="modal-footer">
1528					<button type="submit" name="validate" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…"><i class="fas fa-paper-plane me-1"></i> Envoyer</button>
1529					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
1530				</div>
1531			</form>
1532		</div>
1533	</div>
1534</div>
1535<script>
1536	$('div#modal_bug_report').on('show.bs.modal', function (event) {
1537		let button = $(event.relatedTarget);
1538		const modal = Modal.init($(this));
1539		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
1540			let formData = FormHelper.getFormData(form);
1541			formData.append('user_type', User.getUserType());
1542			formData.append('user_id', User.getUserId());
1543			files.forEach((f, i) => formData.append('attachments[]', f, f.name));
1544			HTTPClient.request('POST', URL_API+'/contact/report-bug', formData,
1545				() => FlashMessage.displaySuccess("Le bug a bien été signalé, il sera vérifié et résolu dans les meilleurs délais.", false, modal),
1546				(response) => Api.displayError(response, modal),
1547				(json) => {
1548					if (captchaEnabled) {
1549						GoogleRecaptcha.reset('bug_report_grecaptcha');
1550					}
1551					FormHelper.displayFormErrors(form, btnSubmit, json);
1552				},
1553			);
1554		});
1555
1556		const MAX_SIZE = 8 * 1024 * 1024; // 8MB
1557
1558		// Identité utilisateur
1559		form.find('.user_identity').addClass('hide');
1560		if (!User.isLogged()) {
1561			form.find('.user_identity').removeClass('hide');
1562		}
1563
1564		// Environnement infos
1565		const userAgent = navigator.userAgent || '';
1566		modal.find('#bug_report_env_info').text(UserAgent.getInfosDisplay(UserAgent.getData(userAgent)));
1567		form.find('input[name="url"]').val(document.location.href);
1568		form.find('input[name="user_agent"]').val(userAgent);
1569
1570		form.find('select[name="severity"]').val('medium');
1571		form.find('select[name="priority"]').val('normal');
1572
1573		// Gestion multi fichiers
1574		let files = [];
1575		MultiFilesInput.init(modal.find('#bug_report_files_input'), (newFilesList) => files = newFilesList, 5, MAX_SIZE);
1576
1577		// Captcha
1578		let captchaEnabled = $('#bug_report_grecaptcha').length;
1579		if (captchaEnabled) {
1580			GoogleRecaptcha.reset('bug_report_grecaptcha');
1581		}
1582	});
1583</script>
1583
1584
1585<div id="modal_contact_share" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1586	<div class="modal-dialog">
1587		<div class="modal-content">
1588			<div class="modal-header">
1589				<h5 class="modal-title">Partager la solution de pointeuse virtuelle myTime</h5>
1590				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1591			</div>
1592			<form method="post" action="#"  class="form-horizontal">
1593				<div class="modal-body">
1594					<div class="alert alert-info">
1595						Un email contenant les informations et les avantages de la solution de pointeuse virtuelle myTime sera envoyé aux adresses email indiquées.
1596					</div>
1597					<div class="form-group">
1598						<label for="contact_share_sender_email">Votre adresse email :</label>
1599						<input type="text" id="contact_share_sender_email" name="sender_email" class="form-control" value="" />
1600					</div>
1601					<div class="form-group">
1602						<label for="contact_share_email_1">Adresses email des destinataires :</label>
1603													<input type="text" id="contact_share_email_1" name="emails[]" placeholder="Adresses email n°1" class="form-control mb-2" />
1604													<input type="text" id="contact_share_email_2" name="emails[]" placeholder="Adresses email n°2" class="form-control mb-2" />
1605													<input type="text" id="contact_share_email_3" name="emails[]" placeholder="Adresses email n°3" class="form-control mb-2" />
1606													<input type="text" id="contact_share_email_4" name="emails[]" placeholder="Adresses email n°4" class="form-control mb-2" />
1607													<input type="text" id="contact_share_email_5" name="emails[]" placeholder="Adresses email n°5" class="form-control mb-2" />
1608											</div>
1609					<div class="form-group2">
1610						<div id="contact_share_grecaptcha" class="grecaptcha"></div>
1611					</div>
1612				</div>
1613				<div class="modal-footer">
1614					<button type="submit" name="validate" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Envoyer</button>
1615					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
1616				</div>
1617			</form>
1618		</div>
1619	</div>
1620</div>
1621<script>
1622	$('div#modal_contact_share').on('show.bs.modal', function (event) {
1623		let button = $(event.relatedTarget);
1624		const modal = Modal.init($(this));
1625		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
1626			HTTPClient.request('POST', URL_API+'/contact/share', FormHelper.getFormData(form),
1627				() => FlashMessage.displaySuccess("Les emails ont bien été envoyés. Merci pour votre confiance !", false, modal),
1628				(response) => Api.displayError(response, modal),
1629				(json) => {
1630					if (captchaEnabled) {
1631						GoogleRecaptcha.reset('contact_share_grecaptcha');
1632					}
1633					FormHelper.displayFormErrors(form, btnSubmit, json);
1634				},
1635			);
1636		});
1637
1638		// Captcha
1639		let captchaEnabled = $('#contact_share_grecaptcha').length;
1640		if (captchaEnabled) {
1641			GoogleRecaptcha.reset('contact_share_grecaptcha');
1642		}
1643	});
1644</script>
1644
1645
1646<div id="modal_contact_demo_flashcode" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1647	<div class="modal-dialog">
1648		<div class="modal-content">
1649			<div class="modal-header">
1650				<h5 class="modal-title">Flashcode de démo</h5>
1651				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1652			</div>
1653			<form method="post" action="#"  class="form-horizontal">
1654				<div class="modal-body text-center">
1655					<img src="/images/type_pointage/qrcode_demo.svg" alt="QR code" class="img-thumbnail">
1656				</div>
1657				<div class="modal-footer">
1658					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
1659				</div>
1660			</form>
1661		</div>
1662	</div>
1663</div>
1664<script>
1665	$('div#modal_contact_demo_flashcode').on('show.bs.modal', function (event) {
1666		const modal = Modal.init($(this));
1667
1668	});
1669</script>
1669
1670
1671
1672
1673<div id="modal_versions" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1674	<div class="modal-dialog modal-xl">
1675		<div class="modal-content">
1676			<div class="modal-header">
1677				<h5 class="modal-title">Versions</h5>
1678				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1679			</div>
1680			<div class="modal-body">
1681								<ul class="nav nav-tabs">
1682											<li><a class="nav-link active" href="#web" aria-controls="web" data-bs-toggle="tab">Web</a></li>
1683											<li><a class="nav-link " href="#android" aria-controls="android" data-bs-toggle="tab">Android</a></li>
1684											<li><a class="nav-link " href="#ios" aria-controls="ios" data-bs-toggle="tab">iOS</a></li>
1685									</ul>
1686
1687				<div class="tab-content">
1688					<div role="tabpanel" class="tab-pane active" id="web">
1689						<div class="web_versions_dev hide">
1690							<h3>Version en développement</h3>
1691							<ul></ul>
1692						</div>
1693
1694						<div class="web_versions_test hide">
1695							<h3>Version en test (prévue le <span class="version_date"></span>)</h3>
1696							<ul></ul>
1697							<p>Pour tester cette version : <a href="https://beta.mytime.fr">https://beta.mytime.fr</a></p>
1698						</div>
1699
1700						<div class="web_versions_online">
1701							<div class="version_base hide">
1702								<h3>Version du <span class="version_name"></span></h3>
1703								<ul></ul>
1704							</div>
1705						</div>
1706					</div>
1707
1708					<div role="tabpanel" class="tab-pane" id="android">
1709						<div class="android_versions_dev hide">
1710							<h3>Version en développement</h3>
1711							<ul></ul>
1712						</div>
1713
1714						<div class="android_versions_test hide">
1715							<h3>Version en test (prévue le <span class="version_date"></span>)</h3>
1716							<ul></ul>
1717						</div>
1718
1719						<div class="android_versions_online">
1720							<div class="version_base hide">
1721								<h3>Version <span class="version_name"></span></h3>
1722								<ul></ul>
1723							</div>
1724						</div>
1725					</div>
1726
1727					<div role="tabpanel" class="tab-pane" id="ios">
1728						<div class="ios_versions_dev hide">
1729							<h3>Version en développement</h3>
1730							<ul></ul>
1731						</div>
1732
1733						<div class="ios_versions_test hide">
1734							<h3>Version en test (prévue le <span class="version_date"></span>)</h3>
1735							<ul></ul>
1736						</div>
1737
1738						<div class="ios_versions_online">
1739							<div class="version_base hide">
1740								<h3>Version <span class="version_name"></span></h3>
1741								<ul></ul>
1742							</div>
1743						</div>
1744					</div>
1745				</div>
1746			</div>
1747			<div class="modal-footer">
1748				<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
1749			</div>
1750		</div>
1751	</div>
1752</div>
1753<script>
1754	$('div#modal_versions').on('show.bs.modal', function (event) {
1755		HTTPClient.request('GET', URL_API+'/service/versions', null,
1756			(data) => {
1757				console.log(data);
1758
1759				function displayAvancement(avancement) {
1760					//if (avancement === 'test') {
1761					//	return '<div class="progress" style="width: 10%; float: left;"><div class="progress-bar" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;">Terminé, test en cours</div></div>';
1762					//}
1763					// if ($avancement == '0') {
1764					// 	return '<div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">Développement planifié</div></div>';
1765					// }
1766					return '<div class="progress" style="width: 15%; float: left; margin-right: 10px; height: 1.3rem"><div class="progress-bar" role="progressbar" aria-valuenow="'+(avancement==='test' ?100:avancement)+'" aria-valuemin="0" aria-valuemax="100" style="width: '+(avancement==='test' ?100:avancement)+'%; min-width: 2em; ">'+(avancement==='test' ?'Terminé, test en cours':avancement)+'%</div></div>';
1767				}
1768
1769				// Web
1770				let divWebVersionsOnline = $('div.web_versions_online');
1771				divWebVersionsOnline.find('div:not(.version_base)').remove();
1772				Object.entries(data['web']['online']).forEach(function([versionName, features]) {
1773					let div = divWebVersionsOnline.find('.version_base').clone().removeClass('version_base').removeClass('hide');
1774					div.find('.version_name').text(versionName);
1775					features.forEach(feature => div.find('ul').append('<li>'+feature+'</li>'));
1776					divWebVersionsOnline.append(div);
1777				});
1778
1779				if (data['web']['test']) {
1780					let divWebVersionsTest = $('div.web_versions_test').removeClass('hide');
1781					Object.entries(data['web']['test']).forEach(function([versionName, features]) {
1782						divWebVersionsTest.find('.version_date').text(versionName);
1783						divWebVersionsTest.find('ul').empty();
1784						features.forEach(feature => divWebVersionsTest.find('ul').append('<li>'+feature+'</li>'));
1785					});
1786				}
1787				if (data['web']['dev']) {
1788					let divWebVersionsDev = $('div.web_versions_dev').removeClass('hide');
1789					Object.entries(data['web']['dev']).forEach(function([versionName, features]) {
1790						divWebVersionsDev.find('.version_date').text(versionName);
1791						divWebVersionsDev.find('ul').empty();
1792						features.forEach(([feature, avancement]) => divWebVersionsDev.find('ul').append('<li>'+displayAvancement(avancement)+' '+feature+'</li>'));
1793					});
1794				}
1795
1796				// Android
1797				let divAndroidVersionsOnline = $('div.android_versions_online');
1798				divAndroidVersionsOnline.find('div:not(.version_base)').remove();
1799				Object.entries(data['android']['online']).forEach(function([versionName, [versionDate, features]]) {
1800					let div = divAndroidVersionsOnline.find('.version_base').clone().removeClass('version_base').removeClass('hide');
1801					div.find('.version_name').text(versionName);
1802					features.forEach(feature => div.find('ul').append('<li>'+feature+'</li>'));
1803					divAndroidVersionsOnline.append(div);
1804				});
1805
1806				if (data['android']['test']) {
1807					let divAndroidVersionsTest = $('div.android_versions_test').removeClass('hide');
1808					Object.entries(data['android']['test']).forEach(function([versionName, [versionDate, features]]) {
1809						divAndroidVersionsTest.find('.version_date').text(versionName);
1810						divAndroidVersionsTest.find('ul').empty();
1811						features.forEach(feature => divAndroidVersionsTest.find('ul').append('<li>'+feature+'</li>'));
1812					});
1813				}
1814				if (data['android']['dev']) {
1815					let divAndroidVersionsDev = $('div.android_versions_dev').removeClass('hide');
1816					Object.entries(data['android']['dev']).forEach(function([versionName, [versionDate, features]]) {
1817						divAndroidVersionsDev.find('.version_date').text(versionName);
1818						divAndroidVersionsDev.find('ul').empty();
1819						features.forEach(([feature, avancement]) => divAndroidVersionsDev.find('ul').append('<li>'+displayAvancement(avancement)+' '+feature+'</li>'));
1820					});
1821				}
1822
1823				// iOS
1824				let divIosVersionsOnline = $('div.ios_versions_online');
1825				divIosVersionsOnline.find('div:not(.version_base)').remove();
1826				Object.entries(data['ios']['online']).forEach(function([versionName, [versionDate, features]]) {
1827					let div = divIosVersionsOnline.find('.version_base').clone().removeClass('version_base').removeClass('hide');
1828					div.find('.version_name').text(versionName);
1829					features.forEach(feature => div.find('ul').append('<li>'+feature+'</li>'));
1830					divIosVersionsOnline.append(div);
1831				});
1832
1833				if (data['ios']['test']) {
1834					let divIosVersionsTest = $('div.ios_versions_test').removeClass('hide');
1835					Object.entries(data['ios']['test']).forEach(function([versionName, [versionDate, features]]) {
1836						divIosVersionsTest.find('.version_date').text(versionName);
1837						divIosVersionsTest.find('ul').empty();
1838						features.forEach(feature => divIosVersionsTest.find('ul').append('<li>'+feature+'</li>'));
1839					});
1840				}
1841				if (data['ios']['dev']) {
1842					let divIosVersionsDev = $('div.ios_versions_dev').removeClass('hide');
1843					Object.entries(data['ios']['dev']).forEach(function([versionName, [versionDate, features]]) {
1844						divIosVersionsDev.find('.version_date').text(versionName);
1845						divIosVersionsDev.find('ul').empty();
1846						features.forEach(([feature, avancement]) => divIosVersionsDev.find('ul').append('<li>'+displayAvancement(avancement)+' '+feature+'</li>'));
1847					});
1848				}
1849
1850			}
1851		);
1852	});
1853</script>
1853
1854	
1855<div id="modal_user_login" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1856	<div class="modal-dialog">
1857		<div class="modal-content">
1858			<div class="modal-header">
1859				<!--<h5 class="modal-title">Se connecter</h5>-->
1860
1861				<ul class="nav nav-pills nav-underline" role="tablist">
1862					<li role="presentation" class="nav-item"><a href="#modal_user_login_panel" aria-controls="home" role="tab" data-bs-toggle="tab" class="nav-link active">Se connecter</a></li>
1863					<li role="presentation" class="nav-item"><a href="#modal_user_subscribe_panel" aria-controls="profile" role="tab" data-bs-toggle="tab" class="nav-link">S’inscrire</a></li>
1864				</ul>
1865
1866				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1867			</div>
1868			<div class="modal-body">
1869				<div class="tab-content no-border mb-0">
1870					<div role="tabpanel" class="tab-pane active" id="modal_user_login_panel">
1871						<form action="#" method="post" class="form-horizontal">
1872							<div class="row form-group align-items-center">
1873								<label class="col-form-label col-sm-4" for="login_email">Adresse email :</label>
1874								<div class="col-sm-8">
1875									<input type="text" id="login_email" name="login" class="form-control" placeholder="Adresse email" autocomplete="username" />
1876								</div>
1877							</div>
1878							<div class="row form-group align-items-center">
1879								<label class="col-form-label col-sm-4" for="login_password">Mot de passe :</label>
1880								<div class="col-sm-8">
1881									<input type="password" id="login_password" name="password" class="form-control" placeholder="Mot de passe" autocomplete="current-password" />
1882								</div>
1883							</div>
1884						</form>
1885						<p class="float-end form-text"><a href="#" data-bs-toggle="modal" data-bs-target="#modal_user_password_forgotten">Mot de passe oublié</a></p>
1886						<div class="cl"></div>
1887					</div>
1888					<div role="tabpanel" class="tab-pane" id="modal_user_subscribe_panel">
1889						<form action="#" method="post" class="form-horizontal">
1890							<div class="form-group">
1891								<label class="col-form-label" for="modal_user_login_subscribe_email">Adresse email :</label>
1892								<input type="text" id="modal_user_login_subscribe_email" name="email" autocomplete="off" class="form-control" placeholder="Adresse email" />
1893							</div>
1894						</form>
1895					</div>
1896				</div>
1897			</div>
1898			<div class="modal-footer">
1899				<button type="submit" name="validate" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" class="btn btn-primary">Valider</button>
1900				<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
1901			</div>
1902		</div>
1903	</div>
1904</div>
1905
1906<script>
1907	$('div#modal_user_login').on('show.bs.modal', function (event) {
1908		let button = $(event.relatedTarget);
1909		const modal = Modal.init($(this));
1910		if (typeof FormHelper == 'undefined') { // hack si click modal avant chargement complet de la page
1911			return false;
1912		}
1913		let form = FormHelper.hideFormErrors(modal.find('form'));
1914
1915		let btnSubmit = FormHelper.buttonLoader(modal.find('button[name="validate"]'), 'reset');
1916		btnSubmit.off('click').click(function (e) {
1917			e.preventDefault();
1918			FormHelper.buttonLoader($(this), 'loading');
1919			FormHelper.hideFormErrors(form);
1920
1921			//console.log(modal.find('.tab-pane.active').id());
1922			//console.log(modal.find('.tab-pane.active').attr('id'));
1923			if (modal.find('.tab-pane.active').attr('id') === 'modal_user_subscribe_panel') {
1924				$('#modal_user_subscribe').find('input[name="email"]').val(form.find('input[name="email"]').val());
1925				$('#modal_user_subscribe').modal('show');
1926
1927				modal.modal('hide');
1928				return;
1929			}
1930
1931			// Récupération du token (si échec, identifiants invalides)
1932			let formData = new FormData();
1933			formData.append('email', form.find('input[name="login"]').val());
1934			formData.append('password', form.find('input[name="password"]').val());
1935			HTTPClient.request('POST', URL_API+'/login', formData,
1936				(data) => JwtSession.login(data, UrlAndQueryString.setParamOfUrl('success', 'Vous êtes maintenant connecté sur votre compte.', User.getRedirectUrlAfterLogin())),
1937				() => FormHelper.displayFormErrors(form, btnSubmit, ['L’adresse email ou le mot de passe est incorrect.']),
1938				null,
1939				{'Content-Type': 'application/json'}
1940			);
1941		});
1942
1943		if (button.data('default_email')) {
1944			form.find('input[name="login"]').val(button.data('default_email'));
1945		}
1946		if (button.data('default_password')) {
1947			form.find('input[name="password"]').val(button.data('default_password'));
1948		}
1949	});
1950</script>
1950
1951
1952<div id="modal_user_subscribe" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
1953	<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
1954		<div class="modal-content">
1955			<div class="modal-header border-0 pb-0">
1956				<div>
1957					<h5 class="modal-title mb-1">S’inscrire</h5>
1958					<p class="text-muted small mb-0">Quelques infos et c’est parti.</p>
1959				</div>
1960				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
1961			</div>
1962			<form action="#" method="post" style="display: contents;">
1963				<div class="modal-body pt-3">
1964
1965					<div class="d-flex align-items-center gap-3 p-3 mb-4 rounded-3 bg-primary-subtle border border-primary-subtle">
1966						<i class="fas fa-gift fa-2x text-primary"></i>
1967						<div>
1968														<div class="fw-semibold">7 jours d’essai gratuit, sans engagement.</div>
1969							<div class="small text-muted">Une fois inscrit, vous recevrez un email récapitulant vos informations.</div>
1970						</div>
1971					</div>
1972
1973					<div class="form_errors_content"></div>
1974
1975					<h6 class="text-uppercase small fw-semibold mb-2">
1976						<i class="far fa-building me-1"></i> Société
1977					</h6>
1978					<div class="form-group">
1979						<input type="text" id="subscribe_company_name" name="company_name" size="30" class="form-control form-control-lg" value="" placeholder="Nom de la société" autocomplete="organization" />
1980					</div>
1981
1982					<h6 class="text-uppercase small fw-semibold mb-2 pt-2">
1983						<i class="far fa-user me-1"></i> Coordonnées
1984					</h6>
1985					<div class="row g-2">
1986						<div class="col-md-2">
1987							<div class="form-group">
1988								<select id="subscribe_gender" name="gender" class="form-select">
1989									<option value="0">-</option>
1990									<option value="1">M.</option>
1991									<option value="2">Mme</option>
1992								</select>
1993							</div>
1994						</div>
1995						<div class="col-md-5">
1996							<div class="form-group">
1997								<input type="text" id="subscribe_first_name" name="first_name" size="30" class="form-control" value="" autocomplete="given-name" placeholder="Prénom" />
1998							</div>
1999						</div>
2000						<div class="col-md-5">
2001							<div class="form-group">
2002								<input type="text" id="subscribe_last_name" name="last_name" size="30" class="form-control" value="" autocomplete="family-name" placeholder="Nom" />
2003							</div>
2004						</div>
2005					</div>
2006
2007					<div class="form-group">
2008						<input type="email" id="subscribe_email" name="email" size="40" class="form-control w-100" value="" autocomplete="username" placeholder="Adresse email" />
2009					</div>
2010					<div class="row g-2">
2011						<div class="col-md-6">
2012							<div class="form-group">
2013								<div class="input-group">
2014									<span class="input-group-text">Fixe</span>
2015									<input type="text" id="subscribe_landline_phone" name="landline_phone" size="25" class="form-control w-100" value="" autocomplete="tel" />
2016								</div>
2017							</div>
2018						</div>
2019						<div class="col-md-6">
2020							<div class="form-group">
2021								<div class="input-group">
2022									<span class="input-group-text">Mobile</span>
2023									<input type="text" id="subscribe_mobile_phone" name="mobile_phone" size="25" class="form-control w-100" value="" autocomplete="tel" />
2024								</div>
2025							</div>
2026						</div>
2027					</div>
2028
2029					<h6 class="text-uppercase small fw-semibold mb-2 pt-2">
2030						<i class="fas fa-map-marker-alt me-1"></i> Adresse postale
2031					</h6>
2032					<div class="form-group">
2033						<label for="subscribe_street" class="form-label visually-hidden">Adresse postale :</label>
2034						<input type="text" id="subscribe_street" name="street" size="40" class="form-control" value="" placeholder="N° et nom de rue" autocomplete="street-address" />
2035					</div>
2036					<div class="form-group">
2037						<input type="text" id="subscribe_additional_address" name="additional_address" size="40" class="form-control" value="" placeholder="Complément (bât., étage, etc.)" autocomplete="street-address" />
2038					</div>
2039					<div class="row g-2">
2040						<div class="col-md-3">
2041							<div class="form-group">
2042								<input type="text" id="subscribe_zip_code" name="zip_code" size="5" class="form-control" value="" placeholder="Code postal" autocomplete="postal-code" />
2043							</div>
2044						</div>
2045						<div class="col-md-5">
2046							<div class="form-group">
2047								<input type="text" id="subscribe_city" name="city" size="30" class="form-control" value="" placeholder="Ville" autocomplete="address-level2" />
2048							</div>
2049						</div>
2050						<div class="col-md-4">
2051							<div class="form-group">
2052								<select id="subscribe_country" name="country" class="form-control ts-select"></select>
2053							</div>
2054						</div>
2055					</div>
2056
2057					<h6 class="text-uppercase small fw-semibold mb-2 pt-2">
2058						<i class="fas fa-lock me-1"></i> Mot de passe
2059					</h6>
2060					<div class="row g-2 mb-3">
2061						<div class="col-md-6">
2062							<div class="form-group">
2063								<input type="password" id="subscribe_password" name="password" size="30" class="form-control" placeholder="Mot de passe" autocomplete="new-password" />
2064							</div>
2065						</div>
2066						<div class="col-md-6">
2067							<div class="form-group">
2068								<input type="password" id="subscribe_password_confirmation" name="password_confirmation" size="30" class="form-control" placeholder="Confirmer le mot de passe" autocomplete="new-password" />
2069							</div>
2070						</div>
2071					</div>
2072
2073					<div class="form-group form-check mb-0">
2074						<input type="checkbox" name="newsletter" value="1" id="subscribe_newsletter" class="form-check-input" />
2075						<label for="subscribe_newsletter" class="form-check-label">S’inscrire à la newsletter</label>
2076					</div>
2077
2078					<input type="hidden" name="gclid" value="" />
2079
2080									</div>
2081				<div class="modal-footer flex-column align-items-stretch border-0 pt-0">
2082					<button type="submit" name="validate" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" class="btn btn-primary btn-lg w-100" id="user_subscribe_button">S’inscrire</button>
2083					<button type="button" class="btn btn-link text-muted" data-bs-dismiss="modal">Annuler</button>
2084				</div>
2085			</form>
2086		</div>
2087	</div>
2088</div>
2089
2090<script>
2091	$('div#modal_user_subscribe').on('show.bs.modal', function (event) {
2092		let button = $(event.relatedTarget);
2093		const modal = Modal.init($(this));
2094		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2095			form.find('input[name="landline_phone"]').val(TelephoneNumber.getEnteredNumberInInternationalFormat(itiFixedLineNumberField));
2096			form.find('input[name="mobile_phone"]').val(TelephoneNumber.getEnteredNumberInInternationalFormat(itiMobileNumberField));
2097
2098			HTTPClient.request('POST', URL_API+'/user/subscribe', FormHelper.getFormData(form),
2099				(data) => {
2100					//console.log(data);
2101					const email = Email.normalize(form.find('input[name="email"]').val());
2102					const password = form.find('input[name="password"]').val();
2103					const phoneNumber = form.find('input[name="mobile_phone"]').val() || form.find('input[name="landline_phone"]').val();
2104
2105					// Google Ads / Appvizer
2106					Appvizer.conversion('AP-27154')
2107					//gtag('event', 'conversion', {'send_to': 'AW-1071463623/YrcYCJCvzVwQx_n0_gM', 'value': 2.0, 'currency': 'EUR', 'transaction_id': email});
2108					dataLayer.push({'event': 'subscribe', 'transaction_id': email, 'enhanced_conversion_data': {'email': email, 'phone_number': phoneNumber, 'first_name': form.find('input[name="first_name"]').val(), 'last_name': form.find('input[name="last_name"]').val()}});
2109
2110					// Récupération du token (si échec, identifiants invalides)
2111					let formData = new FormData();
2112					formData.append('email', email);
2113					formData.append('password', password);
2114					HTTPClient.request('POST', URL_API+'/login', formData,
2115						(data) => JwtSession.login(data, UrlAndQueryString.setParamOfUrl('success', 'Votre inscription a été effectuée avec succès !', URL_TABLEAU_DE_BORD)),
2116						() => window.location = URL_INDEX,
2117						null,
2118						{'Content-Type': 'application/json'}
2119					);
2120
2121									},
2122				(response) => Api.displayError(response, modal),
2123				(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2124			);
2125		});
2126
2127		// Phone number
2128		let itiFixedLineNumberField = TelephoneNumber.setIntlTelInput(form.find('input[name="landline_phone"]'), 'FIXED_LINE');
2129		let itiMobileNumberField = TelephoneNumber.setIntlTelInput(form.find('input[name="mobile_phone"]'), 'MOBILE');
2130
2131		form.find('[name="gender"]').val('0');
2132		form.find('input[name="gclid"]').val(localStorage.getItem('gclid') || '');
2133
2134		Password.displayPasswordStrength(modal.find('input[name="password"]'));
2135
2136		Country.fillSelectWithFlags(form.find('select[name="country"]'), 'FR');
2137	});
2138</script>
2138
2139
2140<div id="modal_user_contact_details_edit" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2141	<div class="modal-dialog modal-lg">
2142		<div class="modal-content">
2143			<div class="modal-header">
2144				<h5 class="modal-title">Modifier les coordonnées</h5>
2145				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
2146			</div>
2147			<form action="#" method="post">
2148				<div class="modal-body">
2149					<div data-is_user_type="supervisor|company">
2150						<div class="form-group">
2151							<label>Type de société :</label><br>
2152							<div class="form-inline company_types_list"></div>
2153						</div>
2154						<div class="form-group champs_societe">
2155							<label for="user_contact_details_edit_company_name">Nom de la société :</label>
2156							<input type="text" id="user_contact_details_edit_company_name" name="company_name" size="30" class="form-control" value="" />
2157						</div>
2158					</div>
2159					<label for="user_contact_details_edit_gender">Dirigeant :</label>
2160					<div class="row">
2161						<div class="col-md-2">
2162							<div class="form-group">
2163								<select id="user_contact_details_edit_gender" name="gender" class="form-control">
2164									<option value="0"> -</option>
2165									<option value="1"> M.</option>
2166									<option value="2"> Mme</option>
2167								</select>
2168							</div>
2169						</div>
2170						<div class="col-md-5">
2171							<div class="form-group">
2172								<input type="text" id="user_contact_details_edit_first_name" name="first_name" size="30" class="form-control" value="" placeholder="Prénom" />
2173							</div>
2174						</div>
2175						<div class="col-md-5">
2176							<div class="form-group">
2177								<input type="text" id="user_contact_details_edit_last_name" name="last_name" size="30" class="form-control" value="" placeholder="Nom" />
2178							</div>
2179						</div>
2180					</div>
2181					<div class="form-group">
2182						<label for="user_contact_details_edit_email">Adresse email :</label>
2183						<input type="text" id="user_contact_details_edit_email" name="email" size="40" class="form-control" value="" />
2184					</div>
2185					<div class="row">
2186						<div class="col-md-6">
2187							<div class="form-group">
2188								<label for="user_contact_details_edit_landline_number">Téléphone fixe :</label>
2189								<input type="text" id="user_contact_details_edit_landline_number" name="landline_phone" size="30" class="form-control" value="" />
2190							</div>
2191						</div>
2192						<div class="col-md-6">
2193							<div class="form-group">
2194								<label for="user_contact_details_edit_mobile_phone">Téléphone mobile :</label>
2195								<input type="text" id="user_contact_details_edit_mobile_phone" name="mobile_phone" size="30" class="form-control" value="" />
2196							</div>
2197						</div>
2198					</div>
2199					<div class="form-group">
2200						<label for="user_contact_details_edit_street">Adresse :</label>
2201						<input type="text" id="user_contact_details_edit_street" name="street" size="30" class="form-control" value="" placeholder="Rue" />
2202					</div>
2203					<div class="form-group">
2204						<input type="text" id="user_contact_details_edit_additional_address" name="additional_address" size="30" class="form-control" value="" placeholder="Complément" />
2205					</div>
2206					<div class="row">
2207						<div class="col-md-2">
2208							<div class="form-group">
2209								<input type="text" id="user_contact_details_edit_zip_code" name="zip_code" size="5" class="form-control" value="" placeholder="Code postal" />
2210							</div>
2211						</div>
2212						<div class="col-md-5">
2213							<div class="form-group">
2214								<input type="text" id="user_contact_details_edit_city" name="city" size="30" class="form-control" value="" placeholder="Ville" />
2215							</div>
2216						</div>
2217						<div class="col-md-5">
2218							<div class="form-group">
2219								<select id="user_contact_details_edit_country" name="country" class="form-control"></select>
2220							</div>
2221						</div>
2222					</div>
2223				</div>
2224				<div class="modal-footer">
2225					<button type="submit" name="validate" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" class="btn btn-warning">Enregistrer</button>
2226					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
2227				</div>
2228			</form>
2229		</div>
2230	</div>
2231</div>
2232
2233<script>
2234	$('div#modal_user_contact_details_edit').on('show.bs.modal', function (event) {
2235		let button = $(event.relatedTarget);
2236		const modal = Modal.init($(this));
2237		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2238			form.find('input[name="landline_phone"]').val(TelephoneNumber.getEnteredNumberInInternationalFormat(itiFixedLineNumberField));
2239			form.find('input[name="mobile_phone"]').val(TelephoneNumber.getEnteredNumberInInternationalFormat(itiMobileNumberField));
2240
2241			if (User.getUserType() === 'reseller' || User.getUserType() === User.TYPE_SUPERVISOR) {
2242				HTTPClient.request('PATCH', URL_API+'/supervisor/'+User.getUserId(), FormHelper.getFormData(form),
2243					() => FlashMessage.displaySuccess("Vos coordonnées ont bien été modifiées.", true, modal),
2244					(response) => Api.displayError(response, modal),
2245					(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2246				);
2247			}
2248			else if (User.getUserType() === User.TYPE_COMPANY) {
2249				HTTPClient.request('PATCH', URL_API+'/company/'+User.getUserId(), FormHelper.getFormData(form),
2250					() => FlashMessage.displaySuccess("Vos coordonnées ont bien été modifiées.", true, modal),
2251					(response) => Api.displayError(response, modal),
2252					(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2253				);
2254			}
2255			else if (User.getUserType() === User.TYPE_EMPLOYEE) {
2256				HTTPClient.request('PATCH', URL_API+'/employee/'+User.getUserId(), FormHelper.getFormData(form),
2257					() => FlashMessage.displaySuccess("Vos coordonnées ont bien été modifiées.", true, modal),
2258					(response) => Api.displayError(response, modal),
2259					(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2260				);
2261			}
2262		});
2263
2264		Company.fillCompanyTypeSelect(form);
2265
2266		// Phone number
2267		let itiFixedLineNumberField = TelephoneNumber.setIntlTelInput(form.find('input[name="landline_phone"]'), 'FIXED_LINE');
2268		let itiMobileNumberField = TelephoneNumber.setIntlTelInput(form.find('input[name="mobile_phone"]'), 'MOBILE');
2269
2270		Country.fillSelectWithFlags(form.find('select[name="country"]'));
2271
2272		CustomModal.addLoader(modal);
2273		modal.off('shown.bs.modal').on('shown.bs.modal', () => {
2274			if (User.getUserType() === 'reseller' || User.getUserType() === User.TYPE_SUPERVISOR) {
2275				HTTPClient.request('GET', URL_API+'/supervisor/'+User.getUserId(), null,
2276					supervisor => {
2277						form.find('input[name="company_type"][value="'+supervisor['company_type']+'"]').prop('checked', true);
2278						CustomFormHelper.companyDetailsFormUpdate(form);
2279
2280						form.find('input[name="company_name"]').val(supervisor['company_name']);
2281						form.find('select[name="gender"]').val(supervisor['gender']);
2282						form.find('input[name="first_name"]').val(supervisor['first_name']);
2283						form.find('input[name="last_name"]').val(supervisor['last_name']);
2284						form.find('input[name="email"]').val(supervisor['email']);
2285						form.find('input[name="landline_phone"]').val(supervisor['landline_phone']);
2286						form.find('input[name="mobile_phone"]').val(supervisor['mobile_phone']);
2287						form.find('input[name="street"]').val(supervisor['street']);
2288						form.find('input[name="additional_address"]').val(supervisor['additional_address']);
2289						form.find('input[name="zip_code"]').val(supervisor['zip_code']);
2290						form.find('input[name="city"]').val(supervisor['city']);
2291						SelectBox.setValue(form.find('select[name="country"]'), supervisor['country'] || 'FR');
2292
2293						// force la détection du pays en fonction du numéro
2294						itiFixedLineNumberField.setNumber(form.find('input[name="landline_phone"]').val());
2295						itiMobileNumberField.setNumber(form.find('input[name="mobile_phone"]').val());
2296
2297						CustomModal.removeLoader(modal);
2298					},
2299					(response) => Api.displayError(response, modal)
2300				);
2301			}
2302			else if (User.getUserType() === User.TYPE_COMPANY) {
2303				HTTPClient.request('GET', URL_API+'/company/'+User.getUserId(), null,
2304					company => {
2305						form.find('input[name="company_type"][value="'+company['company_type']+'"]').prop('checked', true);
2306						CustomFormHelper.companyDetailsFormUpdate(form);
2307
2308						form.find('input[name="company_name"]').val(company['company_name']);
2309						form.find('select[name="gender"]').val(company['director_gender']);
2310						form.find('input[name="first_name"]').val(company['director_first_name']);
2311						form.find('input[name="last_name"]').val(company['director_last_name']);
2312						form.find('input[name="email"]').val(company['email']);
2313						form.find('input[name="landline_phone"]').val(company['landline_phone']);
2314						form.find('input[name="mobile_phone"]').val(company['mobile_phone']);
2315						form.find('input[name="street"]').val(company['street']);
2316						form.find('input[name="additional_address"]').val(company['additional_address']);
2317						form.find('input[name="zip_code"]').val(company['zip_code']);
2318						form.find('input[name="city"]').val(company['city']);
2319						SelectBox.setValue(form.find('select[name="country"]'), company['country'] || User.getAccountCountry());
2320
2321						// force la détection du pays en fonction du numéro
2322						itiFixedLineNumberField.setNumber(form.find('input[name="landline_phone"]').val());
2323						itiMobileNumberField.setNumber(form.find('input[name="mobile_phone"]').val());
2324
2325						CustomModal.removeLoader(modal);
2326					},
2327					(response) => Api.displayError(response, modal)
2328				);
2329			}
2330			else if (User.getUserType() === User.TYPE_EMPLOYEE) {
2331				HTTPClient.request('GET', URL_API+'/employee/'+User.getUserId(), null,
2332					employee => {
2333						form.find('select[name="gender"]').val(employee['gender']);
2334						form.find('input[name="first_name"]').val(employee['first_name']);
2335						form.find('input[name="last_name"]').val(employee['last_name']);
2336						form.find('input[name="email"]').val(employee['email']);
2337						form.find('input[name="landline_phone"]').val(employee['landline_phone']);
2338						form.find('input[name="mobile_phone"]').val(employee['mobile_phone']);
2339						form.find('input[name="street"]').val(employee['street']);
2340						form.find('input[name="additional_address"]').val(employee['additional_address']);
2341						form.find('input[name="zip_code"]').val(employee['zip_code']);
2342						form.find('input[name="city"]').val(employee['city']);
2343						SelectBox.setValue(form.find('select[name="country"]'), employee['country'] || User.getAccountCountry());
2344
2345						// force la détection du pays en fonction du numéro
2346						itiFixedLineNumberField.setNumber(form.find('input[name="landline_phone"]').val());
2347						itiMobileNumberField.setNumber(form.find('input[name="mobile_phone"]').val());
2348
2349						CustomModal.removeLoader(modal);
2350					},
2351					(response) => Api.displayError(response, modal)
2352				);
2353			}
2354		});
2355	});
2356</script>
2356
2357
2358<div id="modal_user_company_details_edit" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2359	<div class="modal-dialog">
2360		<div class="modal-content">
2361			<div class="modal-header">
2362				<h5 class="modal-title">Modifier des informations de la société</h5>
2363				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
2364			</div>
2365			<form action="#" method="post">
2366				<div class="modal-body">
2367					<div class="form-group">
2368						<label>Type de société :</label><br>
2369						<div class="form-inline company_types_list"></div>
2370					</div>
2371					<div class="form-group">
2372						<label for="user_company_details_edit_company_name">Nom de la société :</label>
2373						<input type="text" id="user_company_details_edit_company_name" name="company_name" size="30" class="form-control" value="" />
2374					</div>
2375					<div class="row">
2376						<div class="col-md-6">
2377							<div class="form-group champs_societe champs_profession_liberale champs_autoentrepreneur">
2378								<label for="user_company_details_edit_siret" class="control-label">SIRET :</label>
2379								<input type="text" id="user_company_details_edit_siret" name="siret" class="form-control" value="" />
2380							</div>
2381						</div>
2382						<div class="col-md-6">
2383							<div class="form-group champs_societe champs_profession_liberale champs_autoentrepreneur">
2384								<label for="user_company_details_edit_ape" class="control-label">APE / Code NAF :</label>
2385								<input type="text" id="user_company_details_edit_ape" name="ape" class="form-control" value="" />
2386							</div>
2387						</div>
2388						<div class="col-md-6 champs_societe">
2389							<div class="form-group">
2390								<label for="user_company_details_edit_forme" class="control-label">Forme sociale :</label>
2391								<input type="text" id="user_company_details_edit_forme" name="forme" class="form-control" value="" />
2392							</div>
2393						</div>
2394						<div class="col-md-6 champs_societe">
2395							<div class="form-group">
2396								<label for="user_company_details_edit_capital" class="control-label">Capital :</label>
2397
2398								<div class="input-group">
2399									<input type="text" id="user_company_details_edit_capital" name="capital" class="form-control" value="" />
2400									<div class="input-group-text company_capital_currency"></div>
2401								</div>
2402							</div>
2403						</div>
2404												<div class="col-md-6 champs_societe champs_profession_liberale">
2405							<div class="form-group">
2406								<label for="user_company_details_edit_vat_number" class="control-label">Numéro de TVA :</label>
2407								<input type="text" id="user_company_details_edit_vat_number" name="vat_number" class="form-control" value="" />
2408							</div>
2409						</div>
2410					</div>
2411				</div>
2412				<div class="modal-footer">
2413					<button type="submit" name="validate" class="btn btn-warning" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Enregistrer</button>
2414					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
2415				</div>
2416			</form>
2417		</div>
2418	</div>
2419</div>
2420<script>
2421	$('div#modal_user_company_details_edit').on('show.bs.modal', function (event) {
2422		let button = $(event.relatedTarget);
2423		const modal = Modal.init($(this));
2424		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2425			if (User.getUserType() === 'reseller' || User.getUserType() === User.TYPE_SUPERVISOR) {
2426				HTTPClient.request('PATCH', URL_API+'/supervisor/'+User.getUserId(), FormHelper.getFormData(form),
2427					() => FlashMessage.displaySuccess("Les informations de la société ont bien été modifiées.", true, modal),
2428					(response) => Api.displayError(response, modal),
2429					(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2430				);
2431			}
2432			else if (User.getUserType() === User.TYPE_COMPANY) {
2433				HTTPClient.request('PATCH', URL_API+'/company/'+User.getUserId(), FormHelper.getFormData(form),
2434					() => FlashMessage.displaySuccess("Les informations de la société ont bien été modifiées.", true, modal),
2435					(response) => Api.displayError(response, modal),
2436					(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2437				);
2438			}
2439		});
2440
2441		Company.fillCompanyTypeSelect(form);
2442
2443		CustomModal.addLoader(modal);
2444		modal.off('shown.bs.modal').on('shown.bs.modal', () => {
2445			if (User.getUserType() === 'reseller' || User.getUserType() === User.TYPE_SUPERVISOR) {
2446				HTTPClient.request('GET', URL_API+'/supervisor/'+User.getUserId(), null,
2447					(supervisor) => {
2448						form.find('input[name="company_type"][value="'+supervisor['company_type']+'"]').prop('checked', true);
2449						CustomFormHelper.companyDetailsFormUpdate(form);
2450
2451						form.find('input[name="company_name"]').val(supervisor['company_name']);
2452						form.find('input[name="siret"]').val(supervisor['company_siret']);
2453						form.find('input[name="ape"]').val(supervisor['company_ape']);
2454						form.find('input[name="forme"]').val(supervisor['company_legal_status']);
2455						form.find('input[name="capital"]').val(supervisor['company_capital']);
2456						form.find('.company_capital_currency').text(supervisor['company_capital_currency']);
2457						// form.find('input[name="rcs"]').val(supervisor.rcs);
2458						// form.find('input[name="immatriculation_date"]').val(supervisor.immatriculation_date);
2459						form.find('input[name="vat_number"]').val(supervisor['company_vat_number']);
2460
2461						CustomModal.removeLoader(modal);
2462					},
2463					(response) => Api.displayError(response, modal)
2464				);
2465			}
2466			else if (User.getUserType() === User.TYPE_COMPANY) {
2467				HTTPClient.request('GET', URL_API+'/company/'+User.getUserId()+'/', null,
2468					(company) => {
2469						form.find('input[name="company_type"][value="'+company['company_type']+'"]').prop('checked', true);
2470						CustomFormHelper.companyDetailsFormUpdate(form);
2471
2472						form.find('input[name="company_name"]').val(company['company_name']);
2473						form.find('input[name="siret"]').val(company['siret']);
2474						form.find('input[name="ape"]').val(company['ape']);
2475						form.find('input[name="forme"]').val(company['legal_status']);
2476						form.find('input[name="capital"]').val(company['capital']);
2477						form.find('.company_capital_currency').text(company['capital_currency']);
2478						// form.find('input[name="rcs"]').val(company.rcs);
2479						// form.find('input[name="immatriculation_date"]').val(company.immatriculation_date);
2480						form.find('input[name="vat_number"]').val(company['vat_number']);
2481
2482						CustomModal.removeLoader(modal);
2483					},
2484					(response) => Api.displayError(response, modal)
2485				);
2486			}
2487		});
2488	});
2489</script>
2489
2490
2491<div id="modal_user_email_validation_send" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2492	<div class="modal-dialog">
2493		<div class="modal-content">
2494			<div class="modal-header">
2495				<h5 class="modal-title">Valider mon adresse email</h5>
2496				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
2497			</div>
2498			<form action="#" method="post">
2499				<div class="modal-body">
2500					<p class="confirmation_message">Voulez-vous envoyer un email de validation pour votre adresse email ?</p>
2501				</div>
2502				<div class="modal-footer">
2503					<button type="submit" name="validate" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Envoyer</button>
2504					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
2505				</div>
2506			</form>
2507		</div>
2508	</div>
2509</div>
2510<script>
2511	$('div#modal_user_email_validation_send').on('show.bs.modal', function (event) {
2512		let button = $(event.relatedTarget);
2513		const modal = Modal.init($(this));
2514		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2515			HTTPClient.request('POST', URL_API+'/user/send-email-validation', FormHelper.getFormData(form),
2516				() => FlashMessage.displaySuccess("Les informations pour valider votre adresse email ont bien été envoyées.", false, modal),
2517				(response) => Api.displayError(response, modal),
2518				(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2519			);
2520		});
2521	});
2522</script>
2522
2523
2524<div id="modal_user_password_edit" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2525	<div class="modal-dialog">
2526		<div class="modal-content">
2527			<div class="modal-header">
2528				<h5 class="modal-title">Modifier mon mot de passe</h5>
2529				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
2530			</div>
2531			<form action="#" method="post">
2532				<div class="modal-body">
2533					<input hidden="hidden" type="text" name="email" autocomplete="username email" value="" />
2534					<div class="form-group">
2535						<label for="user_password_edit_old_password">Ancien mot de passe :</label><br>
2536						<input type="password" id="user_password_edit_old_password" name="old_password" size="30" class="form-control" value="" autocomplete="current-password" />
2537					</div>
2538					<div class="form-group">
2539						<label for="user_password_edit_new_password">Nouveau mot de passe :</label><br>
2540						<input type="password" id="user_password_edit_new_password" name="new_password" size="30" class="form-control" value="" autocomplete="new-password" />
2541					</div>
2542					<div class="form-group">
2543						<label for="user_password_edit_password_confirmation">Confirmer le nouveau mot de passe :</label><br>
2544						<input type="password" id="user_password_edit_password_confirmation" name="password_confirmation" size="30" class="form-control" value="" autocomplete="new-password" />
2545					</div>
2546				</div>
2547				<div class="modal-footer">
2548					<button type="submit" name="validate" class="btn btn-warning" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Enregistrer</button>
2549					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
2550				</div>
2551			</form>
2552		</div>
2553	</div>
2554</div>
2555<script>
2556	$('div#modal_user_password_edit').on('show.bs.modal', function (event) {
2557		let button = $(event.relatedTarget);
2558		const modal = Modal.init($(this));
2559		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2560			HTTPClient.request('POST', URL_API+'/user/edit-password', FormHelper.getFormData(form),
2561				() => FlashMessage.displaySuccess("Votre mot de passe a bien été modifié.", false, modal),
2562				(response) => Api.displayError(response, modal),
2563				(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2564			);
2565		});
2566
2567		Password.displayPasswordStrength(modal.find('input[name="new_password"]'));
2568
2569		form.find('input[name="old_password"], input[name="new_password"], input[name="password_confirmation"]').val('');
2570	});
2571</script>
2571
2572
2573<div id="modal_user_password_forgotten" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2574	<div class="modal-dialog">
2575		<div class="modal-content">
2576			<div class="modal-header">
2577				<h5 class="modal-title">Réinitialiser mon mot de passe</h5>
2578				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
2579			</div>
2580			<form action="#" method="post">
2581				<div class="modal-body">
2582					<div class="alert alert-info">
2583						Si vous avez oublié ou perdu votre mot de passe, vous pouvez le réinitialiser : indiquez l’adresse email de votre compte et vous recevrez un email avec un lien pour réinitialiser votre mot de passe.
2584					</div>
2585					<div class="form-group">
2586						<label for="modal_user_password_forgotten_email">Adresse email du compte :</label>
2587						<input type="text" id="modal_user_password_forgotten_email" name="email" size="40" class="form-control" value="" />
2588					</div>
2589				</div>
2590				<div class="modal-footer">
2591					<button type="submit" name="validate" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" class="btn btn-primary">Valider</button>
2592					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
2593				</div>
2594			</form>
2595		</div>
2596	</div>
2597</div>
2598<script>
2599	$('div#modal_user_password_forgotten').on('show.bs.modal', function (event) {
2600		let button = $(event.relatedTarget);
2601		const modal = Modal.init($(this));
2602		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2603			HTTPClient.request('POST', URL_API+'/user/password-forgotten', FormHelper.getFormData(form),
2604				() => FlashMessage.displaySuccess("Un lien pour réinitialiser votre mot de passe vous a bien été renvoyé par email.", false, modal),
2605				(response) => Api.displayError(response, modal),
2606				(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2607			);
2608		});
2609
2610		$('.modal').modal('hide');
2611	});
2612</script>
2612
2613
2614<div id="modal_user_reset_password" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2615	<div class="modal-dialog">
2616		<div class="modal-content">
2617			<div class="modal-header">
2618				<h5 class="modal-title">Réinitialiser mon mot de passe</h5>
2619				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
2620			</div>
2621			<form action="#" method="post">
2622				<input type="text" name="username" autocomplete="username" hidden value="" />
2623				<div class="modal-body">
2624					<div class="alert alert-info">
2625						Entrez votre nouveau mot de passe pour le réinitialiser et vous connecter.
2626					</div>
2627					<div class="form-group">
2628						<label for="modal_user_reset_password_new_password">Nouveau mot de passe :</label><br>
2629						<input type="password" id="modal_user_reset_password_new_password" name="password" size="30" class="form-control" value="" autocomplete="new-password" />
2630					</div>
2631					<div class="form-group">
2632						<label for="modal_user_reset_password_password_confirmation">Confirmer le nouveau mot de passe :</label><br>
2633						<input type="password" id="modal_user_reset_password_password_confirmation" name="password_confirmation" size="30" class="form-control" value="" autocomplete="new-password" />
2634					</div>
2635					<input type="hidden" name="key" value="" />
2636				</div>
2637				<div class="modal-footer">
2638					<button type="submit" name="validate" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" class="btn btn-primary">Valider</button>
2639					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
2640				</div>
2641			</form>
2642		</div>
2643	</div>
2644</div>
2645<script>
2646	$('div#modal_user_reset_password').on('show.bs.modal', function (event) {
2647		let button = $(event.relatedTarget);
2648		const modal = Modal.init($(this));
2649		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2650			HTTPClient.request('POST', URL_API+'/user/password-reset', FormHelper.getFormData(form),
2651				() => {
2652					FlashMessage.displaySuccess("Votre mot de passe a bien été réinitialisé.", false, modal);
2653					$('#modal_user_login').modal('show');
2654				},
2655				//() => window.location.href = URL_INDEX+'?login&success='+encodeURIComponent('Votre mot de passe a bien été réinitialisé.'),
2656				(response) => Api.displayError(response, modal),
2657				(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
2658			);
2659		});
2660
2661		let resetKey = UrlAndQueryString.getParam('key');
2662		form.find('input[name="key"]').val(resetKey);
2663		form.find('input[name="username"]').val(User.getEmail());
2664
2665		Password.displayPasswordStrength(modal.find('input[name="password"]'));
2666
2667		// Vérification du token de réinitialisation
2668		CustomModal.addLoader(modal);
2669		let formData = new FormData();
2670		formData.append('key', resetKey);
2671		HTTPClient.request('POST', URL_API+'/user/password-reset', formData,
2672			() => CustomModal.removeLoader(modal),
2673			(response, json) => {
2674				let error = FormHelper.extractErrorKeyOfJson(json);
2675				console.error(error);
2676				if (error === 'password_reset_link_not_valid' || error === 'password_reset_link_expired') {
2677					window.location.href = URL_INDEX+'?error='+encodeURIComponent('Le lien de réinitialisation du mot de passe est incorrect ou expiré. Veuillez re-demander la réinitialisation de votre mot de passe.');
2678					// cette solution ne fonctionne pas (le modal n'est pas caché)
2679					//window.history.pushState("", "", UrlAndQueryString.deleteParamsOfUrl(['key', 'reset-password']));
2680					//FlashMessage.displayError("Le lien de réinitialisation du mot de passe est incorrect ou expiré. Veuillez re-demander la réinitialisation de votre mot de passe.", modal);
2681					return;
2682				}
2683				CustomModal.removeLoader(modal);
2684			}
2685		);
2686	});
2687</script>
2687
2688
2689	
2690<script defer src="/dist/runtime.bundle.js?1787867340"></script>
vendor: 2 bytes, line 2690
2690
2691<script defer src="/dist/vendors.bundle.js?1787867340"></script>
vendor: 2 bytes, line 2691
2691
2692<script defer src="/dist/commons.bundle.js?1787867340"></script>
vendor: 2 bytes, line 2692
2692
2693<script defer src="/dist/app.bundle.js?1787867340"></script>
2693
2694
2695
2696<script>
2697	// Publiques
2698	const URL_INDEX = "/";
2699	const URL_CONTACT = "/contacter-le-service-de-pointeuse-virtuelle";
2700	const URL_FAQ = "/aide-sur-le-service-de-badgeuse-par-telephone";
2701	const URL_DEMO = "/demo-du-systeme-de-pointage";
2702	const URL_PRESENTATION = "/presentation-de-la-solution-de-pointeuse-virtuelle";
2703	const URL_SOCIETE = "/presentation-de-la-societe";
2704	const URL_TARIFS = "/tarifs-du-service-de-pointage-par-telephone";
2705	const URL_PLAN_DU_SITE = "/plan-du-site-mytime";
2706	const URL_NEWSLETTER = "/newsletters";
2707
2708	// Espace client
2709	const URL_INSCRIPTION = "/espace-client/inscription";
2710	const URL_CONNEXION = "/espace-client/connexion";
2711	const URL_INIT_MDP = "/espace-client/initialisation-du-mot-de-passe";
2712	const URL_TABLEAU_DE_BORD = "/espace-client/tableau-de-bord";
2713	const URL_COORDONNEES_VISU = "/espace-client/coordonnees";
2714	const URL_JOURNAL_ACTIVITE = "/espace-client/journal-d-activite";
2715	const URL_PARAMS_VISU = "/parametres";
2716	
2717	// Pointer
2718	const URL_CLOCK_IN_BY_MYTIME_FR = "/pointer/";
2719	const URL_CLOCK_IN_BY_NET = "/controller/pointer/clock_in_by_net.php";
2720	const URL_CLOCK_IN_BY_NET_URL = "/controller/pointer/clock_in_by_net_url.php";
2721	const URL_CLOCK_IN_BY_NFC = "/controller/pointer/clock_in_by_nfc.php";
2722	const URL_CLOCK_IN_BY_BARCODE = "/controller/pointer/clock_in_by_barcode.php";
2723	const URL_POINTAGE_FONCTIONNEMENT = "/fonctionnement";
2724
2725	// Gestion des clients
2726	const URL_GESTION_SUPERVISOR = "/controller/supervisor/gestion_supervisor.php";
2727	const URL_SUPERVISOR_DETAIL = "/controller/supervisor/supervisor_detail.php";
2728	const URL_SUPERVISOR_SEARCH = "/controller/supervisor/supervisor_search.php";
2729	const URL_SUPERVISOR_LISTER = "/controller/supervisor/supervisor_lister.php";
2730	const URL_SUPERVISOR_ADD = "/controller/supervisor/supervisor_add.php";
2731
2732	// Gestion employés
2733	const URL_EMPLOYEE_LIST = "/employes";
2734	const URL_EMPLOYEE_PROFILE = "/employe/fiche";
2735	const URL_DEPARTMENT_VISUALISATION = "/service/fiche";
2736
2737	// Gestion sociétés/missions
2738	const URL_COMPANIES_AND_TASKS_LIST = "/societes-missions";
2739	const URL_COMPANY_PROFILE = "/societe/fiche";
2740	const URL_ZONE_VISUALISATION = "/zone/fiche";
2741	const URL_TASK_PROFILE = "/mission/fiche";
2742
2743	// Pointages Liste / Stats
2744	const URL_POINTAGES_LISTE = "/pointages";
2745	const URL_LISTING = "/listing";
2746
2747	// Alertes
2748	const URL_NOTIFICATIONS_LIST = "/notifications";
2749
2750	// Planning
2751	const URL_PLANIFICATION_LISTE = "/planifications";
2752	const URL_PLANNING = "/planning";
2753
2754	// Congés
2755	const URL_DAY_OFF_LIST = "/conges-et-arrets";
2756	const URL_DAY_OFF_COUNTER_LIST = "/compteurs-des-conges-et-arrets";
2757
2758	// Facture général
2759	const URL_FACTURES = "/facturation";
2760	const URL_ACHAT_CHOIX_ABO = "/achat/abonnement";
2761	const URL_ACHAT_CHOIX_PAIEMENT = "/achat/validation";
2762	const URL_FACTURE_PAIEMENT = "/facture/paiement";
2763
2764	const URL_API_AND_WEBHOOK = "/api-et-webhooks";
2765</script>
2765
2766<!-- Defines -->
2767<script>
2768	const URL_API = "https://api.mytime.fr";
2769	const URL_DATA_FILES = "https://api.mytime.fr/data/";
2770
2771	const labelErrorOccurred = "Une erreur s’est produite.";
2772	const labelErrorAccountDisabled = "Vous ne pouvez pas faire cette action car ce compte est désactivé.";
2773	const labelErrorAccountDemo = "Vous ne pouvez pas faire cette action depuis le compte de démonstration.";
2774	const messageDownloadFileInProgress = "Le téléchargement du fichier est en cours…";
2775	const labelOneDownloadFileInProgress = "<strong>1</strong> téléchargement en cours";
2776	const labelManyDownloadFileInProgress = "<strong>%s</strong> téléchargements en cours";
2777
2778	const ROOT_PATH = "/";
2779	const SITE_NAME = "myTime";
2780	const URL_WEBSITE = "https://www.mytime.fr";
2781	const URL_MYTIME_APP_ANDROID = "https://play.google.com/store/apps/details?id=com.osimatic.mytime";
2782	const URL_MYTIME_APP_IOS = "https://itunes.apple.com/fr/app/mytime-pointeuse-virtuelle/id988395830";
2783	const IMG_PATH = "/images/";
2784	const IS_PAGE_POINTAGE = 0;
2785	const IS_LOCAL = 0;
2786	const CHATRA_ID = "tojKFz6BQDaRYcQWa";
2787	const BILLING_CURRENCY = "EUR";
2788	let CURRENT_VERSION = null;
2789
2790	const GOOGLE_RECAPTCHA_SITE_KEY = "6Le_AE0pAAAAAJd8mdSyAVmdpeNFmgBRgy-S-F3E";
2791
2792	const FIREBASE_API_KEY = "AIzaSyCGLUtloCJS_HiWeGB3MhNjXvTy-PQtHk4";
2793	const FIREBASE_AUTH_DOMAIN = "mytime-9b3f7.firebaseapp.com";
2794	const FIREBASE_PROJECT_ID = "mytime-9b3f7";
2795	const FIREBASE_STORAGE_BUCKET = "mytime-9b3f7.appspot.com";
2796	const FIREBASE_MESSAGING_SENDER_ID = "897841735307";
2797	const FIREBASE_APP_ID = "1:897841735307:web:a295d80ea7bb9f0b40968e";
2798	const FIREBASE_MEASUREMENT_ID = "G-YVDTLLPPWT";
2799</script>
2799
2800
2801<!-- fichiers JS -->
2802<script defer src="/dist/init.bundle.js?1787867340"></script>
vendor: 2 bytes, line 2802
2802
2803<script defer src="/dist/layout.bundle.js?1787867340"></script>
2803
2804
2805			<div class="billing_warning_account_disabled_base hide">
2806	<div class="alert alert-warning center text-bold billing_warning_account_disabled hide">
2807		<p>
2808			Pour utiliser le service de pointeuse virtuelle, veuillez <a href="/achat/abonnement" title="Acheter un abonnement">acheter un abonnement</a>.
2809		</p>
2810		<a href="/achat/abonnement" class="btn btn-sm btn-light" data-is_user_type="supervisor">Acheter un abonnement</a>
2811	</div>
2812	<div class="alert alert-warning center text-bold billing_warning_test_expired hide">
2813		<p>
2814			Votre période de test est arrivée à son terme.<br/>
2815			Pour continuer utiliser le service de pointeuse virtuelle, veuillez acheter un abonnement.
2816		</p>
2817		<a href="/achat/abonnement" class="btn btn-sm btn-light" data-is_user_type="supervisor">Acheter un abonnement</a>
2818	</div>
2819	<div class="alert alert-danger center text-bold billing_warning_subscription_expired hide">
2820		<p>
2821			L’abonnement au compte myTime est terminé depuis le <span class="subscription_end_date"></span>.<br>
2822			Le compte est désactivé, les employés ne peuvent plus pointer et l’accès aux données est désactivé. Pour continuer à utiliser myTime, veuillez renouveler votre abonnement.
2823		</p>
2824		<a href="/achat/abonnement" class="btn btn-sm btn-light" data-is_user_type="supervisor">Renouveler l’abonnement</a>
2825	</div>
2826	<div class="alert alert-danger center text-bold billing_warning_subscription_soon_expired hide">
2827		<p>
2828			L’abonnement au compte myTime expire dans <span class="nb_days_before_subscription_end"></span> jours.<br>
2829			Si vous ne renouvelez pas l’abonnement, le compte sera désactivé, les employés ne pourront plus pointer et l’accès aux données sera désactivé.
2830		</p>
2831		<a href="/achat/abonnement" class="btn btn-sm btn-light" data-is_user_type="supervisor">Renouveler l’abonnement</a>
2832	</div>
2833	<div class="alert alert-warning center billing_warning_subscription_soon_expired_but_monthly_subscription_enabled hide">
2834		L’abonnement au compte myTime expire dans <span class="nb_days_before_subscription_end"></span> jours.<br>
2835		À partir de cette date, l’abonnement passe en mensuel avec renouvellement automatique.
2836	</div>
2837	<div class="alert alert-warning center text-bold billing_warning_monthly_subscription_stopped hide">
2838		<p>
2839			L’abonnement mensuel a été résilié le <span class="monthly_subscription_termination_date"></span>. Le compte sera désactivé le <span class="monthly_subscription_end_date"></span>.
2840		</p>
2841		<a href="#" data-bs-toggle="modal" data-bs-target="#modal_billing_monthly_subscription_enabled" class="btn btn-sm btn-light" data-is_user_type="supervisor">Ré-activer l’abonnement mensuel</a>
2842	</div>
2843	<div class="alert alert-danger center text-bold billing_warning_monthly_subscription_stopped_for_unpaid_invoices hide">
2844		Le paiement de vos dernières factures a échoué ou n’a pas été effectué, le renouvellement automatique de votre abonnement mensuel est donc désactivé.<br/>
2845		Nous vous prions de bien vouloir régulariser votre situation dans les meilleurs délais et de réactiver le renouvellement automatique de votre abonnement mensuel.<br/>
2846		Votre compte sera désactivé le <strong><span class="monthly_subscription_end_date"></span></strong> si aucun règlement n’est effectué avant cette date.
2847	</div>
2848	<div class="alert alert-danger center text-bold billing_warning_monthly_subscription_stopped_and_finished hide">
2849		<p>
2850			L’abonnement mensuel a été résilié le <span class="monthly_subscription_termination_date"></span> et le compte a été désactivé le <span class="monthly_subscription_end_date"></span>.
2851		</p>
2852		<a href="/achat/abonnement" class="btn btn-sm btn-light" data-is_user_type="supervisor">Renouveler l’abonnement</a>
2853	</div>
2854</div>
2855
2856<div class="billing_subscription_infos_base hide">
2857	<div class="alert alert-info center">
2858		<span class="demo_finished text-danger text-bold hide">Période de test terminée depuis le <span class="demo_end_date"></span></span>
2859		<span class="demo_disabled text-warning hide">Pas de période de test sur ce compte.</span>
2860		<span class="subscription_finished subscription_expired text-danger text-bold hide">Abonnement terminé depuis le <span class="subscription_end_date"></span></span>
2861		<span class="no_subscription text-warning hide">Aucun abonnement en cours.</span>
2862		<span class="demo_activated hide">
2862Actuellement en période de test.</span>
2863		<span class="monthly_subscription_stopped text-danger text-bold hide">Abonnement mensuel résilié le <span class="subscription_termination_date"></span></span>
2864		<span class="monthly_subscription_disabled_for_unpaid_invoices text-danger text-bold hide">Abonnement mensuel désactivé pour impayé</span>
2865		<span class="monthly_subscription_stopped_and_finished text-danger text-bold hide">Abonnement mensuel résilié le <span class="subscription_termination_date"></span> et terminé depuis le <span class="subscription_end_date"></span></span>
2866		<span class="monthly_subscription_enabled_after_end_of_yearly_subscription text-warning text-bold hide">L’abonnement annuel passera en mensuel à la fin de l’abonnement actuel.</span>
2867
2868		<table class="table list_values mb-0 subscription_details hide">
2869			<tr>
2870				<td>Abonnement : </td>
2871				<td class="text-start subscription_type">
2872					<span class="monthly_subscription hide">Mensuel</span>
2873					<span class="yearly_subscription hide">Annuel</span>
2874				</td>
2875			</tr>
2876			<tr>
2877				<td>Tarif mensuel : </td>
2878				<td class="text-start subscription_cost"></td>
2879			</tr>
2880			<tr>
2881				<td>Nb max employés :</td>
2882				<td class="text-start nb_max_employees"></td>
2883			</tr>
2884			<tr>
2885				<td>
2885Date de renouvellement :</td>
2886				<td class="text-start monthly_subscription_renew_date"></td>
2887			</tr>
2888			<tr>
2889				<td>Date de fin :</td>
2890				<td class="text-start subscription_end_date test_end_date"></td>
2891			</tr>
2892		</table>
2893	</div>
2894</div>			
2895<div id="modal_get_demo" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2896	<div class="modal-dialog modal-lg">
2897		<div class="modal-content">
2898			<div class="modal-header">
2899				<h5 class="modal-title">Planifier une démonstration personnalisée</h5>
2900				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
2901			</div>
2902			<form action="#" method="post" class="demo_form">
2903				<div class="modal-body">
2904					<div class="row form">
2905						<div class="col-md-6">
2906							<div class="title">Planifier une démonstration personnalisée</div>
2907							Remplissez le formulaire et notre équipe vous contactera pour vous faire découvrir MyTime et répondre à vos questions.
2908						</div>
2909						<div class="col-md-6">
2910							<div class="row">
2911								<div class="col-md-6">
2912									<div class="form-group">
2913										<label class="control-label sr-only" for="get_demo_first_name">Prénom :</label>
2914										<input type="text" size="22" id="get_demo_first_name" name="first_name" class="form-control" placeholder="Prénom" />
2915									</div>
2916								</div>
2917								<div class="col-md-6">
2918									<div class="form-group">
2919										<label class="control-label sr-only" for="get_demo_last_name">Nom :</label>
2920										<input type="text" size="22" id="get_demo_last_name" name="last_name" class="form-control" placeholder="Nom" />
2921									</div>
2922								</div>
2923							</div>
2924							<div class="form-group">
2925								<label class="control-label sr-only" for="get_demo_company_name">Nom de l’entreprise :</label>
2926								<input type="text" size="22" id="get_demo_company_name" name="company_name" class="form-control" placeholder="Nom de l’entreprise" />
2927							</div>
2928							<div class="form-group">
2929								<label class="control-label sr-only" for="get_demo_email">Adresse email :</label>
2930								<input type="text" size="22" id="get_demo_email" name="email" class="form-control" placeholder="Adresse email" />
2931							</div>
2932							<div class="form-group">
2933								<label class="control-label sr-only" for="get_demo_phone_number">Téléphone :</label>
2934								<input type="text" size="22" id="get_demo_phone_number" name="phone_number" class="form-control" placeholder="Téléphone" />
2935							</div>
2936							<div class="row">
2937								<div class="col-md-6">
2938									<div class="form-group">
2939										<label class="control-label sr-only" for="get_demo_company_activity">Secteur d’activité :</label>
2940										<input type="text" size="22" id="get_demo_company_activity" name="company_activity" class="form-control" placeholder="Secteur d’activité" />
2941									</div>
2942								</div>
2943								<div class="col-md-6">
2944									<div class="form-group">
2945										<label class="control-label sr-only" for="get_demo_company_nb_employees">Nombre d’employés :</label>
2946										<input type="text" size="22" id="get_demo_company_nb_employees" name="company_nb_employees" class="form-control" placeholder="Nombre d’employés" />
2947									</div>
2948								</div>
2949							</div>
2950							<div class="form-group">
2951								<div id="get_demo_grecaptcha" class="grecaptcha"></div>
2952							</div>
2953						</div>
2954					</div>
2955				</div>
2956				<div class="modal-footer">
2957					<button type="submit" name="validate" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…" id="get_demo_button">Valider</button>
2958					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
2959				</div>
2960			</form>
2961
2962			<div class="demo_schedule_selection hide">
2963				<div class="modal-body">
2964					<div class="row">
2965						<div class="col-md-12">
2966							<div class="alert alert-success">Votre demande de démo a bien été enregistrée. Choisissez votre créneau horaire ci-dessous.</div>
2967							<iframe id="get_demo_hubspot_schedules" title="Choix créneau démonstration" src=""></iframe>
2968						</div><br />
2969					</div>
2970				</div>
2971			</div>
2972		</div>
2973	</div>
2974</div>
2975<script>
2976	$('div#modal_get_demo').on('show.bs.modal', function (event) {
2977		let button = $(event.relatedTarget);
2978		const modal = Modal.init($(this));
2979		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
2980			form.find('input[name="phone_number"]').val(TelephoneNumber.getEnteredNumberInInternationalFormat(itiPhoneNumberField));
2981
2982			HTTPClient.request('POST', URL_API+'/contact/ask-demo', FormHelper.getFormData(form),
2983				() => {
2984					const email = Email.normalize(form.find('input[name="email"]').val());
2985					const phoneNumber = form.find('input[name="phone_number"]').val();
2986					Appvizer.conversion('AP-27154');
2987					// Conversion Google Ads "Demande démo" déclenchée explicitement ici plutôt que par un trigger GTM basé sur la visibilité d'un élément du DOM, plus fiable
2988					// , 'first_name': form.find('input[name="first_name"]').val(), 'last_name': form.find('input[name="last_name"]').val()
2989					dataLayer.push({'event': 'demo_request', 'enhanced_conversion_data': {'email': email, 'phone_number': phoneNumber}});
2990					modal.find('.demo_form').addClass('hide');
2991					modal.find('.demo_schedule_selection').removeClass('hide');
2992					modal.find('.demo_schedule_selection').find('iframe').prop('src', 'https://meetings.hubspot.com/mytime/demo?embed=true&firstName='+form.find('input[name="first_name"]').val()	+'&lastName='+form.find('input[name="last_name"]').val()+'&email='+email+'');
2993				},
2994				(response) => Api.displayError(response, modal),
2995				(json) => {
2996					if (captchaEnabled) {
2997						GoogleRecaptcha.reset('get_demo_grecaptcha');
2998					}
2999					FormHelper.displayFormErrors(form, btnSubmit, json);
3000				}
3001			);
3002		});
3003
3004		// Captcha
3005		let captchaEnabled = form.find('#get_demo_grecaptcha').length;
3006		if (captchaEnabled) {
3007			GoogleRecaptcha.reset('get_demo_grecaptcha');
3008		}
3009
3010		// Phone number
3011		let itiPhoneNumberField = TelephoneNumber.setIntlTelInput(form.find('input[name="phone_number"]'), 'FIXED_LINE_OR_MOBILE');
3012	});
3013</script>
3013
3014
3015<div id="modal_get_commercial_documentation" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
3016	<div class="modal-dialog modal-lg">
3017		<div class="modal-content">
3018			<div class="modal-header">
3019				<h5 class="modal-title">Recevoir la documentation commerciale</h5>
3020				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
3021			</div>
3022			<form action="#" method="post" class="">
3023				<div class="modal-body">
3024					<div class="form-group">
3025						<label for="contact_get_commercial_documentation_email" class="control-label">Votre adresse email :</label>
3026						<input type="text" id="contact_get_commercial_documentation_email" name="email" class="form-control" value="" />
3027					</div>
3028					<div class="form-group">
3029						<div id="get_commercial_documentation_grecaptcha" class="grecaptcha"></div>
3030					</div>
3031				</div>
3032				<div class="modal-footer">
3033					<button type="submit" name="validate" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Valider</button>
3034					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
3035				</div>
3036			</form>
3037		</div>
3038	</div>
3039</div>
3040<script>
3041	$('div#modal_get_commercial_documentation').on('show.bs.modal', function (event) {
3042		let button = $(event.relatedTarget);
3043		const modal = Modal.init($(this));
3044		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
3045			HTTPClient.request('POST', URL_API+'/contact/get-commercial-documentation', FormHelper.getFormData(form),
3046				() => {
3047					const email = Email.normalize(form.find('input[name="email"]').val());
3048					Appvizer.conversion('AP-27154');
3049					// Conversion Google Ads "Demande doc commerciale" déclenchée explicitement ici plutôt que par un trigger GTM basé sur la visibilité d'un élément du DOM (peu fiable, l'élément étant créé puis retiré 6 secondes après par FlashMessage)
3050					dataLayer.push({'event': 'documentation_request', 'enhanced_conversion_data': {'email': email}});
3051					FlashMessage.displaySuccess("Vous allez recevoir la documentation commerciale par email.", false, modal);
3052				},
3053				(response) => Api.displayError(response, modal),
3054				(json) => {
3055					if (captchaEnabled) {
3056						GoogleRecaptcha.reset('get_commercial_documentation_grecaptcha');
3057					}
3058					FormHelper.displayFormErrors(form, btnSubmit, json);
3059				},
3060			);
3061		});
3062
3063		// Captcha
3064		let captchaEnabled = $('#get_commercial_documentation_grecaptcha').length;
3065		if (captchaEnabled) {
3066			GoogleRecaptcha.reset('get_commercial_documentation_grecaptcha');
3067		}
3068	});
3069</script>
3069
3070		
3071<div id="modal_newsletter_afficher" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
3072	<div class="modal-dialog modal-lg">
3073		<div class="modal-content">
3074			<div class="modal-header">
3075				<h5 class="modal-title">Newsletter du <span class="newsletter_date"></span></h5>
3076				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
3077			</div>
3078			<div class="modal-body">
3079				<div class="newsletter_contenu"></div>
3080			</div>
3081			<div class="modal-footer">
3082				<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fermer</button>
3083			</div>
3084		</div>
3085	</div>
3086</div>
3087<script>
3088	$('div#modal_newsletter_afficher').on('show.bs.modal', function (event) {
3089		let button = $(event.relatedTarget);
3090		const modal = Modal.init($(this));
3091
3092		var urlForm = '/newsletters?id_newsletter='+button.data('id_newsletter');
3093		modal.find('form').attr('action', urlForm);
3094		modal.find('span.newsletter_titre').text(button.data('newsletter_titre'));
3095		modal.find('span.newsletter_date').text(TimestampUnix.getDateTextDisplay(button.data('newsletter_timestamp'))+' '+TimestampUnix.getTimeDisplay(button.data('newsletter_timestamp')));
3096		modal.find('div.newsletter_contenu').html(button.data('newsletter_contenu'));
3097	});
3098</script>
3098
3099
3100<div id="modal_newsletter_abonnement" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
3101	<div class="modal-dialog">
3102		<div class="modal-content">
3103			<div class="modal-header">
3104				<h5 class="modal-title">S’abonner à la newsletter</h5>
3105				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
3106			</div>
3107			<form action="#" method="post">
3108				<div class="modal-body">
3109					<div class="form-group">
3110						<label for="newsletter_abonnement_email">Adresse email :&nbsp;</label>
3111						<input type="text" name="email" id="newsletter_abonnement_email" size="40" class="form-control" value="" />
3112					</div>
3113					<div class="form-group">
3114						<label for="newsletter_abonnement_company">Société :&nbsp;</label>
3115						<input type="text" name="company" id="newsletter_abonnement_company" class="form-control" value="" />
3116					</div>
3117					<div class="row">
3118						<div class="col-md-2">
3119							<div class="form-group">
3120								<label for="newsletter_abonnement_gender">Civilité :</label>
3121								<select name="gender" id="newsletter_abonnement_gender" class="form-control">
3122									<option value="0">-</option>
3123									<option value="1">M.</option>
3124									<option value="2">Mme</option>
3125								</select>
3126							</div>
3127						</div>
3128						<div class="col-md-5">
3129							<div class="form-group">
3130								<label for="newsletter_abonnement_first_name">Prénom :&nbsp;</label>
3131								<input type="text" name="first_name" id="newsletter_abonnement_first_name" class="form-control" value="" />
3132							</div>
3133						</div>
3134						<div class="col-md-5">
3135							<div class="form-group">
3136								<label for="newsletter_abonnement_last_name">Nom :&nbsp;</label>
3137								<input type="text" name="last_name" id="newsletter_abonnement_last_name" class="form-control" value="" />
3138							</div>
3139						</div>
3140					</div>
3141				</div>
3142				<div class="modal-footer">
3143					<button type="submit" name="validate" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Valider</button>
3144					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
3145				</div>
3146			</form>
3147		</div>
3148	</div>
3149</div>
3150<script>
3151	$('div#modal_newsletter_abonnement').on('show.bs.modal', function (event) {
3152		let button = $(event.relatedTarget);
3153		const modal = Modal.init($(this));
3154		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
3155			HTTPClient.request('POST', URL_API+'/newsletter/subscribe', FormHelper.getFormData(form),
3156				() => FlashMessage.displaySuccess("Votre abonnement à la newsletter de myTime a bien été pris en compte ! <br>Vous recevrez régulièrement les nouveautés et des offres exclusives.", false, modal),
3157				(response) => Api.displayError(response, modal),
3158				(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
3159			);
3160		});
3161	});
3162</script>
3162
3163
3164<div id="modal_newsletter_desabonnement" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
3165	<div class="modal-dialog">
3166		<div class="modal-content">
3167			<div class="modal-header">
3168				<h5 class="modal-title">Se désabonner de la newsletter</h5>
3169				<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
3170			</div>
3171			<form action="#" method="post">
3172				<div class="modal-body">
3173					<div class="form-group">
3174						<label for="modal_newsletter_desabonnement_email">Adresse email :&nbsp;</label>
3175						<input type="text" name="email" id="modal_newsletter_desabonnement_email" size="40" class="form-control" value="" />
3176					</div>
3177				</div>
3178				<div class="modal-footer">
3179					<button type="submit" name="validate" class="btn btn-primary" data-loading-text="<i class='fa fa-circle-notch fa-spin'></i> Traitement en cours…">Valider</button>
3180					<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
3181				</div>
3182			</form>
3183		</div>
3184	</div>
3185</div>
3186<script>
3187	$('div#modal_newsletter_desabonnement').on('show.bs.modal', function (event) {
3188		let button = $(event.relatedTarget);
3189		const modal = Modal.init($(this));
3190		let form = FormHelper.init(modal.find('form'), (form, btnSubmit) => {
3191			HTTPClient.request('POST', URL_API+'/newsletter/unsubscribe', FormHelper.getFormData(form),
3192				() => FlashMessage.displaySuccess("Votre désabonnement à la newsletter de myTime a bien été pris en compte ! <br>Vous ne recevrez plus les nouveautés et des offres exclusives.", false, modal),
3193				(response) => Api.displayError(response, modal),
3194				(json) => FormHelper.displayFormErrors(form, btnSubmit, json)
3195			);
3196		});
3197	});
3198</script>
3198
3199
3200<script>
3201	$(function() {
3202		let form = $('form.footer_newsletter_abonnement');
3203		if (!form.length) {
3204			return;
3205		}
3206
3207		let btnSubmit = form.find('button[name="submit"]').off('click').click(function (e) {
3208			e.preventDefault();
3209			$('#modal_newsletter_abonnement').find('input[name="email"]').val(form.find('input[name="email"]').val());
3210			$('#modal_newsletter_abonnement').modal('show');
3211		});
3212	});
3213</script>
3213
3214	
3215<!-- Sentry -->
3216	
3216<script defer src="/dist/sentry.bundle.js?1787867340"></script>
3216
3217
3218<!-- Firebase (pas utilisé pour le web) -->
3219
3220<!-- Google recaptcha -->
3221<script>
3222</script>
vendor: 87 bytes, lines 3222-3224
3222
3223<script src="https://www.google.com/recaptcha/api.js?hl=fr" async defer></script>
3224
3225<!-- ID requête : 6abe6c282ea9e -->
3226<!-- Page exécutée le 2026-10-01 16:20:24 -->
3227
3228</body>
3229</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.