Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

NamnTypKrav vid update/createBeskrivning
idintGenererasServicens id, genereras av servern.
providerIdintObligatoriskId till serviceplatsen som tillhandahåller servicen, se Serviceplatser.
servicePrincipalIdintObligatoriskId för servicens huvudman, se Huvudman.
serviceTypeIdintObligatorisk

Id till typen av service som utförs, se Servicetyp.

propertiesdictionaryFrivillig

En dictionary med nycklar och värden som är knutna till specifik servicetyp.

ServicetypNyckelVärdeBeskrivning
KontantuttaglstboolUpphandlat tjänsteombud (LST)

ticketsRequiredbool

Inträdesbiljett krävs

BetalningsförmedlinglstboolUpphandlat tjänsteombud (LST)
DagskasseinsättninglstboolUpphandlat tjänsteombud (LST)
Dagligvaror fullsortimentmannedboolBemannad butik

revenueintOmsättning (tkr)

specialOperatingSupportboolSärskilt driftstöd
Dagligvaror ej fullsortimentmannedboolBemannad butik

revenueint Omsättning (tkr)
AllaexternalIdstring

Externt id som kan användas för att koppla service mot externt data

(för att förenkla uppdateringar).


formsarrayObligatorisk

Det sätt som servicen tillhandahålls. Form är knutet till servicetyp.

En service kan ha en eller flera former. Giltiga värden för form för respektive servicetyp beskrivs nedan.

Servicetypvärdebeskrivning
KontantuttagBankkassaÖver disk hos bankkontor
KontantuttagUttagsautomatAutomat för kontantuttag
KontantuttagÖver disk hos ombudOmbud som erbjuder kontantuttag till alla konsumenter eller där ett kreditinstitut eller annat företag har avtal som möjliggör kontantuttag för deras kunder
BetalningsförmedlingBankkassa med kontanterBankkontor där man kan betala räkningar med kontanter i kassan
BetalningsförmedlingBankkassa mot bankkonto/kortBankkontor där man kan betala räkningar via konto/kort i kassan
BetalningsförmedlingÖver disk hos ombudOmbud där man kan betala räkningar över disk
DagskasseinsättningÖver disk hos ombudOmbud som erbjuder dagskasseinsättning till alla företag eller där ett kreditinstitut eller annat företag har avtal som möjliggör dagskasseinsättning för deras kunder
DagskasseinsättningInsättningsautomatInsättningsautomat som möjliggör insättning
DagskasseinsättningBankkassa Över disk hos bankkontor
DagskasseinsättningServiceboxServicebox som möjliggör insättning
PosttjänsterFöretagscenter
PosttjänsterPaketautomat
PosttjänsterPaketombud
PosttjänsterUtlämning
DrivmedelBensin
DrivmedelDiesel
DrivmedelE85
DrivmedelUppgift saknas
ApoteksvarorApotek
ApoteksvarorApoteksombud
Dagligvaror fullsortimentDagligvaror
Dagligvaror ej fullsortimentDagligvaror


activeboolObligatoriskAnger om servicen tillfälligt är inaktiv, ex. säsongsbutik som bara är öppen under sommarhalvåret.
yearintFrivillig (Sätts till nutid)

Det år servicen tillhör. Default är 0 vilket motsvarar aktuellt år.
En service kan bara tillhöra ett år, så vid redigering av historiskt data måste en service skapas för varje år.
För att skapa, uppdatera och radera historiskt data krävs utökad behörighet.

Vid varje årsskifte körs en intern process som arkiverar det gångna årets service.
Då skapas det en kopia av varje service som sedan tilldelas det gångna årets årtal.

timelinessDatedateFrivilligSenast uppdaterad.
För aktuellt år måste datumet ligga inom intervallet xxxx-01-01 till aktuellt datum.
För historiskt data ska datumet ligga inom året.

...

NamnTypKrav vid update/createBeskrivning

id

intGenererasMallens id, genereras av servern.

principalOrganisationId

intObligatoriskId till den organisation som äger mallen, se Organisation 

serviceTypeId

intObligatoriskId till typen av service som utförs, se Servicetyp. 

