Brukerstyrt signering
Slik setter du opp brukerstyrt signering i tjenesten din.
Hva betyr brukerstyrt signering?
Med brukerstyrt signering mener vi en app der de som skal signere får rettigheter til å signere mens de fyller ut skjemaet.
Appen kan for eksempel be skjemaeieren om å oppgi fødselsnummer og etternavn for personer som skal signere, eller organisasjonsnummer hvis det er noen som skal ha rett til å signere på vegne av en virksomhet.
Når skjemaet er ferdig fylt ut, klikker brukeren på Send til signering. Da vil appen delegere rettigheter og sende en melding til innboksen i Altinn. Det er også mulig å sette opp at de som skal signere får varsel på e-post og SMS.
Avhengigheter
Brukerstyrt signering avhenger av Meldingstjenesten (Correspondence) i Altinn. Den må du sette opp utenom.
Meldingstjenesten brukes for å gi beskjed til de som skal signere om at de må signere et skjema i Altinn, og for å sende en kvittering til innboksen deres når de har signert.
Slik kommer du i gang med meldingstjenesten.
Eksempel på konfigurasjon
I dette repoet ligger det et eksempel på en app som har brukerstyrt signering.
Flyten i appen er slik:
- Den som fyller ut skjemaet oppgir fødselsnummer og etternavn, eller eventuelt organisasjonsnummer hvis den som skal signere representerer en virksomhet.
- Når skjemaet er ferdig utfylt, klikker den som fyller ut på “Til signering”. Det beveger prosessen til neste steg, som er signeringssteget.
- Når signeringssteget blir startet, kaller appen opp en implementering av grensesnittet
ISigneeProvider
, som dere må implementere, for å finne ut hvem som må få tillatelse til å signere. - De som skal signere får delegert de rettighetene de trenger, og de blir varslet om at de har en signeringsoppgave.
- Skjemaet de skal signere kommer i innboksen slik at de kan åpne det, se over informasjonen og signere.
- Innsenderen signerer også, hvis appen er satt opp til det, og deretter blir skjemaet sendt inn.
Merk: Vi støtter ikke automatisk innsending enda.
Følg trinnene under for å sette opp en slik app.
1. Legg til en signeringsoppgave i appens prosess, med tilhørende konfigurasjon
Utvid app prossesen med signing task:
Det må legges til et signeringssteg i appens prosess, som er definert i App/config/process/process.bpmn
.
Det anbefales å dra inn prosessteget via prosessdesigneren i Altinn Studio. Da får man generert BPMN-diagram som viser flyten i appen. Forløpig vil prosessdesigneren bare delvis konfigurere steget riktig, så det må suppleres med manuell konfigurasjon.
Signering benytter to burkerhandlinger (user actions):
sign
: Selve signeringshandlingen.reject
: Dersom det skal være mulig å avbryte signeringssteget, så må det også legges til en gateway for å styre hvor prosessen skal gå videre når det skjer.
Dersom Altinn-brukergrensesnittet benyttes av appen, så vil handlingene ovenfor bli kalt ved knappetrykk i signeringssteget.
Om kun API-et benyttes, så må disse kalles manuelt via /actions
-endepunktet eller process next.
Et signeringssteg kan se omtrent slik ut:
<bpmn:task id="SigningTask" name="Signering">
<bpmn:extensionElements>
<altinn:taskExtension>
<altinn:taskType>signing</altinn:taskType>
<altinn:actions>
<altinn:action>sign</altinn:action>
<altinn:action>reject</altinn:action>
</altinn:actions>
<altinn:signatureConfig>
<!-- De faktiske dataene som skal signeres. Kan være vedlegg, skjemadata i xml, -->
<!-- eller PDF fra tidligere steg. -->
<altinn:dataTypesToSign>
<altinn:dataType>ref-data-as-pdf</altinn:dataType>
</altinn:dataTypesToSign>
<!-- Denne datatypen brukes for lagre signaturene. -->
<altinn:signatureDataType>signatures</altinn:signatureDataType>
<!-- Denne datatypen brukes for lagre signatarene og tilhørende informasjon. -->
<altinn:signeeStatesDataTypeId>signeeState</altinn:signeeStatesDataTypeId>
<!-- Denne ID-en angir hvilken implementasjon av C# interface-et -->
<!-- ISigneeProvider som skal benyttes for dette signeringssteget. -->
<altinn:signeeProviderId>signees</altinn:signeeProviderId>
<!-- Her oppgis en correspondence resource, som brukes for å si fra til signaterene -->
<!-- om at de må inn og signere, samt signeringskvittering. Påkrevd. -->
<altinn:correspondenceResource>app-correspondence-resource</altinn:correspondenceResource>
<!-- Dersom man ønsker at det skal bli generert en PDF av signeringssteget -->
<!-- så kan man oppgi en datatype her av type application/pdf. -->
<altinn:signingPdfDataType>signing-step-pdf</altinn:signingPdfDataType> <!-- optional -->
<!-- Vi har laget en standard validator som kan slås på her. Den validerer at -->
<!-- alle signatarer har signert og at minCount på signatur-datatypen er oppfylt. -->
<!-- Om denne ikke slås på, bør man skrive egen validering av signaturer. -->
<altinn:runDefaultValidator>true</altinn:runDefaultValidator
</altinn:signatureConfig>
</altinn:taskExtension>
</bpmn:extensionElements>
<bpmn:incoming>SequenceFlow_1oot28q</bpmn:incoming>
<bpmn:outgoing>SequenceFlow_1if1sh9</bpmn:outgoing>
</bpmn:task>
Konfigurere miljø-spesifikke correspondence ressurser
Hvis du ønsker å bruke miljø-spesifikke correspondence ressurser kan du konfigurere dem ved å bruke følgende syntaks:
<altinn:signatureConfig>
...
<altinn:correspondenceResource env="Development">app-correspondence-resource-1</altinn:correspondenceResource>
<altinn:correspondenceResource env="Staging">app-correspondence-resource-2</altinn:correspondenceResource>
<altinn:correspondenceResource env="Production">app-correspondence-resource</altinn:correspondenceResource>
...
</altinn:signatureConfig>
Altinn miljø-mapping:
Development -> “development”, “dev”, “local”, “localtest”
Staging -> “staging”, “test”, “at22”, “at23”, “at24”, “tt02”, “yt01”
Production -> “production”, “prod”, “produksjon”
Legg til datatyper for å lagre signeringsdata
Disse datatypene legger til i dataTypes
i App/config/applicationmetadata.json
.
Den første datatypen benyttes av signeringssteget til å lagre de faktiske signaturene som genereres når brukeren utfører signeringshandlingen.
{
"id": "signatures",
"taskId": "SigningTask",
"allowedContentTypes": [
"application/json"
],
"allowedContributors": [
"app:owned"
],
"minCount": 1
}
Denne datatypen benyttes for å lagre informasjon om signatarene som skal få deligert rettigheter til å signere og statusen deres.
{
"id": "signeeState",
"taskId": "SigningTask",
"allowedContentTypes": [
"application/json"
],
"allowedContributors": [
"app:owned"
],
"maxCount": 1,
"minCount": 1
}
Det er viktig å sette allowedContributors
til "app:owned"
. Det gjør at disse dataene ikke kan redigeres via appens API, men kun av appen selv. Før versjon 8.6 var denne konfigurasjonen feilstavet allowedContributers
.
Datatypenes ID-er kan settes til noe annet, men det må matche ID-ene som legges inn i signatureDataType
og signeeStatesDataTypeId
i prossessteget, som vist i punktet under.
Tilgangsstyring
Gi read
, write
og eventuelt sign
til den som fyller ut skjemaet.
For at appen skal kunne delegere rettigheter til de som skal signere så må appen få rettigheter til å delegere read
og sign
.
Se eksempel nedenfor.
- Bytt ut
ttd
med riktig org. - Bytt ut
app_ttd_signering-brukerstyrt
med tilsvarendeapp_{org}_{appnavn}
. - Bytt ut
signering-brukerstyrt
med appnavn.
<xacml:Rule RuleId="urn:altinn:org:ttd:signering-brukerstyrt:ruleid:7" Effect="Permit">
<xacml:Description>
A rule defining all instance delegation rights the App itself is allowed to perform for instances of the app ttd/signering-brukerstyrt. In this example the app can delegate the Read and Sign actions for task SingingTask.
</xacml:Description>
<xacml:Target>
<xacml:AnyOf>
<xacml:AllOf>
<xacml:Match
MatchId="urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case">
<xacml:AttributeValue
DataType="http://www.w3.org/2001/XMLSchema#string">
app_ttd_signering-brukerstyrt
</xacml:AttributeValue>
<xacml:AttributeDesignator
AttributeId="urn:altinn:resource:delegation"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="false"
/>
</xacml:Match>
</xacml:AllOf>
</xacml:AnyOf>
<xacml:AnyOf>
<xacml:AllOf>
<xacml:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">ttd</xacml:AttributeValue>
<xacml:AttributeDesignator
AttributeId="urn:altinn:org"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="false"
/>
</xacml:Match>
<xacml:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">signering-brukerstyrt</xacml:AttributeValue>
<xacml:AttributeDesignator
AttributeId="urn:altinn:app"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="false"
/>
</xacml:Match>
<xacml:Match
MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">SingingTask</xacml:AttributeValue>
<xacml:AttributeDesignator
AttributeId="urn:altinn:task"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="false"
/>
</xacml:Match>
</xacml:AllOf>
<xacml:AnyOf>
<xacml:AllOf>
<xacml:Match MatchId="urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case">
<xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">read</xacml:AttributeValue>
<xacml:AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="false"
/>
</xacml:Match>
</xacml:AllOf>
<xacml:AllOf>
<xacml:Match MatchId="urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case">
<xacml:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">sign</xacml:AttributeValue>
<xacml:AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
DataType="http://www.w3.org/2001/XMLSchema#string"
MustBePresent="false"
/>
</xacml:Match>
</xacml:AllOf>
</xacml:AnyOf>
</xacml:Target>
</xacml:Rule>
Dette steget må gjøres manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se “Manuelt oppsett”-fanen for denne seksjonen for veiledning.
2. Legg til layout-set for signering
Legg til en ny mappe under App/ui
for signeringsoppgaven din. Kall den f.eks. signing
.
Oppdater filen App/ui/layout-sets.json
med ny sidegruppe, som har samme id
som mappen du nettopp opprettet.
Din oppdaterte layout-sets.json
kan se slik ut:
{
"$schema": "https://altinncdn.no/toolkits/altinn-app-frontend/4/schemas/json/layout/layout-sets.schema.v1.json",
"sets": [
{
"id": "form",
"dataType": "model",
"tasks": [
"Task_1"
]
},
{
"id": "signing",
"dataType": "model",
"tasks": [
"SigningTask"
]
}
]
}
I mappen du opprettet, legg til en ny fil kalt signing.json
.
Det finnes et sett med ferdige komponenter for å bygge opp layout for et signeringssteg. Vi anbefaler å bruke disse, men de er ikke obligatoriske.
- SigneeList:
- Lister ut signatarer og tilhørende signeringsstatus. Les mer her.
- SigningDocumentList:
- Lister ut dataene som blir signert på. Feks. vedlegg, xml-data eller PDF-oppsummering fra tidligere steg. Les mer her.
- SigningActions:
- Utleder status for signeringssteget og viser relevante knapper til sluttbruker, feks. “Signer”-knappen. Les mer her.
Dersom du ikke benytter SigningActions
for å vise “Signer”-knappen, så må du legge til en egen action button med action “sign”, for å la sluttbruker signere.
Eksempel på bruk av komponentene:
{
"$schema": "https://altinncdn.no/schemas/json/layout/layout.schema.v1.json",
"data": {
"layout": [
{
"id": "headerSigningFounders",
"type": "Header",
"size": "M",
"textResourceBindings": {
"title": "Her kan man ha en overskrift"
}
},
{
"id": "signee-list",
"type": "SigneeList",
"textResourceBindings": {
"title": "Personer som skal signere",
"description": "Personer som skal signere beskrivelse",
"help": "Dette er personer som skal signere"
}
},
{
"id": "signing-documents",
"type": "SigningDocumentList",
"textResourceBindings": {
"title": "Dokumenter som skal signeres",
"description": "Dokumenter som skal signeres beskrivelse"
}
},
{
"id": "signing-state",
"type": "SigningActions"
}
]
}
}
Dette steget må gjøres manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se “Manuelt oppsett”-fanen for denne seksjonen for veiledning.
3. Valgfritt - Egendefinert validering
Du kan bruke standardvalidatoren som nevnt i punkt 2. Den verifiserer at antall signaturer er minst det som er satt til
minCount
på feltet i datamodellen. Egendefinert validering kan settes opp ved å implementere IValidator
eller ITaskValidator
, som
beskrevet i Hvordan legge til egendefinert validering.
Om appen er konfigurert slik at utførelsen av signeringshandlingen gjøres i prosessnavigasjonen, så vil handlingen utføres før valideringen.
Et eksempel er en validator som verifiserer at en signatur er gjort på vegne av en organisasjon:
public class SigningTaskValidator : IValidator
{
private readonly IProcessReader _processReader;
public SigningTaskValidator(IProcessReader processReader)
{
_processReader = processReader;
}
/// <summary>
/// Vi implementerer <see cref="ShouldRunForTask"/> i stedet.
/// </summary>
public string TaskId => "*";
/// <summary>
/// Kjører kun for steg med stegtype "signing".
/// </summary>
public bool ShouldRunForTask(string taskId)
{
AltinnTaskExtension? taskConfig;
try
{
taskConfig = _processReader.GetAltinnTaskExtension(taskId);
}
catch (Exception)
{
return false;
}
return taskConfig?.TaskType == "signing";
}
public bool NoIncrementalValidation => true;
/// <inheritdoc />
public Task<bool> HasRelevantChanges(IInstanceDataAccessor dataAccessor, string taskId, DataElementChanges changes)
{
throw new UnreachableException(
"HasRelevantChanges should not be called because NoIncrementalValidation is true."
);
}
/// <inheritdoc />
/// <remarks>Validerer at minst en av signaturene er gjort på vegne av en organisasjon.</remarks>
public async Task<List<ValidationIssue>> Validate(
IInstanceDataAccessor instanceDataAccessor,
string taskId,
string? language
)
{
AltinnSignatureConfiguration signatureConfiguration =
(_processReader.GetAltinnTaskExtension(taskId)?.SignatureConfiguration)
?? throw new ApplicationConfigException("Signing configuration not found in AltinnTaskExtension");
string signatureDataTypeId =
signatureConfiguration.SignatureDataType
?? throw new ApplicationConfigException("SignatureDataType is not set in the signature configuration.");
IEnumerable<DataElement> signatureDataElements = instanceDataAccessor.GetDataElementsForType(
signatureDataTypeId
);
SignDocument[] signDocuments = await Task.WhenAll(
signatureDataElements.Select(async signatureDataElement =>
{
ReadOnlyMemory<byte> data = await instanceDataAccessor.GetBinaryData(signatureDataElement);
string signDocumentSerialized = Encoding.UTF8.GetString(data.ToArray());
return JsonSerializer.Deserialize<SignDocument>(signDocumentSerialized)
?? throw new JsonException("Could not deserialize signature document.");
})
);
var organisationHasSigned = signDocuments.Any(doc => doc?.SigneeInfo?.OrganisationNumber is not null);
if (organisationHasSigned is false)
{
return
[
new ValidationIssue
{
Code = "SignatureIssues",
Severity = ValidationIssueSeverity.Error,
Description = "An organisation must sign the document.",
},
];
}
return [];
}
}
4. Oppgi hvem som skal signere
For at appen skal vite hvem som skal få tilganger for å lese og signere må C# interface-et ISigneeProvider
implementeres.
Den må returnere et sett med personer og/eller virksomheter som skal få rettighetene. Det kan for eksempel være basert på datamodellen, som vist nedenfor.
Id
-attributtet i denne implementasjonen må matche ID som ble angitt i <altinn:signeeProviderId>
.
Når en organisasjon er oppgitt som signatar så vil de som har en nøkkelrolle i organisasjonen få read
og sign
rettigheter til instansen.
#nullable enable
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Altinn.App.Core.Features;
using Altinn.App.Core.Features.Signing;
using Altinn.App.Models.Skjemadata;
using Altinn.Platform.Storage.Interface.Models;
namespace Altinn.App.logic;
public class FounderSigneesProvider : ISigneeProvider
{
public string Id { get; init; } = "founders";
public async Task<SigneeProviderResult> GetSignees(GetSigneesParameters parameters)
{
DataElement dataElement = parameters.InstanceDataAccessor
.GetDataElementsForType("Skjemadata")
.Single();
var formData = await parameters.InstanceDataAccessor.GetFormData<Skjemadata>(dataElement);
List<ProvidedSignee> providedSignees = [];
foreach (StifterPerson stifterPerson in formData.StifterPerson)
{
var personSignee = new ProvidedPerson
{
FullName = string.Join(
" ",
[stifterPerson.Fornavn, stifterPerson.Mellomnavn, stifterPerson.Etternavn]
),
SocialSecurityNumber = stifterPerson.Foedselsnummer?.ToString() ?? string.Empty,
// CommunicationConfig er valgfritt, og beskrevet i punkt 6.
};
providedSignees.Add(personSignee);
}
foreach (StifterVirksomhet stifterVirksomhet in formData.StifterVirksomhet)
{
var organisationSignee = new ProvidedOrganization
{
Name = stifterVirksomhet.Navn,
OrganizationNumber =
stifterVirksomhet.Organisasjonsnummer?.ToString() ?? string.Empty,
// CommunicationConfig er valgfritt, og beskrevet i punkt 6.
};
providedSignees.Add(organisationSignee);
}
return new SigneeProviderResult { Signees = providedSignees };
}
}
Dette steget må gjøres manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se “Manuelt oppsett”-fanen for denne seksjonen for veiledning.
5. Valgfritt - Legg til tekstressurser
Denne seksjonen er kun relevant for deg dersom du ønsker å endre på standardtekstene i kommunikasjon med signatarer - de som skal signere.
Standardverdiene som brukes dersom kommunikasjonstekstene ikke overstyres er som følger:
Tekst | StandardVerdi |
---|---|
Innboksmelding til signatar - tittel | “{appName}: Oppgave til signering” |
Innboksmelding til signatar - undertittel | “Din signatur ventes for {appName}.” |
Innboksmelding til signatar - innhold | “Du har en oppgave som venter på din signatur. <a href="{instanceUrl}">Klikk her for å åpne applikasjonen. Hvis du lurer på noe, kan du kontakte {appOwner}.” |
Sms til signatar - innhold | “Din signatur ventes for {appName}. Åpne Altinn-innboksen din for å fortsette.” |
E-post til signatar - emne | “{appName}: Oppgave til signering” |
E-post til signatar - innhold | “Din signatur ventes for {appName}. Åpne Altinn-innboksen din for å fortsette. Hvis du lurer på noe, kan du kontakte {appOwner}.” |
Kvittering til signatar - tittel | “{appName}: Signeringen er bekreftet” |
Kvittering til signatar - undertittel | “Du har signert for {appName}.” |
Kvittering til signatar - innhold | “Dokumentene du har signert er vedlagt. Disse kan lastes ned om ønskelig. Hvis du lurer på noe, kan du kontakte {appOwner}.” |
Tekst | StandardVerdi |
---|---|
Innboksmelding til signatar - tittel | “{appName}: Oppgåve til signering” |
Innboksmelding til signatar - undertittel | “Signaturen din vert venta for {appName}.” |
Innboksmelding til signatar - innhold | “Du har ei oppgåve som ventar på signaturen din. <a href="{instanceUrl}">Klikk her for å opne applikasjonen. Om du lurer på noko, kan du kontakte {appOwner}.” |
Sms til signatar - innhold | “Signaturen din vert venta for {appName}. Opne Altinn-innboksen din for å gå vidare.” |
E-post til signatar - emne | “{appName}: Oppgåve til signering” |
E-post til signatar - innhold | “Signaturen din vert venta for {appName}. Opne Altinn-innboksen din for å gå vidare. Om du lurer på noko, kan du kontakte {appOwner}.” |
Kvittering til signatar - tittel | “{appName}: Signeringa er stadfesta” |
Kvittering til signatar - undertittel | “Du har signert for {appName}.” |
Kvittering til signatar - innhold | “Dokumenta du har signert er vedlagde. Dei kan lastast ned om ønskeleg. Om du lurer på noko, kan du kontakte {appOwner}.” |
Tekst | StandardVerdi |
---|---|
Innboksmelding til signatar - tittel | “{appName}: Task for signing” |
Innboksmelding til signatar - undertittel | “Your signature is requested for {appName}.” |
Innboksmelding til signatar - innhold | “You have a task waiting for your signature. <a href="{instanceUrl}">Click here to open the application. If you have any questions, you can contact {appOwner}.” |
Sms til signatar - innhold | “Your signature is requested for {appName}. Open your Altinn inbox to proceed.” |
E-post til signatar - emne | “{appName}: Task for signing” |
E-post til signatar - innhold | “Your signature is requested for {appName}. Open your Altinn inbox to proceed. If you have any questions, you can contact {appOwner}.” |
Kvittering til signatar - tittel | “{appName}: Signature confirmed” |
Kvittering til signatar - undertittel | “Your signature has been registered for {appName}.” |
Kvittering til signatar - innhold | “The signed documents are attached. They may be downloaded. If you have any questions, you can contact {appOwner}.” |
Dersom du ønsker å overstyre standardtekstene:
Legg til en teksressurs-fil under ´App/config/texts´ for hvert språk du vil støtte.
Med CommunicationConfig
oppsettet for en oppgitt signatar i implementasjonen din av ISigneeProvider
interfacet, kan
du knytte opp tekstressurser for å overstyre innholdet i melding til innboksen i Altinn, samt sms og e-post som sendes
for å varsle signatar om en signeringsoppgave.
Disse kan du kalle hva du vil, og koble dem opp til CommunicationConfig
i neste punkt (punkt 4.).
Eksempel på tekstressurser for varsling med egne tekster for e-post, samt kvittering:
$instanceUrl$
plassholder (placeholder).
Det vil erstattes med en lenke til skjemaet. Hvis dette overstyres uten å bruke denne plassholderen, så vil IKKE mottaker
kunne finne frem til skjemaet med signeringsoppgaven! {
"id": "signing.correspondence_title_common",
"value": "Oppgave - Signer stiftelsesdokumenter"
},
{
"id": "signing.correspondence_summary_stifter_person",
"value": "Du har blitt lagt til som signatar."
},
{
"id": "signing.correspondence_summary_stifter_organisasjon",
"value": "Organisjonen har blitt lagt til som signatar."
},
{
"id": "signing.correspondence_body_stifter_person",
"value": "Du har blitt lagt til som signatar for stiftelsesdokumenter. <br /> $instanceUrl$ <br /><br />Hvis du lurer på noe, ta kontakt med Brønnøysundregistrene på telefon 75 00 75 00."
},
{
"id": "signing.correspondence_body_stifter_organisasjon",
"value": "Organisjonen har blitt lagt til som signatar for stiftelsesdokumenter. <br /> $instanceUrl$ <br /><br />Ved spørsmål, ta kontakt med Brønnøysundregistrene på telefon 75 00 75 00."
},
{
"id": "signing.notification_content",
"value": "Hei $correspondenceRecipientName$,\n\nDu har mottatt stiftelsesdokumenter for signering i Altinn. Logg inn på Altinn for å signere dokumentene.\n\nMed vennlig hilsen\nBrønnøysundregistrene"
},
{
"id": "signing.email_subject",
"value": "Stiftelsesdokumenter mottatt for signering i Altinn. Gå til Altinn-innboks for å signere."
},
Overstyring av kvittering er ikke mulig å gjøre per signatar, det gjøres generelt for alle signatarer. Her må navnet på tekstressursene være de følgende nøklene for at overstyringen skal skje:
signing.correspondence_receipt_title
- tittel på kvitteringsmelding
signing.correspondence_receipt_summary
- undertittel på kvitteringsmelding
signing.correspondence_receipt_body
- innhold i kvitteringsmelding
Eksempel:
{
"id": "signing.correspondence_receipt_title",
"value": "Receipt: Signing of founding documents"
},
{
"id": "signing.correspondence_receipt_summary",
"value": "You have signed the founding documents"
},
{
"id": "signing.correspondence_receipt_body",
"value": "The documents you have signed are attached. These can be downloaded if desired. <br /><br />If you have any questions, contact the Brønnøysund Register Centre at phone 75 00 75 00."
},
Dette steget må gjøres manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se “Manuelt oppsett”-fanen for denne seksjonen for veiledning.
6. Valgfritt - skreddersy hvordan signatarene varsles
Legg merke til at CommunicationConfig
er valgfritt. Her kan du overstyre standardtekster brukt i kommunikasjon med signatarene,
som beskrevet i forrige punkt. Du kan også overstyre e-post adresse og telefonnummer for signatarene.
Om ikke overstyrt, vil e-postadressene og telefonnumrene populeres som beskrevet i Recipient lookup og Address lookup.
Dette er de mulige overstyringskonfigurasjonene for kommunikasjon med signatarer:
Property | Description | Type |
---|---|---|
CommunicationConfig | Objektet for kommunikasjonskonfigurasjon | Object |
CommunicationConfig.InboxMessage | Objektet for innboksmeldingskonfigurasjon | Object |
CommunicationConfig.InboxMessage.TitleTextResourceKey | Tekstressursnøkkelen for innboksmeldingstittel | String |
CommunicationConfig.InboxMessage.SummaryTextResourceKey | Tekstressursnøkkelen for innboksmeldingssammendrag | String |
CommunicationConfig.InboxMessage.BodyTextResourceKey | Tekstressursnøkkelen for innboksmeldingsinnhold | String |
CommunicationConfig.Notification | Objektet for varslingskonfigurasjon | Object |
CommunicationConfig.Notification.Email | Objektet for e-postvarselingskonfigurasjon | Object |
CommunicationConfig.Notification.Email.EmailAddress | Tekstressursnøkkelen for e-postadresse | String |
CommunicationConfig.Notification.Email.SubjectTextResourceKey | Tekstressursnøkkelen for e-postemne | String |
CommunicationConfig.Notification.Email.BodyTextResourceKey | Tekstressursnøkkelen for e-postinnhold | String |
CommunicationConfig.Notification.Sms | Objektet for SMS-varslingskonfigurasjon | Object |
CommunicationConfig.Notification.Sms.MobileNumber | Tekstressursnøkkelen for mobilnummer | String |
CommunicationConfig.Notification.Sms.BodyTextResourceKey | Tekstressursnøkkelen for SMS-innhold | String |
CommunicationConfig.Notification.NotificationChoice | Varslingspreferansevalget | NotificationChoice enum (String) |
Følgende er et eksempel på overstyring av kommunikasjon med en ProvidedPerson
, det samme gjelder for ProvidedOrganization
:
var personSignee = new ProvidedPerson
{
CommunicationConfig = new CommunicationConfig
{
InboxMessage = new InboxMessage
{
TitleTextResourceKey = "signing.correspondence_title_common",
SummaryTextResourceKey = "signing.correspondence_summary_stifter_organisasjon",
BodyTextResourceKey = "signing.correspondence_body_stifter_organisasjon"
},
Notification = new Notification
{
Email = new Email
{
EmailAddress = stifterVirksomhet.Epost,
SubjectTextResourceKey = "signing.email_subject",
BodyTextResourceKey = "signing.notification_content".Replace(
"{0}",
stifterVirksomhet.Navn
),
},
Sms = new Sms
{
MobileNumber = stifterVirksomhet.Mobiltelefon,
BodyTextResourceKey = "signing.notification_content".Replace(
"{0}",
stifterVirksomhet.Navn
),
}
NotificationChoice = NotificationChoice.EmailPreferred,
}
}
}
Dette steget må gjøres manuelt. Støtte for konfigurasjon i Altinn Studio kommer senere. Se “Manuelt oppsett”-fanen for denne seksjonen for veiledning.
6. Test brukerstyrt signering
Obs! Du kan foreløpig ikke teste i
localtest
, du må teste i TT02-miljøet.
Det er en forsinkelse i autorisasjonslaget. Det gjør at det kan ta tid før brukere som har fått delegert tilgang til et skjema med brukerstyrt signering, får se selve skjemaet i Altinn-innboksen.
Dette skjer bare for
- de brukerne som er aktivt pålogget Altinn når et eksemplar (instans) blir delegert
- de som ikke allerede har annen tilgang for InstanceOwner
For at du skal slippe å oppleve problemer med dette mens du tester, kan du delegere til en person du ikke har brukt i testingen den siste timen.