Kobling mot webservice i Visma HRM

I forbindelse med bruk av Interact Flow har vi behov for å hente ut opplysninger fra Visma HRM. Er det andre kunder som har satt opp velfungerende kobling mot Visma for å hente ut informasjon (gjerne også tilbakeskriving!)

Jeg har sett på API-beskrivelsen, og ser at det er en ganske omfattende funksjonalitet. Det har vært et par kommuner som har vurdert å gå igang med dette APIet, men siden det var uvisst om det kunne brukes til deres formål, samt at det var en ganske kostbar affære, har det ikke blitt benyttet.

Dersom dere går igang med dette, hadde det nok vært veldig interessant for mange å se hva dere kan få til her.

Først kort om behovet: Vi holder på å lage et internt skjema for overføring av ferie. Skjemaet skal vha Flow sendes til attestant og deretter til anvisning. Anvisning gjøres av manager og det får vi fra AD. Problemet er attestanten…

Med god hjelp fra Sola og Gjøvik kommuner har jeg fått koblet opp WS’en som henter ansattdata fra Visma (ansattmodulen). Inputparameter jeg har benyttet er fødselsnummer (som vi i skjema har fått hentet fra AD, men Visma WS’en kan også benytte andre parametre). Feltet jeg har behov for fra ansattmodulen er Unit Id som er identifikatoren til virksomheten til den ansatte. Denne ID’en får jeg hentet.

Dessverre må det benyttes en annen webservice for å hente ut data om attestant. Til dette finnes det en webservice som er koblet til organisasjonsstrukturen. Denne har dessverre veldig få inputparametre tilgjengelig (kun dato og bedriftsnummer) og i retur får man en stor XML som inneholder hele kartet (til valgte bedriftsnr og dato), og i denne XML’en finner jeg igjen Unit ID og hvem som er attestant(er) for hver enkelt virksomhet. Men hvordan skal jeg få denne XML’en inn i Interact og deretter kun plukke ut de få feltene jeg har bruk for)?

Jeg ser at dette kan være utfordrende. Jeg mener det skal være mulig å scanne gjennom hele xmlen slik at man kan matche en unit id, men det vil være krevende å få til hvis det er et stort hierarki. Det spørs litt hvordan denne er bygd opp.

Hvordan ser strukturen ut? Har den en “parent/child” type struktur?

Ja, en veldig forenklet versjon:

<units>
<unit id="20000" company="1" name="Navn på seksjonen" (...)>
<tasks>
    <task id="5" description="Attestere">
        <employees>
            <eployee id=21234" name="Navn på attestant 1">
            <eployee id=56781" name="Navn på attestant 2">
        </employees>
   </task>
</tasks>
osv....

I dokumentasjonen er helheten beskrevet slik:

<chart id="4" name="Org.kart for Visma Enterprise">
<units>
<unit company="1" id="110000" kode="94" name="Rådmann og kom.sjefer" parentid="10" unitType="Rådmannens stab">
<manager id="4286" name="Idar Filip Ingebrigtsdtr"/>
<contactInfo>...</contactInfo>
<tasks>...</tasks>
<roles>...</roles>
</unit> 
</units>
</chart>

Det er mye info og veldig synd man ikke kan plukke ut enkeltelementer vha webservicens inputparametre.

Dette med å søke gjennom organisasjonskartet er jeg nesten sikker på at Sola eller Gjøvik har løst. Ja, det er synd at apiet til Visma mater så mye data på en gang, men det bør fortsatt være mulig å søke gjennom for å finne riktig id, ved hjelp av en serie med loop-kommandoer. Det kan kreve en del scripting, og det er en risiko for at det kan begynne å gå tregt, så om Visma kunne tilbudt et mer hensiktsmessig API hadde det definitivt hjulpet.

Det å få XMLen inn i Interact skal gå greit. Den tolkes automatisk inn i Ascript hvis du oppretter en returparameter med “Enkel type”.

Hei,

det stemmer at vi i Sola kommune bruker API’et til Visma HRM for å hente ut ansattedata.

For å få det til, spesielt med tanke på den brede resultatxml’en, vil jeg anbefale verktøy som Postman, som gir en god oversikt på strukturen til API’et.

Man bruker da loop’er i AScipt, for å traversere strukturen, dersom det finnes flere mulige treff i strukturen. Eksempelvis har vi ansatte med flere stillinger rundt om i kommunen.
Der blar vi oss inn i strukturen vha logiske treff fra rot-nivå. Noe sånn som:

var selskap = hentPersonMedSSN["person"]["employments"];
var valg = [];
loop (selskap){
	var typeStilling = val["category"]["id"];
	if(typeStilling == "F"){
		var stilling = val["positions"];
		loop(stilling){
		var selskapsTittel = val["chart"]["name"];
		var enhetsTittel = val["chart"]["unit"]["name"];
		var leder = val["chart"]["unit"]["manager"]["name"];
		var stillingsdetaljer = selskapsTittel + " - " + enhetsTittel;
		valg += stillingsdetaljer:val;
	}
	};
}
return valg;

På dette viset kan man bla seg innover og hente ut informasjon fra deler av XML’en. Eksempelet over er fra AnsatteWS’en, men det skal fungere å gjøre tilsvarende fra OrgWS’en.

Resultatet her blir ei liste med alle stillingene til den ansatte man har tatt utgangspunkt i skjemaet, enten automatisk den som er pålogget, eller en ansatt som er søkt opp.Kodeutsnitt

3 Likes

Ser forresten at det kan være lurt å sjekke opp stillingstyper. I eksempelet over begrenses dette til type F, så dersom dere skal så oppslag på stillinger som har andre stillingskoder, må logikken utvides til de stillingstitlene ved å endre denne:

if(typeStilling == "F"){ 

Til

if(typeStilling == "F" || typeStilling == "FD" || typeStilling == "T"){

Og videre med så mange typer man trenger.
Alternativt, andre veien:

if(typeStilling != "D"){ 

Og da tar med alle utenom D her.

1 Like