]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
clean up logs origin/temporary_smirnov
authorAlexander Smirnov <fredeom@mail.ru>
Sat, 28 Dec 2024 08:27:08 +0000 (11:27 +0300)
committerAlexander Smirnov <fredeom@mail.ru>
Sat, 28 Dec 2024 08:27:08 +0000 (11:27 +0300)
erp24/views/timetable/start_shift_step_three.php
erp24/web/dist/js/timetable/start.js
erp24/web/js/timetable/start.js

index e7535b909620dbe681db804046ddaaf5d8775e0a..25b2be1cb9bd3ce8f0a99122472be4593917d46c 100644 (file)
@@ -21,6 +21,10 @@ use yii_app\records\TimetablePlan;
 \r
 \yii_app\assets\timetable\StartAsset::register($this);\r
 \r
+$this->registerJsVar('settings', [\r
+    'model' => $model,\r
+]);\r
+\r
 \r
 $this->registerCssFile('/css/timetable/style.css');\r
   $this->registerJsFile('/js/timetable/script.js', ['position' => \yii\web\View::POS_END]);\r
index dca80515265591e974a8a916455e29cf2374e17c..382ab0b9546466c052235f8745dbfa5213320579 100644 (file)
@@ -1,2 +1,2 @@
-var __defProp=Object.defineProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;var __publicField=(obj,key,value)=>(__defNormalProp(obj,typeof key!="symbol"?key+"":key,value),value);function gpsDistance(lat1,lon1,lat2,lon2){let R=6371e3;function rad(deg){return Math.PI*deg/180}let phi1=rad(lat1),lambda1=rad(lon1),phi2=rad(lat2),lambda2=rad(lon2),dphi=phi2-phi1,dlambda=lambda2-lambda1,a=Math.sin(dphi/2)*Math.sin(dphi/2)+Math.cos(phi1)*Math.cos(phi2)*Math.sin(dlambda/2)*Math.sin(dlambda/2),c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return R*c}var _Checkin=class{type_id;plan_id;checkin_id;constructor(checkin){Object.assign(this,checkin),this.type_id=parseInt(checkin.type_id),this.checkin_id=parseInt(checkin.id)}type(){switch(this.type_id){case _Checkin.TYPE_START:return"\u041E\u0442\u043A\u0440\u044B\u0442\u0438\u0435";case _Checkin.TYPE_END:return"\u0417\u0430\u043A\u0440\u044B\u0442\u0438\u0435";case _Checkin.TYPE_APPEAR:return"\u041F\u043E\u044F\u0432\u043B\u0435\u043D\u0438\u0435"}throw new Error("Undefined type: "+this.type_id)}isStart(){return this.type_id===_Checkin.TYPE_START}isEnd(){return this.type_id===_Checkin.TYPE_END}isAppear(){return this.type_id===_Checkin.TYPE_APPEAR}},Checkin=_Checkin;__publicField(Checkin,"TYPE_START",1),__publicField(Checkin,"TYPE_END",2),__publicField(Checkin,"TYPE_APPEAR",3),__publicField(Checkin,"STATUS_PENDING",0),__publicField(Checkin,"STATUS_VERIFIED",1);var _TimetableSlot=class{id;admin_id;date;d_id;slot_type_id;work_time;constructor(slot){Object.assign(this,slot),this.slot_type_id=parseInt(slot.slot_type_id)}isWorkSlot(){return this.slot_type_id===_TimetableSlot.TIMESLOT_WORK||this.slot_type_id===_TimetableSlot.TIMESLOT_INTERNSHIP}},TimetableSlot=_TimetableSlot;__publicField(TimetableSlot,"TIMESLOT_WORK",1),__publicField(TimetableSlot,"TIMESLOT_VACATION",2),__publicField(TimetableSlot,"TIMESLOT_ADMINISTRATIVE",3),__publicField(TimetableSlot,"TIMESLOT_SICK_LEAVE",4),__publicField(TimetableSlot,"TIMESLOT_INTERNSHIP",5),__publicField(TimetableSlot,"TIMESLOT_WEEKEND",6),__publicField(TimetableSlot,"TIMESLOT_FREELANCE",7);(()=>{window.isRoam&&navigator.geolocation&&navigator.geolocation.getCurrentPosition(function(position){let lat=position.coords.latitude,lon=position.coords.longitude;document.querySelector("#lat").value=lat,document.querySelector("#lon").value=lon;let closestStore=window.settings.stores.map(function(store){return Object.assign(store,{distance:gpsDistance(lat,lon,store.lat,store.lon)})}).sort(function(a,b){return a.distance-b.distance})[0];if(closestStore.distance<50){let storeFieldName=window.settings.fieldNames.store_id;document.querySelector(`[name="${storeFieldName}"]`).value=closestStore.id}});let bottomMessageBar=document.querySelector('[data-role="bottom-message-bar"]'),topMessageBar=document.querySelector('[role="alert"]'),model=new Checkin(window.settings.model),planSlot=window.settings.modelPlanSlot?new TimetableSlot(window.settings.modelPlanSlot):null,planSlotsByAdmin={};if(window.settings.planSlots.map(slotData=>{let slot=new TimetableSlot(slotData);planSlotsByAdmin[slot.admin_id]=slot}),model.isStart()&&!planSlot&&(topMessageBar.className="alert alert-warning",topMessageBar.innerHTML="\u041D\u0435 \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u0435\u043D \u0433\u0440\u0430\u0444\u0438\u043A \u043D\u0430 \u0441\u0435\u0433\u043E\u0434\u043D\u044F. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u0432 \u043E\u0442\u0434\u0435\u043B \u043A\u0430\u0434\u0440\u043E\u0432.",topMessageBar.hidden=!1),model.isStart()&&planSlot&&!planSlot.isWorkSlot()){let message=Object.keys(planSlotsByAdmin).filter(k=>planSlotsByAdmin[k].isWorkSlot()).length>0?"\u0423 \u0432\u0430\u0441 \u0441\u0435\u0433\u043E\u0434\u043D\u044F \u0432\u044B\u0445\u043E\u0434\u043D\u043E\u0439. \u041C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0447\u0430\u0442\u044C \u0441\u043C\u0435\u043D\u0443 \u0437\u0430 \u0434\u0440\u0443\u0433\u043E\u0433\u043E \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u0430":"\u0423 \u0432\u0430\u0441 \u0441\u0435\u0433\u043E\u0434\u043D\u044F \u0432\u044B\u0445\u043E\u0434\u043D\u043E\u0439, \u0441\u043C\u0435\u043D\u0430 \u043D\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0441\u0447\u0438\u0442\u0430\u043D\u0430. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u0432 \u043E\u0442\u0434\u0435\u043B \u043A\u0430\u0434\u0440\u043E\u0432.";topMessageBar.className="alert alert-warning",topMessageBar.innerHTML=message,topMessageBar.hidden=!1}let photoBlob=null;var video=document.getElementById("video");navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&navigator.mediaDevices.getUserMedia({audio:!1,video:{facingMode:"user"}}).then(function(stream){video.srcObject=stream,video.play()}),document.getElementById("canvas").toBlob(function(blob){photoBlob=blob},"image/jpeg");let clickSelfie=function(event){topMessageBar.hidden=!0,event.preventDefault();var canvas2=document.getElementById("canvas");canvas2.width=video.videoWidth,canvas2.height=video.videoHeight;var context=canvas2.getContext("2d");context.drawImage(video,0,0,canvas2.width,canvas2.height);let dataURL=canvas2.toDataURL("image/jpeg");canvas2.toBlob(function(blob){let startSelfieWarning=document.querySelector("#start_smena_div");if(startSelfieWarning&&(startSelfieWarning.style.display="none"),!blob){topMessageBar.className="alert alert-danger",topMessageBar.innerHTML="\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u0441\u043D\u0438\u043C\u043E\u043A. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043A\u0430\u043C\u0435\u0440\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.",topMessageBar.hidden=!1;return}photoBlob=blob,document.querySelector("#canvas").hidden=!0,document.querySelector("#imgnew").innerHTML=`<img alt="selfie" src="${dataURL}" class="m-1 img-fluid p-1 bg-success">`,document.querySelector("#start_smena").removeAttribute("disabled")},"image/jpeg")};document.querySelector("[data-selfie-click]").addEventListener("click",clickSelfie),document.querySelector("form[data-checkin-form]").addEventListener("submit",function(event){event.preventDefault();let submitButton=document.querySelector("#start_smena");submitButton.disabled=!0,bottomMessageBar.hidden=!0;let form=new FormData(document.querySelector("[data-checkin-form]"));if(!photoBlob){bottomMessageBar.className="alert alert-danger",bottomMessageBar.innerHTML="\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u0441\u043D\u0438\u043C\u043E\u043A. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043A\u0430\u043C\u0435\u0440\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.",bottomMessageBar.hidden=!1;return}let replacedAdminId=form.get(window.settings.fieldNames.replaced_admin_id);if(replacedAdminId){let planSlot2=planSlotsByAdmin[replacedAdminId];form.append(window.settings.fieldNames.plan_id,planSlot2.id),form.append(window.settings.fieldNames.date,planSlot2.date),form.append(window.settings.fieldNames.d_id,planSlot2.d_id),form.append(window.settings.fieldNames.id,planSlot2.id)}form.append(window.settings.fieldNames.photo,photoBlob,"selfie.jpg"),fetch("/timetable/start-shift-step-two",{method:"POST",headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},body:form}).then(function(response){return response.json()},function(error){return window.reportError(error.message),{success:!1,message:"\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F"}}).then(function(json){if(Array.from(document.querySelectorAll("form .help-block")).map(function(element){element.innerHTML=""}),json.success){let model2=new Checkin(json.model);document.querySelector("[data-selfie-click]").removeEventListener("click",clickSelfie),bottomMessageBar.className="alert alert-success",model2.isStart()&&(bottomMessageBar.innerHTML="\u0421\u043C\u0435\u043D\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0430."),model2.isEnd()&&(bottomMessageBar.innerHTML="\u0421\u043C\u0435\u043D\u0430 \u0437\u0430\u043A\u0440\u044B\u0442\u0430."),model2.isAppear()&&(bottomMessageBar.innerHTML="\u041E\u0442\u043C\u0435\u0442\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430."),bottomMessageBar.hidden=!1,setTimeout(function(){$("#checkin-form input#startform-checkin_id").val(model2.checkin_id),$("#checkin-form").submit()},1e3)}else{submitButton.disabled=!1;let error;if(json.errors){Object.keys(json.errors).map(function(attribute){let fieldName=window.settings.fieldNames[attribute],fieldElement=document.querySelector(`[name="${fieldName}"]`);fieldElement&&(fieldElement.parentNode.querySelector(".help-block").innerHTML=json.errors[attribute].join(" "))});let firstAttribute=Object.keys(json.errors)[0];error=json.errors[firstAttribute][0]}json.message&&(error=json.message),bottomMessageBar.className="alert alert-danger",bottomMessageBar.innerHTML=`\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C ${model.isStart()?"\u043E\u0442\u043A\u0440\u044B\u0442\u044C":"\u0437\u0430\u043A\u0440\u044B\u0442\u044C"} \u0441\u043C\u0435\u043D\u0443: ${json.errors}`,bottomMessageBar.hidden=!1}})})})();
+var __defProp=Object.defineProperty;var __defNormalProp=(obj,key,value)=>key in obj?__defProp(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value;var __publicField=(obj,key,value)=>(__defNormalProp(obj,typeof key!="symbol"?key+"":key,value),value);function gpsDistance(lat1,lon1,lat2,lon2){let R=6371e3;function rad(deg){return Math.PI*deg/180}let phi1=rad(lat1),lambda1=rad(lon1),phi2=rad(lat2),lambda2=rad(lon2),dphi=phi2-phi1,dlambda=lambda2-lambda1,a=Math.sin(dphi/2)*Math.sin(dphi/2)+Math.cos(phi1)*Math.cos(phi2)*Math.sin(dlambda/2)*Math.sin(dlambda/2),c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return R*c}var _Checkin=class{type_id;plan_id;checkin_id;constructor(checkin){Object.assign(this,checkin),this.type_id=parseInt(checkin.type_id),this.checkin_id=parseInt(checkin.id)}type(){switch(this.type_id){case _Checkin.TYPE_START:return"\u041E\u0442\u043A\u0440\u044B\u0442\u0438\u0435";case _Checkin.TYPE_END:return"\u0417\u0430\u043A\u0440\u044B\u0442\u0438\u0435";case _Checkin.TYPE_APPEAR:return"\u041F\u043E\u044F\u0432\u043B\u0435\u043D\u0438\u0435"}throw new Error("Undefined type: "+this.type_id)}isStart(){return this.type_id===_Checkin.TYPE_START}isEnd(){return this.type_id===_Checkin.TYPE_END}isAppear(){return this.type_id===_Checkin.TYPE_APPEAR}},Checkin=_Checkin;__publicField(Checkin,"TYPE_START",1),__publicField(Checkin,"TYPE_END",2),__publicField(Checkin,"TYPE_APPEAR",3),__publicField(Checkin,"STATUS_PENDING",0),__publicField(Checkin,"STATUS_VERIFIED",1);(()=>{window.isRoam&&navigator.geolocation&&navigator.geolocation.getCurrentPosition(function(position){let lat=position.coords.latitude,lon=position.coords.longitude;document.querySelector("#lat").value=lat,document.querySelector("#lon").value=lon;let closestStore=window.settings.stores.map(function(store){return Object.assign(store,{distance:gpsDistance(lat,lon,store.lat,store.lon)})}).sort(function(a,b){return a.distance-b.distance})[0];if(closestStore.distance<50){let storeFieldName=window.settings.fieldNames.store_id;document.querySelector(`[name="${storeFieldName}"]`).value=closestStore.id}});let bottomMessageBar=document.querySelector('[data-role="bottom-message-bar"]'),topMessageBar=document.querySelector('[role="alert"]'),model;window?.settings?.model&&(model=new Checkin(window.settings.model));let planSlotsByAdmin={},photoBlob=null;var video=document.getElementById("video");video&&navigator.mediaDevices&&navigator.mediaDevices.getUserMedia&&navigator.mediaDevices.getUserMedia({audio:!1,video:{facingMode:"user"}}).then(function(stream){video.srcObject=stream,video.play()}),document.getElementById("canvas")?.toBlob(function(blob){photoBlob=blob},"image/jpeg");let clickSelfie=function(event){topMessageBar.hidden=!0,event.preventDefault();var canvas2=document.getElementById("canvas");canvas2.width=video.videoWidth,canvas2.height=video.videoHeight;var context=canvas2.getContext("2d");context.drawImage(video,0,0,canvas2.width,canvas2.height);let dataURL=canvas2.toDataURL("image/jpeg");canvas2.toBlob(function(blob){let startSelfieWarning=document.querySelector("#start_smena_div");if(startSelfieWarning&&(startSelfieWarning.style.display="none"),!blob){topMessageBar.className="alert alert-danger",topMessageBar.innerHTML="\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u0441\u043D\u0438\u043C\u043E\u043A. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043A\u0430\u043C\u0435\u0440\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.",topMessageBar.hidden=!1;return}photoBlob=blob,document.querySelector("#canvas").hidden=!0,document.querySelector("#imgnew").innerHTML=`<img alt="selfie" src="${dataURL}" class="m-1 img-fluid p-1 bg-success">`,document.querySelector("#start_smena").removeAttribute("disabled")},"image/jpeg")};document.querySelector("[data-selfie-click]")?.addEventListener("click",clickSelfie),document.querySelector("form[data-checkin-form]")?.addEventListener("submit",function(event){event.preventDefault();let submitButton=document.querySelector("#start_smena");submitButton.disabled=!0,bottomMessageBar.hidden=!0;let form=new FormData(document.querySelector("[data-checkin-form]"));if(!photoBlob){bottomMessageBar.className="alert alert-danger",bottomMessageBar.innerHTML="\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u0441\u043D\u0438\u043C\u043E\u043A. \u041F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043A\u0430\u043C\u0435\u0440\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.",bottomMessageBar.hidden=!1;return}let replacedAdminId=form.get(window.settings.fieldNames.replaced_admin_id);if(replacedAdminId){let planSlot=planSlotsByAdmin[replacedAdminId];form.append(window.settings.fieldNames.plan_id,planSlot.id),form.append(window.settings.fieldNames.date,planSlot.date),form.append(window.settings.fieldNames.d_id,planSlot.d_id),form.append(window.settings.fieldNames.id,planSlot.id)}form.append(window.settings.fieldNames.photo,photoBlob,"selfie.jpg"),fetch("/timetable/start-shift-step-two",{method:"POST",headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"},body:form}).then(function(response){return response.json()},function(error){return window.reportError(error.message),{success:!1,message:"\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F"}}).then(function(json){if(Array.from(document.querySelectorAll("form .help-block")).map(function(element){element.innerHTML=""}),json.success){let model2=new Checkin(json.model);document.querySelector("[data-selfie-click]").removeEventListener("click",clickSelfie),bottomMessageBar.className="alert alert-success",model2.isStart()&&(bottomMessageBar.innerHTML="\u0421\u043C\u0435\u043D\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u0430."),model2.isEnd()&&(bottomMessageBar.innerHTML="\u0421\u043C\u0435\u043D\u0430 \u0437\u0430\u043A\u0440\u044B\u0442\u0430."),model2.isAppear()&&(bottomMessageBar.innerHTML="\u041E\u0442\u043C\u0435\u0442\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430."),bottomMessageBar.hidden=!1,setTimeout(function(){$("#checkin-form input#startform-checkin_id").val(model2.checkin_id),$("#checkin-form").submit()},1e3)}else{submitButton.disabled=!1;let error;if(json.errors){Object.keys(json.errors).map(function(attribute){let fieldName=window.settings.fieldNames[attribute],fieldElement=document.querySelector(`[name="${fieldName}"]`);fieldElement&&(fieldElement.parentNode.querySelector(".help-block").innerHTML=json.errors[attribute].join(" "))});let firstAttribute=Object.keys(json.errors)[0];error=json.errors[firstAttribute][0]}json.message&&(error=json.message),bottomMessageBar.className="alert alert-danger",bottomMessageBar.innerHTML=`\u041D\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u043E\u0441\u044C ${model?.isStart()?"\u043E\u0442\u043A\u0440\u044B\u0442\u044C":"\u0437\u0430\u043A\u0440\u044B\u0442\u044C"} \u0441\u043C\u0435\u043D\u0443: ${json.errors}`,bottomMessageBar.hidden=!1}})})})();
 //# sourceMappingURL=start.js.map
index cf39e1776ec11da916f111f9187619f0d23462d5..f6df3233b212917b3539468af6f43bee53fc540d 100755 (executable)
@@ -39,35 +39,37 @@ import TimetableSlot from "./Model/TimetableSlot";
 
     let bottomMessageBar = document.querySelector('[data-role="bottom-message-bar"]');
     let topMessageBar = document.querySelector('[role="alert"]');
-
-    let model = new Checkin(window.settings.model);
-    let planSlot = window.settings.modelPlanSlot ? new TimetableSlot(window.settings.modelPlanSlot) : null;
+    let model;
+    if (window?.settings?.model) {
+        model = new Checkin(window.settings.model);
+    }
+    // let planSlot = window.settings.modelPlanSlot ? new TimetableSlot(window.settings.modelPlanSlot) : null;
     /**
      * @type {Object.<string, TimetableSlot>}
      */
     let planSlotsByAdmin = {};
-    window.settings.planSlots.map(slotData => {
-        let slot = new TimetableSlot(slotData);
-        planSlotsByAdmin[slot.admin_id] = slot;
-    });
-    if (model.isStart() && !planSlot) {
-        topMessageBar.className = 'alert alert-warning';
-        topMessageBar.innerHTML = 'Не проставлен график на сегодня. Обратитесь в отдел кадров.';
-        topMessageBar.hidden = false;
-    }
-    if (model.isStart() && planSlot && !planSlot.isWorkSlot()) {
-        let otherWorkSlots = Object.keys(planSlotsByAdmin).filter(k => planSlotsByAdmin[k].isWorkSlot());
-        let message = otherWorkSlots.length > 0 ?
-            'У вас сегодня выходной. Можете начать смену за другого сотрудника':
-            'У вас сегодня выходной, смена не будет засчитана. Обратитесь в отдел кадров.';
-        topMessageBar.className = 'alert alert-warning';
-        topMessageBar.innerHTML = message;
-        topMessageBar.hidden = false;
-    }
+    // window.settings.planSlots.map(slotData => {
+    //     let slot = new TimetableSlot(slotData);
+    //     planSlotsByAdmin[slot.admin_id] = slot;
+    // });
+    // if (model.isStart() && !planSlot) {
+    //     topMessageBar.className = 'alert alert-warning';
+    //     topMessageBar.innerHTML = 'Не проставлен график на сегодня. Обратитесь в отдел кадров.';
+    //     topMessageBar.hidden = false;
+    // }
+    // if (model.isStart() && planSlot && !planSlot.isWorkSlot()) {
+    //     let otherWorkSlots = Object.keys(planSlotsByAdmin).filter(k => planSlotsByAdmin[k].isWorkSlot());
+    //     let message = otherWorkSlots.length > 0 ?
+    //         'У вас сегодня выходной. Можете начать смену за другого сотрудника':
+    //         'У вас сегодня выходной, смена не будет засчитана. Обратитесь в отдел кадров.';
+    //     topMessageBar.className = 'alert alert-warning';
+    //     topMessageBar.innerHTML = message;
+    //     topMessageBar.hidden = false;
+    // }
 
     let photoBlob = null;
     var video = document.getElementById('video');
-    if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
+    if (video && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
         navigator.mediaDevices.getUserMedia({audio: false, video: {facingMode: 'user'}}).then(function (stream) {
             video.srcObject = stream;
             video.play();
@@ -75,8 +77,9 @@ import TimetableSlot from "./Model/TimetableSlot";
     }
 
     let canvas = document.getElementById('canvas');
-    canvas.toBlob(function (blob) { photoBlob = blob; }, "image/jpeg");
-
+    canvas?.toBlob(function (blob) {
+        photoBlob = blob;
+    }, "image/jpeg");
 
     let clickSelfie = function (event) {
         topMessageBar.hidden = true;
@@ -104,8 +107,8 @@ import TimetableSlot from "./Model/TimetableSlot";
             document.querySelector('#start_smena').removeAttribute('disabled');
         }, 'image/jpeg');
     };
-    document.querySelector('[data-selfie-click]').addEventListener('click', clickSelfie);
-    document.querySelector('form[data-checkin-form]').addEventListener('submit', function (event) {
+    document.querySelector('[data-selfie-click]')?.addEventListener('click', clickSelfie);
+    document.querySelector('form[data-checkin-form]')?.addEventListener('submit', function (event) {
         event.preventDefault();
 
         let submitButton = document.querySelector('#start_smena');
@@ -185,7 +188,7 @@ import TimetableSlot from "./Model/TimetableSlot";
                     error = json.message;
                 }
                 bottomMessageBar.className = 'alert alert-danger';
-                bottomMessageBar.innerHTML = `Не получилось ${model.isStart() ? 'открыть' : 'закрыть'} смену: ${json.errors}`;
+                bottomMessageBar.innerHTML = `Не получилось ${model?.isStart() ? 'открыть' : 'закрыть'} смену: ${json.errors}`;
                 bottomMessageBar.hidden = false;
             }
         });