1. Selectors #
Opus er ret ligefrem i forhold til at lave controls, det eneste man skal være obs på er når man får en ny / fjernet en adgang, da navigationslinjen ikke tilføjer den nye adgang til højre. Der er åbenbart en fast rækkefølge i baggrunden, som skubber frem og tilbage, alt efter hvad der bliver tilføjet eller fjernet.
1.1 Title #
I de fleste controls er der blevet sat en Title på som man selv skal aktivere, dette gør det meget nemmere at lave controls.


1.2 jQuery #
Man kan bruge jQueries såsom en a:contains(“Min Økonomi”) custom control, der kan fange direkte den fane man ønsker.

Til opsætninger som lignende her, kan man lave en custom selector der prøver at hive fat i tablerow med en contains:, og fange title selectoren i stedet for id. Obs i eksemplet prøver vi at hive Bogføringsdatoen ud. Vær opmærksom på at Opus Rollebaseret Indgang bliver opdateret løbende, og selve teksten kan flytte sig til at sidde på et andet element. Man kan derfor være nødt til at prøve sig frem, for at finde ud af hvor teksten eventuelt sidder.


2. Skabelon til fakturering #
2.1 Power Automate kode #
Hvorimod man kan lave fakturering igennem SAP også, kan det i nogle tilfælde være nemmere og hurtigere igennem Opus. Herunder gennemgås hvordan man eventuelt kan lave en skabelon, som kan kopieres, hver gang man skal lave en ny proces til fakturering. Selve faktureringen er delt op i 5 trin, som man udfylder løbende. De fleste tekstfelter og knapper får autogenerede ID’er, som kan være svære at fange. Derfor bruges der en kombination af selectors, send keys og find image.
Det kræver man har adgang til Fakturasøgning og fakturering fanen, hvor man kan søge CPR / CVR numre frem, og oprette fakturaer.

Herunder et eksempel fra trin 1. Der er ikke indsat variabler på billedet i Send keys, da det er fra en intern skabelon, som man kopierer og selv udfylder. Der skal dog stå et variable ved “” i de enkelte Send Keys, såfremt de skal udfyldes og ikke bare springes over.

I del 2 skal man særligt opmærksom på, at kolonner kan tilføjes/fjernes via Personaliser knappen, og er gældende indtil de ændres igen. Jeg har ikke haft held med dette hverken med selectors (skiftende id’er), jQuery (kunne ikke findes) eller send keys (der kan ikke navigeres mellem linjerne via eksempelvis Tab). Hvis man bruger Move mouse to image med standard tolerancen på 10, og fanger billederne som vist, så kan man godt få det til at virke. Det eneste men er at man ikke kan validere, om man viser eller skjuler kolonnerne, da man blot sender et klik afsted. Den bedste løsning vil være en standard bruger, som har de kolonnerne der oftest bruges slået til. Det har ingen betydning for udseendet af fakturaen, såfremt et felt ikke udfyldes, vises det ikke senere.

Ved udfyldelse af del 2 bruges billede genkendelse for at kunne udfyldt Tekst kolonnen. Resten er ligetil, når man starter fra Antal kolonnen kan man lave Send keys, og udfylde resten. De næste trin vil være samme fremgangsmåde.
Selector til antal kolonnen (virker denne mod forventning ikke, så kør en macro recorder hiv en ny ud på den måde):
“html > body > table > tbody > tr:eq(1) > td:eq(1) > table > tbody > tr:eq(2) > td > table > tbody > tr > td:eq(1) > table > tbody > tr:eq(1) > td > div > iframe > html > body > div:eq(2) > table > tbody > tr > td > table > tbody > tr > td > iframe > html > body > table > tbody > tr > td > div > div:eq(0) > span > span > div > div > table > tbody > tr:eq(6) > td > div > div > table > tbody > tr:eq(0) > td > table > tbody > tr > td > table > tbody > tr:eq(1) > td:eq(2) > table > tbody > tr > td > input”

2.2 Dokumentation til procesejer #
Man kan bruge blanke billeder af processen som nedenfor, som kan sendes til procesejer for udfyldelse med hvad skal indtastes hvor. Dette kan senere bruges som dokumentation på processen, og give udvikleren er hurtigt overblik.
Søg efter

Del 1 Aftaleindhold

Del 2 Fakturalinjer

Kolonne muligheder:

Del 3 Fakturagruppe

3. Omposteringsbilag #
Det er også oplagt at hjælpe med omposteringsbilag, da med RPA hurtigt kan løbe bilag og fagsystemer igennem, og udfylde en CSV-fil som kan udleveres til procesejer efterfølgende, som kan uploade den direkte til Opus. Skabelonen til CSV-filen kan hentes fra Bilagsbehandling – Opret omposteringsbilag – Indlæs fra regneark – Hent skabelon. Vær opmærksom på at ikke alle kolonner behøver være udfyldt, da det er en overordnet skabelon, og at forskellige visninger kan bruge den alligevel.