serviceFormId

intObligatoriskId till formen som utförs, se Serviceform.

openHoursPerWeek

intFrivilligÖppettider anges i timmar per vecka under normalvecka. Med normalvecka avses en vecka som består av fem helgfria dagar samt lördag och söndag utan extra helgdagar, under normalsäsong. Om platsen för kontanttjänsten finns i en lokal eller inrättning som har kortare öppettider än platsen anges lokalens eller inrättningens öppettider. 
Giltiga värden är 0 till 168.

closedWeeksPerYear

intFrivilligAnges i antal veckor per år som platsen är stängd.
Giltiga värden är 0 till 53.
advancedOpenHourDescriptionstringFrivilligFält där avgiftsmodellen kan förklaras i fritext om den inte passar in i ovanstående alternativ eller om det finns olika avgifter för olika kunder.

withdrawalLimit

intFrivillig

Ange högsta tillåtna belopp per uttag, som du som huvudman tillåter. Ange 0 om inte maxbelopp tillämpas.

minFlatFeeintFrivilligFylls i med lägsta fasta avgift. Beloppet anges i kronor.
minPercentageFeefloatFrivillig

Fylls i med lägsta rörliga avgift i form av procent av uttag. Anges i procent, giltiga värden är 0 till 100.

maxFlatFeeintFrivilligFylls i med högsta fasta avgift. Beloppet anges i kronor.
maxPercentageFeefloatFrivilligFylls i med högsta rörliga avgift i form av procent av uttag. Anges i procent, giltiga värden är 0 till 100.
advancedFeeDescriptionstringFrivilligFält där avgiftsmodellen kan förklaras i fritext om den inte passar in i ovanstående alternativ eller det finns olika avgifter för olika kunder.
depositLimitintFrivilligAnge högsta tillåtna belopp per insättning, som du som huvudman tillåter. Beloppet ska anges i kronor. Ange 0 om inte maxbelopp tillämpas.
withdrawalLimitDescriptionstringFrivilligFält där modell för lägsta maxbelopp för insättning eller uttag kan förklaras i fritext om den inte passar in i ovanstående alternativ.
weeklyDepositLimitintFrivilligAnge högsta tillåtna belopp, som du som huvudman tillåter, att kunden får sätta in på en vecka. Beloppet ska anges i kronor. Ange 0 om inte maxbelopp tillämpas.

accessBarrier

boolFrivillig

Tillträdeshinder. Sant om det krävs inträdesbiljett och/eller specifik behörighet till område/lokal.

Om tillträdeshinder är sant ska attributet accessBarrierDescription anges.

accessBarrierDescriptionstringFrivilligFält där tillträdeshindret kan förklaras i fritext.

...

NamnTypKrav vid update/createBeskrivning

id

intGenererasAnpassningens id, genereras av servern.

serviceId

intObligatoriskId till den service som anpassningen hör till. 

serviceFormId

intObligatoriskId till den serviceform som anpassningen hör till.

accessBarrier

boolFrivillig

Tillträdeshinder. Sant om det krävs inträdesbiljett och/eller specifik behörighet till område/lokal.

Om tillträdeshinder är sant ska attributet accessBarrierDescription anges.

accessBarrierDescriptionstringFrivilligFält där tillträdeshindret kan förklaras i fritext.

openHoursPerWeek

intFrivilligÖppettider anges i timmar per vecka under normalvecka. Med normalvecka avses en vecka som består av fem helgfria dagar samt lördag och söndag utan extra helgdagar, under normalsäsong. Om platsen för kontanttjänsten finns i en lokal eller inrättning som har kortare öppettider än platsen anges lokalens eller inrättningens öppettider. 
Giltiga värden är 0 till 168.

closedWeeksPerYear

intFrivilligAnges i antal veckor per år som platsen är stängd.
Giltiga värden är 0 till 53.
advancedOpenHourDescriptionstringFrivilligFält där avgiftsmodellen kan förklaras i fritext om den inte passar in i ovanstående alternativ eller om det finns olika avgifter för olika kunder.

withdrawalLimit

