## Socialförvaltningen - Processuppföljning

Flödesdiagrammet ovan finns även att hitta med klickbara länkar till alla frendsprocesser och devops-tabeller som pfd och rå Visio-fil i `G:\Gemensam\Datalager\Socialförvaltningen\Processuppföljning\Flöde`.
## Kultur och Fritid - Aktivitetsstöd

Flödesdiagrammet ovan finns även att hitta med klickbara länkar till alla frendsprocesser och devops-tabeller som pfd och rå Visio-fil i `G:\Gemensam\Datalager\Kultur och fritid\Aktivitetsstöd app\Flöde`.
## Stored Procedure: `sp_add_data`
Frends-processen: [`Datalager - Starta SQL-flytt`](https://kalmar.frendsapp.com/Process/List/KalmarGround/KalmarGround/instances?processGuids=eb8b6a1f-e340-480e-93c8-bf910e6f4b82) använder sig av stored procedure: [`sp_add_data`](https://dev.azure.com/Kalmarkommun/_git/Datalager?path=/Sqlserver%20Projects/DL_Konfig/Gemensam/StoredProcedures/sp_add_data.sql) när vi gör `INSERT`'s från en tabell/vy till en annan tabell.
### Krav
Då det har införts nycklar i datalagret, har det ändrat kraven på några sätt på stored proceduren (`sp_add_data`) som ska utföra flytten.
**De nyinförda kraven är**:
1. Söka upp Primary Key'n för source-tabell samt target-tabell.
1. Hantera flera keys i en och samma tabel. Ett exempel är fall då vi har kopplingstabeller. Se bild nedan.

## Nya konfig-tabeller
Med introduktionen av nycklar i datalagret är det av yttersta vikt att Stored Procedures körs i rätt ordning för att undvika datakonflikter och säkerställa integriteten i databasoperationer.
För att hantera detta har nya konfigurationstabeller skapats. Dessa konfigurationstabeller tillåter definition av beroenden mellan Stored Procedures samt mellan Stored Procedures och tabeller. Det är avgörande för att kontrollera körordningen och säkerställa att data är aktuell och korrekt.
### Tabell: `ProcedureProcedureDependencies`
Tabellen `ProcedureProcedureDependencies` är till för att specificera beroenden mellan olika Stored Procedures. Den består av två fält: `Procedure` och `DependsOnProcedure`, vilka båda är Foreign Keys som refererar till `procedureId` i `ConfigProcedure`-tabellen.

#### Exempelcase
Om `SpA` laddar värden för "Handläggare" och `SpB` behöver dessa värden för att utföra sin operation, är det kritiskt att `SpA` körs före `SpB`. Annars kan `SpB` komma att hantera föråldrad eller ofullständig information.
Därför lägger vi in ett beroende i `ProcedureProcedureDependencies` som anger att `SpB` (`Procedure`) är beroende av `SpA` (`DependsOnProcedure`). Det garanterar att vid samtidig kö av dessa Stored Procedures kommer `SpA` alltid att köras först.
### Tabell: `ProcedureTableDependencies`
Tabellen `ProcedureTableDependencies` används för att ange beroenden mellan Stored Procedures och de tabeller de interagerar med. Detta säkerställer att en Stored Procedure inte körs förrän nödvändiga data i beroende tabeller är uppdaterade och tillgängliga.

Den innehåller fält som `Procedure` för den beroende Stored Procedure och `DependsOnTable` för den tabell som måste vara aktuell innan Stored Procedure körs. Dessa är också främmande nycklar länkade till `procedureId` respektive `tableId` i deras motsvarande konfigurationstabeller.
#### Exempelcase
Om `SpC` är beroende av uppdaterade poster i tabellen "Ärenden", lägger vi till ett beroende i `ProcedureTableDependencies` som visar att `SpC` inte bör köras innan "Ärenden" har uppdaterats.
### Frendsprocess: `Datalager - Hämta Procedure-kö`
Frendsprocessen [`Datalager - Hämta Procedure-kö`](https://kalmar.frendsapp.com/SubProcess/Edit/13899) har genomgått uppdateringar för att integrera nya konfigurationstabeller, vilket förbättrar hanteringen av köer och beroenden utan att störa funktionen av befintliga tabeller och procedurer som saknar dessa nyckelrelationer.
#### Ursprunglig SQL query
Den ursprungliga queryn såg ut så här:
```sql
SELECT TOP (1)
P.[procedureId],
P.[appId],
P.[layer],
P.[databaseId],
DB.[dbName],
P.[schema],
P.[name],
P.[status],
P.[active],
P.[startdate],
P.[enddate]
FROM
[Gemensam].[ConfigProcedure] P
JOIN
[Gemensam].[ConfigDatabases] DB ON P.[databaseId] = DB.[databaseId]
WHERE
P.[active] = 1
AND UPPER(P.[status]) = 'SCHEDULED'
```
Denna fråga valde den högst prioriterade, aktiva och schemalagda proceduren från konfigurationstabellen.
#### Uppdaterad SQL query
Uppdateringarna i SQL-queryn i `Datalager - Hämta Procedure-kö` är skapade för att hantera nya beroenden och relationer:
##### `ProcedureProcedureDependencies`
För att undvika att köa procedurer som inte kan köras på grund av andra icke-slutförda procedurer, har vi infört detta villkor:
```sql
AND NOT EXISTS (
SELECT 1
FROM [Gemensam].[ProcedureProcedureDependencies] PD
JOIN [Gemensam].[ConfigProcedure] P2 ON PD.[DependsOnProcedure] = P2.[procedureId]
WHERE PD.[Procedure] = P.[procedureId]
AND P2.[active] = 1
AND UPPER(P2.[status]) = 'SCHEDULED'
)
```
Denna uteslutning förhindrar att en procedur köar om den väntar på en annan schemalagd procedur.
##### `ProcedureTableDependencies`
Ett ytterligare villkor har lagts till för att filtrera bort procedurer som är beroende av tabeller som ännu inte är i status 'SUCCESS':
```sql
AND NOT EXISTS (
SELECT 1
FROM [Gemensam].[ProcedureTableDependencies] TD
JOIN [Gemensam].[ConfigTables] T ON TD.[DependsOnTable] = T.[tableId]
WHERE TD.[Procedure] = P.[procedureId]
AND T.[active] = 1
AND UPPER(T.[status]) != 'SUCCESS'
)
```
Detta säkerställer att en procedur inte köar om de underliggande tabellerna inte är färdiga.
Viktigt att notera är att dessa uppdateringar endast påverkar procedurer och tabeller som ingår i de nya nyckelrelationerna. Äldre konfigurationer som inte använder dessa relationer påverkas inte och kommer att fungera som tidigare. Denna strategi säkerställer kontinuitet i befintliga flöden samtidigt som systemet tillåts att skala upp för att hantera komplexa beroenden och schemaläggningar.
## Agenda 2030
### Dokumentering
Dokumentering för Agenda 2030 sker i [Azure DevOps Wikin](https://dev.azure.com/Kalmarkommun/Datalager/_wiki/wikis/Datalager.wiki/209/Kalmar-Modern-Dataplattform/Agenda-2030).
### Vårt ansvar
| Ansvarsområde | Praktisk tillämpning |
|---|---|
| :heavy_check_mark: Validering | Atea-konsulter gör pull requests till Dev-branschen i Azure DevOps-repot som måste valideras av oss innan det går igenom. |
| :brain: Teknisk kompetens | Atea-konsulter ställer frågor till oss via Teams vid tekniska hinder. |
| :building_construction: Produktionssättning | När en app ska produktionssätas är det vi som gör det. Atea-konsulterna saknar rättigheter i produktonsmiljöer. |
| :hammer_and_wrench: Förvaltning | När projektet är avslutat ligger förvaltningsansvar för alla appar på oss. |
### Kontaktpersoner
| Roll | Förnamn | Efternamn | Epost |
|---|---|---|---|
| PowerBI-utvecklare | Mathilda | Ziedén | mathilda.zieden@atea.se |
| Backend-utvecklare | Fredrik | Wetterqvist | fredrik.wetterqvist@atea.se |
| Backend-utvecklare | Linus | Isaksson | linus.isaksson@atea.se |
| Fullstack-utvecklare | Oscar | Nylén | oscar.nylen@atea.se |
| Projektledare | Anders | Arbin | anders.arbin@atea.se |
| Samordnare | Christoffer | Carlsson Schött | christoffer.carlsson-schott@kalmar.se |
### Kravspecifikation
Kravspecifikation för hela Agenda 2030 ligger i [Antura](https://anturaprojects.kalmar.se/Views/ProjectPlace/Documents/Main.aspx?ProjectID=1151930&Mode=Normal&NodeId=1200646_1203973).
I den går det att läsa om de olika apparna som är planerade för projektet.
## Kalmar Vatten - Mätdatahantering
Kravspecifikiation för Mätdatahantering ligger i [Antura](https://anturaprojects.kalmar.se/Views/ProjectPlace/Start/Main.aspx?ProjectID=1152024).
| Källa | Frendsprocess |
|---|---|
| [Energidata API](https://navigator-api.eon.se/swagger/index.html) | [/api/datalager/app/v1/job/EON/SourceToBronze](https://kalmar.frendsapp.com/Process/List/KalmarGround/KalmarGround/instances?processGuids=94299564-2e77-456d-b648-be4a8385a7a1&search=filterCategory%253DText) |
| [Historian Databas](https://www.ge.com/digital/documentation/historian/version80/r_ihrawdata_table.html) | [/api/datalager/app/v1/job/KalmarVatten/Historian/SourceToBronze](https://kalmar.frendsapp.com/Process/List/Default/Default/instances?processGuids=daddf7cb-9c3b-4afd-b250-a4db8582dcac) |
| [SMHI Open Data API](https://opendata.smhi.se/apidocs/) | [/api/datalager/app/v1/job/SMHI/SourceToBronze](https://kalmar.frendsapp.com/Process/Edit/8254) |
### Energidata
#### Bronstabeller
Bronstabellerna är inte mycket mer än datan från källan uppdelad i olika tabeller. Tabellerna har fått en autogenererad nyckel som heter `Id` för snabbare indexering.

#### Silvertabeller
I silvertabellerna kopplar vi ihop alla tabeller med Primary Keys och Foreign Keys. Business Keys behålls men används ej för kopplingar.

Exempelvis i kopplingstabellen `InstallationMeasurementSeries` byter vi ut innehållet i kolumnerna `InstallationId` och `MeasurementSeriesId` från Business Key:n till `Installations` Primary Key och `MeasurementSeries` Primary Key som Foreign Keys.
### Historian
#### Källa till brons
##### Prioriterade sensorer
Historian är idag laddat med data från sensorer specificerade som prioriterade i [`Taqnamn_avlopp vatten.xlsx`](https://anturaprojects.kalmar.se/Views/ProjectPlace/Documents/Main.aspx?ProjectID=1152024&Mode=Normal&NodeId=1212859_1212871_1212875).
I framtiden ska alla sensorer som är markerade med "Till datalager" laddas in.

Detta är förberett för i [frends-processen](https://kalmar.frendsapp.com/Process/List/Default/Default/instances?processGuids=daddf7cb-9c3b-4afd-b250-a4db8582dcac) genom att kommentera ut de sensorer som inte är prioriterade.
Det ska alltså vara att bara gå in i processen och avkommentera hela listan, så ska det rulla fint.
##### Problem med historian
Historian kastar oregelbundet felmeddelandet `Cannot execute the query ...`

Jag har löst detta genom att helt enkelt fånga errors, kolla om det är problemet, för att sedan gå vidare och hämta resterande sensorers data.
Har skrivit mer om problemet som kommentar i processen.
#### Bronstabell
Bronstabellen för Historian är en exakt replika av ihRawData från historians databas med tillägget av en autoincrementande `Id`-kolumn som PK.

### SMHI
#### Källa till brons
För att ladda från källa till brons anävnder vi processer och tabeller som redan finns på plats från appen: *KF - Besöksdata*.
Frendsprocessen uppdateras med nya URL:er att hämta från enligt specdokument [`Data smhi.xlsx` i Antura](https://anturaprojects.kalmar.se/Views/ProjectPlace/Documents/Main.aspx?ProjectID=1152024&Mode=Normal&NodeId=1212859_1212871).

Bronstabellen förblir oförändrad.
#### Brons till silver
Inte hunnit implementera detta steg. Vet bara att det behöver implementeras.
## Serviceförvaltningen - Avtalsuppföljning (Macro excel)
### Källa till brons
Hämtas genom länkas server. Se `ConfigTables`:
| tableId | appId | layer | source_databaseId | sourceSchema | sourceTable | target_databaseId | targetSchema | targetTable | writeMode |
|---------|-------|---------------|-------------------|--------------|----------------------------|-------------------|---------------------|----------------------------|--------------|
| 82 | 14 | SourceToBronze| 6 | dbo | r2_ansvar | 1 | Serviceforvaltningen| R2Ansvar | deleteinsert |
| 83 | 14 | SourceToBronze| 6 | dbo | nodes | 1 | Serviceforvaltningen| Nodes | insert |
| 85 | 14 | SourceToBronze| 6 | ia | fact_ekonomi_transaktioner | 1 | Serviceforvaltningen| FaktaEkonomiTransaktioner | insert |
Tabellen är en exakt replika av källdatat, med addition av auto incrementing PK. Tabellerna saknar kopplingar helt med FK.

### Brons till silver
Mellan brons och silver händer inget särskilt.
### Silver till guld
I guld har vi enbart en tabell som är en sammanslagning av alla tre tabeller i brons/silver:

Sammanslagningen görs genom [Vy'n: AvtalsuppfoljningV](https://dev.azure.com/Kalmarkommun/_git/Datalager?path=/Sqlserver%20Projects/DL_Silver/Serviceforvaltningen/Views/AvtalsuppfoljningV.sql) i silver till guld-lagret.
## Kir
### Frends-task
Tasken är importerad i frends och ligger som `Kir.GetPerson`.
En frendsprocess är uppsatt för att testa tasken med namnet: [Testing Kir GetPerson](https://kalmar.frendsapp.com/Process/List/Default/Default/instances?processGuids=19b67f1f-92aa-4d3f-8b14-4f9859f9cd1d).
### Källkod
Koden för tasken ligger i repositoriet [`frends-task-kir` i Azure DevOps](https://dev.azure.com/Kalmarkommun/Datalager/_git/frends-task-kir).
Koden bygger på källkod från Tietoevry för en grafisk applikation som använts för att kalla på API:t. Den grafiska applikationens källkod är skickad till Jesper Jeansson och Michael Hall via säker filöverföring.
### Användarhandledning
Tasken bygger på Tietoevry's KIR API. Användarhandledningsdokumentet ligger på "G:\Gemensam\Datalager\Samhällsbyggnadskontoret\AnvändarHandledning enterKIR.pdf".