Da det kan være bøvlet alt efter RPA-software og forskellige løsninger at skrive til en CSV, så kan man alternativt selv lave skabelonen via VBScript som forneden. Det kræver blot at Excel kører i forvejen, og har en projektmappe og ark åben. Man kan eventuelt justere navne på disse. Vær opmærksom på at %CountCSVRow% er en selvlavet variabel i Power Automate Desktop, som hjælper med at finde ud af hvad næste ledige række er i CSV arket, da jeg bruger samme kode til senere at sætte værdierne ind i de respektive kolonner (ikke alle behøves at være udfyldt, man kan lade dem være tomme med “”). Efterfølgende kan man uploade CSV-filen til Opus samme sted hvor man kan hente skabelonen, og alt efter hvilken visning (view) man vælger, udfylder den kolonnerne automatisk med de indtastede værdier.
3.1 VBScripts til CSV bilag #
Oprettelse med kolonnenavne i række 1:
Set objExcel = GetObject(, “Excel.Application”)
Set objWorkbook = objExcel.Workbooks(“Mappe1”)
Set objSheet = objWorkbook.Sheets(“Ark1”)
objExcel.visible=true
objSheet.Cells(%CountCSVRow%, 1).Value = “Artskonto”
objSheet.Cells(%CountCSVRow%, 2).Value = “Omkostningssted”
objSheet.Cells(%CountCSVRow%, 3).Value = “PSP-element”
objSheet.Cells(%CountCSVRow%, 4).Value = “Profitcenter”
objSheet.Cells(%CountCSVRow%, 5).Value = “Ordre”
objSheet.Cells(%CountCSVRow%, 6).Value = “Debet/kredit”
objSheet.Cells(%CountCSVRow%, 7).Value = “Beløb”
objSheet.Cells(%CountCSVRow%, 8).Value = “Næste agent”
objSheet.Cells(%CountCSVRow%, 9).Value = “Tekst”
objSheet.Cells(%CountCSVRow%, 10).Value = “Betalingsart”
objSheet.Cells(%CountCSVRow%, 11).Value = “Påligningsår”
objSheet.Cells(%CountCSVRow%, 12).Value = “Betalingsmodtagernr.”
objSheet.Cells(%CountCSVRow%, 13).Value = “Betalingsmodtagernr.kode”
objSheet.Cells(%CountCSVRow%, 14).Value = “Ydelsesmodtagernr.”
objSheet.Cells(%CountCSVRow%, 15).Value = “Ydelsesmodtagernr.kode”
objSheet.Cells(%CountCSVRow%, 16).Value = “Ydelsesperiode fra”
objSheet.Cells(%CountCSVRow%, 17).Value = “Ydelsesperiode til”
objSheet.Cells(%CountCSVRow%, 18).Value = “Oplysningspligtnr.”
objSheet.Cells(%CountCSVRow%, 19).Value = “Oplysningspligtmodtagernr.kode”
objSheet.Cells(%CountCSVRow%, 20).Value = “Oplysningspligtkode”
objSheet.Cells(%CountCSVRow%, 21).Value = “Netværk”
objSheet.Cells(%CountCSVRow%, 22).Value = “Operation”
objSheet.Cells(%CountCSVRow%, 23).Value = “Mængde”
objSheet.Cells(%CountCSVRow%, 24).Value = “Mængdeenhed”
objSheet.Cells(%CountCSVRow%, 25).Value = “Referencenøgle”
objSheet.Cells(%CountCSVRow%, 26).Value = “Org. nr.”
objSheet.Cells(%CountCSVRow%, 27).Value = “Næste EAN nr.”
Udfyldelse af data senere
Set objExcel = GetObject(, “Excel.Application”)
Set objWorkbook = objExcel.Workbooks(“Mappe1”)
Set objSheet = objWorkbook.Sheets(“Ark1”)
objExcel.visible=true
objSheet.Cells(%CountCSVRow%, 1).Value = “%VarArtsKonto%”
objSheet.Cells(%CountCSVRow%, 2).Value = “%VarOmkostningssted%”
objSheet.Cells(%CountCSVRow%, 3).Value = “%VarPSPElement%”
objSheet.Cells(%CountCSVRow%, 4).Value = “”
objSheet.Cells(%CountCSVRow%, 5).Value = “”
objSheet.Cells(%CountCSVRow%, 6).Value = “%VarDebKred%”
objSheet.Cells(%CountCSVRow%, 7).Value = “%VarBelob%”
objSheet.Cells(%CountCSVRow%, 8).Value = “”
objSheet.Cells(%CountCSVRow%, 9).Value = “%VarBanktekst%”
objSheet.Cells(%CountCSVRow%, 10).Value = “”
objSheet.Cells(%CountCSVRow%, 11).Value = “”
objSheet.Cells(%CountCSVRow%, 12).Value = “”
objSheet.Cells(%CountCSVRow%, 13).Value = “”
objSheet.Cells(%CountCSVRow%, 14).Value = “%VarCPR%.”
objSheet.Cells(%CountCSVRow%, 15).Value = “02”
objSheet.Cells(%CountCSVRow%, 16).Value = “”
objSheet.Cells(%CountCSVRow%, 17).Value = “”
objSheet.Cells(%CountCSVRow%, 18).Value = “”
objSheet.Cells(%CountCSVRow%, 19).Value = “”
objSheet.Cells(%CountCSVRow%, 20).Value = “”
objSheet.Cells(%CountCSVRow%, 21).Value = “”
objSheet.Cells(%CountCSVRow%, 22).Value = “”
objSheet.Cells(%CountCSVRow%, 23).Value = “”
objSheet.Cells(%CountCSVRow%, 24).Value = “”
objSheet.Cells(%CountCSVRow%, 25).Value = “”
objSheet.Cells(%CountCSVRow%, 26).Value = “”
objSheet.Cells(%CountCSVRow%, 27).Value = “”
Gem CSV-filen som semikolon-separeret, og luk projektmappen samt Excel.
Dim objExcel, objWorkbook
Set objExcel = GetObject(, “Excel.Application”)
Set objWorkbook = objExcel.Workbooks(“Mappe1”)
objExcel.visible=true
objWorkbook.SaveAs “%FilePathCSV%”, 6, , , , , , , , , , True
objWorkbook.Close False
objExcel.Quit
4. Bilagsbogføring #
4.1 Bilagsindbakke del #
For at kunne lave Bilagsbogføring i Opus, kræver det at man har adgang til det det/de pågældende EAN. Efterfølgende kan man under fanen Min Økonomi – Bilag og fakturaer – Bilagsindbakke, se de bilag som ligger klar til godkendelse for EAN.