intFrivillig

Ange högsta tillåtna belopp per uttag, som du som huvudman tillåter. Ange 0 om inte maxbelopp tillämpas.

minFlatFeeintObligatoriskFrivilligFylls i med lägsta fasta avgift. Beloppet anges i kronor.
minPercentageFeefloatObligatoriskFrivillig

Fylls i med lägsta rörliga avgift i form av procent av uttag. Anges i procent, giltiga värden är 0 till 100.

maxFlatFeeintObligatoriskFrivilligFylls i med högsta fasta avgift. Beloppet anges i kronor.
maxPercentageFeefloatObligatoriskFrivilligFylls i med högsta rörliga avgift i form av procent av uttag. Anges i procent, giltiga värden är 0 till 100.
advancedFeeDescriptionstringFrivilligFält där avgiftsmodellen kan förklaras i fritext om den inte passar in i ovanstående alternativ eller det finns olika avgifter för olika kunder.
depositLimitintFrivilligAnge högsta tillåtna belopp per insättning, som du som huvudman tillåter. Beloppet ska anges i kronor. Ange 0 om inte maxbelopp tillämpas.
withdrawalLimitDescriptionstringFrivilligFält där modell för lägsta maxbelopp för uttag eller insättning kan förklaras i fritext om den inte passar in i ovanstående alternativ. Ange 0 om inte maxbelopp tillämpas.
weeklyDepositLimitintFrivilligAnge högsta tillåtna belopp, som du som huvudman tillåter, att kunden får sätta in på en vecka. Beloppet ska anges i kronor. Ange 0 om inte maxbelopp tillämpas.

...

Namn

Typ

Krav vid update/create

Beskrivning

id

intGenererasModellens id, genereras av servern.

supplierOrganisationId

intObligatoriskOrganisations-id till det kreditinstitut eller filial till utländskt kreditinstitut som omfattas av skyldigheten att tillhandahålla kontanttjänster.

principalOrganisationId

intObligatoriskOrganisations-id till den huvudman som driver eller på annat sätt råder över kontanttjänsten.

serviceTypeId

intObligatoriskServicetyps-id till den typ av betaltjänst som erbjuds (kontantuttag, dagskasseinsättning eller betalningsförmedling).

serviceFormId

intObligatoriskServiceforms-id till den serviceform modellen gäller.
minFlatFeeintObligatorisk

Avgift per uttag (fast avgift).
Totala lägsta fasta avgift som era slutkunder får betala när de använder den aktuella betaltjänsten hos ovan vald huvudman. Belopp anges i kronor.

minPercentageFeefloatObligatorisk

Avgift per uttag (rörlig avgift).
Totala lägsta rörliga avgift som era slutkunder får betala när de använder den aktuella betaltjänsten hos ovan vald huvudman. Värdet anges i %.

maxFlatFeeintObligatorisk

Avgift per uttag (fast avgift).

Totala högsta fasta avgift som era slutkunder får betala när de använder den aktuella betaltjänsten hos ovan vald huvudman. Belopp anges i kronor.

maxPercentageFeefloatObligatorisk

Avgift per uttag (rörlig avgift).

Totala högsta rörliga avgift som era slutkunder får betala när de använder den aktuella betaltjänsten hos ovan vald huvudman. Värdet anges i %.

