D ##class(BL.Derde.Agenda.GeoMobile).UpdateAll() D ##class(BL.Derde.Agenda.GeoMobile).Create(22).CopyPreviousAllDay($H-2) BL.EC.Common 1 %RegisteredObject 0 Hoeveel lookups moeten er zijn vooralleer de lookup wordt gestart. 4 Agenda %String 1 Res.InternePersoon %Boolean 1 :Datum) Set DiffTime=9999999999 &sql(OPEN IsAlive) For &sql(FETCH IsAlive) Quit:SQLCODE Do . Set Diff=$$DIFFTIME^vhDTyp(InsertTijdStip,$H) . Quit:Diff<0 . Set:DiffTime>Diff DiffTime=Diff &sql(CLOSE IsAlive) Set IsVerlof=$$CALCDATE^vhDTyp($H,"A","+0")'=+$H Set IsArbeidsTijd=($P($H,",",2)>(3600*8))&&($P($H,",",2)<(3600*18)) Set MaxDiffTime=$S(IsVerlof:24,'IsArbeidsTijd:12,1:4)*3600 If DiffTime>MaxDiffTime Do ;Halve dag . Set Body="Translocator service op TAPI herstarten" . Set Body=Body_$C(13,13)_"Namespace: "_$zu(5)_$C(13)_"Server: "_$ZU(110) . Do SendMiniMail^vhLib("admin@vanhoecke.be",$lb("pv@vanhoecke.be"),"Geomobile : Translocator gestopt : "_$J(DiffTime/3600,0,0),Body,,,,,) ]]> D ##class(BL.Derde.Agenda.GeoMobile).ConfigAll("INFO",6) 1 Node,SubNode '') &sql(OPEN ConfigAll) For &sql(FETCH ConfigAll) Quit:SQLCODE Do . Do ..ConfigDevice(UserID,Node,.SubNode) &sql(CLOSE ConfigAll) ]]> D ##class(BL.Derde.Agenda.GeoMobile).ConfigDevice(11,"CONFIG") confguratiecommand versturen naar het GeoDevice via de geomobileconnector data bevind zich in ^Derde.Agenda.GeoMobileCfg Node = "INFO" of "CONFIG" 1 UserID,Node,SubNode Opbouw van Index in VHUser en een WieIsWie tabel in Derde.Agenda.GeoMobileCfg D ##class(BL.Derde.Agenda.GeoMobile).CreateLookup() 1 0 '') &sql(OPEN LookupGeoUsers) Set Cnt=0 For &sql(FETCH LookupGeoUsers) Quit:SQLCODE Do . Set IGeo(GeoDevice)=UserID . Set Key="R"_$J($G(ExtVtw(UserID)),2) . Set:(Key'?1"R"1E1N)||($D(WieIsWie(Key))) Key="U"_$J($I(Cnt),2) . Set WieIsWie(Key)=UserID_"\"_Naam_"\"_GeoDevice &sql(CLOSE LookupGeoUsers) Kill ^vhUSER("IGEO") Merge ^vhUSER("IGEO")=IGeo Kill ^Derde.Agenda.GeoMobileCfg("WIE") Merge ^Derde.Agenda.GeoMobileCfg("WIE")=WieIsWie Set Dev=$$OPEN^vhDEV("\\tapi\c$\GeoMobileconnector\Log","WIE IS WIE.txt","W") Use Dev Set Key="" For Set Key=$O(WieIsWie(Key)) Quit:Key="" Do . Write Key,?5,$J($P(WieIsWie(Key),"\"),4),?15,$P(WieIsWie(Key),"\",2),?50,$P(WieIsWie(Key),"\",3),! Close:0'[Dev Dev ]]> 1 UserID r "DD/MM/YYYY: ",K s Dat=$ZDH(K,4) k ^|"REM-ADMIN1"|Derde.Agenda.AgendaD(22,Dat) m ^|"REM-ADMIN1"|Derde.Agenda.AgendaD(22,Dat)=^Derde.Agenda.AgendaD(22,Dat) D ##class(BL.Derde.Agenda.GeoMobile).Import() 1 Alleen GeoMobile bussiness logic, Agenda bL niet. 1 DeviceNr De basissleutel is Gebruiker, Datum en GeoStamp Eerst nakijken of dat de vorige dagen reeds volledig zijn opgehaald in dien niet dan eerst ophalen. User,BLAgenda D ##class(BL.Derde.Agenda.GeoMobile).UpdateAll() 1 (21*60*60) ; niet na 8 uur 's avonds &sql(DECLARE GeoUsers CURSOR FOR Select ID,Naam into :UserID,:Naam from Res.InternePersoon where isnull(GeoDevice,'')<>'') &sql(OPEN GeoUsers) For &sql(FETCH GeoUsers) Quit:SQLCODE Do . Set BL=..%New() . Do BL.Initialize(UserID) . Do BL.Update() &sql(CLOSE GeoUsers) ]]> D ##class(BL.Derde.Agenda.GeoMobile).ReDoUpdate(1028,+$H) D ##class(BL.Derde.Agenda.GeoMobile).ReDoUpdate(11,+$H) 11=LDS,22=PVT,1028=KSM 1 UserID,FromDay BL.Derde.Agenda.pxStatus ($P($H,",",2)+300),Type'="INVALID" Do ; geen records in toekomst, maar een verschil van 5min toelaten . Set Body="Gebruiker: "_..User.%Id()_" "_..User.Naam . Set Body=Body_$C(13)_"Record tijdstip "_$$EXTDATE^vhDTyp(Datum)_" "_$$EXTTIME^vhDTyp(Tijd) . Set Body=Body_$C(13)_"Registratie tijdstip "_$$EXTDATE^vhDTyp($H)_" "_$$EXTTIME^vhDTyp($H) . Set Body=Body_$C(13)_"Server: "_$ZU(110)_" NameSpace: "_$ZU(5) . Set From="System@vanhoecke.be" . Set Subj="GeoData met tijdstip in de toekomst "_..User.%Id() . Set To=$LB("pv@vanhoecke.be") . Do SendMiniMail^vhLib(From,To,Subj,Body,,,,,) . Set Type="skip tijdstip in de toekomst" Set GeoData=##class(Derde.Agenda.GeoMobile).Create(GeoStamp,..User,Datum,Tijd, ContactOn, Afstand, Snelheid, Latitude, Longitude,PrecisionError,Type) Set Status=GeoData.%Save() ;do WL^vhDBG("GeoData STORE save status"_$$ParseStatus^vhLib(Status)) If Status'=$$$OK Do Quit Status . Set:$G(TempIndex) ^Derde.Agenda.GeoBackupD(TempIndex,"SAVEERROR")=Status . Do ..Error(Status,GeoData) Else Do . Set:'PrecisionError $$$MapPointIndex(GeoData.%Id())=Latitude_";"_Longitude ;Do ..TranslateGPS2Street() Quit $$$OK ]]> d ##class(BL.Derde.Agenda.GeoMobile).Reconstruct() 1 UserId,VanDatum D ##Class(BL.Derde.Agenda.GeoMobile).%New().TranslateGPS2Street(1) Forced 3 ; Retrycount overschreden . Set GPSList=GPSList_"\"_GeoID_";"_$P($$$MapPointIndex(GeoID),";",1,2) . Set Cnt=Cnt+1 . If $I(Cnt)'<..#MinMapPointLookups Do . . Do TransAndSave . . Set Cnt=0 . . Set GPSList="" Do:Cnt TransAndSave Quit TransAndSave Set %ClientIP="192.168.1.15" ;Do WL^vhDBG("START: "_GPSList) Set $ZTRAP="Error" Set AdresList=soap.GPSList2Address(GPSList) ; Translate with MapPoint service Set Ref="" For Set Adres=AdresList.Adressen.GetNext(.Ref) Quit:Ref="" Do . Quit:Adres.ID="" . Set GeoData=##class(Derde.Agenda.GeoMobile).%OpenId(Adres.ID) . If '$isObject(GeoData) Kill $$$MapPointIndex(Adres.ID) Quit ; GeoMobile item bestaat niet meer . Set GeoData.Straat=Adres.Straat . Set GeoData.Gemeente=Adres.Gemeente . Set GeoData.PostCode=Adres.PostCode . Do:$L(Adres.LandISOCode) GeoData.LandSetObjectId(Adres.LandISOCode) . Set Status=GeoData.%Save() . If Status'=1 DO . . Do ..Error(Status,GeoData) . Kill $$$MapPointIndex(Adres.ID) ; Retrycount van adressen verhogen die niet zijn teruggekomen ; Als er een errortrap voorkomt dan wordt dit niet opgeroepen. For I=1:1:$L(GPSList,"\") Set GeoID2=$P($P(GPSList,"\",I),";") Set:GeoID2&&$D($$$MapPointIndex(GeoID2)) $P($$$MapPointIndex(GeoID2),";",3)=$P($$$MapPointIndex(GeoID2),";",3)+1 Quit Error Set $ZTRAP="" Set %ClientIP="192.168.1.15" Do WL^vhDBG($$ParseStatus^vhLib(%objlasterror)) Do WL^vhDBG("ERROR: "_GPSList) Quit ]]> "" AND Datum<=:Datum) ; De datum wordt bijgevoegd in de where clause om eventuele toekomstige data die 'per ongeluk' in de databank zijn terecht gekomen te negeren &sql(OPEN RAL) For &sql(FETCH RAL) Quit:SQLCODE &sql(CLOSE RAL) Set:LastDatum<($H-30) LastDatum=$H-30 Kill ..Log For Datum=LastDatum:1:+$H Do . ;Write !, "Convert ",$ZD(Datum,8) ; Geen WRITES bij SOAP . Do ..GeoData2Agenda(Datum) . Do UnLockConvert2Agenda Do ..MailLog() Quit MailLockAgenda Set Body="Gebruiker: "_..User.%Id()_" "_..User.Naam Set Body=Body_$C(13)_"Server: "_$ZU(110)_" NameSpace: "_$ZU(5) Set From="System@vanhoecke.be" Set Subj="GEOMobile of Agenda - user "_..User.%Id()_" locked" Set To=$LB("pv@vanhoecke.be") Do SendMiniMail^vhLib(From,To,Subj,Body,,,,,) Quit UnLockConvert2Agenda Do ##Class(Derde.Agenda.GeoMobile).UnLockUser(..User) Do ##Class(Derde.Agenda.Agenda).UnLockUser(..User) Quit ]]> Country Conversie van de GeoMobile data naar Agenda gegevens dit voor één bep Persoon en één bep dag Conversie van de GeoMobile data naar Agenda gegevens dit voor één bep Persoon en één bep dag Datum:%Date,NoReload:%Boolean "INVALID" and Type not like 'skip%' ORDER BY Tijd,SubID) Set VolgNr=0 Kill Cache &sql(OPEN GD2A) For &sql(FETCH GD2A) Quit:SQLCODE Do . Quit:$$DIFFTIME^vhDTyp(InsertTijdStip,Nu)<0 . ;Quit:$ZCVT(Type,"L")=Type ; Reloaded ! . Set Cache($I(VolgNr))=ID &sql(CLOSE GD2A) Set Cache($I(VolgNr))="" ; een extra om de next ook te verwerken Set VolgNr=$O(Cache("")) Quit:VolgNr="" ; Niets te doen Set ID=Cache(VolgNr) Quit:ID="" ; Niets te doen Set Current=##class(Derde.Agenda.GeoMobile).%OpenId(ID) For Set VolgNr=$O(Cache(VolgNr)) Quit:VolgNr="" Do . Set ID=Cache(VolgNr) . Set Next=$S(ID="":"",1:##class(Derde.Agenda.GeoMobile).%OpenId(ID)) . Set Skipped=0 . ; Nieuw object maar het is in het verleden, er zijn reeds objecten verwerkt die recenter zijn . If MaxTijd,$$DIFFTIME^vhDTyp(MaxTijd,Current.Datum_","_Current.Tijd)<0 Do . . Set Body="Gebruiker: "_..User.%Id()_" "_..User.Naam . . Set Body=Body_$C(13)_"Geomobile ID "_Current.%Id() . . Set Body=Body_$C(13)_"Geo TijdStip "_$$EXTDATE^vhDTyp(Current.Datum)_" "_$$EXTTIME^vhDTyp(Current.Tijd) . . Set Body=Body_$C(13)_"Max tijd "_$$EXTDATE^vhDTyp(MaxTijd)_" "_$$EXTTIME^vhDTyp(MaxTijd) . . Set Body=Body_$C(13)_"Server: "_$ZU(110)_" NameSpace: "_$ZU(5) . . Set From="System@vanhoecke.be" . . Set Subj="GeoData met tijdstip in het verleden, er werd reeds recentere data verwerkt "_..User.Naam . . Set To=$LB("pv@vanhoecke.be") . . ;Do SendMiniMail^vhLib(From,To,Subj,Body,,,,,) . . Set:Current.Type'=$ZCVT(Current.Type,"L") Reload=1 ; not yet reloaded . . Set Current.Type=$ZCVT(Current.Type,"L") ; lowercase . . Do Current.%Save() . . Set Skipped=1 . . Set Current=Next . . ; Controle of het vorig een contact OFF was en dat er binnen de 2min een contact ON volgt -> skip . If 'Skipped,$isObject(Vorig),$isObject(Next),'Vorig.ContactOn,Current.ContactOn,Next.ContactOn Do . . ;w !,"V:",$ZT(Vorig.Tijd)," ",Vorig.Type," C:",$ZT(Current.Tijd)," ",Current.Type," N:",$zt(Next.Tijd)," ",Next.Type . . Quit:(Current.Tijd-Vorig.Tijd)>130 . . ;W " CO" . . Quit:(Next.Tijd-Current.Tijd)<130 ; Als het volgend bericht minder dan 2min achter het huidige komt dan is het ok . . ;w " skipped bad start-time" . . Set Body="Gebruiker: "_..User.%Id()_" "_..User.Naam . . Set Body=Body_$C(13)_"Geomobile ID "_Current.%Id() . . Set Body=Body_$C(13)_"Geo TijdStip "_$$EXTDATE^vhDTyp(Current.Datum)_" "_$$EXTTIME^vhDTyp(Current.Tijd) . . Set Body=Body_$C(13)_"Server: "_$ZU(110)_" NameSpace: "_$ZU(5) . . Set From="System@vanhoecke.be" . . Set Subj="GeoData element skipped, START met vals tijdstip "_..User.Naam . . Set To=$LB("pv@vanhoecke.be") . . ;Do SendMiniMail^vhLib(From,To,Subj,Body,,,,,) . . Set Current.Type="skip start-time bad" . . Do Current.%Save() . . Set Skipped=1 . . Set Current=Next . . ; Controle of het vorig een contact ON was en dat er binnen de 2min een contact OFF volgt -> skip . If 'Skipped,$isObject(Vorig),$isObject(Next),Vorig.Type="START",'Current.ContactOn,Next.ContactOn Do . . ;w !,"V:",$ZT(Vorig.Tijd)," ",Vorig.Type," C:",$ZT(Current.Tijd)," ",Current.Type," N:",$zt(Next.Tijd)," ",Next.Type . . Quit:(Current.Tijd-Vorig.Tijd)>130 . . ;W " CO" . . Quit:(Next.Tijd-Current.Tijd)>130 ; Als het volgend bericht minder dan 2min achter het huidige komt dan is het ok . . ;w " skipped wrong engine-off " . . Set Body="Gebruiker: "_..User.%Id()_" "_..User.Naam . . Set Body=Body_$C(13)_"Geomobile ID "_Current.%Id() . . Set Body=Body_$C(13)_"Geo TijdStip "_$$EXTDATE^vhDTyp(Current.Datum)_" "_$$EXTTIME^vhDTyp(Current.Tijd) . . Set Body=Body_$C(13)_"Server: "_$ZU(110)_" NameSpace: "_$ZU(5) . . Set From="System@vanhoecke.be" . . Set Subj="GeoData element skipped, vals 'contact off'"_..User.Naam . . Set To=$LB("pv@vanhoecke.be") . . ;Do SendMiniMail^vhLib(From,To,Subj,Body,,,,,) . . Set Current.Type="skip engine-off after START" . . Do Current.%Save() . . Set Skipped=1 . . Set Current=Next . . Quit:Skipped . Set Skipped=0 . Set Agenda2=..Add2Agenda(Current,Vorig,Agenda) . Set Count=Count+1 . Set Vorig=Current . Set Current=Next . Set:$isObject(Agenda)&&(Agenda2'=Agenda) OK=..SaveAgenda(Agenda),Count=1 . Set Agenda=Agenda2 Set:$isObject(Agenda) OK=..SaveAgenda(Agenda) ; Er is nog onverwerkte informatie binnengekomen terwijl er al latere data verwerkt werd -> de ganse dag herberekenen If '$G(NoReload),$G(Reload),..CheckReload(Datum) Do . Do ..DeleteVanafDag(Datum) . Do ..GeoData2Agenda(Datum,1) ; zonder reload . Set Body="Gebruiker: "_..User.%Id()_" "_..User.Naam . Set Body=Body_$C(13)_"Server: "_$ZU(110)_" NameSpace: "_$ZU(5) . Set From="System@vanhoecke.be" . Set Subj="GeoData reload ganse dag"_..User.Naam . Set To=$LB("pv@vanhoecke.be") . Do SendMiniMail^vhLib(From,To,Subj,Body,,,,,) . ;Write !,"**** RELOADED ****" Else Do ; Normale verwerking . Do ..AfrondenDag(Datum) . Do ..BLAgenda.RijdenWerkPrive(Datum) ]]> Nakijken of de gebruiker reeds gewijzigd heeft indien ja dan is de reload niet mogelijk Datum "" ORDER BY TijdVan Desc) Quit CreatieTijdStip="" ]]> Set ag=##class(Derde.Agenda.Agenda).%OpenId("22||60657||37020") w ok=##class(BL.Derde.Agenda.GeoMobile).SaveAgenda(ag) 1 Agenda toevoegen van een Geomobile aan een agenda Als het GeoMobile data reeds is verwerkt dan niets doen Als het ContactOn van status wisselt dan een nieuw Agenda item anders bijvoegen bij het vorige Agenda Als Vorig GeoMobile data reeds overgebracht was aan een Agenda was dan wordt deze heropend om eventueel hieraan bij te voegen op deze manier kan de conversie steeds aan pikken waar het de vorige keer gebleven was Current,Vorig,Agenda DiffTijd Do ErrorOutOfSync ; als er binnen de X min geen nieuw bericht is ; Toevoegen aan bestaande agenda of nieuwe agenda If $isObject(Vorig),$isObject(Agenda),+Current.ContactOn=+Vorig.ContactOn Do ; Toevoegen . Do ..AddTime2Agenda(Current,Agenda,Current.Tijd,Current.Afstand) Else Do ; Nieuw agenda maken . Do:$isObject(Agenda) ..AddTime2Agenda(Current,Agenda,Current.Tijd,$S(Vorig.ContactOn:Current.Afstand,1:"")) ; Vorige agenda aanpassen zodanig dat TijdTot gelijk is aan TijdVan van de volgende . Set Agenda=..CreateAgenda(Current) . Do ..AddTime2Agenda(Current,Agenda,Current.Tijd,$S(Current.ContactOn:Current.Afstand,1:"")) ; De link met Agenda opslaan Set Current.AgendaSubID=Agenda.SubID Set Status=Current.%Save() Do:Status'=1 ..Error(Status,%this) Quit Agenda ErrorOutOfSync ;Write "Error out of sync" Set Log=$LB(Vorig.Datum,Vorig.Tijd,Current.Tijd,DiffTijd,Current.GeoStamp) Set ..Log=$G(..Log)+1 Set ..Log(..Log)=Log Quit ]]> Current Current,Agenda,Tijd,Afstand Current,Agenda 0&&($E(Agenda.Gemeente,1)'="«") ; Er zijn reeds positie gegevens ingevuld Set Agenda.Straat=Current.Straat Set Agenda.Gemeente=Current.Gemeente Set Agenda.PostCode=Current.PostCode Set Agenda.Land=Current.Land Do ..BLAgenda.SetProximity(Agenda) ]]> Het laatste agenda-item van de vorige dag laten eindingen op 23:59:59 Het eerste agenda-item van een dag laten beginnen op 00:00:00 Datum De datum heeft geen agenda item daarom het laatste van vorige dag ophalen en deze copieren voor de ganse dag Datum IDVorig,IDHuidig DiffTijd Do ; Eerste ID is meer dan 45 min NA middernacht -> Error logging . Set Log=$LB(AgendaHuidig.Datum,0,AgendaHuidig.TijdVan,DiffTijd,"Begin Dag - Eerste = rijden") . Set ..Log=$G(..Log)+1 . Set ..Log(..Log)=Log Set AgendaClone=AgendaVorig.%ConstructClone() Set AgendaClone.TijdVan=0 Set AgendaClone.TijdTot=AgendaHuidig.TijdVan Set AgendaClone.Datum=AgendaHuidig.Datum Set Status=AgendaClone.%Save() Do:Status'=1 ..Error(Status,%this) ]]> Een agenda-item laten beginnen op 00:00:00 ID DiffTijd Do ; Eerste ID is meer dan 45 min NA middernacht -> Error logging . Set Log=$LB(Agenda.Datum,0,Agenda.TijdVan,DiffTijd,"Begin Dag") . Set ..Log=$G(..Log)+1 . Set ..Log(..Log)=Log ; De correctie wordt slechts uitgevoerd bij het tijdstip voor 2 uur 's morgens is If Agenda.TijdVan < (2*60*60),Agenda.TijdVan'=0 Do . Set Agenda.TijdVan=0 . Set Status=Agenda.%Save() . Do:Status'=1 ..Error(Status,%this) Quit ]]> Een agenda-item laten eindingen op 23:59:59 ID Error logging . Set Log=$LB(Agenda.Datum,Agenda.TijdTot,24*60*60-1,DiffTijd,"Einde Dag") . Set ..Log=$G(..Log)+1 . Set ..Log(..Log)=Log ; De correctie wordt slechts uitgevoerd bij het tijdstip na 22 uur ('s avonds) is If Agenda.TijdTot > ($S(..IsLightBridge:0,1:22)*60*60),Agenda.TijdTot'=(24*60*60-1) Do . Set Agenda.TijdTot=24*60*60-1 . Set Status=Agenda.%Save() . Do:Status'=1 ..Error(Status,%this) ]]> 1 Dagen TotDatum Do . . Kill ^Derde.Agenda.GeoMobileD(UserID,Datum) ; Er is geen index dus de node verwijderen is voldoende ]]> 1 Dagen d ##class(BL.Derde.Agenda.GeoMobile).CleanConnector(365) 1 Dagen '') &sql(OPEN CleanConnector) For &sql(FETCH CleanConnector) Quit:SQLCODE Do . Quit:GeoDevice="" . Quit:GeoDevice=9999 . Do SCANDIR^vhDEV($$$ConnectorPad_GeoDevice,"*",.result,"X",Dagen) &sql(CLOSE CleanConnector) Do SCANDIR^vhDEV($$$ConnectorPad_"UNKNOWN","*",.result,"X",Dagen/2) ; Alle foutieve berichten (en hacking) komen hier terecht ]]> Verwijderen van de GeoMobile data voor één gebruiker en vanaf bep dat Datum is optioneel Datum:%Date,Forced:%Boolean =:Datum and Gebruiker=:UserID) Do ..BLAgenda.DeleteVanafDag(Datum,1) ]]> Berekend door de coordinaten van thuis te vgl met de coordinaten van het werk Afstand in vogelvlucht = 5331,288524m (berekend via de bolmeetkunde) GeoCoordinatenAfstand door de regel van Pythagoras = 0,048142808 GeoToMeter=GeoAfstand/GeoCoordinatenAfstand = 110739,0441 %Float 110739 Straal waarmee Proximity werkt in meters %Float 200 ProximityAfstand in meters s o=##class(BL.Derde.Agenda.GeoMobile).%New().GetProximity("51.0913467","5.5226567") LatitudeOrg,LongitudeOrg,ProximityAfstand :LatitudeMin AND Latitude<:LatitudeMax AND Longitude>:LongitudeMin AND Longitude<:LongitudeMax) &sql(OPEN GLUProx) Set oLookUp="" For &sql(FETCH GLUProx) Quit:SQLCODE Do . Set Afstand=$ZPOWER(((Latitude-LatitudeOrg)**2)+((Longitude-LongitudeOrg)**2),0.5)*..#GeoToMeter . Quit:Afstand>ProximityAfstand . Set oNewLookUp=..OpenLookUpIfActive(ID) . Set:$isObject(oNewLookUp) oLookUp=oNewLookUp . ;Write Latitude," ",Longitude," ",Afstand,! &sql(CLOSE GLUProx) Quit oLookUp ]]> aangepast PV 16/6/2010 de non-aKtieve klanten mogen niet meer gebruikt worden bij de proximity lookup en moeten dus verwijderd worden LookUpID Status,Object