I Power Automate Desktop kan man sætte et loop op ved, at trække hele tabellen ud (Extract data from webpage-action), og lave en for-each på hver række. Vær opmærksom på at i extracten at man vælger en celle i tabellen først, og laver en Select parent UI element en del gange (det tager også tid før den fanger dem hver gang), indtil den markere hele tabellen som vist nedenfor, og herefter en Extract entire HTML table som vist. Da der er tabeller i tabellen, kan man ikke direkte vælge Extract entire HTML table på første celle man markere, da den så kun henter den ene celles værdi ud.

Selve tabellen viser kun 20 rækker af gangen, og det vil også kun være disse som en robot kan trække ud. Hvis der er mindre end 20 rækker med data, vil de sidste rækker være blanke. Ønsker man at trække flere ud, kræver det eksempelvis en pagedown i tabellen og en ny extract. Min løsning er at holde tage den første og sidste række ud, og i slutningen af hver kørsel gemme, og så matche op mod hinanden inden faktura loopet (det “rigtige” loop til processen) køres. Såfremt de matcher, kan det antages at det er samme data der kigges på, og at der dermed ikke er mere at lave.

20.60 ser således ud, og hopper ned i tabellen til næste datasæt. Da Behandl faktura / kreditnota linket er det eneste i tabellen som har en fast tekst man kan fange, så bruges denne både til at åbne fakturaer i næste del, og i dette tilfælde til at markere tabellen så man kan lave en pagedown. I denne action er X dog offset med 40, så vi kun klikker i højre side af cellen og ikke på selve linket. Selectoren ser således ud:
iframe[Id=”contentAreaFrame”] iframe[Id=”ivuFrm_page0ivu0″] span[Text=”Behandl faktura / kreditnota”]:eq(%CountOpusRow%)

4.2 Faktura del #
Alt efter behov, kan man enten få robotten til at udfylde linjer, og efterfølgende godkende eller bare gem, så en økonomi medarbejder kan dobbelttjekke, før et bilag godkendes. Det kan også tænkes man har en beløbsgrænse i tankerne for begge scenerier, så det kan være skiftende alt efter dette. Yderligere kan man forsøge i Købers ordrenr.: feltet skrive noget ind, som robotten kan slå op, og finde omk. sted eller PSP-element fra til udfyldelsen.

For at lave selectors til knapperne, og evt Artskonto-kolonnen, kan man slå Id fra (de skifter hver gang et nyt bilag åbnes) og fange dem på deres Title i stedet, da disse er faste.

Til udfyldelsen kan man gøre noget lignende det, hvor vi trækker alle rækkerne ud i bilaget, samme fremgangsmåde som tidligere. Herefter kan man få en RowsCount, så robotten ved hvor mange linjer den skal udfylde. Jeg har ikke kunnet lave en selector med en ordinal, til at fange de enkelte felter, så i stedet bruges Send Keys som vist herunder.

Loop subflowet ser således ud.