advancedWithdrawalFeeDescriptionstringFrivilligFält där avgiftsmodellen kan förklaras i fritext om den inte passar in i ovanstående alternativ.
withdrawalLimitintFrivilligAnge högsta tillåtna belopp per uttag för era slutkunder när de gör uttag från ert betalkonto genom tjänst hos aktuell huvudman och för vald serviceform. Beakta gränser för maxbelopp hos er och hos huvudmannen (dvs välj det lägsta av de två). Beloppet ska anges i kronor. Ange 0 om inte maxbelopp tillämpas.
weeklyDepositLimitintFrivilligAnge högsta tillåtna belopp som era slutkunder får sätta in på en vecka på betalkonto hos er genom tjänst hos ovan vald huvudman och för ovan vald serviceform. Beakta gällande maxbelopp hos er och hos huvudmannen (dvs välj det lägsta av de två). Beloppet anges i kronor. Ange 0 om inte maxbelopp tillämpas.
depositLimitintFrivilligAnge högsta tillåtna belopp per insättning som era slutkunder får sätta in på betalkonto hos er genom tjänst hos ovan vald huvudman och för ovan serviceform. Beakta gällande maxbelopp hos er och hos huvudmannen (dvs välj det lägsta av de två). Beloppet anges i kronor. Ange 0 om inte maxbelopp tillämpas.
withdrawalLimitDescriptionstringFrivilligFält där modell för lägsta maxbelopp för insättning eller uttag kan förklaras i fritext om den inte passar in i ovanstående alternativ.
includedServiceIdsint[]FrivilligInkludera bara specifika platser för kontanttjänster hos vald huvudman. Listan innehåller id till 19529744service.

Address

Beskrivning av attribut

...

Code Block
languagepy
titleLogga in, skapa och hämta
#-*- coding: utf-8 -*-
import urllib.request
import urllib.error
import urllib.parse
import json
 
BASE_URL = 'https://kontantanalys.tillvaxtverket.se/test/'
 
def acquire_token(username, password):
    """ Login and acquire a valid token """
    url = BASE_URL + '/Token'
    data = {
        'grant_type': 'password',
        'username': username,
        'password': password
    }
    opener = urllib.request.build_opener()
    response = opener.open(url, urllib.parse.urlencode(data).encode("utf-8"))
 
    if response.getcode() == 200:
        content = response.read()
        data = json.loads(content)
        return data['access_token']
 
    return None
 
