PageSourceSearch

https://infosoft.ate-bus.ch:4443/6309.0e085ca70147e96e.js

js ate-bus.ch collected 2026-10-08 08:32:03 UTC 98,876 bytes, 1 lines download raw bytes

1(self.webpackChunkapp=self.webpackChunkapp||[]).push([[6309],{46309:(A,I,a)=>{"use strict";a.r(I),a.d(I,{StundenrapportPageModule:()=>C});var p=a(31635),g=a(17705),f=a(60177),N=a(89417),k=a(35933),E=a(43559),s=a(10467);var G=a(69971),W=a.n(G),y=a(39440),j=a(32653);class ${}var x=a(82014),O=a(25220);class T{}class K{}var Z=a(7141);class v{constructor(){this.Pause=!1,this.Produktiv=!1}}var L=a(94228),Y=a(34535),R=a(81827),X=a(26084),b=a(21192),w=a(97586),Q=a(45918);class V{}var z,J=a(57854),h=a(86225),H=a(28874);let F=((z=class{get isSmallScreen(){return b.Z.isSmallScreen}get isLargeScreen(){return b.Z.isLargeScreen}constructor(e,n,t,i,r,l,o,c,u,d,D){this.timeService=e,this.languageService=n,this.menuCtrl=t,this.helper=i,this.modalController=r,this.alertService=l,this.loadingService=o,this.hubFactory=c,this.toastService=u,this.documentViewer=d,this.cdRef=D,this.permissions=new $,this.rapportAlreadySubmitted=!1,this.monatAbgerechnet=!1,this.sollzeit=0,this.bemerkung="",this.vonZeit=new Date,this.bisZeit=new Date,this.vonZeitString=this.vonZeit.toISOString(),this.bisZeitString=this.bisZeit.toISOString(),this.dienst=new T,this.Einteilungen=[],this.datum="",this.abschnitte=[],this.newabsch=new v,this.tagesjournalLoading=!1,this.monatsjournalLoading=!1,this.monatsrapportLoading=!1,this.monatsrapportEinreichenLoading=!1,this.reportDate=new Date,this.reportDateString=this.reportDate.toISOString(),this.preventPDFShow=!1,this.TeamPersonen=[],this.dataLoadedDate=new Date,this.hasUnsavedChanges=!1,this.remainingIntervalTime=0,this.isIonSlideOpen=!1}ngOnInit(){}ionViewWillEnter(){var e=this;return(0,s.A)(function*(){var n;if(e.selectedPerson=yield e.helper.getPerson(),e.setPersonUi(e.selectedPerson),e.permissions=yield(yield e.hubFactory.permissionService()).getStundenrapportPermission(),void 0===(null===(n=e.permissions)||void 0===n?void 0:n.VisierungAktiv)&&(e.permissions.VisierungAktiv=!0),!e.permissions||!e.permissions.HasStundenrapport&&!e.permissions.HasVisierung)return e.alertService.createCustomSwal(e.languageService.translate("lblFehler"),e.languageService.translate("errorKeineBerechtigung"),"error"),void e.helper.goHome();if(yield e.onRapportDateChanged((new Date).toISOString(),!1),!e.monatAbgerechnet){yield e.getLastMonatAbgerechnet();let t=e.timeService.addMonth(e.lastMonatAbgerechnet,1),i=e.timeService.getLastDayOfMonth(t).toISOString();e.onFilterDateChanged(e.timeService.removeTime(i))}})()}ionViewWillLeave(){var e=this;return(0,s.A)(function*(){(e.hasUnsavedChanges||e.remainingIntervalTime>0)&&e.saveCurrentStundenrapport()})()}ngOnDestroy(){this.unsubscribeSignalREvents()}tabChanged(e){this.activeTabIndex=e.detail.index,this.superTabs.activeTabIndex=this.activeTabIndex}openFilter(){this.menuCtrl.enable(!0,"Filter"),this.menuCtrl.toggle("end")}canBuchen(){var e,n;return!(!this.pauseAbschnitt||this.rapportAlreadySubmitted||this.monatAbgerechnet||!this.selectedEinteilung||null!==(e=this.selectedEinteilung)&&void 0!==e&&e.IsAbsenz||!this.Einteilungen||(null===(n=this.Einteilungen)||void 0===n?void 0:n.length)<0)}changeEinteilung(e){var n;this.selectedEinteilung&&this.abschnitte&&(this.selectedEinteilung.Abschnitte=this.abschnitte),this.selectedEinteilung=e,this.abschnitte=this.selectedEinteilung.Abschnitte,this.setVonBisZeit(this.abschnitte),null===(n=this.timeFrom)||void 0===n||n.setFocus()}onAbschnittartChanged(e,n){n?(n.AbschnittArt=e,n.fkAbschnittArt=e.ID,this.startSaveTimer()):this.selectedAbschnittart=e}isSelectedEinteilung(e){return!!this.selectedEinteilung&&(e.ID==this.selectedEinteilung.ID?!(void 0===e.ID||e.ID<=0)||e.ProvisorischeID==this.selectedEinteilung.ProvisorischeID:void 0)}canAbsenzenEinteilen(){return!(!this.pauseAbschnitt||!this.absenzen||this.absenzen.length<=0||this.rapportAlreadySubmitted||this.monatAbgerechnet)&&!!this.permissions.HasAbsenzEinteilen}canSonderdienstEinteilen(){return!this.rapportAlreadySubmitted&&!this.monatAbgerechnet&&(null!=this.sonderDienste&&this.sonderDienste.length>0)}setAbschnittForeground(e){var n,t;let i=null==e||null===(n=e.AbschnittArt)||void 0===n?void 0:n.Aktivforeground,r=null==e||null===(t=e.AbschnittArt)||void 0===t?void 0:t.Aktivbackground;return b.Z.isDarkPreferred?"#000000"==i&&"#ffffff"!=r&&(i="var(--ion-text-color, #ffffff)"):"#ffffff"==i&&"#000000"!=r&&(i="var(--ion-text-color, #000000)"),"color: "+i+" !important"}
1setAbschnittBackground(e){var n,t;let i=null==e||null===(n=e.AbschnittArt)||void 0===n?void 0:n.Aktivforeground,r=null==e||null===(t=e.AbschnittArt)||void 0===t?void 0:t.Aktivbackground;return b.Z.isDarkPreferred?"#ffffff"==r&&"#000000"!=i&&(r="var(--ion-item-background, #1a1a1a)"):"#000000"==r&&"#ffffff"!=i&&(r="var(--ion-item-background, #ffffff)"),"--background: "+r+" !important"}loadData(){var e=this;return(0,s.A)(function*(){try{yield e.loadingService.showLoader(),e.resetSelectedData(),e.hasUnsavedChanges=!1,yield e.loadPersonen(),e.loadInstanzen(),yield e.loadKonten(),yield e.loadFavoritKonten(),e.abschnittarten=yield(yield e.hubFactory.stundenrapportService()).getAbschnittart(),e.absenzen=yield(yield e.hubFactory.diensteinteilungService()).getStundenrapportAbsenzen(),e.pauseAbschnitt=yield(yield e.hubFactory.stundenrapportService()).getPauseAbschnittart(),e.pauseAbschnitt||e.alertService.createCustomSwal(e.languageService.translate("lblPauseNichtGesetzt"),e.languageService.translate("errorPauseNichtGesetzt"),"error"),e.defaultAbschnitt=yield(yield e.hubFactory.stundenrapportService()).getDefaultAbschnittart(),e.defaultAbschnitt&&(e.selectedAbschnittart=e.abschnittarten.find(n=>{var t;return n.ID==(null===(t=e.defaultAbschnitt)||void 0===t?void 0:t.ID)}),e.setAbschnittArtKonto()),yield e.loadDienstData(),e.setVonBisZeit(e.abschnitte),e.dataLoadedDate=new Date}catch(n){h.K.Fehler("\u{1f680} ~ StundenrapportPage ~ loadData ~ err:",n)}finally{yield e.loadingService.dismiss()}})()}loadPersonen(){var e=this;return(0,s.A)(function*(){var n;let t=new Date(e.datum);e.personen=yield(yield e.hubFactory.stundenrapportService()).getPersonen(t,t),null===(n=e.personen)||void 0===n||n.sort((i,r)=>i.Name>r.Name?1:-1)})()}loadDienstData(){var e=this;return(0,s.A)(function*(){var n,t,i,r;let l=new Date(e.datum);var o;(e.sollzeit=yield(yield e.hubFactory.personService()).GetTagessollzeitByUser(l,null===(n=e.selectedPerson)||void 0===n?void 0:n.ID),e.Einteilungen=yield(yield e.hubFactory.diensteinteilungService()).getEinteilungByFkPersonDatum(l,null===(t=e.selectedPerson)||void 0===t?void 0:t.ID,!0),e.Einteilungen&&e.Einteilungen.length>0&&(e.selectedEinteilung=e.Einteilungen[0],e.selectedEinteilung.Abschnitte))&&(e.abschnitte=e.selectedEinteilung.Abschnitte,e.setVonBisZeit(e.abschnitte),null===(o=e.abschnitte)||void 0===o||o.forEach(c=>{var u,d;c.Konto&&(c.Konto.FullBezeichnung="("+(null===(u=c.Konto)||void 0===u?void 0:u.Name)+") "+(null===(d=c.Konto)||void 0===d?void 0:d.Bezeichnung))}));e.rapportAlreadySubmitted=yield(yield e.hubFactory.stundenrapportService()).getMonatsrapportSubmitStatus(null===(i=e.selectedPerson)||void 0===i?void 0:i.ID,e.datum),e.monatAbgerechnet=yield(yield e.hubFactory.stundenrapportService()).getMonatAbgerechnet(null===(r=e.selectedPerson)||void 0===r?void 0:r.ID,e.datum),h.K.Debug("\u{1f680} ~ StundenrapportPage ~ loadDienstData ~ monatAbgerechnet:",e.monatAbgerechnet),e.sonderDienste=yield(yield e.hubFactory.stundenrapportService()).getSonderdienste(l)})()}getLastMonatAbgerechnet(){var e=this;return(0,s.A)(function*(){let n=new Date,t=e.timeService.addMonth(n.toISOString(),-1);for(;!e.lastMonatAbgerechnet;){var i;let r=e.timeService.removeTime(n.toISOString());if((yield(yield e.hubFactory.stundenrapportService()).getMonatAbgerechnet(null===(i=e.selectedPerson)||void 0===i?void 0:i.ID,r))&&e.setLastMonatAbgerechnet(n),e.timeService.isBeforeOneYear(n)){e.setLastMonatAbgerechnet(t);break}n=e.timeService.addMonth(n.toISOString(),-1)}return e.lastMonatAbgerechnet})()}setLastMonatAbgerechnet(e){let n=this.timeService.getLastDayOfMonth(e);this.lastMonatAbgerechnet=this.timeService.removeTime(n.toISOString()),h.K.Debug("\u{1f680} ~ StundenrapportPage ~ setLastMonatAbgerechnet ~ lastMonatAbgerechnet:",this.lastMonatAbgerechnet)}setVonBisZeit(e){(null==e?void 0:e.length)>0?(this.vonZeit=new Date(e[e.length-1].Bis),this.vonZeitString=this.timeService.toLocaleISOString(this.vonZeit.toISOString())):(this.vonZeit=new Date,this.vonZeitString=this.timeService.toLocaleISOString(this.vonZeit.toISOString())),this.bisZeit=this.vonZeit,this.bisZeitStr
1ing=this.timeService.toLocaleISOString(this.bisZeit.toISOString())}loadKonten(){var e=this;return(0,s.A)(function*(){e.konten=yield(yield e.hubFactory.stundenrapportService()).getKonto()})()}loadFavoritKonten(){var e=this;return(0,s.A)(function*(){var n,t,i;(e.favoritKonten=yield(yield e.hubFactory.stundenrapportService()).getFavoritKonto(null===(n=e.selectedPerson)||void 0===n?void 0:n.ID),e.favoritKonten)&&(null===(i=e.konten)||void 0===i||i.sort((r,l)=>e.kontoSort(r,l)));e.favoritKontenSelectable=[],null===(t=e.favoritKonten)||void 0===t||t.forEach(r=>{var l;const o=null===(l=e.konten)||void 0===l?void 0:l.find(c=>c.Bezeichnung==r.Bezeichnung);o&&e.favoritKontenSelectable.push(o)})})()}isFavoritKonto(e){var n;return(null===(n=this.favoritKonten)||void 0===n?void 0:n.findIndex(t=>t.ID==e.ID))>=0}kontoSort(e,n){let t=this.isFavoritKonto(e),i=this.isFavoritKonto(n);return t==i?0:t?-1:i?1:void 0}onKontoChanged(e,n){n?(n.Konto=e,n.fkKonto=e.ID,this.startSaveTimer()):this.selectedKonto=e}onKontoFavoritenChanged(e){var n=this;return(0,s.A)(function*(){n.favoritKontenSelectable=e,n.selectedPerson&&(yield(yield n.hubFactory.stundenrapportService()).saveKontoFavoriten(n.selectedPerson.ID,n.favoritKontenSelectable).then(t=>{t||n.alertService.createCustomSwal(n.languageService.translate("lblFehler"),n.languageService.translate("errorKontofavoritSpeichern"),"error")}),n.loadFavoritKonten())})()}openKontoFavoriten(){var e=this;return(0,s.A)(function*(){var n;null===(n=e.slcFavoritKonten)||void 0===n||n.setOpen(!0)})()}nextDate(){this.onRapportDateChanged(w(new Date(this.datum)).add(1,"days").toISOString())}prevDate(){this.onRapportDateChanged(w(new Date(this.datum)).add(-1,"days").toISOString())}onRapportDateChanged(e){var n=this;return(0,s.A)(function*(t,i=!0){(n.hasUnsavedChanges||n.remainingIntervalTime>0)&&i&&(yield n.saveCurrentStundenrapport()),n.datum=n.timeService.removeTime(t),h.K.Debug("\u{1f680} ~ StundenrapportPage ~ onRapportDateChanged ~ datum:",n.datum),yield n.loadData()}).apply(this,arguments)}onFilterDateChanged(e){this.reportDateString=this.timeService.removeTime(e),h.K.Debug("\u{1f680} ~ StundenrapportPage ~ onFilterDateChanged ~ reportDateString:",this.reportDateString),this.reportDate=new Date(this.reportDateString),this.getReportDateHasDienst()}getReportDateHasDienst(){var e=this;return(0,s.A)(function*(){e.reportDateHasDienst=!1;let n=yield(yield e.hubFactory.diensteinteilungService()).getEinteilungByFkPersonDatum(e.reportDate);null==n||n.forEach(t=>{t.IsAbsenz||(e.reportDateHasDienst=!0)})})()}setAbschnittArtKonto(){if(this.selectedAbschnittart)if(this.selectedAbschnittart.FkKonto<=0)this.selectedKonto=null;else{var e;let n=null===(e=this.konten)||void 0===e?void 0:e.filter(t=>t.ID==this.selectedAbschnittart.FkKonto)[0];this.selectedKonto=null!=n?n:null}}onDateChanged(e,n){e?(this.vonZeit=new Date(n),this.vonZeitString=this.timeService.toLocaleISOString(this.vonZeit.toISOString()),this.vonZeit>this.bisZeit&&(this.bisZeit=new Date(n),this.bisZeitString=this.timeService.toLocaleISOString(this.bisZeit.toISOString()))):(this.bisZeit=new Date(n),this.bisZeitString=this.timeService.toLocaleISOString(this.bisZeit.toISOString()))}setDateToNow(e){let n=(new Date).toISOString();this.onDateChanged(e,n)}onDateChangedAbschnitt(e,n,t){var i=this;return(0,s.A)(function*(){var r;let l=new Date(n),o=i.convertDateToDayMinute(l),c=null===(r=i.abschnitte)||void 0===r?void 0:r.findIndex(d=>d==t);if(c<0)return;let u=i.abschnitte[c];if(i.sortAbschnitte(),e){if((null==u?void 0:u.VonDate)==o)return;if(c>0){let d=i.abschnitte[c-1];if(o<d.BisDate)if(o<=d.VonDate){let D=yield i.alertService.createYesNoAlert(i.languageService.translate("ttlUeberschneidung"),i.languageService.translate("lblUeberschneidung"));("success"==D.value||1==D.value)&&(t.VonDate=o,t.VonString=n,i.deleteAllOverlappingAbschnitte(t))}else u.VonDate=o,u.VonString=n,d.BisDate=o,d.BisString=n;else u.VonDate=o,u.VonString=n,d.BisDate=o,d.BisString=n}else u.VonDate=o,u.VonString=n}else{if(u.BisDate==o)return;if(c<i.abschnitte.length-1){let d=i.abschnitte[c+1];if(o>d.VonDate)if(o>=d.BisDate){let D=yield i.alertService.createYesNoAlert(i.languageService.translate("ttlUeberschneidung"),i.languageService.translate("lblUeberschneidung"));("success"==D.value||1==D.value)&&(t.BisDate=o,t.BisString=n,i.deleteAllOverlappingAbschnitte(t))}else u.BisDate=o,u.BisString=n,d.VonDate=o,d.VonString=n;else u.BisDate=o,u.BisString=n,d.VonDate=o,d.VonString=n}else u.BisDate=o,u.BisString=n}i.checkAbschnittValidity(),i.cleanUpAbschnitte(),i.startSaveTimer()})()}deleteAllOverlappingAbschnitte(e){let n=[];for(let t=0;t<this.abschnitte.length;t++)this.abschnitte[t].VonDate>=e.VonDate&&this.abschnitte[t].BisDate<e.BisDate&&n.push(this.abschnitte[t]);
1n.forEach(t=>{let i=this.abschnitte.indexOf(t,0);i>-1&&this.abschnitte.splice(i,1)});for(let t=0;t<this.abschnitte.length;t++)if(this.abschnitte[t].VonDate<e.VonDate&&this.abschnitte[t].BisDate>=e.VonDate){this.abschnitte[t].BisDate=e.VonDate,this.abschnitte[t].BisString=e.VonString,this.abschnitte.length-1>t&&(this.abschnitte[t+1].VonDate=e.VonDate,this.abschnitte[t+1].VonString=e.VonString);break}}cleanUpAbschnitte(){let e=[];for(let t=0;t<(null===(n=this.abschnitte)||void 0===n?void 0:n.length);t++){var n;this.calculateAbschnittMinuten(this.abschnitte[t]),this.abschnitte[t].MinutenAngerechnet<=0&&!this.abschnitte[t].AbschnittArt.Pause&&e.push(this.abschnitte[t])}e.forEach(t=>{let i=this.abschnitte.indexOf(t,0);i>-1&&this.abschnitte.splice(i,1)})}onPersonChanged(){var e=this;return(0,s.A)(function*(){(e.hasUnsavedChanges||e.remainingIntervalTime>0)&&(yield e.saveCurrentStundenrapport()),yield e.loadData()})()}calculateAbschnittMinuten(e){e.BisDate<e.VonDate&&-1*(e.BisDate-e.VonDate)>720&&(e.BisDate=e.BisDate+1440);let n=(e.BisDate-e.VonDate)*e.AbschnittArt.ProzentAngerechnet/100;e.MinutenAngerechnet=Math.ceil(n)}calculateArbeitszeit(){let e=0;return null==this.Einteilungen||0==this.Einteilungen.length?0:(this.Einteilungen.forEach(n=>{n.Abschnitte&&n.Abschnitte.forEach(t=>{e+=t.MinutenAngerechnet})}),e)}calculateZulageZeit(){let e=0;return null==this.Einteilungen||0==this.Einteilungen.length?0:(this.Einteilungen.forEach(n=>
1{null!=n.Zulagen&&n.Zulagen.forEach(t=>{e+=t.Zeit})}),e)}calculateAbsenzVerguetungZulage(){let e=0;return this.Einteilungen.forEach(n=>{e+=n.AbsenzVerguetungsZeit}),e}hasAbsenz(){return this.Einteilungen.findIndex(n=>n.IsAbsenz)>=0}calculateTagesSollzeit(){return null==this.Einteilungen||0==this.Einteilungen.length?0:this.calculateArbeitszeit()+this.calculateZulageZeit()+this.calculateAbsenzVerguetungZulage()-this.sollzeit}getSollzeitColor(){return this.calculateTagesSollzeit()<0?"color: firebrick":"color: green"}openModalZusammenfassung(e,n){var t=this;return(0,s.A)(function*(){if(!e)return;const i=yield t.modalController.create({component:X.A,showBackdrop:!0,cssClass:"my-custom-modal-css",id:"StundenrapportCreateModal"+(new Date).getMilliseconds().toString(),componentProps:{URL:e,ReportDate:n}});return i.onWillDismiss().then(r=>{h.K.Debug("\u{1f680} ~ StundenrapportPage ~ openModalZusammenfassung ~ modal.onWillDismiss ~ res?.data:",null==r?void 0:r.data),null!=r&&r.data&&t.submitStundenrapport(),b.Z.OpenModals.pop()}),b.Z.OpenModals.push(i),yield null==i?void 0:i.present()})()}openModal(){var e=this;return(0,s.A)(function*(){e.newabsch=new v,e.setModalDate();const n=yield e.modalController.create({component:R.P,showBackdrop:!0,cssClass:"my-custom-modal-css",id:"StundenrapportCreateModal"+(new Date).getMilliseconds().toString(),componentProps:{EinteilungAbschnitt:e.newabsch,PauseAbschnitt:e.pauseAbschnitt,Konten:e.konten,AbschnittArt:e.abschnittarten,FavoritKonten:e.favoritKonten}});return n.onWillDismiss().then(t=>{var i;if(null!=t&&null!==(i=t.data)&&void 0!==i&&i.Success){var r;let l=null==t||null===(r=t.data)||void 0===r?void 0:r.Einteilung;e.vonZeit=l.Von,e.bisZeit=l.Bis,e.selectedAbschnittart=l.AbschnittArt,e.selectedKonto=l.Konto,e.bemerkung=l.Bemerkung,e.addAbschnitt()}b.Z.OpenModals.pop()}),b.Z.OpenModals.push(n),yield null==n?void 0:n.present()})()}copyAbschnitt(e){let n=new v;return n.Von=e.Von,n.VonDate=e.VonDate,n.VonString=e.VonString,n.Bis=e.Bis,n.BisDate=e.BisDate,n.BisString=e.BisString,n.Bemerkung=e.Bemerkung,n.AbschnittArt=e.AbschnittArt,n.Konto=e.Konto,n}openModalAbschnitt(e){var n=this;return(0,s.A)(function*(){if(!n.canBuchen())return;n.newabsch=new v;let t=e;n.setModalDate();const i=yield n.modalController.create({component:R.P,showBackdrop:!0,cssClass:"my-custom-modal-css",id:"StundenrapportCreateModal"+(new Date).getMilliseconds().toString(),componentProps:{EinteilungAbschnitt:n.copyAbschnitt(e),PauseAbschnitt:n.pauseAbschnitt,Konten:n.konten,AbschnittArt:n.abschnittarten,FavoritKonten:n.favoritKonten}});return i.onWillDismiss().then(r=>{var l;if(null!=r&&null!==(l=r.data)&&void 0!==l&&l.Success){let o=r.data.Einteilung,c=r.data.Von,u=r.data.Bis;c&&n.onDateChangedAbschnitt(!0,o.VonString,t),u&&n.onDateChangedAbschnitt(!1,o.BisString,t),t.Konto=o.Konto,t.AbschnittArt=o.AbschnittArt,t.Bemerkung=o.Bemerkung,n.checkAbschnittValidity(),n.cleanUpAbschnitte(),n.startSaveTimer()}b.Z.OpenModals.pop()}),b.Z.OpenModals.push(i),yield null==i?void 0:i.present()})()}setModalDate(){this.abschnitte&&this.abschnitte.length>0?(this.newabsch.Von=this.abschnitte[this.abschnitte.length-1].Bis,this.newabsch.Bis=this.newabsch.Von):(this.newabsch.Von=new Date,this.newabsch.Bis=new Date)}getAbschnittArt(e){let n=null;return e&&e.AbschnittArt&&this.abschnittarten.forEach(t=>{t.Bezeichnung==e.AbschnittArt.Bezeichnung&&(n=t)}),n}isPauseAbschnitt(e){return!!(this.pauseAbschnitt&&e&&e.AbschnittArt)&&e.AbschnittArt.ID==this.pauseAbschnitt.ID}checkAbschnittValidity(){if(this.abschnitte&&!(this.abschnitte.length<=0)){this.sortAbschnitte(),this.calculateAbschnittMinuten(this.abschnitte[0]);for(let e=1;e<this.abschnitte.length;e++){if(this.abschnitte[e].VonDate<this.abschnitte[e-1].BisDate)return this.abschnitte[e].VonDate=this.abschnitte[e-1].BisDate,void this.checkAbschnittValidity();this.abschnitte[e].Von=this.convertDayMinutesToDate(this.abschnitte[e].VonDate),this.abschnitte[e].VonString=this.timeService.toLocaleISOString(this.abschnitte[e].Von.toISOString()),this.abschnitte[e].Bis=this.convertDayMinutesToDate(this.abschnitte[e].BisDate),this.abschnitte[e].BisString=this.timeService.toLocaleISOString(this.abschnitte[e].Bis.toISOString()),this.calculateAbschnittMinuten(this.abschnitte[e])}this.checkForBreaks()}}deleteAllBreaks(){var e;null===(e=this.abschnitte)||void 0===e||e.forEach(n=>
1{n.AbschnittArt.ID==this.pauseAbschnitt.ID&&this.abschnitte.splice(this.abschnitte.findIndex(t=>t==n),1)})}checkForBreaks(){if(!this.abschnitte)return;this.deleteAllBreaks();let e=[];if(this.abschnitte.length>0)for(let n=1;n<this.abschnitte.length;n++)if(this.abschnitte[n].VonDate>this.abschnitte[n-1].BisDate){let t=new v;t.VonDate=this.abschnitte[n-1].BisDate,t.Von=new Date(this.abschnitte[n-1].BisString),t.VonString=this.timeService.toLocaleISOString(t.Von.toISOString()),t.BisDate=this.abschnitte[n].VonDate,t.Bis=new Date(this.abschnitte[n].VonString),t.BisString=this.timeService.toLocaleISOString(t.Bis.toISOString()),t.AbschnittArt=this.pauseAbschnitt,t.MinutenAngerechnet=0,t.Pause=!0,e.push(t)}e.forEach(n=>this.abschnitte.push(n)),this.sortAbschnitte(),this.checkSlidesState()}sortAbschnitte(){var e;null===(e=this.abschnitte)||void 0===e||e.sort((n,t)=>n.VonDate==t.VonDate?n.BisDate-t.BisDate:n.VonDate>t.VonDate?1:-1)}addAbschnittWithFavoritKonto(e){this.selectedKonto=e,this.addAbschnitt()}addAbsenz(){var e=this;return(0,s.A)(function*(){if(!e.selectedAbsenz)return void e.alertService.createCustomSwal(e.languageService.translate("lblUnvollstaendigeDaten"),e.languageService.translate("errorAbsenzWaehlen"),"warning");let n=yield e.createEinteilung(e.datum,e.selectedPerson,e.selectedAbsenz);e.selectedEinteilung=n,e.Einteilungen=[],e.abschnitte=[],e.Einteilungen.push(n),e.selectedAbsenz=null;let t=yield e.alertService.createYesNoAlert("",e.languageService.translate("msgDatenSpeichernSicher"));null!=t&&t.isConfirmed&&(yield e.saveCurrentStundenrapport()),yield e.loadData()})()}addSonderDienst(){var e=this;return(0,s.A)(function*(){if(!e.selectedSonderdienst)return void e.alertService.createCustomSwal(e.languageService.translate("lblUnvollstaendigeDaten"),e.languageService.translate("errorDienstWaehlen"),"warning");let n=yield e.createEinteilung(e.datum,e.selectedPerson,e.selectedSonderdienst);e.selectedEinteilung=n,e.abschnitte=[],e.Einteilungen.push(n),e.selectedSonderdienst=null;let t=yield e.alertService.createYesNoAlert("",e.languageService.translate("msgDatenSpeichernSicher"));null!=t&&t.isConfirmed&&(yield e.saveCurrentStundenrapport()),yield e.loadData()})()}createEinteilung(e,n,t){var i=this;return(0,s.A)(function*(){let r=new T;return r.Datum=e,r.FkPerson=n.ID,r.FkDienstelement=t.ID,r.FkDienstelementfarbe=t instanceof K?t.fkDienstelementfarbe:t.FkDienstelementfarbe,r.Name=t.Name,r.Bezeichnung=t.Bezeichnung,r.ProvisorischeID=(0,J.Os)(),t instanceof K?(r.IsAbsenz=!0,r.AbsenzVerguetungsZeit=yield(yield i.hubFactory.stundenrapportService()).getAbsenzVerguetungsZeit(t.ID,new Date(e))):(r.AbsenzVerguetungsZeit=0,r.Zulagen=t.Zulagen),r})()}addAbschnitt(){var e=this;return(0,s.A)(function*(){var n;if(!e.canBuchen()||!e.checkAbschnittInputs())return;e.abschnitte||(e.abschnitte=[]),1==e.abschnitte.length&&0==e.abschnitte[0].MinutenAngerechnet&&(e.abschnitte=[]);let t=new v;yield e.modifyAbschnittTimes(t,e.vonZeit,e.bisZeit),t.Bemerkung=e.bemerkung,t.AbschnittArt=e.selectedAbschnittart,t.Konto=e.selectedKonto,yield e.fitAbschnittIntoDay(t),e.abschnitte.length>1?e.checkAbschnittValidity():e.calculateAbschnittMinuten(e.abschnitte[0]),e.setVonBisZeit(e.abschnitte),e.bemerkung="",e.setAbschnittArtKonto(),null===(n=e.timeTo)||void 0===n||n.setFocus(),e.selectedEinteilung.Abschnitte=e.abschnitte,e.checkSlidesState(),e.cleanUpAbschnitte(),e.startSaveTimer()})()}fitAbschnittIntoDay(e){var n=this;return(0,s.A)(function*(){var t,i;if(0==(null===(t=n.abschnitte)||void 0===t?void 0:t.length))return void n.abschnitte.push(e);let r,l;if(n.sortAbschnitte(),(null===(i=n.abschnitte)||void 0===i?void 0:i.findIndex(o=>o.VonDate>=e.VonDate&&o.BisDate<=e.BisDate))>=0){let o=yield n.alertService.createYesNoAlert(n.languageService.translate("ttlUeberschneidung"),n.languageService.translate("lblUeberschneidung"));if("success"!=o.value&&1!=o.value)return}for(let o=0;o<n.abschnitte.length;o++)if(e.VonDate>=n.abschnitte[o].VonDate&&e.BisDate<=n.abschnitte[o].BisDate){r=n.abschnitte[o],l=o;break}if(r){let o=new v;yield n.modifyAbschnittTimes(o,r.Von,e.Von);let c=new v;yield n.modifyAbschnittTimes(c,e.Bis,r.Bis),o.Bemerkung=c.Bemerkung=r.Bemerkung,o.AbschnittArt=c.AbschnittArt=r.AbschnittArt,o.Konto=c.Konto=r.Konto,n.abschnitte.splice(l,1),n.abschnitte.push(o),n.abschnitte.push(c)}else{for(let o=0;o<n.abschnitte.length;o++)e.VonDate>=n.abschnitte[o].VonDate&&(r=n.abschnitte[o],l=o);
1r&&(l<n.abschnitte.length-1?(n.abschnitte[l].BisDate=e.VonDate,n.abschnitte[l+1].VonDate=e.BisDate):r.BisDate>e.VonDate&&(n.abschnitte[l].BisDate=e.VonDate))}n.abschnitte.push(e)})()}modifyAbschnittTimes(e,n,t){var i=this;return(0,s.A)(function*(){if(e.Von=new Date(n),e.Bis=new Date(t),e.VonDate=i.convertDateToDayMinute(e.Von),e.BisDate=i.convertDateToDayMinute(e.Bis),i.abschnitte.length>=1&&e.Von.getHours()<new Date(i.abschnitte[0].Von).getHours()){let r=yield i.alertService.createYesNoAlert(i.languageService.translate("ttlAbschnittFolgetag"),i.languageService.translate("msgAbschnittFolgetag"));("success"==r.value||1==r.value)&&(e.VonDate=e.VonDate+1440,e.BisDate=e.BisDate+1440)}else i.abschnitte.length>=1&&e.Bis.getHours()<new Date(i.abschnitte[0].Von).getHours()&&(e.BisDate=e.BisDate+1440);e.VonString=i.timeService.toLocaleISOString(e.Von.toISOString()),e.BisString=i.timeService.toLocaleISOString(e.Bis.toISOString())})()}checkAbschnittInputs(){var e;return this.vonZeit?this.bisZeit?this.selectedAbschnittart?!this.selectedKonto&&null!==(e=this.selectedAbschnittart)&&void 0!==e&&e.ProduktiveAZ?(this.alertService.createCustomSwal(this.languageService.translate("lblUnvollstaendigeDaten"),this.languageService.translate("errorKontoWaehlen"),"warning"),!1):!(this.convertDateToDayMinute(this.vonZeit)>this.convertDateToDayMinute(this.bisZeit)&&-1*(this.convertDateToDayMinute(this.bisZeit)-this.convertDateToDayMinute(this.vonZeit))<720)||(this.alertService.createErrorAlert(this.languageService.translate("ttlVonKleinerBis"),this.languageService.translate("lblVonKleinerBis")),!1):(this.alertService.createCustomSwal(this.languageService.translate("lblUnvollstaendigeDaten"),this.languageService.translate("errorAbschnittartWaehlen"),"warning"),!1):(this.alertService.createCustomSwal(this.languageService.translate("lblUnvollstaendigeDaten"),this.languageService.translate("errorBisWaehlen"),"warning"),!1):(this.alertService.createCustomSwal(this.languageService.translate("lblUnvollstaendigeDaten"),this.languageService.translate("errorVonWaehlen"),"warning"),!1)}removeAbschnitt(e){var n=this;return(0,s.A)(function*(){var t,i;if(1==(null===(t=n.abschnitte)||void 0===t?void 0:t.length)&&n.abschnitte[0]===e){let r=yield n.alertService.createYesNoAlertHTML("",n.languageService.translate("msgZeitrapportAntragAbschnittLoeschenSicher"));if(null==r||!r.isConfirmed)return}null===(i=n.abschnitte)||void 0===i||i.forEach((r,l)=>{r===e&&n.abschnitte.splice(l,1)}),n.checkAbschnittValidity(),n.startSaveTimer()})()}convertDateToDayMinute(e){return 60*e.getHours()+e.getMinutes()}convertDayMinutesToDate(e){let n=this.timeService.getTimeStringFromMinutes(e).split(":"),t=new Date(this.datum);return new Date(t.getFullYear(),t.getMonth(),t.getDate(),Number(n[0]),Number(n[1]),0,0)}abortSaveInterval(){this.saveInterval&&(clearInterval(this.saveInterval),this.remainingIntervalTime=0,this.saveInterval=null)}revertCurrentStundenrapport(){var e=this;return(0,s.A)(function*(){yield e.loadData()})()}startSaveTimer(){if(!this.selectedEinteilung.IsAbsenz&&!this.canBuchen())return;let e=this;this.saveInterval||(this.hasUnsavedChanges=!0,this.remainingIntervalTime=30,this.saveInterval=setInterval(()=>{e.remainingIntervalTime--,0==e.remainingIntervalTime&&e.saveCurrentStundenrapport()},1e3))}saveCurrentStundenrapport(){var e=this;return(0,s.A)(function*(){var n,t,i;if(e.abortSaveInterval(),e.monatAbgerechnet||e.rapportAlreadySubmitted)return void e.alertService.createErrorAlert(e.languageService.translate("lblFehler"),e.languageService.translate("msgRapportSpeichernMonatAbgerechnet"));if(!e.selectedEinteilung)return;if(!e.Einteilungen)return h.K.Fehler("\u{1f680} ~ StundenrapportPage ~ saveCurrentStundenrapport ~ Einteilungen not found!"),void e.alertService.createErrorAlert(e.languageService.translate("lblFehler"),e.languageService.translate("msgRapportSpeichernFehler")+" "+e.languageService.translate("msgSeiteNeuLaden"));if(e.Einteilungen.filter(c=>{}).length>0)return h.K.Fehler("\u{1f680} ~ StundenrapportPage ~ saveCurrentStundenrapport ~ Some Einteilungen are null!"),void e.alertService.createErrorAlert(e.languageService.translate("lblFehler"),e.languageService.translate("msgRapportSpeichernFehler")+" "+e.languageService.translate("msgSeiteNeuLaden"));if(new Date>w(e.dataLoadedDate).add(5,"m").toDate()){let c=yield e.alertService.createYesNoAlertHTML("",`${e.languageService.translate("msgDatenVeraltet")} ${e.languageService.translate("msgSeiteNeuLaden")} <br/><br/> ${e.languageService.translate("msgDatenSpeichernSicher")}`);
1if(null==c||!c.isConfirmed)return}h.K.Debug("\u{1f680} ~ StundenrapportPage ~ saveCurrentStundenrapport ~ Datum:",e.datum),h.K.Debug("\u{1f680} ~ StundenrapportPage ~ saveCurrentStundenrapport ~ Anzahl Einteilungen:",null===(n=e.Einteilungen)||void 0===n?void 0:n.length),h.K.Debug("\u{1f680} ~ StundenrapportPage ~ saveCurrentStundenrapport ~ Einteilungen:",null===(t=e.Einteilungen)||void 0===t?void 0:t.map(c=>c.Name));let r=new Date(e.datum);e.selectedEinteilung&&e.abschnitte&&(e.selectedEinteilung.Abschnitte=e.abschnitte);let l=null===(i=e.selectedPerson)||void 0===i?void 0:i.ID;e.Einteilungen.length>0&&(l=e.Einteilungen[0].FkPerson);let o=yield(yield e.hubFactory.stundenrapportService()).saveStundenrapport(e.Einteilungen,l,r.toISOString());h.K.Debug("\u{1f680} ~ StundenrapportPage ~ saveCurrentStundenrapport ~ result:",o),o&&(e.hasUnsavedChanges=!1,e.toastService.presentSuccessToast("",e.languageService.translate("lblStundenrapportGespeichert"),3e3))})()}rapportEinreichen(){var e=this;return(0,s.A)(function*(){e.monatsrapportEinreichenLoading=!0,(yield(yield e.hubFactory.stundenrapportService()).canSubmitMonatsRapport(e.selectedTeamPerson.ID,e.reportDate))&&(b.Z.isSmallScreen?(yield e.confirmSubmitStundenrapport())&&e.submitStundenrapport():(e.preventPDFShow=!0,yield e.MonatsrapportPDF()))})()}confirmSubmitStundenrapport(){var e=this;return(0,s.A)(function*(){let n=w(e.reportDate).format("MMMM YYYY"),t=yield e.alertService.createYesNoAlertHTML("",e.languageService.translate("msgRapportWirklichEinreichen")+n);return null==t?void 0:t.isConfirmed})()}submitStundenrapport(){var e=this;return(0,s.A)(function*(){(yield(yield e.hubFactory.stundenrapportService()).submitMonatsrapport(e.selectedTeamPerson.ID,e.reportDate))&&(e.alertService.createCustomSwal(e.languageService.translate("lblErfolg"),e.languageService.translate("lblMonatsrapportEingereicht"),"success"),e.rapportAlreadySubmitted=!0)})()}unsubscribeSignalREvents(){return(0,s.A)(function*(){y.V.removeHubEvent("GetTagesjournal"),y.V.removeHubEvent("GetMonatsjournal"),y.V.removeHubEvent("GetMonatsrapport")})()}TagesjournalPDF(){var e=this;return(0,s.A)(function*(){if(e.tagesjournalLoading)return;e.tagesjournalLoading=!0,y.V.bindHubEvent("GetTagesjournal",function(){var i=(0,s.A)(function*(r){e.tagesjournalLoading=!1,e.downloadPDF(r)});return function(r){return i.apply(this,arguments)}}(),!1);let n=new V;var t;(n.Datum=e.reportDate,null!=e.selectedTeamPerson)&&(n.PersonID=null===(t=e.selectedTeamPerson)||void 0===t?void 0:t.ID);(yield e.hubFactory.reportingService()).GetTagesjournal(n)})()}MonatsjournalPDF(){var e=this;return(0,s.A)(function*(){if(e.monatsjournalLoading)return;e.monatsjournalLoading=!0,y.V.bindHubEvent("GetMonatsjournal",function(){var i=(0,s.A)(function*(r){e.monatsjournalLoading=!1,e.downloadPDF(r)});return function(r){return i.apply(this,arguments)}}(),!1);let n=new V;var t;(n.Datum=e.reportDate,null!=e.selectedTeamPerson)&&(n.PersonID=null===(t=e.selectedTeamPerson)||void 0===t?void 0:t.ID);(yield e.hubFactory.reportingService()).GetMonatsjournal(n)})()}MonatsrapportPDF(){var e=this;return(0,s.A)(function*(){if(e.monatsrapportLoading)return;e.monatsrapportLoading=!0,y.V.bindHubEvent("GetMonatsrapport",function(){var i=(0,s.A)(function*(r){e.monatsrapportLoading=!1,e.monatsrapportEinreichenLoading=!1,e.preventPDFShow?yield e.openModalZusammenfassung(r,e.reportDate):yield e.downloadPDF(r),e.preventPDFShow=!1});return function(r){return i.apply(this,arguments)}}(),!1);let n=new V;var t;(n.Datum=e.reportDate,null!=e.selectedTeamPerson)&&(n.PersonID=null===(t=e.selectedTeamPerson)||void 0===t?void 0:t.ID);yield(yield e.hubFactory.reportingService()).GetMonatsrapport(n)})()}downloadPDF(e){var n=this;return(0,s.A)(function*(){if(!e)return;let t=yield n.helper.formatURL(e);return yield n.documentViewer.openFile(t)})()}resetSelectedData(){this.selectedEinteilung=null,this.selectedAbsenz=null,this.selectedSonderdienst=null,this.selectedAbschnittart=null,this.selectedKonto=null,this.abschnitte=[],this.sollzeit=0}toggleIonSlides(){var e=this;return(0,s.A)(function*(){e.isIonSlideOpen=!e.isIonSlideOpen,e.checkSlidesState()})()}checkSlidesState(){var e;this.cdRef.detectChanges(),null===(e=this.ionItemSlide)||void 0===e||e.forEach(n=>
1{null!=n&&n.disabled||(this.isIonSlideOpen?n.open("start"):n.close())})}setPersonUi(e){e&&this.slcPerson&&(this.slcPerson.name=null==e?void 0:e.Name,this.slcPerson.value=null==e?void 0:e.ID)}setBemerkungTextarea(e,n){var t;if(!this.abschnitte)return;let i=null===(t=this.abschnitte)||void 0===t?void 0:t.findIndex(r=>r.ID==n.ID);i>=0&&(this.abschnitte[i].Bemerkung=e.detail.value,this.startSaveTimer())}ionSelectInterfaceOptions(e,n=!1){let t={header:e,keyboardClose:!0,cssClass:"WideAlert"};return n&&(t.header=this.languageService.translate(e)),t}loadInstanzen(){var e=this;return(0,s.A)(function*(){var n;let t=new Date(e.datum);e.TeamPersonen=yield(yield e.hubFactory.stundenrapportService()).getReportPersonen(t,t),null===(n=e.TeamPersonen)||void 0===n||n.sort((i,r)=>i.Name>r.Name?1:-1),e.clearReportSelection()})()}clearReportSelection(){var e;this.selectedTeamPerson=null===(e=this.TeamPersonen)||void 0===e?void 0:e.filter(n=>{var t;return n.ID==(null===(t=this.selectedPerson)||void 0===t?void 0:t.ID)})[0]}onTeamPersonChanged(e){this.selectedTeamPerson=e.detail.value}}).ctorParameters=()=>[{type:Y.v},{type:L.g},{type:k._t},{type:H.N},{type:k.W3},{type:O.u},{type:x.U},{type:Z.d},{type:j.f},{type:Q.r},{type:g.gRc}],z.propDecorators={superTabs:[{type:g.Uct,args:["superTabs"]}],timeFrom:[{type:g.Uct,args:["timeFrom"]}],timeTo:[{type:g.Uct,args:["timeTo"]}],mobilExpansionHeader:[{type:g.Uct,args:["mobilExpansionHeader"]}],slcPerson:[{type:g.Uct,args:["slcPerson"]}],slcFavoritKonten:[{type:g.Uct,args:["slcFavoritKonten"]}],ionItemSlide:[{type:g.b2L,args:["ionItemSlide"]}]},z);F=(0,p.Cg)([(0,g.uAl)({selector:"app-stundenrapport",template:'\x3c!-- TODO: Refactor and reduce duplicated code. (https://infosoft-systems.atlassian.net/browse/INFOSOFT-756) --\x3e\r\n<ion-header>\r\n  <isg-header [Title]="\'lblStundenrapport\' | translate"\r\n              [Filter-Enable]="this.permissions.HasStundenrapport" (Filter-Event)="openFilter()">\r\n  </isg-header>\r\n</ion-header>\r\n\r\n<ion-content id="StundenrapportContent">\r\n  \x3c!-- TODO: Replace with ion-tabs (https://ionicframework.com/docs/api/tabs). (https://infosoft-systems.atlassian.net/browse/INFOSOFT-756) --\x3e\r\n  <super-tabs #superTabs (tabChange)="tabChanged($event)">\r\n    <super-tabs-toolbar slot="top">\r\n      <super-tab-button *ngIf="this.permissions.HasStundenrapport">\r\n        <ion-label>{{\'lblStundenrapport\' | translate}}</ion-label>\r\n      </super-tab-button>\r\n      <super-tab-button *ngIf="this.permissions.HasVisierung && !this.isSmallScreen">\r\n        <ion-label>{{\'lblVisierung\' | translate}}</ion-label>\r\n      </super-tab-button>\r\n    </super-tabs-toolbar>\r\n\r\n    <super-tabs-container *ngIf="this.permissions.HasStundenrapport || this.permissions.HasVisierung"\r\n      swipeEnabled="false">\r\n      <super-tab *ngIf="this.permissions.HasStundenrapport">\r\n        \x3c!--Stundenrapport--\x3e\r\n        <ion-content [scrollY]="false">\r\n          \x3c!-- Header --\x3e\r\n          <div #filterContainer>\r\n            <ion-item lines="full">\r\n\r\n              \x3c!-- Mobile-App Header --\x3e\r\n              <ion-grid *ngIf="this.isSmallScreen">\r\n                <ion-row class="ion-align-items-center ion-justify-content-center">\r\n                  <ion-col size="3" sizeSm="2">\r\n                    <ion-button expand="block" shape="round" fill="clear" (click)="this.prevDate()">\r\n                      <ion-icon slot="icon-only" name="chevron-back-outline"></ion-icon>\r\n                    </ion-button>\r\n                  </ion-col>\r\n                  <ion-col size="6" sizeSm="auto">\r\n                    <isg-datetime [Value]="this.datum" (changeEvent)="this.onRapportDateChanged($event)" tabindex="99"\r\n                                  label="{{\'lblDatum\' | translate}}" labelPlacement="floating">\r\n                    </isg-datetime>\r\n                  </ion-col>\r\n                  <ion-col size="3" sizeSm="2">\r\n                    <ion-button expand="block" shape="round" fill="clear" (click)="this.nextDate()">\r\n                      <ion-icon slot="icon-only" name="chevron-forward-outline"></ion-icon>\r\n                    </ion-button>\r\n                  </ion-col>\r\n                </ion-row>\r\n\r\n                <ion-row class="ion-align-items-center ion-justify-content-center ion-margin-horizontal cursor-pointer">\r\n                  <ion-col size="auto">\r\n                    <ion-button shape="round" fill="clear" class="ion-no-margin ion-no-padding"\r\n                                (click)="this.mobilExpansionHeader.toggle(
1)">\r\n                      <ion-icon slot="icon-only" name="pencil-outline"></ion-icon>\r\n                    </ion-button>\r\n                  </ion-col>\r\n                  <ion-col size="auto" tappable (click)="this.mobilExpansionHeader.toggle()">\r\n                    <ion-label>\r\n                      {{\'lblEinteilung\' | translate}}:\r\n                    </ion-label>\r\n                  </ion-col>\r\n                  <ion-col class="ion-text-end">\r\n                    <app-einteilung-cell *ngFor="let et of this.Einteilungen" tabindex="1"\r\n                                         [Einteilung]="et"\r\n                                         [Selected]="this.isSelectedEinteilung(et)"\r\n                                         [ClickEnabled]="false"\r\n                                         (click)="this.changeEinteilung(et)">\r\n                    </app-einteilung-cell>\r\n                  </ion-col>\r\n                </ion-row>\r\n\r\n                \x3c!-- TODO: Replace with ion-accordion (https://ionicframework.com/docs/api/accordion). (https://infosoft-systems.atlassian.net/browse/INFOSOFT-756) --\x3e\r\n                <mat-expansion-panel #mobilExpansionHeader [hideToggle]="true" togglePosition="before">\r\n                  <ion-grid class="ion-justify-content-center ion-no-padding">\r\n                    <ion-row class="ion-align-items-center">\r\n                      <ion-col>\r\n                        <ion-item lines="none">\r\n                          <ion-select #slcSonderdienst class="w-100"\r\n                          cancelText="{{\'lblAbbrechen\' | translate}}"\r\n                            multiple="false" placeholder="{{\'lblWaehlen\' | translate}}"\r\n                            [value]="this.selectedSonderdienst" [(ngModel)]="this.selectedSonderdienst"\r\n                            [disabled]="!this.canSonderdienstEinteilen()"\r\n                            [interfaceOptions]="this.ionSelectInterfaceOptions(\'lblDienstWaehlen\', true)"\r\n                            label="{{\'lblDienst\' | translate}}" labelPlacement="stacked">\r\n                            \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                            <ion-select-option [value]="dienst" *ngFor="let dienst of this.sonderDienste">{{dienst.Name}}: {{dienst.Bezeichnung}}</ion-select-option>\r\n                          </ion-select>\r\n                        </ion-item>\r\n                      </ion-col>\r\n                    </ion-row>\r\n\r\n                    <ion-row class="ion-align-items-center">\r\n                      <ion-col>\r\n                        <ion-button class="infoSoftButton" expand="block" (click)="addSonderDienst()"\r\n                                    [disabled]="!this.canSonderdienstEinteilen() || !this.selectedSonderdienst">\r\n                          {{\'btnSonderdienstEinfuegen\' | translate}}\r\n                        </ion-button>\r\n                      </ion-col>\r\n                    </ion-row>\r\n\r\n                    <ion-row class="ion-align-items-center">\r\n                      <ion-col>\r\n                        <ion-item lines="none">\r\n                          <ion-select #slcAbsenz class="w-100"\r\n                          cancelText="{{\'lblAbbrechen\' | translate}}"\r\n                            multiple="false" placeholder="{{\'lblWaehlen\' | translate}}"\r\n                            [value]="this.selectedAbsenz" [(ngModel)]="this.selectedAbsenz"\r\n                            [disabled]="!this.canAbsenzenEinteilen()"\r\n                            [interfaceOptions]="this.ionSelectInterfaceOptions(\'lblAbsenzWaehlen\', true)"\r\n                            label="{{\'lblAbsenz\' | translate}}" labelPlacement="stacked">\r\n                            \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                            <ion-select-option [value]="absenz" *ngFor="let absenz of this.absenzen">{{absenz.Name}}: {{absenz.Bezeichnung}}</ion-select-option>\r\n                          </ion-select>\r\n                        </ion-item>\r\n                      </ion-col>\r\n                    </ion-row>\r\n\r\n                    <ion-row class="ion-align-items-center">\r\n                      <ion-col>\r\n                        <ion-button expand="block" class="infoSoftButton" (click)="addAbsenz()"\r\n                                    [disabled]="!this.canAb
1senzenEinteilen() || !this.selectedAbsenz">\r\n                          {{\'btnAbsenzEinteilen\' | translate}}\r\n                        </ion-button>\r\n                      </ion-col>\r\n                    </ion-row>\r\n                  </ion-grid>\r\n                </mat-expansion-panel>\r\n\r\n                <ion-row class="ion-align-items-center">\r\n                  <ion-col>\r\n                    <ion-button id="btnEintragErstellenMobil" expand="block" class="infoSoftButton ion-margin-horizontal"\r\n                                (click)="openModal()"\r\n                                [disabled]="!this.canBuchen()">\r\n                      {{\'btnEintragErstellen\' | translate}}\r\n                    </ion-button>\r\n                  </ion-col>\r\n                </ion-row>\r\n              </ion-grid>\r\n\r\n              \x3c!-- Browser-App Header --\x3e\r\n              <ion-grid *ngIf="!this.isSmallScreen">\r\n                <ion-row class="ion-align-items-center">\r\n                  <ion-col size="3">\r\n                    <ion-row class="ion-justify-content-center ion-align-items-center">\r\n                      <ion-col size="3">\r\n                        <ion-button expand="block" shape="round" fill="clear" (click)="this.prevDate()">\r\n                          <ion-icon slot="icon-only" name="chevron-back-outline"></ion-icon>\r\n                        </ion-button>\r\n                      </ion-col>\r\n                      <ion-col size="6">\r\n                        <isg-datetime [Value]="this.datum" (changeEvent)="this.onRapportDateChanged($event)"\r\n                                      label="{{\'lblDatum\' | translate}}" labelPlacement="floating">\r\n                        </isg-datetime>\r\n                      </ion-col>\r\n                      <ion-col size="3">\r\n                        <ion-button expand="block" shape="round" fill="clear" (click)="this.nextDate()">\r\n                          <ion-icon slot="icon-only" name="chevron-forward-outline"></ion-icon>\r\n                        </ion-button>\r\n                      </ion-col>\r\n                    </ion-row>\r\n                  </ion-col>\r\n\r\n                  <ion-col size="3" *ngIf="!this.isSmallScreen">\r\n                    <ion-item lines="none">\r\n                      <ion-select #slcPerson class="w-100"\r\n                      cancelText="{{\'lblAbbrechen\' | translate}}" multiple="false"\r\n                        [(ngModel)]="this.selectedPerson.ID" (ngModelChange)="onPersonChanged()"\r\n                        [interfaceOptions]="this.ionSelectInterfaceOptions(\'lblPersonWaehlen\',true)"\r\n                        placeholder="{{\'lblWaehlen\' | translate}}" [value]="this.selectedPerson?.ID"\r\n                        label="{{\'lblPerson\' | translate}}:" labelPlacement="start">\r\n                        \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                        <ion-select-option [value]="person.ID" *ngFor="let person of personen">{{person.Name}}</ion-select-option>\r\n                      </ion-select>\r\n                    </ion-item>\r\n                  </ion-col>\r\n\r\n                  <ion-col size="6">\r\n                    <ion-row class="ion-align-items-center">\r\n                      <ion-col size="auto">\r\n                        <ion-label>\r\n                          {{\'lblEinteilung\' | translate}}:\r\n                        </ion-label>\r\n                      </ion-col>\r\n                      <ion-col class="ion-text-end">\r\n                        <app-einteilung-cell *ngFor="let et of this.Einteilungen" [Einteilung]="et"\r\n                          [ClickEnabled]="false" (click)="this.changeEinteilung(et)"\r\n                          [Selected]="this.isSelectedEinteilung(et)" [ShowInfopointIcon]="false">\r\n                        </app-einteilung-cell>\r\n                      </ion-col>\r\n                    </ion-row>\r\n                  </ion-col>\r\n                </ion-row>\r\n\r\n                <ion-row class="ion-align-items-center">\r\n                  <ion-col>\r\n                    <ion-item lines="none">\r\n                      <ion-select #slcSonderdienst class="w-100"\r\n                      cancelText="{{\'lblAbbrechen\' | translate}}"\r\n                        multiple="false" placeholder="{{\'lblWaehlen\' | translate}}"\r\n                        [value]="this.selectedSonderdienst" [(ngModel)]="this.selectedSonderdienst"\r\n                        [disabled]="!this.canSonderdienstEinteilen()"\r\n                        [interfaceOptions]="this.ionSelectInterfaceOptions(\'lblDienstWaehlen\', true)"\r\n                        label="{{\'lblDienst\' | translate}}" labelPlacement="stacked">\r\n                        \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                        <ion-select-option [value]="dienst" *ngFor="let dienst of this.sonderDie
1nste">{{dienst.Name}}: {{dienst.Bezeichnung}}</ion-select-option>\r\n                      </ion-select>\r\n                    </ion-item>\r\n                  </ion-col>\r\n\r\n                  <ion-col>\r\n                    <ion-button class="infoSoftButton" expand="block" (click)="addSonderDienst()"\r\n                      [disabled]="!this.canSonderdienstEinteilen() || !this.selectedSonderdienst">\r\n                      {{\'btnSonderdienstEinfuegen\' | translate}}\r\n                    </ion-button>\r\n                  </ion-col>\r\n\r\n                  <ion-col>\r\n                    <ion-item lines="none">\r\n                      <ion-select #slcAbsenz class="w-100"\r\n                        cancelText="{{\'lblAbbrechen\' | translate}}"\r\n                        multiple="false" placeholder="{{\'lblWaehlen\' | translate}}"\r\n                        [value]="this.selectedAbsenz" [(ngModel)]="this.selectedAbsenz"\r\n                        [disabled]="!this.canAbsenzenEinteilen()"\r\n                        [interfaceOptions]="this.ionSelectInterfaceOptions(\'lblAbsenzWaehlen\', true)"\r\n                        label="{{\'lblAbsenz\' | translate}}" labelPlacement="stacked">\r\n                        \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                        <ion-select-option [value]="absenz" *ngFor="let absenz of this.absenzen">{{absenz.Name}}: {{absenz.Bezeichnung}}</ion-select-option>\r\n                      </ion-select>\r\n                    </ion-item>\r\n                  </ion-col>\r\n\r\n                  <ion-col>\r\n                    <ion-button class="infoSoftButton" expand="block" (click)="addAbsenz()"\r\n                      [disabled]="!this.canAbsenzenEinteilen() || !this.selectedAbsenz">\r\n                      {{\'btnAbsenzEinteilen\' | translate}}\r\n                    </ion-button>\r\n                  </ion-col>\r\n                </ion-row>\r\n              </ion-grid>\r\n\r\n            </ion-item>\r\n          </div>\r\n\r\n          <ion-content class="contentContainer" [style.--FilterHeight]="filterContainer.clientHeight + \'px\'" [style.--FooterHeight]="footerContainer.clientHeight + \'px\'">\r\n\r\n            \x3c!-- Browser-App Content --\x3e\r\n            <ion-grid *ngIf="!this.isSmallScreen">\r\n              <ion-row>\r\n                <ion-col size="3">\r\n                  <ion-row>\r\n                    <ion-col>\r\n                      <ion-row>\r\n                        <ion-col>\r\n                          <ion-label>{{\'lblGeleisteteArbeitszeit\' | translate}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col size="auto" class="ion-text-end">\r\n                          <ion-label>{{this.calculateArbeitszeit()}} Min.</ion-label>\r\n                        </ion-col>\r\n                      </ion-row>\r\n                      <ion-row>\r\n                        <ion-col>\r\n                          <ion-label>
1{{\'lblGutschriftZulagen\' | translate}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col size="auto" class="ion-text-end">\r\n                          <ion-label>{{this.calculateZulageZeit()}} Min.</ion-label>\r\n                        </ion-col>\r\n                      </ion-row>\r\n                      <ion-row *ngIf="this.hasAbsenz()">\r\n                        <ion-col>\r\n                          <ion-label>{{\'lblGutschriftAbsenz\' | translate}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col size="auto" class="ion-text-end">\r\n                          <ion-label>{{this.calculateAbsenzVerguetungZulage()}} Min.</ion-label>\r\n                        </ion-col>\r\n                      </ion-row>\r\n                      <ion-row>\r\n                        <ion-col>\r\n                          <ion-label>{{\'lblAbweichungTagessollzeit\' | translate}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col size="auto" class="ion-text-end">\r\n                          <ion-label [style]="getSollzeitColor()">{{this.calculateTagesSollzeit()}} Min.</ion-label>\r\n                        </ion-col>\r\n                      </ion-row>\r\n                    </ion-col>\r\n                  </ion-row>\r\n\r\n                  <ion-row>\r\n                    <ion-grid class="isgBox">\r\n                      <ion-row>\r\n                        <ion-col>\r\n                          <ion-row class="ion-align-items-center">\r\n                            <ion-col size="3">\r\n                              <ion-button shape="round" fill="clear" color="dark" class="ion-no-padding"\r\n                                          (click)="setDateToNow(true)">\r\n                                <ion-icon slot="icon-only" name="time-outline"></ion-icon>\r\n                              </ion-button>\r\n                            </ion-col>\r\n                            <ion-col size="9">\r\n                              <isg-datetime #timeFrom Presentation="time" [Value]="this.vonZeitString"\r\n                                            (changeEvent)="this.onDateChanged(true, $event)"\r\n                                            Placeholder="--:--"\r\n                                            label="{{\'lblGrossVon\' | translate}}" labelPlacement="floating">\r\n                              </isg-datetime>\r\n                            </ion-col>\r\n                          </ion-row>\r\n                        </ion-col>\r\n                        <ion-col>\r\n                          <ion-row class="ion-align-items-center">\r\n                            <ion-col size="3">\r\n                              <ion-button shape="round" fill="clear" color="dark" class="ion-no-padding"\r\n                                          (click)="setDateToNow(false)">\r\n                                <ion-icon slot="icon-only" name="time-outline"></ion-icon>\r\n                              </ion-button>\r\n                            </ion-col>\r\n                            <ion-col size="9">\r\n                              <isg-datetime #timeTo Presentation="time" [Value]="this.bisZeitString"\r\n                                            (changeEvent)="this.onDateChanged(false, $event)"\r\n                                            Placeholder="--:--"\r\n                                            label="{{\'lblGrossBis\' | translate}}" labelPlacement="floating">\r\n                              </isg-datetime>\r\n                            </ion-col>\r\n                          </ion-row>\r\n                        </ion-col>\r\n                      </ion-row>\r\n\r\n                      <ion-row class="ion-align-items-center">\r\n                        <ion-col size="6">\r\n                          <isg-selectable [items]="this.abschnittarten" title="{{\'lblAbschnittart\' | translate}}"\r\n                            displayKey="Bezeichnung" lines="none" (selectionOutput)="onAbschnittartChanged($event)"\r\n                            [selectedItems]="this.selectedAbschnittart"\r\n                            buttonIcon="caret-down-sharp" buttonIconSize="extra-small"\r\n                            placeholder="{{\'lblWaehlen\' | translate}}" labelPlacement="stacked">\r\n                          </isg-selectable>\r\n                        </ion-col>\r\n                        <ion-col size="6">\r\n                          <isg-selectable lines="none" title="{{\'lblKonto\' | translate}}"\r\n                                          buttonIcon="caret-down-sharp" buttonIconSize="extra-small"\r\n                                          [items]="this.konten" [selectedItems]="this.selectedKonto"\r\n                                          (selectionOutput)="onKontoChanged($event)"\r\n                                          displayKey="FullBezeichnung"\r\n                                          placeholder="{{\'lblWaehlen\' | translate}}" labelPlacement="stacked">\r\n                          </isg-selectable>\r\n                        </ion-col>\r\n                      </ion-row>\r\n\r\n                      <ion-row>\r\n                        <ion-col class="ion-padding">\r\n                          <ion-textarea type="text" fill="outline" rows="2" autoGrow="true"\r\n                                        [(ngModel)]="this.bemerkung"\r\n                                        name="{{\'lblBemerkung\' | translate}}"\r\n                                        label="{{\'lblBemerkung\' | translate}}" labelPlacement="stacked">\r\n                          </ion-textarea>\r\n                        </ion-col>\r\n                      </ion-row>\r\n\r\n                      <ion-row>\r\n                        <ion-col class="ion-padding">\r\n                          <ion-button id="btnBuchen" expand="block" class="infoSoftButton"\r\n                                      (click)="this.addAbschnitt()"\r\n                                      [disabled]="!this.canBuchen()">\r\n                            {{\'btnBuchen\' | translate}}\r\n                          </ion-button>\r\n                        </ion-col>\r\n                      </ion-row>\r\n                    </ion-grid>\r\n                  </ion-row>\r\n\r\n                  <ion-row>\r\n                    <ion-grid class="isgBox">\r\n                      <ion-row class="ion-align-items-center background-infosoft-gradient border-rounded-top p-8">\r\n                        <ion-col size="4" class="text-overflow-ellipsis">\r\n                          <ion-label>{{\'lblKonto\' | translate}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col class="text-overflow-ellipsis">\r\n                          <ion-label>{{\'lblBezeichnung\' | translate}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col size="auto" class="ion-no-padding ion-justify-content-end">\r\n                          <ion-button shape="round" fill="clear" class="color-white ion-no-padding"\r\n                                      (click)="openKontoFavoriten()">\r\n                            <ion-icon name="star-outline" slot="icon-only"></ion-icon>\r\n                          </ion-button>\r\n                        </ion-col>\r\n                      </ion-row>
1\r\n\r\n                      <ion-row *ngFor="let kont of this.favoritKonten" class="ion-align-items-center px-8">\r\n                        <ion-col size="4" class="text-overflow-ellipsis">\r\n                          <ion-label>{{kont.Name}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col class="text-overflow-ellipsis">\r\n                          <ion-label>{{kont.Bezeichnung}}</ion-label>\r\n                        </ion-col>\r\n                        <ion-col size="auto">\r\n                          <ion-button expand="block" class="infoSoftButton" size="small"\r\n                                      (click)="this.addAbschnittWithFavoritKonto(kont)"\r\n                                      [disabled]="!this.canBuchen()">\r\n                            <ion-icon name="cart-outline" slot="icon-only"></ion-icon>\r\n                          </ion-button>\r\n                        </ion-col>\r\n                      </ion-row>\r\n                    </ion-grid>\r\n                  </ion-row>\r\n                </ion-col>\r\n\r\n                <ion-col size="9">\r\n                  <ion-grid class="isgBox h-100">\r\n                    \x3c!-- header row --\x3e\r\n                    <ion-row class="ion-align-items-center background-infosoft-gradient border-rounded-top p-8">\r\n                      <ion-col size="0.5" class="ion-no-margin ion-no-padding">\r\n                        <ion-button *ngIf="this.canBuchen()" id="btnDeleteAbschnitt"\r\n                                    shape="round" fill="clear" size="small"\r\n                                    class="color-white ion-no-margin ion-no-padding"\r\n                                    (click)="toggleIonSlides()">\r\n                          <ion-icon name="trash-outline" slot="icon-only" size="small"></ion-icon>\r\n                        </ion-button>\r\n                      </ion-col>\r\n                      <ion-col size="1.5" sizeXl="1">\r\n                        <ion-label>{{\'lblGrossVon\' | translate}}</ion-label>\r\n                      </ion-col>\r\n                      <ion-col size="1.5" sizeXl="1">\r\n                        <ion-label>{{\'lblGrossBis\' | translate}}</ion-label>\r\n                      </ion-col>\r\n                      <ion-col size="1.5" sizeXl="1" class="ion-text-nowrap ion-text-end">\r\n                        <ion-label>{{\'lblZeitMin\' | translate}}</ion-label>\r\n                      </ion-col>\r\n                      <ion-col size="1.5" sizeXl="1" class="ion-text-nowrap">\r\n                        <ion-label>{{\'lblKonto\' | translate}}</ion-label>\r\n                      </ion-col>\r\n                      <ion-col>\r\n                        <ion-label>{{\'lblKontoBezeichnung\' | translate}}</ion-label>\r\n                      </ion-col>\r\n                      <ion-col>\r\n                        <ion-label>{{\'lblAbschnittart\' | translate}}</ion-label>\r\n                      </ion-col>\r\n                      <ion-col *ngIf="this.isLargeScreen">\r\n                        <ion-label>{{\'lblBemerkung\' | translate}}</ion-label>\r\n                      </ion-col>\r\n                    </ion-row>\r\n\r\n                    <ion-row>\r\n                      <ion-col>\r\n                        <div [style.--FilterHeight]="filterContainer.clientHeight + \'px\'" [style.--FooterHeight]="footerContainer.clientHeight + \'px\'">\r\n                          <ion-item-sliding #ionItemSlide *ngFor="let absch of this.abschnitte"\r\n                                            (ionSwipe)="this.removeAbschnitt(absch)">\r\n                            <ion-item-options side="start">\r\n                              <ion-item-option expandable color="danger">\r\n                                <ion-button shape="round" fill="clear" class="color-white ion-no-padding"\r\n                                            (click)="this.removeAbschnitt(absch)">\r\n                                  <ion-icon name="trash-outline" slot="icon-only"></ion-icon>\r\n                                </ion-button>\r\n                              </ion-item-option>\r\n                            </ion-item-options>\r\n\r\n                            <ion-item lines="full" [style]="this.setAbschnittBackgroun
1d(absch)">\r\n                              <mat-expansion-panel class="w-100" [expanded]="absch.Bis.length <= 0" [disabled]="!this.canBuchen()">\r\n                                <mat-expansion-panel-header class="w-100 p-0">\r\n                                  <ion-grid>\r\n                                    <ion-row class="ion-align-items-center">\r\n                                      <ion-col *ngIf="!isIonSlideOpen" size="0.5"></ion-col>\r\n                                      <ion-col size="1.5" sizeXl="1" class="ion-text-nowrap" [style]="this.setAbschnittForeground(absch)">\r\n                                        <isg-datetime [Value]="absch.VonString" [Disabled]="!this.canBuchen()"\r\n                                          [style]="this.setAbschnittForeground(absch)" *ngIf="!isPauseAbschnitt(absch)"\r\n                                          (changeEvent)="onDateChangedAbschnitt(true,$event,absch)" Presentation="time">\r\n                                        </isg-datetime>\r\n                                        <ion-label *ngIf="isPauseAbschnitt(absch)">\r\n                                          {{timeService.convertToTime(absch.VonString)}}\r\n                                        </ion-label>\r\n                                      </ion-col>\r\n                                      <ion-col size="1.5" sizeXl="1" class="ion-text-nowrap" [style]="this.setAbschnittForeground(absch)">\r\n                                        <isg-datetime [Value]="absch.BisString" [Disabled]="!this.canBuchen()"\r\n                                          [style]="this.setAbschnittForeground(absch)" *ngIf="!isPauseAbschnitt(absch)"\r\n                                          (changeEvent)="onDateChangedAbschnitt(false,$event,absch)" Presentation="time">\r\n                                        </isg-datetime>\r\n                                        <ion-label *ngIf="isPauseAbschnitt(absch)">\r\n                                          {{timeService.convertToTime(absch.BisString)}}\r\n                                        </ion-label>\r\n                                      </ion-col>\r\n                                      <ion-col size="1.5" sizeXl="1" class="ion-text-end ion-text-nowrap">\r\n                                        <ion-label [style]="this.setAbschnittForeground(absch)">\r\n                                          {{absch.MinutenAngerechnet}} Min.\r\n                                        </ion-label>\r\n                                      </ion-col>\r\n                                      <ion-col size="1.5" sizeXl="1" class="ion-text-nowrap">\r\n                                        <ion-label *ngIf="absch.Konto != null" [style]="this.setAbschnittForeground(absch)">\r\n                                          {{absch.Konto.Name}}\r\n                                        </ion-label>\r\n                                      </ion-col>\r\n                                      <ion-col>\r\n                                        <ion-label *ngIf="absch.Konto != null" [style]="this.setAbschnittForeground(absch)">\r\n                                          {{absch.Konto.Bezeichnung}}\r\n                                        </ion-label>\r\n                                      </ion-col>\r\n                                      <ion-col>\r\n                                        <ion-label [style]="this.setAbschnittForeground(absch)">\r\n                                          {{absch.AbschnittArt.Bezeichnung}}\r\n                                        </ion-label>\r\n                                      </ion-col>\r\n                                      <ion-col *ngIf="this.isLargeScreen">\r\n                                        <ion-label [style]="this.setAbschnittForeground(absch)">\r\n                                          {{absch.Bemerkung}}\r\n                                        </ion-label>\r\n                                      </ion-col>\r\n                                    </ion-row>\r\n                                  </ion-grid>\r\n                                </mat-expansion-panel-header>\r\n\r\n                                <ion-grid>\r\n                                  <ion-row class="ion-align-items-center">\r\n                                    <ion-col size="0.5"></ion-col>\r\n                                    <ion-col size="4">\r\n                                      <ion-row>\r\n                                        <ion-col>\r\n                                          <isg-selectable lines="none" title="{{\'lblAbschnittart\' | translate}}"\r\n                                                          [items]="this.abschnittarten" [selectedItems]="absch.AbschnittArt"\r\n                                                          (selectionOutput)="onAbschnittartChanged($event, absch)"\r\n                                                          displayKey="Bezeichnung"\r\n                                                          buttonIcon="caret-down-sharp" buttonIconSize="extra-small"\r\n                                                          placeholder="{{\'lblWaehlen\' | translate}}" labelPlacement="stacked">\r\n                                          </isg-selectable>\r\n                                        </ion-col>\r\n                                      </ion-row>\r\n                                      <ion-row>\r\n                                        <ion-col>\r\n                                          <isg-selectable lines="none" title="{{\'lblKonto\' | translate}}"\r\n                                                          buttonIcon="caret-down-sharp" buttonIconSize="extra-small"\r\n                                                          [items]="this.konten" [selectedItems]="absch.Konto"\r\n                                                          (selectionOutput)="onKontoChanged($event, absch)"\r\n                                                          displayKey="FullBezeichnung"\r\n                                                          placeholder="{{\'lblWaehlen\' | translate}}" labelPlacement="stacked">\r\n                                          </isg-selectable>\r\n                                        </ion-col>\r\n                                      </ion-row>\r\n                                    </ion-col>\r\n                                    <ion-col size="7">\r\n                                      <ion-textarea type="text" fill="outline" rows="5" autoGrow="true"\r\n                                                    name="{{\'lblBemerkung\' | translate}}"\r\n                                                    [value]="absch.Bemerkung"\r\n                                                    (ionChange)="setBemerkungTextarea($event, absch)"\r\n                                                    [debounce]="150"\r\n                                                    label="{{\'lblBemerkung\' | translate}}" labelPlacement="stacked">\r\n                                      </ion-textarea>\r\n                                    </ion-col>\r\n                                  </ion-row>\r\n                                </ion-grid>\r\n                              </mat-expansion-panel>\r\n                            </ion-item>\r\n                          </ion-item-sliding>\r\n                        </div>\r\n                      </ion-col>\r\n                    </ion-row>\r\n                  </ion-grid>\r\n                </ion-col>\r\n              </ion-row>\r\n            </ion-grid>\r\n\r\n            \x3c!-- Mobil-App Content --\x3e\r\n            <ion-grid *ngIf="this.isSmallScreen" class="isgBox ion-margin">\r\n              <ion-row class="background-infosoft-gradient border-rounded-top p-8">\r\n                <ion-col>\r\n                  <ion-label>{{\'lblGrossVon\' | translate}}</ion-label>\r\n                </ion-col>\r\n                <ion-col>\r\n                  <ion-label>{{\'lblGrossBis\' | translate}}</ion-label>\r\n                </ion-col>\r\n                <ion-col class="ion-text-nowrap ion-text-end">\r\n                  <ion-label>{{\'lblZeitMin\' | translate}}</ion-label>\r\n                </ion-col>\r\n              </ion-row>\r\n\r\n              <ion-item-sliding #ionItemSlide *ngFor="let absch of this.abschnitte"\r\n                                (ionSwipe)="this.removeAbschnitt(absch)"\r\n                                (click)="this.openModalAbschnitt(absch)">\r\n                <ion-item-options side="start">\r\n                  <ion-item-option expandable color="danger">\r\n                    <ion-button shape="round" fill="clear" class="color-white ion-no-padding"\r\n                                (click)="this.removeAbschnitt(absch)">\r\n                      <ion-icon name="trash-outline" slot="icon-only"></ion-icon>\r\n                    </ion-button>\r\n                  </ion-item-option>\r\n                </ion-item-options>\r\n\r\n                <ion-item lines="full" class="AbschnittItem">\r\n                  <ion-grid class="ion-no-padding">\r\n                    <ion-row>\r\n                      <ion-col>\r\n                        <ion-label [style]="this.setAbschnittForeground(absch)">\r\n                          {{this.timeService.convertToTime(absch.VonString)}}\r\n                        </ion-label>\r\n                      </ion-col>\r\n                      <ion-col>\r\n                        <ion-label [style]="this.setAbschnittForeground(absch)">\r\n                          {{this.timeService.convertToTime(absch.BisString)}}\r\n                        </ion-label>\r\n                      </ion-col>\r\n                      <ion-col class="ion-text-end">\r\n                        <ion-label [style]="this.setAbschnittForeground(absch)">\r\n                          {{absch.MinutenAngerechnet}} Min.\r\n                        </ion-label>\r\n                      </ion-col>\r\n                    </ion-row>\r\n                  </ion-grid>\r\n                </ion-item>\r\n              </ion-item-sliding>\r\n            </ion-grid>\r\n\r\n          </ion-content>\r\n\r\n          <ion-footer>\r\n            <div #footerContainer>\r\n              <ion-grid>\r\n                <ion-row *ngIf="this.isSmallScreen" class="px-8">\r\n                  <ion-col>\r\n                    <ion-label>{{\'lblGeleisteteArbeitszeit\' | translate}}</ion-label>\r\n                  </ion-col>\r\n                  <ion-col size="auto" class="ion-text-end">\r\n                    <ion-label>{{this.calculateArbeitszeit()}} Min.</ion-label>\r\n                  </ion-col>\r\n                </ion-row>\r\n                <ion-row *ngIf="this.isSmallScreen" class="px-8">\r\n                  <ion-col>\r\n                    <ion-label>
1{{\'lblGutschriftZulagen\' | translate}}</ion-label>\r\n                  </ion-col>\r\n                  <ion-col size="auto" class="ion-text-end">\r\n                    <ion-label>{{this.calculateZulageZeit()}} Min.</ion-label>\r\n                  </ion-col>\r\n                </ion-row>\r\n                <ion-row *ngIf="this.isSmallScreen" class="px-8">\r\n                  <ion-col>\r\n                    <ion-label>{{\'lblAbweichungTagessollzeit\' | translate}}</ion-label>\r\n                  </ion-col>\r\n                  <ion-col size="auto" class="ion-text-end">\r\n                    <ion-label [style]="getSollzeitColor()">{{this.calculateTagesSollzeit()}} Min.</ion-label>\r\n                  </ion-col>\r\n                </ion-row>\r\n\r\n                <ion-row>\r\n                  <ion-col *ngIf="this.remainingIntervalTime <= 0">\r\n                    <ion-button expand="block" color="danger"\r\n                                (click)="revertCurrentStundenrapport()"\r\n                                [disabled]="!this.hasUnsavedChanges || !this.canBuchen()">\r\n                      <ion-icon name="trash-outline" slot="start"></ion-icon>\r\n                      {{\'lblVerwerfen\' | translate}}\r\n                    </ion-button>\r\n                  </ion-col>\r\n                  <ion-col *ngIf="this.remainingIntervalTime <= 0">\r\n                    <ion-button expand="block" color="success"\r\n                                (click)="saveCurrentStundenrapport()"\r\n                                [disabled]="!this.hasUnsavedChanges || !this.canBuchen()">\r\n                      <ion-icon name="save-outline" slot="start"></ion-icon>\r\n                      {{\'lblSpeichern\' | translate}}\r\n                    </ion-button>\r\n                  </ion-col>\r\n                  <ion-col *ngIf="this.remainingIntervalTime > 0">\r\n                    <ion-button expand="block" class="infoSoftButton"\r\n                                (click)="abortSaveInterval()">\r\n                      {{\'lblSpeichernAbbrechen\' | translate}}\r\n                    </ion-button>\r\n                  </ion-col>\r\n                  <ion-col *ngIf="this.remainingIntervalTime > 0">\r\n                    <ion-button expand="block" class="infoSoftButton"\r\n                                (click)="saveCurrentStundenrapport()">\r\n                      <ion-label>\r\n                        {{this.languageService.formatString(\'lblAutoSpeichern\' | translate, this.remainingIntervalTime.toString())}}\r\n                      </ion-label>\r\n                    </ion-button>\r\n                  </ion-col>\r\n                </ion-row>\r\n              </ion-grid>\r\n            </div>\r\n          </ion-footer>\r\n        </ion-content>\r\n      </super-tab>\r\n\r\n      \x3c!-- Visierung --\x3e\r\n      <super-tab *ngIf="this.permissions.HasVisierung && !this.isSmallScreen">\r\n        <app-visierung></app-visierung>\r\n      </super-tab>\r\n\r\n      <ion-item\r\n        *ngIf="!this.permissions.HasStundenrapport && this.permissions.HasVisierung && this.isSmallScreen">\r\n        <ion-label class="ion-text-wrap">{{\'lblVisierungNurGross\' | translate}}</ion-label>\r\n      </ion-item>\r\n    </super-tabs-container>\r\n  </super-tabs>\r\n</ion-content>\r\n\r\n<ion-menu #MenuFilter id="filter" side="end" type="overlay"\r\n          menuId="Filter" contentId="isgHeaderContent"\r\n          *ngIf="this.permissions.HasStundenrapport"\r\n          [swipeGesture]="false">\r\n  <ion-header>\r\n    <ion-toolbar>\r\n      <ion-title>{{\'lblBerichte\' | translate}}</ion-title>\r\n      <ion-buttons slot="end">\r\n        <ion-button (click)="this.MenuFilter.close()">\r\n          <ion-icon slot="icon-only" name="close"></ion-icon>\r\n        </ion-button>\r\n      </ion-buttons>\r\n    </ion-toolbar>\r\n  </ion-header>\r\n\r\n  <ion-content scrollY="false" id="FilterContent">\r\n    <ion-grid>\r\n      <ion-row>\r\n        <ion-col size="12">\r\n          <ion-item lines="none">\r\n            <isg-datetime style="width: 100%;" Presentation="date" [Value]="this.reportDateString"\r\n              (changeEvent)="this.onFilterDateChanged($event)"\r\n              label="{{\'lblDatum\' | translate}}" labelPlacement="floating"></isg-datetime>\r\n          </ion-item>\r\n        </ion-col>\r\n      </ion-row>\r\n\r\n      <ion-row *ngIf="this.permissions.DarfFremdbearbeiten">\r\n        <ion-col>\r\n          <ion-item lines="full">\r\n            <ion-col>\r\n              <ion-select class="w-100"\r\n                cancelText="{{\'lblAbbrechen\' | translate}}" multiple="false"\r\n                [value]="this.selectedTeamPerson" (ionChange)="onTeamPersonChanged($event)"\r\n                [interfaceOptions]="this.ionSelectInterfaceOptions(\'lblPersonWaehlen\',true)"\r\n                label="{{\'lblPerson\' | translate}}" labelPlacement="stacked">\r\n                \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                <ion-select-option [value]="person" *ngFor="let person of TeamPersonen">{{person.Name}}</ion-select-option>\r\n              </ion-select>\r\n            </ion-col>\r\n            <ion-col size="auto">\r\n              <ion-button shape="round" fill="clear" color="dark" class="ion-no-padding"\r\n                          (click)="clearReportSelection()">\r\n                <ion-icon name="close" slot="icon-only"></ion-icon>\r\n              </ion-button>\r\n            </ion-col>\r\n          </ion-item>\r\n        </ion-col>\r\n      </ion-row>\r\n\r\n      <ion-row>\r\n        <ion-col>\r\n          <ion-item lines="none" button (click)="TagesjournalPDF()" [disabled]="!this.reportDateHasDienst"\r\n            [style.pointer-events]="this.reportDateHasDienst ? \'auto\' : \'none\'"\r\n            class="infoSoftButton ion-justify-content-start">\r\n            <ion-label class="pdfButtonLabel" slot="start"> {{\'lblTagesjournal\' | translate}}</ion-label>\r\n            <ion-icon name="document-attach" slot="end" class="ion-margin"></ion-icon>\r\n            <ion-spinner *ngIf="this.tagesjournalLoading" name="dots" class="ion-margin"></ion-spinner>\r\n          </ion-item>\r\n        </ion-col>\r\n      </ion-row>\r\n\r\n      <ion-row>\r\n        <ion-col>\r\n          <ion-item lines="none" button (click)="MonatsjournalPDF()"\r\n                    class="infoSoftButton ion-justify-content-start">\r\n            <ion-label class="pdfButtonLabel" slot="start"> {{\'lblMonatsjournal\' | translate}}</ion-label>\r\n            <ion-icon name="document-attach" slot="end" class="ion-margin"></ion-icon>\r\n            <ion-spinner *ngIf="this.monatsjournalLoading" name="dots" class="ion-margin"></ion-spinner>\r\n          </ion-item>\r\n        </ion-col>\r\n      </ion-row>\r\n\r\n      <ion-row>\r\n        <ion-col>\r\n          <ion-item lines="none" button (click)="MonatsrapportPDF()"\r\n                    class="infoSoftButton ion-justify-content-start">\r\n            <ion-label class="pdfButtonLabel" slot="start">{{\'lblMonatsrapport\' | translate}}</ion-label>\r\n            <ion-icon name="document-attach" slot="end" class="ion-margin"></ion-icon>\r\n            <ion-spinner *ngIf="this.monatsrapportLoading && !this.monatsrapportEinreichenLoading" name="dots" class="ion-margin"></ion-spinner>\r\n          </ion-item>\r\n        </ion-col>\r\n      </ion-row>\r\n\r\n      <ion-row>\r\n        <ion-col>\r\n          <ion-item *ngIf="this.permissions.DarfStundenrapportEinreichen" lines="none" button (click)="rapportEinreichen()"\r\n                    class="infoSoftButton ion-justify-content-start ion-text-wrap">\r\n            <ion-label slot="start">{{\'lblMonatsrapportEinreichen\' | translate}}</ion-label>\r\n            <ion-icon name="send" slot="end" class="ion-margin"></ion-icon>\r\n            <ion-spinner *ngIf="this.monatsrapportLoading && this.monatsrapportEinreichenLoading" name="dots" class="ion-margin"></ion-spinner>\r\n          </ion-item>\r\n        </ion-col>\r\n      </ion-row>\r\n\r\n      <ion-row>\r\n        <ion-col>\r\n          \x3c!-- Selectable muss vorhanden sein um \xfcber Icon-Button zu \xf6ffnen. Es kann aber ausgeblendet sein. --\x3e\r\n          <isg-selectable #slcFavoritKonten id="slcFavoritKonten" lines="none" presentAsButton="true" multiSelect="true" buttonIcon="star"\r\n                          title="{{\'lblKontofavoriten\' | translate}}"\r\n                          [items]="this.konten" [selectedItems]="this.favoritKontenSelectable"\r\n                          displayKey="FullBezeichnung"\r\n                          (selectionOutput)="onKontoFavoritenChanged($event)">\r\n          </isg-selectable>\r\n        </ion-col>\r\n      </ion-row>\r\n    </ion-grid>\r\n  </ion-content>\r\n</ion-menu>\r\n',styles:[W()]})],F);const _=[{path:"",component:F}];let B=class{};B=(0,p.Cg)([(0,g.UQu)({imports:[E.iI.forChild(_)],exports:[E.iI]})],B);
1var q=a(1775),ee=a(73955),ne=a(7485),te=a(68470);var M,re=a(86139),oe=a.n(re),se=a(345),S=a(72491),ae=a(83915);let P=((M=class{constructor(e,n,t,i,r,l){this.loadingService=e,this.hubFactory=n,this.alertService=t,this.languageService=i,this.sanitizer=r,this.storage=l,this.isLoading=!1,this.isLoadingVisierung=!1,this.visierungFilterMode=S.XY.Pendent,this.visierungFilterModeFiltered=S.XY.Pendent,this.visierungInstanzen=[],this.visierungMonatsrapporte=[],this.canVisierungZuruecknehmen=!1,this.visierungDatum=(new Date).toISOString(),this.visierungDatumDisplay=this.visierungDatum}ngOnInit(){var e=this;return(0,s.A)(function*(){yield e.loadData()})()}loadData(){var e=this;return(0,s.A)(function*(){if(!e.isLoading)try{var n;e.isLoading=!0,yield e.loadingService.showLoader(),e.visierungInstanzen=yield(yield e.hubFactory.stundenrapportService()).getVisierungInstanzen(),yield e.loadFilter(),(null===(n=e.visierungInstanzen)||void 0===n?void 0:n.length)>0&&null==e.selectedVisierungInstanz&&(e.selectedVisierungInstanz=e.visierungInstanzen[0])}catch(t){h.K.Fehler("\u{1f680} ~ VisierungComponent ~ loadData ~ err:",t),e.alertService.createCustomSwal(e.languageService.translate("lblFehler"),e.languageService.translate("msgFehler"),"error")}finally{yield e.loadingService.dismiss(),e.isLoading=!1}})()}onClickVisierungLoadFilteredData(){var e=this;return(0,s.A)(function*(){if(null!=e.selectedVisierungInstanz)try{yield e.loadingService.showLoader(),e.selectedVisierungMonatsrapport=null,e.visierungFilterModeFiltered=e.visierungFilterMode;let n=new Date(e.visierungDatum);e.visierungMonatsrapporte=yield(yield e.hubFactory.stundenrapportService()).getMonatsrapport(n.getFullYear(),n.getMonth(),e.selectedVisierungInstanz,e.visierungFilterMode)}catch(n){h.K.Fehler("\u{1f680} ~ VisierungComponent ~ onClickVisierungLoadFilteredData ~ err:",n),e.alertService.createCustomSwal(e.languageService.translate("lblFehler"),e.languageService.translate("msgFehler"),"error")}finally{yield e.loadingService.dismiss()}else e.alertService.createWarnungAlert(e.languageService.translate("lblUnvollstaendigeDaten"),e.languageService.translate("msgFilterKeineDaten"))})()}onClickVisierungMonatsrapport(e){var n=this;return(0,s.A)(function*(){if(!n.isLoadingVisierung){n.isLoadingVisierung=!0;try{var t;n.selectedVisierungMonatsrapport=e,2==n.visierungFilterModeFiltered&&(n.canVisierungZuruecknehmen=yield(yield n.hubFactory.stundenrapportService()).CanVisierungZuruecknehmen(e.ID,n.selectedVisierungInstanz.ID)),n.selectedVisierungMonatsrapport&&null==(null===(t=n.selectedVisierungMonatsrapport)||void 0===t?void 0:t.PDFURL)&&(n.selectedVisierungMonatsrapport.PDFURL=yield n.getMonatsrapportVisierungUrl(n.selectedVisierungMonatsrapport.Valuta,n.selectedVisierungMonatsrapport.Person.ID))}catch(i){h.K.Fehler("\u{1f680} ~ VisierungComponent ~ onClickVisierungMonatsrapport ~ err:",i)}finally{n.isLoadingVisierung=!1}}})()}getMonatsrapportVisierungUrl(e,n){var t=this;return(0,s.A)(function*(){let i=new V;i.Datum=e,i.PersonID=n;let r=yield(yield t.hubFactory.reportingService()).GetMonatsrapportVisierung(i);return t.sanitizer.bypassSecurityTrustResourceUrl(r)})()}onClickVisierungApprove(){var e=this;return(0,s.A)(function*(){try{(yield(yield e.hubFactory.stundenrapportService()).approveMonatsrapport(e.selectedVisierungMonatsrapport,e.selectedVisierungInstanz,e.visierungBemerkung))&&(e.visierungBemerkung="",e.removeSelectedVisierungPerson(),e.selectedVisierungMonatsrapport=null,e.onClickVisierungLoadFilteredData())}catch(n){h.K.Fehler("\u{1f680} ~ VisierungComponent ~ onClickVisierungApprove ~ err:",n),e.alertService.createCustomSwal(e.languageService.translate("lblFehler"),e.languageService.translate("msgFehler"),"error")}})()}onClickVisierungReject(){var e=this;return(0,s.A)(function*(){try{(yield(yield e.hubFactory.stundenrapportService()).rejectMonatsrapport(e.selectedVisierungMonatsrapport,e.selectedVisierungInstanz,e.visierungBemerkung))&&(e.visierungBemerkung="",e.removeSelectedVisierungPerson(),e.selectedVisierungMonatsrapport=null,e.onClickVisierungLoadFilteredData())}catch(n){h.K.Fehler("\u{1f680} ~ VisierungComponent ~ onClickVisierungReject ~ err:",n),e.alertService.createCustomSwal(e.languageService.translate("lblFehler"),e.languageService.translate("msgFehler"),"error")}})()}onClickWithdrawVisierung(){var e=this;return(0,s.A)(function*(){try{(yield(yield e.hubFactory.stundenrapportService()).withdrawVisierung(e.selectedVisierungMonatsrapport,e.selectedVisierungInstanz))&&(e.selectedVisierungMonatsrapport=null,e.onClickVisierungLoadFilteredData())}catch(n){h.K.Fehler("\u{1f680} ~ VisierungComponent ~ onClickWithdrawVisierung ~ err:",n),e.alertService.createCustomSwal(e.languageService.translate("lblFehler"),e.languageService.translate("msgFehler"),"error")}})()}onVisierungDateChanged(e){var n=this;return(0,s.A)(function*(){n.visierungDatum=e,n.visierungDatumDisplay=new Date(n.visierungDatum).toISOString()})()}removeSelectedVisierungPerson(){var e;let n=this.selectedVisierungMonatsrapport;this.visierungMonatsrapporte=null===(e=this.visierungMonatsrapporte)||void 0===e?void 0:e.filter(function(t){return t.ID!=n.ID})}formatDateString(e){if(e)return w(e).format("DD.MM.YYYY")}isSelectedMonatsrapport(e){return e==this.selectedVisierungMonatsrapport?"selected":""}getLastVisierungForMonatsrapport(e){var n,t;if(e&&null!=e&&e.Visierungen&&!((null==e||null===(n=e.Visierungen)||void 0===n?void 0:n.length)<=0))return null==e||null===(t=e.Visierungen)||void 0===t||t.sort((i,r)=>H.N.sortByDate(null==i?void 0:i.Created,null==r?void 0:r.Created)),null==e?void 0:e.Visierungen[0]}loadFilter(){var e=this;return(0,s.A)(function*(){let n;var t;(n=b.Z.isAppModeOnline()?yield(yield e.hubFactory.personService()).GetUsersetting("StundenrapportVisierung_Instanz"):yield e.storage.getValue(S.mG.StundenrapportVisierungInstanz),null!=n)&&(e.selectedVisierungInstanz=null===(t=e.visierungInstanzen)||void 0===t?void 0:t.find(i=>i.ID==Number(n)))})()}saveFilter(){var e=this;return(0,s.A)(function*(){var n,t;if(null===(n=e.selectedVisierungInstanz)||void 0===n||!n.ID)return;let i=null===(t=e.selectedVisierungInstanz)||void 0===t||null===(t=t.ID)||void 0===t?void 0:t.toString();try{yield(yield e.hubFactory.personService()).SetUsersetting("StundenrapportVisierung_Instanz",i
1),yield e.storage.setValue(S.mG.StundenrapportVisierungInstanz,i)}catch(r){h.K.Fehler("\u{1f680} ~ VisierungComponent ~ saveFilter ~ err:",r)}})()}ionSelectInterfaceOptions(e,n=!1){let t={header:e,keyboardClose:!0,cssClass:"WideAlert"};return n&&(t.header=this.languageService.translate(e)),t}showAkzeptierenAblehnen(){var e,n;return b.Z.BackendVersion.isNewerOrEqual("3.6.0")?(null===(e=this.selectedVisierungMonatsrapport)||void 0===e?void 0:e.Status)==S.VH.Pendent||(null===(n=this.selectedVisierungMonatsrapport)||void 0===n?void 0:n.Status)==S.VH.PendentVorinstanz:this.visierungFilterModeFiltered<1||this.visierungFilterModeFiltered>2}showZuruecknehmen(){var e;return b.Z.BackendVersion.isNewerOrEqual("3.6.0")?(null===(e=this.selectedVisierungMonatsrapport)||void 0===e?void 0:e.Status)==S.VH.Erledigt:2==this.visierungFilterModeFiltered}canZuruecknehmen(){return!!this.selectedVisierungMonatsrapport&&this.canVisierungZuruecknehmen}}).ctorParameters=()=>[{type:x.U},{type:Z.d},{type:O.u},{type:L.g},{type:se.up},{type:ae.n}],M);P=(0,p.Cg)([(0,g.uAl)({selector:"app-visierung",template:'<ion-content>\r\n  <ion-grid class="visumOuterGrid">\r\n    \x3c!-- Header --\x3e\r\n    <ion-item class="datepickerHeaderItem ion-no-padding ion-no-margin ion-padding-end">\r\n      <ion-grid>\r\n        <ion-row class="ion-no-padding">\r\n          <ion-col>\r\n            <ion-row>\r\n              <ion-col class="ion-no-padding ion-text-center">\r\n                <ion-item>\r\n                  <isg-datetime [Value]="this.visierungDatum" Presentation="month-year" [LastDayOfMonth]="false"\r\n                    (changeEvent)="this.onVisierungDateChanged($event)"\r\n                    label="{{\'lblMonat\' | translate}}" labelPlacement="floating">\r\n                  </isg-datetime>\r\n                </ion-item>\r\n              </ion-col>\r\n              <ion-col>\r\n                <ion-item>\r\n                  <ion-select cancelText="{{\'lblAbbrechen\' | translate}}" multiple="false"\r\n                    [value]="this.selectedVisierungInstanz" [(ngModel)]="this.selectedVisierungInstanz" (ionChange)="saveFilter()"\r\n                    placeholder="{{\'lblWaehlen\' | translate}}"\r\n                    label="{{\'lblInstanz\' | translate}}" labelPlacement="stacked">\r\n                    \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                    <ion-select-option [value]="visierung" *ngFor="let visierung of visierungInstanzen">{{visierung.Bezeichnung}}</ion-select-option>\r\n                  </ion-select>\r\n                </ion-item>\r\n              </ion-col>\r\n              <ion-col>\r\n                <ion-item>\r\n                  <ion-select cancelText="{{\'lblAbbrechen\' | translate}}" multiple="false"\r\n                    [value]="this.visierungFilterMode" [(ngModel)]="this.visierungFilterMode"\r\n                    [interfaceOptions]="this.ionSelectInterfaceOptions(\'lblFilternNach\',true)"\r\n                    label="{{\'lblFilternNach\' | translate}}" labelPlacement="floating">\r\n                    \x3c!-- * Attention: Don\'t add newlines on ion-select-options! --\x3e\r\n                    <ion-select-option [value]="0">{{\'lblPendent\' | translate}}</ion-select-option>\r\n                    <ion-select-option [value]="1">{{\'lblAlle\' | translate}}</ion-select-option>\r\n                    <ion-select-option [value]="2">{{\'lblErledigt\' | translate}}</ion-select-option>\r\n                    <ion-select-option [value]="3">{{\'lblPendentVorinstanz\' | translate}}</ion-select-option>\r\n                  </ion-select>\r\n                </ion-item>\r\n              </ion-col>\r\n              <ion-col class="ion-no-padding">\r\n                <ion-button class="infoSoftButton" expand="block" (click)="onClickVisierungLoadFilteredData()">\r\n                  {{\'btnFiltern\' | translate}}\r\n                </ion-button>\r\n              </ion-col>\r\n            </ion-row>\r\n          </ion-col>\r\n        </ion-row>\r\n      </ion-grid>\r\n    </ion-item>\r\n    <ion-row style="min-height:600px; align-items:start;">\r\n      \x3c!-- Personenliste --\x3e\r\n      <ion-col size="4" class="visumGrid ion-margin isgBox">\r\n        <ion-row class="gridHeaderRow gridHeaderRowNoRightPadding border-rounded-top">\r\n          <ion-col size="3" class="ion-text-start">\r\n            <ion-label>{{\'lblName\' | translate}}</ion-label>\r\n          </ion-col>\r\n          <ion-col size="2" class="ion-text-start">\r\n            <ion-label>{{\'lblGrossPer\' | translate}}</ion-label>\r\n          </ion-col>\r\n          <ion-col size="2" class="ion-text-start">\r\n            <ion-label>{{\'lblVisum\' | translate}}</ion-label>\r\n          </ion-col>\r\n          <ion-col size="3" class="ion-text-start">\r\n            <ion-label>{{\'lblDurch\' | translate}}</ion-label>\r\n          </ion-col>\r\n          <ion-col size="2" class="ion-text-start">\r\n            <ion-label>{{\'lblInstanz\' | translate}}</ion-label>\r\n          </ion-col>\r\n        </ion-row>
1\r\n        <ion-item *ngFor="let rapport of this.visierungMonatsrapporte"\r\n          (click)="onClickVisierungMonatsrapport(rapport)" class="ion-no-padding selectable"\r\n          [ngClass]="isSelectedMonatsrapport(rapport)">\r\n          <ion-row style="width: 100%" class="ion-no-padding">\r\n            <ion-col size="3" class="ion-text-start">\r\n              <ion-label>{{rapport.Person.Name}}</ion-label>\r\n            </ion-col>\r\n            <ion-col size="2" class="ion-text-start">\r\n              <ion-label>{{this.formatDateString(rapport.Valuta)}}</ion-label>\r\n            </ion-col>\r\n            <ion-col size="2" class="ion-text-start">\r\n              <ion-label>{{formatDateString(getLastVisierungForMonatsrapport(rapport)?.Created)}}</ion-label>\r\n            </ion-col>\r\n            <ion-col size="3" class="ion-text-start">\r\n              <ion-label>{{getLastVisierungForMonatsrapport(rapport)?.Person.Name}}</ion-label>\r\n            </ion-col>\r\n            <ion-col size="2" class="ion-text-start">\r\n              <ion-label>{{getLastVisierungForMonatsrapport(rapport)?.VisierungInstanz.Bezeichnung}}</ion-label>\r\n            </ion-col>\r\n          </ion-row>\r\n        </ion-item>\r\n      </ion-col>\r\n      \x3c!-- Report --\x3e\r\n      <ion-col class="visumGrid ion-margin isgBox" style="margin-left: 0;">\r\n        <ion-item\r\n          *ngIf="this.selectedVisierungMonatsrapport != null && this.selectedVisierungMonatsrapport.PDFURL != null">\r\n          <embed class="visumPdf" [src]="this.selectedVisierungMonatsrapport.PDFURL" width="100%">\r\n        </ion-item>\r\n        <ion-spinner id="visierung-spinner" *ngIf="this.isLoadingVisierung" name="dots" class="ion-margin">\r\n        </ion-spinner>\r\n      </ion-col>\r\n    </ion-row>\r\n  </ion-grid>\r\n\r\n  <ion-footer style="z-index:102; position:fixed; bottom:0;">\r\n    <ion-grid class="ion-no-padding ion-no-margin" style="padding-right: 15px;">\r\n      <ion-row class="footer-row" *ngIf="showAkzeptierenAblehnen()">\r\n        <ion-col size="7" class="ion-margin">\r\n          <ion-item id="BemerkungItem">\r\n            <ion-textarea [disabled]="!this.selectedVisierungMonatsrapport" class="bemerkung"\r\n              [(ngModel)]="this.visierungBemerkung" label="{{\'lblBemerkung\' | translate}}" labelPlacement="floating">\r\n            </ion-textarea>\r\n          </ion-item>\r\n        </ion-col>\r\n        <ion-col>\r\n          <ion-button class="infoSoftButton buttonRed ion-margin-vertical" expand="block"\r\n            [disabled]="!this.selectedVisierungMonatsrapport" (click)="onClickVisierungReject()">\r\n            {{\'lblAblehnen\' | translate}}\r\n          </ion-button>\r\n          <ion-button class="infoSoftButton buttonGreen ion-margin-vertical" expand="block"\r\n            [disabled]="!this.selectedVisierungMonatsrapport" (click)="onClickVisierungApprove()">\r\n            {{\'lblAkzeptieren\' | translate}}\r\n          </ion-button>\r\n        </ion-col>\r\n      </ion-row>\r\n      <ion-row class="footer-row" *ngIf="showZuruecknehmen()">\r\n        <ion-col size="7" class="ion-margin">\r\n        </ion-col>\r\n        <ion-col>\r\n          <ion-button class="infoSoftButton buttonRed ion-margin-vertical" expand="block"\r\n            [disabled]="!canZuruecknehmen()" (click)="onClickWithdrawVisierung()">\r\n            {{\'lblVisierungZuruecknehmen\' | translate}}\r\n          </ion-button>\r\n        </ion-col>\r\n      </ion-row>\r\n    </ion-grid>\r\n  </ion-footer>\r\n</ion-content>\r\n',styles:[oe()]})],P);let C=class{};C=(0,p.Cg)([(0,g.UQu)({imports:[f.MD,N.YN,k.bv,B,q.G,ee.h,te.Qv,ne.MY],declarations:[F,P]})],C)},86139:(A,I,a)=>{var p=a(8564),f=a(98557)(p);f.push([A.id,":host {\n  --super-tabs-toolbar-background: var(--ion-color-light);\n  --st-indicator-color: black;\n}\n\nion-textarea {\n  background-color: white;\n  border: var(--ion-color-light-shade) solid 1px;\n}\n\nion-item {\n  width: 100%;\n  --inner-padding-end: 0;\n  --padding-end: 0px;\n}\n\n#BemerkungItem {\n  --inner-padding-start: 0px;\n  --padding-start: 0px;\n}\n\nion-select {\n  width: 100%;\n  max-width: 100%;\n}\n\n.gridHeaderRow {\n  background: var(--infosoft-gradient);\n  color: white;\n  padding-left: 0;\n  padding-right: 30px;\n  padding-top: 5px;\n  padding-bottom: 5px;\n  font-size: large;\n  text-align: center;\n}\n\n.gridHeaderRowNoRightPadding {\n  padding-right: 0px !important;\n}\n\nion-row {\n  align-items: center;\n}\n\nion-button {\n  font-size: 16px;\n}\n\n.grid {\n  padding-bottom: 0;\n}\n\n.contentRow {\n  align-items: unset;\n}\n\npdf-viewer {\n  width: 100%;\n  height: 200px;\n}\n\n.visumGrid {\n  padding: 0;\n  height: calc(100vh - 350px);\n  min-height: 400px;\n}\n\n.visumOuterGrid {\n  padding: 0;\n  height: calc(100vh - 246px);\n  min-height: 400px;\n}\n\n.visumPdf {\n  margin-left: 0;\n  height: calc(100vh - 353px);\n  min-height: 400px;\n}\n\n.buttonRed {\n  background-color: firebrick !important;\n}\n\n.buttonGreen > .button-inner,\n.buttonGreen > ion-ripple {\n  background-color: green !important;\n}\n\n.selectable {\n  cursor: pointer;\n}\n\n#filter ion-icon,\n#filter ion-spinner {\n  color: white;\n}\n\n#visierung-spinner {\n  transform: scale(8);\n  left: 50%;\n  top: 50%;\n}\n\nion-item.rowColor div.item-native {\n  background-color: inherit !important;\n}\n\n.bemerkung {\n  --padding-end: 5px;\n  --padding-start: 5px;\n}\n\n@media (prefers-color-scheme: dark) {\n  .bemerkung {\n    background-color: #1E1E1E;\n    color: white;\n  }\n}",""]),A.exports=f.toString()},69971:(A,I,a)=>
1{var p=a(8564),f=a(98557)(p);f.push([A.id,":host {\n  --super-tabs-toolbar-background: var(--ion-color-light);\n  --st-indicator-color: black;\n}\n\ndiv ion-item {\n  --padding-start: 0px;\n  --padding-end: 0px;\n  --inner-padding-start: 0px;\n  --inner-padding-end: 0px;\n}\n\nion-item ion-textarea {\n  background-color: var(--ion-item-background, var(--ion-background-color, #ffffff));\n  border: var(--ion-color-light-shade) solid 1px;\n}\n\n.contentContainer {\n  --FilterHeight: 68px;\n  --FooterHeight: 86px;\n  height: calc(100% - (var(--FooterHeight) + var(--FilterHeight)));\n}\n\n@media only screen and (max-width: 1079px) {\n  .contentContainer {\n    --FilterHeight: 148px;\n    --FooterHeight: 170px;\n    height: calc(100% - (var(--FooterHeight) + var(--FilterHeight)));\n  }\n}",""]),A.exports=f.toString()}}]);

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.