{"id":13758,"date":"2025-05-08T07:55:15","date_gmt":"2025-05-08T04:55:15","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=13758"},"modified":"2025-05-08T18:22:51","modified_gmt":"2025-05-08T15:22:51","slug":"backend-data-conversion-integrating-dhtmlx-booking-scheduler","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/backend-data-conversion-integrating-dhtmlx-booking-scheduler\/","title":{"rendered":"Backend Data Conversion for Integrating DHTMLX Booking and Scheduler"},"content":{"rendered":"<p>Not long ago, you learned how to make the DHTMLX <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/\" rel=\"noopener\" target=\"_blank\">Scheduler<\/a> and <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxBooking\/\" rel=\"noopener\" target=\"_blank\">Booking<\/a> components work smoothly on the <a href=\"https:\/\/dhtmlx.com\/blog\/frontend-setup-integrating-dhtmlx-booking-scheduler\/\" rel=\"noopener\" target=\"_blank\">frontend<\/a>. Now, it is time to share with you instructions on key points required for integrating these components on the backend, namely, data conversion.<\/p>\n<h5>Conversion Algorithm of Scheduler Events to Booking Events<\/h5>\n<p>In our <a href=\"https:\/\/snippet.dhtmlx.com\/d5zbq3g3?tag=booking&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">demo<\/a>, the integration between these DHTMLX components takes place on the server side. We will go through the data conversion algorithm that allows various types of Scheduler events to be converted into corresponding Booking events (slots). In this blog post, we\u2019ll show how to generate time slots in the booking system from doctors\u2019 schedules using JSON data.<\/p>\n<p>Before we start exploring the peculiarities of converting scheduler events into Booking events used in our demo, you should get acquainted with the key parameters in both widgets that play an important role in the conversion process of different event types. <\/p>\n<p>For Scheduler events, you\u2019ll need to know parameters such as duration (<strong>start_time<\/strong>, <strong>end_time<\/strong>) as well as <a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/recurring_events.html#formatdescription\" rel=\"noopener\" target=\"_blank\">extra properties<\/a> related to recurring series. As for Booking, you\u2019ll need to get acquainted with <strong>id<\/strong>, <strong>slotSize<\/strong>, <strong>SlotGap<\/strong>, and <strong>slots<\/strong> parameters, which are clearly explained in this <a href=\"https:\/\/docs.dhtmlx.com\/booking\/api\/config\/booking-data\/\" rel=\"noopener\" target=\"_blank\">section<\/a> of the Booking API.<\/p>\n<p><em><strong>NOTE:<\/strong> In our scenario, each scheduler event has the doctor_id property that corresponds to the ID of the booking event and points to the ID of a specific doctor in the system.<\/em><\/p>\n<p>In this blog post, samples for demonstrating the conversion process span from 2025-05-08 to 2027-05-08.<\/p>\n<h6>Conversion of Regular Events<\/h6>\n<p>A regular (single) event is a basic type of event in DHTMLX Scheduler that occurs once, but may last from one to several days. Let us consider how to convert both variations of regular events into Booking events:<\/p>\n<ol>\n<li><strong>Regular One-Day Event<\/strong><\/li>\n<\/ol>\n<p>If you need to create a regular one-day event, it is necessary to convert the Scheduler\u2019s <strong>start_date<\/strong> and <strong>end_date<\/strong> parameters to <strong>from<\/strong>, <strong>to<\/strong>, and <strong>dates<\/strong> parameters of Booking events as shown below:<\/p>\n<p><strong>Scheduler event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 02:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 06:00:00&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">20<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;02:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;06:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746662400000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-08<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<ol start=\"2\">\n<li><strong>Regular Multi-Day Event<\/strong><\/li>\n<\/ol>\n<p>Since Booking can only generate slots within one day, you need to split a multi-day event into the required number of slots, one for each day.<\/p>\n<p>For instance, let us consider the conversion of a Scheduler event that starts at 8 PM on one day and ends at 4 AM on the next day:<\/p>\n<p><strong>Scheduler event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 20:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-09 04:00:00&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">20<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;20:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;24:10&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746662400000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-08<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:10&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;04:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746748800000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-09<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<h6>Conversion of Recurring Events<\/h6>\n<p><a href=\"https:\/\/docs.dhtmlx.com\/scheduler\/recurring_events.html\" rel=\"noopener\" target=\"_blank\">Recurring events<\/a> in Scheduler include all parameters of a regular event and several extra parameters:<\/p>\n<ul>\n<li><strong>rrule<\/strong> &#8211; defines the rule of repetition,<\/li>\n<li><strong>duration<\/strong> &#8211; the duration of the recurring instance.<\/li>\n<\/ul>\n<p>Here, it is important to remember that <strong>Booking supports only weekly events!<\/strong> It means that the <strong>rrule<\/strong> parameter can comply with the following pattern only:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">INTERVAL<span class=\"sy0\">=<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span>FREQ<span class=\"sy0\">=<\/span>WEEKLY<span class=\"sy0\">;<\/span>BYDAY<span class=\"sy0\">=<\/span>...<\/div><\/div>\n<p>where \u2026 &#8211; listing of weekdays. For example:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">INTERVAL<span class=\"sy0\">=<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span>FREQ<span class=\"sy0\">=<\/span>WEEKLY<span class=\"sy0\">;<\/span>BYDAY<span class=\"sy0\">=<\/span>MO<span class=\"sy0\">,<\/span>WE<span class=\"sy0\">,<\/span>FR<\/div><\/div>\n<p>When it comes to creating recurring events in Booking i.e., converting Scheduler events into Booking slots, you\u2019ll need one more slot parameter, namely, <strong>days<\/strong>. It refers to days of the week when a slot can be booked.<\/p>\n<p>There are several scenarios for the conversion of Scheduler recurring events into Booking events:<\/p>\n<ol>\n<li><strong>Recurring Event<\/strong><\/li>\n<\/ol>\n<p>In case of a basic recurring event, you need to convert <strong>start_date<\/strong> and <strong>duration<\/strong> to <strong>from<\/strong> and <strong>to<\/strong> and transform <strong>rrule<\/strong> in <strong>days<\/strong>: <\/p>\n<p><strong>Scheduler event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2027-05-08 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;rrule&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;INTERVAL=1;FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">28800<\/span> <span class=\"co1\">\/\/ 8 hours in seconds<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">45<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;09:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;17:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;days&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ Monday to Friday<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<ol start=\"2\">\n<li><strong>Multi-day Event in Recurring Series<\/strong><\/li>\n<\/ol>\n<p>It works similarly to regular multi-day events, but in this scenario, you need to split days rather than dates:<\/p>\n<p><strong>Scheduler event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 20:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2027-05-08 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;rrule&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;INTERVAL=1;FREQ=WEEKLY;BYDAY=TH&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">28800<\/span> <span class=\"co1\">\/\/ 8 hours in seconds<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">45<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;20:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;24:10&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;days&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">4<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ Tuesday<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:10&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;04:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;days&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ Wednesday<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<ol start=\"3\">\n<li><strong>Recurring Event + Regular Event<\/strong><\/li>\n<\/ol>\n<p>For this scenario, it is important to emphasize that a regular event has a higher priority than a recurring one in Booking. More info on the matter is provided in the info section of this <a href=\"https:\/\/docs.dhtmlx.com\/booking\/guides\/configuration\/#defining-slot-rules\" rel=\"noopener\" target=\"_blank\">documentation page<\/a>.<\/p>\n<p><strong>Scheduler events:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/ regular event<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-10 02:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-10 06:00:00&quot;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"co1\">\/\/ recurring event<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2027-05-08 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;rrule&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;INTERVAL=1;FREQ=WEEKLY;BYDAY=SU,MO,TU,WE,TH,FR,SA&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">28800<\/span> <span class=\"co1\">\/\/ 8 hours in seconds<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><\/div><\/div>\n<p>In this example, the date of the regular event (May 10th) is added to the rule of rendering for recurring slots in Booking so that it is not excluded by a regular event taking place on the same day.<\/p>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">45<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;02:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;06:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746835200000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-10<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;09:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;17:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;days&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">6<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746835200000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-10 (added)<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<ol start=\"4\">\n<li><strong>Start Date Discrepancy<\/strong><\/li>\n<\/ol>\n<p>It is important to take into account the fact that Booking cannot identify specific <a href=\"https:\/\/docs.dhtmlx.com\/booking\/api\/config\/booking-start\/\" rel=\"noopener\" target=\"_blank\">start dates<\/a> for slots with days, while recurring events in Scheduler usually have these details. It brings up the question of how to deal with this discrepancy during data conversion.<\/p>\n<p>For instance, if the event is created on Thursday and should be repeated on Thursdays and Fridays, starting next week, Booking won\u2019t be able to identify the exact start date for this recurring event i.e. whether it should be started this or next week.<\/p>\n<p>To solve this issue, you need to create &#8220;empty&#8221; slots (slots with \u201c00:00\u201d values in <strong>from<\/strong> and <strong>to<\/strong> parameters and specific dates) that will block displaying of slots on Thursdays and Fridays of the week when the events should not occur as in the example below:<\/p>\n<p><strong>Scheduler event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-15 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ next Thursday<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2027-05-08 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;rrule&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;INTERVAL=1;FREQ=WEEKLY;BYDAY=TH,FR&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">28800<\/span> <span class=\"co1\">\/\/ 8 hours in seconds<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">45<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">5<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;09:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;17:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;days&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:00&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1746662400000<\/span><span class=\"sy0\">,<\/span> &nbsp; <span class=\"co1\">\/\/ 2025-05-08 - Thursday<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1746748800000<\/span> &nbsp; &nbsp;<span class=\"co1\">\/\/ 2025-05-09 - Friday<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>And what if your series should include some events that do not follow recurring rules? These are exceptions and we\u2019ll consider them in the following section.<\/p>\n<h6>Conversion of Exception Events<\/h6>\n<p>In DHTMLX Scheduler, events with modified settings (or deleted ones) in recurring series are called exceptions. They are stored as separate records related to their parent series. Under the hood, exceptions are specified with three additional parameters for modified or deleted instances of the series:<\/p>\n<ul>\n<li><strong>recurring_event_id<\/strong> &#8211; ID of the parent recurring series,<\/li>\n<li><strong>original_start<\/strong> &#8211; the original date and time of the edited instance in the recurring series (i.e. before editing),<\/li>\n<li><strong>deleted<\/strong> &#8211; the deleted instance of the series.<\/li>\n<\/ul>\n<p>Using these properties, you can specify modified or deleted instances and how they are related to the parent series.<\/p>\n<p>When converting exception events to slots, you\u2019ll also need to create an &#8220;empty&#8221; slot.<\/p>\n<ol>\n<li><strong>Editing a Single Instance in Recurring Series<\/strong><\/li>\n<\/ol>\n<p>Any instance in the series is converted as a regular event, and an \u201cempty\u201d slot must be created for its initial date.<\/p>\n<p>In the code sample below, we have recurring events for Thursdays and Fridays, where the instance on Friday the 9th is rescheduled for Saturday the 10th. <\/p>\n<p><strong>Scheduler events:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2027-05-08 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;rrule&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;INTERVAL=1;FREQ=WEEKLY;BYDAY=TH,FR&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">28800<\/span> <span class=\"co1\">\/\/ 8 hours in seconds<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-10 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-10 12:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;recurring_event_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;1&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;original_start&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-09 09:00&quot;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><\/div><\/div>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">30<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; <span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;09:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;17:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;days&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ modified slot<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;09:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;12:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746835200000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-10<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ \u201cempty\u201d slot<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746748800000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-09<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; <span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>NOTE:<\/strong><em> If an exception event has only modified time (the date is the same), you don\u2019t need to create an \u201cempty\u201d slot for the initial date of the exception event.<\/em><\/p>\n<ol start=\"2\">\n<li><strong>Excluding a Single Instance from a Recurring Series<\/strong><\/li>\n<\/ol>\n<p>Instead of removed date, you need to create a new \u201cempty\u201d slot:<\/p>\n<p><strong>Scheduler event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-08 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2027-05-08 00:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;rrule&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;INTERVAL=1;FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;duration&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">28800<\/span> <span class=\"co1\">\/\/ 8 hours in seconds<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-09 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-09 17:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;recurring_event_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;1&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;original_start&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-09 09:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;deleted&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"kw2\">true<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><\/div><\/div>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">30<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;09:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;17:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;days&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ Monday to Friday<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"co1\">\/\/ \u201cempty\u201d slot<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746748800000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-09<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<h6>Booked Slots<\/h6>\n<p>When Scheduler events are modified (i.e. rescheduled), it may affect booked slots based on these events. By default, Booking won\u2019t display booked slots if they are unavailable after slots are regenerated from edited events. But if this scenario is not good for you, there are two possible solutions:<\/p>\n<ul>\n<li>Disable editing of scheduler events for time intervals containing any booked slots.<\/li>\n<li>If regenerated slots do not contain the same options as already booked slots, you block the reservation of two neighbouring slots on both sides to keep the booked slots relevant.<\/li>\n<\/ul>\n<p>We adhere to the <strong>second approach<\/strong>, which is vividly demonstrated with the following code samples:<\/p>\n<p><strong>Scheduler event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;doctor_id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2025-05-09 09:00:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;2027-05-09 15:00:00&quot;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p><strong>Booked slots:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu0\">1746781200000<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ 2025-05-09 09:00<\/span><br \/>\n&nbsp; &nbsp; <span class=\"nu0\">1746792000000<\/span> &nbsp;<span class=\"co1\">\/\/ 2025-05-09 12:00<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><\/div><\/div>\n<p>According to our approach, it is necessary to create <strong>usedSlots<\/strong> from the array of booked slots so that the booking system could identify which time slots should be blocked.<\/p>\n<p><strong>Booking event:<\/strong><\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;id&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotSize&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">60<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slotGap&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ 09:00 10:10 11:20 12:30 13:40 (time slots)<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;slots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;from&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;09:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;to&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;15:00&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">&quot;dates&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">1746748800000<\/span><span class=\"br0\">&#93;<\/span> <span class=\"co1\">\/\/ 2025-05-09<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;usedSlots&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1746781200000<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ 2025-05-09 09:00 (no changes)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1746789600000<\/span><span class=\"sy0\">,<\/span> <span class=\"co1\">\/\/ 2025-05-09 11:20 (was 2025-05-09 12:00)<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"nu0\">1746793800000<\/span> &nbsp;<span class=\"co1\">\/\/ 2025-05-09 12:30 (was 2025-05-09 12:00)<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>These are the main cases of event conversion between DHTMLX Scheduler and Booking based on <a href=\"https:\/\/docs.dhtmlx.com\/booking\/guides\/integration-with-scheduler\/#rules-for-converting-scheduler-events-to-booking-slots\" rel=\"noopener\" target=\"_blank\">specific rules<\/a>. However, the full-fledged backend integration of these DHTMLX tools also requires creating endpoints for data exchange between the client and server sides. You can learn more about this aspect in the <a href=\"https:\/\/docs.dhtmlx.com\/booking\/guides\/integration-with-scheduler\/#example\" rel=\"noopener\" target=\"_blank\">documentation<\/a>.<\/p>\n<p>The source code of the backend integration is available in our <a href=\"https:\/\/github.com\/DHTMLX\/scheduler-booking-go\/\" rel=\"noopener\" target=\"_blank\">GitHub repository<\/a>. <\/p>\n<h5>Conclusion<\/h5>\n<p>This blog post covers the main aspects required for integrating DHTMLX Scheduler and Booking on the backend. Together with front-end insights provided in the previous article, you have enough knowledge to combine these components within a single app. It can be a great solution for web projects demanding both flexible visual scheduling and a user-friendly booking experience. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Not long ago, you learned how to make the DHTMLX Scheduler and Booking components work smoothly on the frontend. Now, it is time to share with you instructions on &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":13759,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71],"tags":[33,78,15],"class_list":["post-13758","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-all-posts","tag-booking","tag-dhtmlxscheduler"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13758","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/101014"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=13758"}],"version-history":[{"count":4,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13758\/revisions"}],"predecessor-version":[{"id":13773,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/13758\/revisions\/13773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/13759"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=13758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=13758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=13758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}