def create_provider(provider, token):
    headers = {
        'Authorization': 'Bearer %s' % token,
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
    envelope = {
        "data": provider
    }
 
    url = BASE_URL + '/api/providers/'
    data = json.dumps(envelope).encode('utf8')
    req = urllib.request.Request(url, headers=headers)
    try:
        response = urllib.request.urlopen(req, data=data)
        content = response.read()
        new_object = json.loads(content)
        return new_object['data']
    except urllib.error.HTTPError as e:
        content = e.read()
        if content:
            errors = json.loads(content)
            print ('Error (%d) create provider' % e.code)
            for error in errors['errors']:
                print (error)
        else:
            print ('Error (%d) create provider' % e.code)
 
    return None
 
def find_provider(provider_id, token):
    """ Get provider by id """
    opener = urllib.request.build_opener()
    opener.addheaders = [('Authorization', 'Bearer %s' % token)]
    url = BASE_URL + '/api/Providers/%d' % provider_id
    response = opener.open(url)
    content = response.read()
    data = json.loads(content)
    return data['data']
 
def main():
    token = acquire_token('testbanken', 'Sommar&sol2020')
     
    provider = {
        'type': 'provider',
        'attributes': {
            'name': 'INGO Örebro, Adolfsbergsvägen',
            'visitingAddress': 'Adolfsbergsvägen 4',
            'postalCode': '702 27',
            'postTown': 'ÖREBRO',
            'x': 509886.4,
            'y': 6568855.5
        }
    }
    new_provider = create_provider(provider, token)
    if new_provider:
        provider = find_provider(new_provider['id'], token)
        assert provider['attributes']['name'] == new_provider['attributes']['name']
 
if __name__== "__main__":
    main()

...

Code Block
languagec#
titleLogga in, skapa och hämta
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web;
using Newtonsoft.Json;

namespace PiPoS.Examples
{
    public class ApiExamples
    {
		static readonly string BASE_URL = "https://kontantanalys.tillvaxtverket.se/test/";

		public static void Main(string[] args)
        {
			var token = AcquireToken("testbanken", "Sommar&sol2020");
            var provider = new Provider {
                Name = "INGO Örebro, Adolfsbergsvägen",
                VisitingAddress = "Adolfsbergsvägen 4",
                PostalCode = "702 27",
                PostTown = "ÖREBRO",
                X = 509886.4,
                Y = 6568855.5
            };
            
            var newProvider = CreateProvider(provider, token);
            provider = FindProvider(newProvider.Id, token);
            System.Diagnostics.Debug.Assert(newProvider.Name == provider.Name);
		}

		static string AcquireToken(string username, string password)
        {
            string token = string.Empty;
            using (var client = new WebClient())
            {
                client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
                var formData = string.Format("grant_type=password&username={0}&password={1}",
                    HttpUtility.UrlEncode(username),
                    HttpUtility.UrlEncode(password)
                );
                var htmlResult = client.UploadString(BASE_URL + "/Token", formData);
                var json = JsonConvert.DeserializeObject<Dictionary<string, object>>(htmlResult);

                if (json.ContainsKey("access_token"))
                {
                    token = json["access_token"] as string;
                }
            }
            return token;
        }

		static Provider CreateProvider(Provider provider, string token)
        {
            using (var client = new WebClient())
            {
                client.Headers.Add(HttpRequestHeader.Authorization, string.Format("Bearer {0}", token));
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
                client.Headers.Add(HttpRequestHeader.Accept, "application/json");
 
                var envelope = new Envelope<Provider>
                {
                    Data = new Data<Provider>
                    {
                        Attributes = provider,
                        Type = "provider"
                    }
                };
                     
                var json = JsonConvert.SerializeObject(envelope);
                var result = string.Empty;

                try
                {
                    result = client.UploadString(BASE_URL + "/api/providers/", json);
                }
                catch (WebException exception)
                {
                    var responseStream = exception.Response?.GetResponseStream();
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            var responseText = reader.ReadToEnd();
                            if (!string.IsNullOrEmpty(responseText))
                            {
                                try
                                {
                                    var responseData = JsonConvert.DeserializeObject<Error>(responseText);
                                    foreach (var error in responseData?.Errors)
                                    {
                                        Console.Error.WriteLine($"Error:\t{error}");
                                    }
                                }
                                catch (JsonReaderException)
                                {
                                    Console.Error.WriteLine(responseText);
                                }
                                
                            }
                        }
                    }
                    throw exception;
                }
                                  
                var newProvider = JsonConvert
                    .DeserializeObject<Envelope<Provider>>(result)
                    .Data
                    .Attributes;
                return newProvider;
            }
        }

		static Provider FindProvider(int providerId, string token)
        {
            using (var client = new WebClient())
            {
                client.Headers.Add(HttpRequestHeader.Authorization, string.Format("Bearer {0}", token));
                using (var data = client.OpenRead(BASE_URL + $"/api/providers/{providerId}"))
                using (var reader = new StreamReader(data))
                {
                    var provider = JsonConvert
                        .DeserializeObject<Envelope<Provider>>(reader.ReadToEnd())
                        .Data
                        .Attributes;
                    return provider;
                }
            }
        }

		public class Envelope<TEntity>
        {
            [JsonProperty(PropertyName = "data")]
            public Data<TEntity> Data { get; set; }
        }

        public class Data<TEntity>
        {
            [JsonProperty(PropertyName = "attributes")]
            public TEntity Attributes { get; set; }

            [JsonProperty(PropertyName = "id")]
            public int Id { get; set; }

            [JsonProperty(PropertyName = "type")]
            public string Type { get; set; }
        }

        public class Provider
        {
            [JsonProperty(PropertyName = "id")]
            public int Id { get; set; }

            [JsonProperty(PropertyName = "name")]
            public string Name { get; set; }

            [JsonProperty(PropertyName = "code")]
            public string Code { get; set; }

            [JsonProperty(PropertyName = "x")]
            public double X { get; set; }

            [JsonProperty(PropertyName = "y")]
            public double Y { get; set; }

            [JsonProperty(PropertyName = "visitingAddress")]
            public string VisitingAddress { get; set; }

            [JsonProperty(PropertyName = "postalCode")]
            public string PostalCode { get; set; }

            [JsonProperty(PropertyName = "postTown")]
            public string PostTown { get; set; }

            [JsonIgnore]
            public string TypeName => "provider";
        }

        public class Error
        {
            [JsonProperty(PropertyName = "errors")]
            public List<string> Errors { get; set; }
        }
	}
}

...