@haus-tech/haus-workflow 4.2.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1135 @@
1
+ # Poängskalan
2
+
3
+ Sexton referensuppdrag med poäng. Skalan används för att placera in ett nytt uppdrag
4
+ genom jämförelse, aldrig genom fri skattning.
5
+
6
+ Poängen är ett relativt mått på arbetets omfattning. Den innehåller inget timpris, inga
7
+ timmar och ingen valuta. Omräkningen till kronor sker någon annanstans.
8
+
9
+ **Typen är en sökhjälp, aldrig en prisfaktor.** Den finns för att du snabbt ska hitta
10
+ jämförbara referensuppdrag. Ingen typ har högre poäng än en annan vid samma
11
+ arbetsmängd, och inget påslag får göras för att ett uppdrag är en integration, ett
12
+ internt verktyg eller ett underhåll.
13
+
14
+ **Skalan är inte linjär i kodmängd.** Ett uppdrag med tio gånger mer kod har inte tio
15
+ gånger fler poäng. Jämför med vad ändringen drar med sig, inte med hur mycket som
16
+ skrivs.
17
+
18
+ ## Poängens upplösning
19
+
20
+ Poängen sätts aldrig finare än var som helst i den här skalan:
21
+
22
+ - **Under 3 poäng:** steg om 0,25. Alltså 0,25 · 0,5 · 0,75 · 1 · 1,25 · 1,5 · 1,75 · 2 · 2,25 · 2,5 · 2,75.
23
+ - **Från 3 poäng och uppåt:** hela poäng.
24
+
25
+ Skälet är att en finare siffra låtsas om en noggrannhet som inte finns. Två oberoende
26
+ bedömare hamnar i olika klass i en femtedel av fallen, så skillnaden mellan 16 och 16,5
27
+ är mindre än osäkerheten i bedömningen.
28
+
29
+ Stegen är finare i botten därför att samma relativa skillnad kräver det. Från 1 till 1,25
30
+ är en fjärdedels ökning; från 16 till 17 är en sextondel. I den nedre änden dominerar
31
+ dessutom den fasta processavgiften priset, så poängen betyder minst där.
32
+
33
+
34
+ ## Verifiering förutsätter automatiska tester
35
+
36
+ Referensuppdragens beskrivningar av vad som kan bevisas automatiskt utgår från att en
37
+ fungerande testsvit finns. Jämför ett nytt uppdrag på samma grund, även om dess repo
38
+ saknar tester i dag.
39
+
40
+ Skälet är att ett repo utan testsvit annars gör varje post i det repot dyrare, och då
41
+ betalar kunden för Haus egen tekniska skuld. Räkna bara det manuella arbete som
42
+ återstår när testerna gjort sitt: kontroll mot en extern tjänsts testläge, visuell
43
+ granskning, och genomgång på flera enheter eller i flera miljöer.
44
+
45
+ ## Översikt
46
+
47
+ | Ankare | Poäng | Typ | Uppdrag |
48
+ | --- | --- | --- | --- |
49
+ | A1 | 0,25 | Kundvänd funktion | Uppdatera texter i en översättningsfil |
50
+ | A2 | 0,75 | Kundvänd funktion | Visa ett kontonummer i användarens kontovy |
51
+ | A3 | 0,75 | Kundvänd funktion | Härled landval ur webbadressens språkdel |
52
+ | A4 | 1 | Kundvänd funktion | Gör en rad i en produktlista klickbar |
53
+ | A5 | 2 | Underhåll | Säkerhetsuppdatering av beroenden |
54
+ | A6 | 2,25 | Kundvänd funktion | Normalisera filnamn vid uppladdning |
55
+ | A7 | 2,5 | Teknisk uppsättning | Konfigurerbart spårningsskript per webbplats |
56
+ | A8 | 3 | Integration | Kundmatchning mot affärssystem via momsnummer |
57
+ | A9 | 4 | Internt verktyg | Låt administratörer sätta en kunds lösenord |
58
+ | A10 | 4 | Kundvänd funktion | Förpackningsstorlek med decimaler |
59
+ | A11 | 7 | Integration | Hantera felaktigt pris vid sidladdning i betalflödet |
60
+ | A12 | 9 | Kundvänd funktion | Förbättrad kartvy för val av upphämtningsplats |
61
+ | A13 | 12 | Internt verktyg | Import av användare och konton från fil |
62
+ | A14 | 13 | Kundvänd funktion | Delad komponent för lägg i varukorg |
63
+ | A15 | 16 | Integration | Inloggning med extern e-legitimation, gränssnittsdelen |
64
+ | A16 | 17 | Kundvänd funktion | Strukturerad produktdata för sökmotorer |
65
+
66
+ Fördelningen speglar materialet: kundvänd funktion är 56 procent av allt arbete,
67
+ internt verktyg 10, integration 7 och underhåll 5. Uppdrag över 25 poäng är utelämnade
68
+ eftersom bara tre sådana finns 2025 och 2026.
69
+
70
+ ---
71
+
72
+ # A1 · Uppdatera texter i en översättningsfil
73
+ **0,25 poäng · Kundvänd funktion**
74
+
75
+ ## Spec
76
+
77
+ **Problem.** Flera texter i bokningsflödet använder fel ord för ombokning på norska.
78
+ Kunder hör av sig och undrar vad som menas.
79
+
80
+ **Lösning.** De felaktiga texterna byts till rätt term, på alla ställen där de
81
+ förekommer i den norska språkfilen.
82
+
83
+ **När det är klart.** De berörda texterna visar rätt term i det norska flödet. Övriga
84
+ språk är oförändrade.
85
+
86
+ **Ingår inte.** Ingen ändring av flödets steg eller logik.
87
+
88
+ ## Påverkansanalys
89
+
90
+ **Berörda repon och filer.** Språkfilerna för norska i bokningsdelen, samt
91
+ versionsanteckningarna. Ingen kod med logik ändras. Ingen delad kod, ingen driftmiljö.
92
+
93
+ **Datalagring.** Ingen.
94
+
95
+ **Integrationspunkter.** Inga.
96
+
97
+ **Flöden.** Bokningen är en sekvens användaren passerar i ordning, men inget steg
98
+ ändras. Bara texten inuti stegen byts.
99
+
100
+ **Gränssnitt.** Inget nytt mönster. Texterna visas i befintliga fält, och de nya
101
+ formuleringarna är ungefär lika långa som de gamla.
102
+
103
+ **Verifiering.** Automatiska tester täcker att språkfilen laddas och att inga nycklar
104
+ saknas. Att texterna läser rätt i sitt sammanhang behöver ses över för hand en gång i
105
+ det norska flödet, eftersom en text kan vara korrekt i sig och ändå fel på sin plats.
106
+
107
+ **Konsekvens av fel.** Fel eller missvisande text visas för kunden. Inget beteende
108
+ ändras, ingen data påverkas, och en felaktig text går att rätta lika enkelt som den
109
+ lades in.
110
+
111
+ **Vägval.** Texterna byts på alla förekomster i språkfilen i stället för bara i det
112
+ ställe som anmäldes, eftersom samma felaktiga term används på flera ställen och ett
113
+ delvis byte hade gett två olika ord för samma sak.
114
+
115
+ **Antaganden.** Att den nya termen är den kunden själv använder. Bekräftad av
116
+ beställaren i ärendet.
117
+
118
+ **Beroenden.** Inga.
119
+
120
+ ---
121
+ ## Till granskaren
122
+ **Ej verifierat:** Om samma term förekommer i marknadsföringstexter utanför
123
+ applikationen.
124
+ **Avvikelse mot specen:** Ingen.
125
+
126
+ ---
127
+
128
+ # A2 · Visa ett kontonummer i användarens kontovy
129
+ **0,75 poäng · Kundvänd funktion**
130
+
131
+ ## Spec
132
+
133
+ **Problem.** Supportpersonalen ser inte vilket konto en användare tillhör när de läser
134
+ ett supportärende, utan måste slå upp det i ett annat system.
135
+
136
+ **Lösning.** Kontots identifierare visas i användarens kontovy och följer med när ett
137
+ supportärende skapas.
138
+
139
+ **När det är klart.** En användare som tillhör ett konto ser identifieraren i sin
140
+ kontovy. Ett supportärende som skapas innehåller samma identifierare.
141
+
142
+ **Ingår inte.** Identifieraren går inte att redigera.
143
+
144
+ ## Påverkansanalys
145
+
146
+ **Berörda repon och filer.** Innehållssystemets datamodell för konto, och webbklientens
147
+ kontovy. Klientens typdefinition för användare utökas. Ingen delad kod, ingen
148
+ driftmiljö.
149
+
150
+ **Datalagring.** Serverlagrad struktur ändras: kontots innehållstyp får ett nytt
151
+ valfritt textfält. Befintliga konton saknar värde, så ingen bakåtfyllning och ingen
152
+ driftsättningsordning krävs. Ingen klientlagring.
153
+
154
+ **Integrationspunkter.** Inga nya. Supportärendets skapande sker redan i systemet och
155
+ utökas med ett fält.
156
+
157
+ **Flöden.** Ingen sekvens ändras. Kontovyn nås från en plats.
158
+
159
+ **Gränssnitt.** Befintligt mönster återanvänds: fältet visas i den lista av
160
+ kontouppgifter som redan finns i vyn. Inget nytt mönster byggs.
161
+
162
+ **Verifiering.** Automatiska tester täcker att fältet visas när det finns och att vyn
163
+ fungerar när det saknas. Ingen manuell genomgång behövs.
164
+
165
+ **Konsekvens av fel.** Fel identifierare visas, eller ingen alls. Uppgiften är läsande
166
+ och styr ingen behörighet.
167
+
168
+ **Vägval.** Fältet läggs på kontots innehållstyp i stället för på användaren, eftersom
169
+ identifieraren hör till kontot och flera användare kan dela konto.
170
+
171
+ **Antaganden.** Att alla befintliga konton har en identifierare i källsystemet. Går att
172
+ verifiera genom att räkna konton utan värde efter en första inläsning.
173
+
174
+ **Beroenden.** Inga.
175
+
176
+ ---
177
+ ## Till granskaren
178
+ **Ej verifierat:** Om identifieraren är unik över alla konton. Den behandlas som en
179
+ visningsuppgift, inte som en nyckel.
180
+ **Avvikelse mot specen:** Ingen.
181
+
182
+ ---
183
+
184
+ # A3 · Härled landval ur webbadressens språkdel
185
+ **0,75 poäng · Kundvänd funktion**
186
+
187
+ ## Spec
188
+
189
+ **Problem.** I kassan får kunden välja land i en lista, trots att de redan kommit in via
190
+ en landsspecifik webbadress. Fel val ger fel frakt och fel moms.
191
+
192
+ **Lösning.** Landet härleds ur webbadressens språkdel och förväljs. Kunden kan fortfarande
193
+ byta.
194
+
195
+ **När det är klart.** En kund som kommer via en landsspecifik adress ser rätt land
196
+ förvalt. En kund på den generella adressen får välja som förut.
197
+
198
+ **Ingår inte.** Ingen ändring av vilka länder som är valbara.
199
+
200
+ ## Påverkansanalys
201
+
202
+ **Berörda repon och filer.** Två komponenter i butikens kassa: kassans behållare och
203
+ landvalssteget. Ingen delad kod, ingen serverdel, ingen driftmiljö.
204
+
205
+ **Datalagring.** Ingen. Språkdelen finns i adressen och landlistan hämtas som förut.
206
+
207
+ **Integrationspunkter.** Inga.
208
+
209
+ **Flöden.** Kassan är en sekvens användaren passerar i ordning, och ett av dess steg får
210
+ ett förvalt värde. Antalet steg ändras inte.
211
+
212
+ **Gränssnitt.** Befintligt mönster återanvänds: samma landväljare som förut, med ett
213
+ förvalt värde i stället för tomt.
214
+
215
+ **Verifiering.** Automatiska tester täcker att rätt land förväljs per språkdel och att
216
+ det generella fallet lämnar valet tomt. Att frakt och moms följer med det förvalda
217
+ landet behöver ses över för hand i kassan, eftersom det avgörs längre fram i flödet.
218
+
219
+ **Konsekvens av fel.** Fel förvalt land ger fel fraktkostnad och fel moms på ordern,
220
+ alltså felaktigt pris för kunden. Kunden kan rätta det själv, men det syns bara om de
221
+ tittar.
222
+
223
+ **Vägval.** Landet härleds ur adressens språkdel i stället för ur webbläsarens
224
+ språkinställning, eftersom adressen är det kunden faktiskt valt och
225
+ språkinställningen ofta står på något annat.
226
+
227
+ **Antaganden.** Att varje språkdel motsvarar exakt ett land. Går att verifiera mot
228
+ listan av publicerade adresser; håller det inte behövs en uttrycklig koppling i stället
229
+ för en härledning.
230
+
231
+ **Beroenden.** Inga.
232
+
233
+ ---
234
+ ## Till granskaren
235
+ **Ej verifierat:** Inget.
236
+ **Avvikelse mot specen:** Specen säger inte vad som ska hända för en språkdel som saknar
237
+ land. Implementationen lämnar valet tomt.
238
+
239
+ ---
240
+
241
+ # A4 · Gör en rad i en produktlista klickbar
242
+ **1 poäng · Kundvänd funktion**
243
+
244
+ ## Spec
245
+
246
+ **Problem.** I produktlistan går det bara att klicka på produktens namn. Kunder klickar
247
+ på bilden eller priset och ingenting händer.
248
+
249
+ **Lösning.** Hela raden blir klickbar och leder till produktsidan.
250
+
251
+ **När det är klart.** Klick var som helst på raden leder till rätt produktsida. Knappar
252
+ inuti raden fungerar oförändrat utan att raden aktiveras.
253
+
254
+ **Ingår inte.** Ingen ändring av produktsidan.
255
+
256
+ ## Påverkansanalys
257
+
258
+ **Berörda repon och filer.** En komponent i butikens gränssnitt med tillhörande
259
+ formatmall. Används av en butik. Ingen serverdel, ingen driftmiljö.
260
+
261
+ **Datalagring.** Ingen. Länkmålet finns redan i den produktdata komponenten tar emot.
262
+
263
+ **Integrationspunkter.** Inga.
264
+
265
+ **Flöden.** Ingen sekvens ändras. Produktsidan var redan nåbar från raden, nu från en
266
+ större yta av samma rad.
267
+
268
+ **Gränssnitt.** Befintligt mönster återanvänds: samma länkelement som omslöt namnet
269
+ omsluter nu raden. Formatmallen justeras så att den inre knappen behåller sitt
270
+ klickområde.
271
+
272
+ **Verifiering.** Automatiska tester täcker att klick på raden navigerar rätt och att
273
+ klick på den inre knappen inte gör det. Ingen manuell genomgång behövs.
274
+
275
+ **Konsekvens av fel.** Klick på knappen inuti raden kan råka navigera i stället för att
276
+ lägga i varukorgen. Irriterande men ofarligt; ingen data påverkas.
277
+
278
+ **Vägval.** Raden omsluts av ett länkelement i stället för att lyssna på klick i
279
+ JavaScript, eftersom det bevarar öppna i ny flik och fungerar för skärmläsare.
280
+
281
+ **Antaganden.** Inga.
282
+
283
+ **Beroenden.** Inga.
284
+
285
+ ---
286
+ ## Till granskaren
287
+ **Ej verifierat:** Inget.
288
+ **Avvikelse mot specen:** Ingen.
289
+
290
+ ---
291
+
292
+ # A5 · Säkerhetsuppdatering av beroenden
293
+ **2 poäng · Underhåll**
294
+
295
+ ## Spec
296
+
297
+ **Problem.** Säkerhetsgenomsökningen rapporterar kända sårbarheter i flera av
298
+ applikationens beroenden.
299
+
300
+ **Lösning.** Beroendena uppdateras till versioner utan kända sårbarheter. Ändringarna
301
+ dokumenteras i versionsanteckningarna.
302
+
303
+ **När det är klart.** Genomsökningen rapporterar inga kvarstående sårbarheter av hög
304
+ allvarlighetsgrad. Applikationen bygger och testsviten går igenom.
305
+
306
+ **Ingår inte.** Ingen uppgradering av huvudramverket till ny huvudversion.
307
+
308
+ ## Påverkansanalys
309
+
310
+ **Berörda repon och filer.** Beroendeförteckningarna för både serverdelen och
311
+ klientdelen, samt versionsanteckningarna. Ingen egen kod ändras. Ingen driftmiljö, men
312
+ en driftsättning krävs för att uppdateringarna ska nå produktion.
313
+
314
+ **Datalagring.** Ingen.
315
+
316
+ **Integrationspunkter.** Inga nya. Befintliga beroenden byter version, vilket i sig kan
317
+ ändra beteende hos de bibliotek som talar med externa tjänster.
318
+
319
+ **Flöden.** Ingen sekvens ändras avsiktligt. En beteendeändring i ett beroende kan
320
+ däremot slå var som helst, vilket är hela svårigheten i posten.
321
+
322
+ **Gränssnitt.** Inget nytt mönster. Beroenden som påverkar utseende kan ge små visuella
323
+ skillnader.
324
+
325
+ **Verifiering.** Den automatiska testsviten är huvudkontrollen och täcker applikationens
326
+ egen logik. Eftersom ändringen kan slå brett behöver de mest använda vyerna dessutom
327
+ gås igenom för hand i testmiljö, som ett stickprov snarare än en fullständig genomgång.
328
+
329
+ **Konsekvens av fel.** En beteendeändring i ett beroende kan bryta befintlig funktion på
330
+ ett ställe ingen tänkt på, och felet upptäcks då först i drift. Å andra sidan är
331
+ alternativet att låta kända sårbarheter stå kvar.
332
+
333
+ **Vägval.** Uppdateringarna görs i en samlad omgång i stället för en i taget, eftersom
334
+ flera av dem har beroenden till varandra och en i taget hade krävt lika många
335
+ driftsättningar. Huvudramverkets huvudversion lämnas orörd och hanteras som en egen
336
+ post, eftersom den för med sig ändringar i egen kod.
337
+
338
+ **Antaganden.** Att testsvitens täckning räcker för att fånga de vanligaste
339
+ regressionerna. Går att verifiera genom att läsa täckningsrapporten innan uppdateringen
340
+ görs.
341
+
342
+ **Beroenden.** Inga.
343
+
344
+ ---
345
+ ## Till granskaren
346
+ **Ej verifierat:** Om något av de uppdaterade beroendena har ändringar som bryter mot
347
+ tidigare beteende. Ändringsloggarna är lästa men inte alla i detalj.
348
+ **Avvikelse mot specen:** Ingen.
349
+
350
+ ---
351
+
352
+ # A6 · Normalisera filnamn vid uppladdning
353
+ **2,25 poäng · Kundvänd funktion**
354
+
355
+ ## Spec
356
+
357
+ **Problem.** Uppladdade filer behåller sina originalnamn. Namn med mellanslag, svenska
358
+ tecken eller versaler ger trasiga länkar och dubbletter.
359
+
360
+ **Lösning.** Filnamnet normaliseras vid uppladdning: gemener, bindestreck i stället för
361
+ mellanslag, och svenska tecken översatta. Redan uppladdade filer lämnas orörda.
362
+
363
+ **När det är klart.** En fil med mellanslag och svenska tecken i namnet får ett rensat
364
+ namn och en fungerande länk. Två filer med samma normaliserade namn krockar inte.
365
+
366
+ **Ingår inte.** Ingen omdöpning av befintliga filer.
367
+
368
+ ## Påverkansanalys
369
+
370
+ **Berörda repon och filer.** En ny namngivningsstrategi i e-handelsplattformen, samt
371
+ plattformens konfiguration där strategin registreras. Strategin gäller alla
372
+ uppladdningar i installationen, alltså både administratörers och kunders.
373
+
374
+ **Datalagring.** Ingen strukturändring. Filnamnet som lagras för nya filer får ett annat
375
+ format än tidigare, vilket innebär att lagringen från och med nu innehåller två
376
+ namnformat sida vid sida.
377
+
378
+ **Integrationspunkter.** Inga nya. Filerna lagras där de lagrades förut.
379
+
380
+ **Flöden.** Ingen sekvens ändras. Uppladdning nås från flera ställen i administrationen,
381
+ alltså flera ingångar till samma åtgärd, och alla får den nya namngivningen.
382
+
383
+ **Gränssnitt.** Inget nytt mönster. Ändringen är osynlig i gränssnittet utom genom att
384
+ det visade filnamnet ser annorlunda ut.
385
+
386
+ **Verifiering.** Automatiska tester täcker normaliseringen för mellanslag, versaler,
387
+ svenska tecken och krockande namn. Att länken till filen fungerar efter uppladdning
388
+ behöver kontrolleras för hand en gång, eftersom det involverar lagringen.
389
+
390
+ **Konsekvens av fel.** En felaktig normalisering kan ge två filer samma namn, så att den
391
+ ena skriver över den andra. Det är förlust av data som inte går att återskapa, och det
392
+ är därför krockhanteringen är den viktigaste delen av posten.
393
+
394
+ **Vägval.** Normaliseringen läggs som en strategi i plattformens egen
395
+ uppladdningsmekanik i stället för i varje anropande vy, så att den gäller alla
396
+ uppladdningsvägar utan att någon behöver komma ihåg den. Befintliga filer lämnas orörda,
397
+ eftersom en omdöpning hade brutit alla länkar som redan pekar på dem.
398
+
399
+ **Antaganden.** Att inga befintliga länkar innehåller filnamn som skulle ändras. Går att
400
+ verifiera med en genomsökning av innehållet.
401
+
402
+ **Beroenden.** Inga.
403
+
404
+ ---
405
+ ## Till granskaren
406
+ **Ej verifierat:** Om lagringen är skiftlägeskänslig. Normaliseringen till gemener gör
407
+ frågan mindre viktig men inte irrelevant.
408
+ **Avvikelse mot specen:** Ingen.
409
+
410
+ ---
411
+
412
+ # A7 · Konfigurerbart spårningsskript per webbplats
413
+ **2,5 poäng · Teknisk uppsättning**
414
+
415
+ ## Spec
416
+
417
+ **Problem.** Spårningsskriptet för webbanalys är hårdkodat. Varje ny webbplats kräver en
418
+ kodändring och en driftsättning för att få sin egen mätning.
419
+
420
+ **Lösning.** Skriptets identifierare läggs som en inställning i innehållssystemet och
421
+ läses in när sidan byggs. Saknas den laddas inget skript.
422
+
423
+ **När det är klart.** En webbplats med angiven identifierare får skriptet i sidhuvudet.
424
+ En utan får inget skript och inga fel i webbläsarkonsolen.
425
+
426
+ **Ingår inte.** Ingen konfiguration av vad som mäts.
427
+
428
+ ## Påverkansanalys
429
+
430
+ **Berörda repon och filer.** Innehållssystemets globala inställningar, samt
431
+ webbklientens rotlayout, dess ruttdefinitioner och en ny omslutande komponent som lägger
432
+ in skriptet. Ingen delad kod. Ingen driftmiljö, eftersom värdet nu kommer ur
433
+ innehållssystemet i stället för ur en miljövariabel.
434
+
435
+ **Datalagring.** Serverlagrad struktur ändras: den globala inställningstypen får ett nytt
436
+ textfält. Det är en enda rad i systemet, så ingen datamigrering krävs.
437
+
438
+ **Integrationspunkter.** Ett externt spårningsskript laddas från tredje part. Nytt som
439
+ konfigurerbar integration; skriptet självt användes redan hårdkodat.
440
+
441
+ **Flöden.** Ingen sekvens ändras. Skriptet laddas på varje sida, alltså vid varje ingång.
442
+
443
+ **Gränssnitt.** Inget synligt gränssnitt byggs. Den nya komponenten är teknisk och saknar
444
+ egen visuell form. Inställningen redigeras i innehållssystemets befintliga formulär.
445
+
446
+ **Verifiering.** Automatiska tester täcker att skriptet läggs in när identifieraren finns
447
+ och utelämnas när den saknas. Att skriptet faktiskt rapporterar till rätt mottagare går
448
+ inte att bevisa automatiskt och behöver kontrolleras för hand en gång per miljö.
449
+
450
+ **Konsekvens av fel.** Fel identifierare skickar mätdata till fel mottagare. Mätdata som
451
+ gått fel är svår att ta tillbaka. Ett skript som laddas felaktigt kan fördröja
452
+ sidladdningen.
453
+
454
+ **Vägval.** Skriptet läggs in genom en omslutande komponent i rotlayouten i stället för
455
+ i det statiska sidhuvudet, eftersom värdet nu är dynamiskt. Alternativet hade krävt en
456
+ byggtidsvariabel och därmed en driftsättning per ändring, vilket är precis problemet som
457
+ skulle lösas.
458
+
459
+ **Antaganden.** Att en webbplats bara behöver ett spårningsskript. Går att verifiera med
460
+ förvaltningen; om flera behövs blir fältet en lista.
461
+
462
+ **Beroenden.** Inga.
463
+
464
+ ---
465
+ ## Till granskaren
466
+ **Ej verifierat:** Om identifieraren behöver skilja sig mellan test och drift för samma
467
+ webbplats. Fältet är i dag ett per webbplats.
468
+ **Avvikelse mot specen:** Ingen.
469
+
470
+ ---
471
+
472
+ # A8 · Kundmatchning mot affärssystem via momsnummer
473
+ **3 poäng · Integration**
474
+
475
+ ## Spec
476
+
477
+ **Problem.** Ordrar från företagskunder hamnar ibland på fel kund i affärssystemet, för
478
+ att kundnumret eller organisationsnumret inte matchar. Ordern måste då flyttas för hand.
479
+
480
+ **Lösning.** Matchningen mot affärssystemet försöker med kundnummer först, sedan
481
+ organisationsnummer, och slutligen momsnummer. Hittas ingen kund skapas ingen order på
482
+ fel kund utan ärendet flaggas.
483
+
484
+ **När det är klart.** En order från en kund som bara går att matcha på momsnummer hamnar
485
+ på rätt kund. En order som inte matchar alls skapas inte, utan flaggas för manuell
486
+ hantering.
487
+
488
+ **Ingår inte.** Ingen ändring av hur kunder skapas i affärssystemet.
489
+
490
+ ## Påverkansanalys
491
+
492
+ **Berörda repon och filer.** Kopplingen mot affärssystemet: de anrop som slår upp kund,
493
+ och de frågor som definierar vad som hämtas. Kopplingen används av en kund. Ingen
494
+ driftmiljö.
495
+
496
+ **Datalagring.** Ingen strukturändring. Uppslaget läser ur affärssystemet, och resultatet
497
+ avgör vilken kund ordern knyts till.
498
+
499
+ **Integrationspunkter.** Affärssystemet är en befintlig extern integration. Ett nytt
500
+ uppslagssätt läggs till på ett befintligt anrop, alltså ingen ny koppling.
501
+
502
+ **Flöden.** Ingen sekvens som användaren passerar. Matchningen sker i bakgrunden när en
503
+ order förs över.
504
+
505
+ **Gränssnitt.** Inget. Flaggningen av omatchade ordrar syns i den befintliga listan över
506
+ ärenden som kräver hantering.
507
+
508
+ **Verifiering.** Automatiska tester täcker matchningsordningen och att ingen order skapas
509
+ när alla tre uppslagen misslyckas. Att uppslaget mot affärssystemet faktiskt returnerar
510
+ det som förväntas behöver provas för hand mot systemets testmiljö, för en kund som bara
511
+ har momsnummer och en som inte finns alls.
512
+
513
+ **Konsekvens av fel.** En order kan hamna på fel kund, vilket innebär att en kunds
514
+ uppgifter och köp syns för en annan, och att fakturan går till fel mottagare. Det är
515
+ felet posten finns för att åtgärda, så en felaktig lösning gör problemet värre snarare än
516
+ oförändrat.
517
+
518
+ **Vägval.** Uppslagen görs i tur och ordning med momsnummer sist, eftersom det är det
519
+ minst tillförlitliga av de tre och bara ska användas när de säkrare misslyckats.
520
+ Omatchade ordrar flaggas i stället för att skapas på en uppsamlingskund, eftersom en
521
+ felplacerad order är svårare att upptäcka än en som saknas.
522
+
523
+ **Antaganden.** Att momsnummer är unikt per kund i affärssystemet. Går att verifiera med
524
+ en fråga mot systemet som räknar dubbletter.
525
+
526
+ **Beroenden.** Inga.
527
+
528
+ ---
529
+ ## Till granskaren
530
+ **Ej verifierat:** Hur många av de historiska felplacerade ordrarna som skulle ha matchat
531
+ på momsnummer. Det avgör hur mycket posten faktiskt löser.
532
+ **Avvikelse mot specen:** Specen säger inte vad som ska hända med de ordrar som redan
533
+ hamnat fel. Ingen rättning av historiken ingår.
534
+
535
+ ---
536
+
537
+ # A9 · Låt administratörer sätta en kunds lösenord
538
+ **4 poäng · Internt verktyg**
539
+
540
+ ## Spec
541
+
542
+ **Problem.** När en kund inte kan logga in måste supporten be dem gå igenom
543
+ återställningsflödet själva. För kunder som inte når sin mejl går det inte alls.
544
+
545
+ **Lösning.** En administratör kan sätta ett nytt lösenord för en kund direkt i
546
+ administrationsgränssnittet. Åtgärden loggas i kundens historik.
547
+
548
+ **När det är klart.** En administratör med rätt behörighet kan sätta ett nytt lösenord
549
+ och kunden kan logga in med det. En administratör utan behörighet ser inte funktionen.
550
+ Åtgärden syns i kundens händelsehistorik med vem som utförde den.
551
+
552
+ **Ingår inte.** Ingen förändring av kundens egen återställning via mejl.
553
+
554
+ ## Påverkansanalys
555
+
556
+ **Berörda repon och filer.** Ett nytt instick i e-handelsplattformen, med en serverdel som
557
+ exponerar åtgärden, en behörighetsdefinition, och en gränssnittsdel som lägger till
558
+ fältet på kundens detaljsida och en post i händelsehistoriken. Bygget av
559
+ administrationsgränssnittet konfigureras om för att inkludera insticket. Insticket ligger
560
+ i kundens egen installation och delas inte. Administrationsgränssnittet måste byggas om
561
+ vid driftsättning.
562
+
563
+ **Datalagring.** Ingen ny struktur. Lösenordet skrivs genom plattformens befintliga
564
+ mekanik, som hashar värdet. Händelsehistoriken använder plattformens befintliga
565
+ historikpost.
566
+
567
+ **Integrationspunkter.** Inga externa.
568
+
569
+ **Flöden.** Ingen sekvens ändras. Åtgärden nås från kundens detaljsida, som är en ingång.
570
+
571
+ **Gränssnitt.** Ett nytt fält och en knapp på en befintlig detaljsida, med plattformens
572
+ egna formulärkomponenter. Historikposten använder plattformens befintliga mönster.
573
+ Översättningar läggs till på två språk.
574
+
575
+ **Verifiering.** Automatiska tester täcker att åtgärden avvisas utan rätt behörighet och
576
+ att lösenordet ändras med den. Att kunden faktiskt kan logga in med det nya lösenordet
577
+ involverar butikens inloggning och behöver provas för hand. Behörighetsspärren behöver
578
+ också ses över för hand i gränssnittet, eftersom en dold knapp inte är samma sak som en
579
+ skyddad åtgärd.
580
+
581
+ **Konsekvens av fel.** En administratör utan rätt behörighet skulle kunna sätta en kunds
582
+ lösenord och därmed komma åt kundens konto, alltså felaktig åtkomst till en annan persons
583
+ uppgifter. Ett fel i lösenordshanteringen kan också låsa ute kunden helt.
584
+ Behörighetsmekaniken som används är plattformens etablerade.
585
+
586
+ **Vägval.** Åtgärden byggs som ett eget instick i stället för som en ändring i
587
+ plattformens kärna, eftersom det överlever framtida uppgraderingar. Lösenordet sätts
588
+ genom plattformens egen mekanik i stället för genom direkt skrivning, så att hashning och
589
+ regler för lösenordsstyrka gäller oförändrat.
590
+
591
+ **Antaganden.** Att en administratörsroll med den nya behörigheten går att tilldela. Går
592
+ att verifiera i rolladministrationen.
593
+
594
+ **Beroenden.** Inga.
595
+
596
+ ---
597
+ ## Till granskaren
598
+ **Ej verifierat:** Om kunden ska aviseras när lösenordet ändras av en administratör.
599
+ **Avvikelse mot specen:** Specen nämner inte behörighetsnivå. Åtgärden har lagts bakom en
600
+ egen behörighet, vilket är ett utfallsval specen inte besvarat.
601
+
602
+ ---
603
+
604
+ # A10 · Förpackningsstorlek med decimaler
605
+ **4 poäng · Kundvänd funktion**
606
+
607
+ ## Spec
608
+
609
+ **Problem.** Förpackningsstorlek anges bara i heltal. Produkter som säljs i halva
610
+ förpackningar eller med decimalvikt går inte att ange rätt, vilket ger fel fraktpris.
611
+
612
+ **Lösning.** Förpackningsstorlek kan anges med decimaler. Antal decimaler och enhet
613
+ konfigureras per installation.
614
+
615
+ **När det är klart.** En produkt kan få en förpackningsstorlek med decimaler, den visas
616
+ med rätt antal decimaler i butiken, och fraktberäkningen använder det exakta värdet.
617
+ Befintliga heltalsvärden fungerar oförändrat.
618
+
619
+ **Ingår inte.** Ingen ändring av fraktprismodellen i sig.
620
+
621
+ ## Påverkansanalys
622
+
623
+ **Berörda repon och filer.** Ett instick för förpackningsstorlek i ett delat
624
+ paketbibliotek: insticket självt, dess gränssnitt utåt och dess dokumentation.
625
+ **Insticket är delad kod och används av flera kunders installationer**, så ändringen når
626
+ fler än den som beställt den.
627
+
628
+ **Datalagring.** Serverlagrad struktur påverkas: fältets datatyp går från heltal till
629
+ decimaltal. Befintliga värden är giltiga decimaltal, så migreringen är en typändring
630
+ utan omräkning, men den måste köras innan den nya koden driftsätts, annars avvisas
631
+ skrivningar.
632
+
633
+ **Integrationspunkter.** Inga nya. Fraktberäkningen läser fältet som förut.
634
+
635
+ **Flöden.** Ingen sekvens ändras.
636
+
637
+ **Gränssnitt.** Inget nytt mönster. Fältet i administrationen byter från heltalsfält till
638
+ decimalfält med konfigurerbart antal decimaler.
639
+
640
+ **Verifiering.** Automatiska tester täcker att decimalvärden sparas och läses, att
641
+ befintliga heltal fungerar, och att avrundningen följer konfigurationen. Att fraktpriset
642
+ faktiskt blir rätt behöver kontrolleras för hand för minst ett decimalfall, eftersom det
643
+ avgörs i beräkningen längre fram.
644
+
645
+ **Konsekvens av fel.** Fel avrundning ger fel fraktpris, alltså att kunden debiteras fel
646
+ belopp. Eftersom insticket är delat kan felet dessutom slå hos kunder som inte begärt
647
+ ändringen och som inte vet att den skett.
648
+
649
+ **Vägval.** Antal decimaler görs konfigurerbart i stället för att sättas till ett fast
650
+ antal, eftersom de installationer som delar insticket har olika enheter och ett fast
651
+ antal hade tvingat fram en ny ändring för nästa kund. Datatypen ändras i botten i stället
652
+ för att lagra decimaltal som text, så att beräkningar kan ske i databasen.
653
+
654
+ **Antaganden.** Att inga befintliga installationer förutsätter heltal i sin egen
655
+ fraktberäkning. Går att verifiera genom att söka igenom de installationer som använder
656
+ insticket.
657
+
658
+ **Beroenden.** Migreringen måste köras före driftsättning i varje installation som
659
+ använder insticket.
660
+
661
+ ---
662
+ ## Till granskaren
663
+ **Ej verifierat:** Vilka installationer som i dag använder insticket. Listan är hämtad ur
664
+ paketberoenden och kan vara ofullständig.
665
+ **Avvikelse mot specen:** Specen talar om en installation. Insticket är delat, så
666
+ ändringen berör flera, vilket specen inte förhåller sig till.
667
+
668
+ ---
669
+
670
+ # A11 · Hantera felaktigt pris vid sidladdning i betalflödet
671
+ **7 poäng · Integration**
672
+
673
+ ## Spec
674
+
675
+ **Problem.** När kunden laddar om betalsidan visas ibland ett pris som inte stämmer med
676
+ ordern, eftersom betalleverantörens vy skapas innan orderns rader hunnit uppdateras.
677
+
678
+ **Lösning.** Betalvyn skapas först när ordern är i ett stabilt läge. Ändras ordern medan
679
+ betalvyn är öppen laddas den om med rätt belopp.
680
+
681
+ **När det är klart.** En kund som ändrar sin varukorg och går tillbaka till betalningen
682
+ ser rätt belopp. En omladdning av betalsidan visar rätt belopp. Ett betalförsök på ett
683
+ inaktuellt belopp går inte att slutföra.
684
+
685
+ **Ingår inte.** Ingen ändring av vilka betalsätt som erbjuds.
686
+
687
+ ## Påverkansanalys
688
+
689
+ **Berörda repon och filer.** Ett instick för betalleverantören i ett delat
690
+ paketbibliotek: gränssnittet som skapar betalvyn, tjänsten som talar med leverantören,
691
+ och lyssnaren på ändringar i orderrader. **Insticket är delad kod och används av flera
692
+ installationer.**
693
+
694
+ **Datalagring.** Ingen strukturändring. Orderns befintliga tillstånd läses för att avgöra
695
+ om den är stabil.
696
+
697
+ **Integrationspunkter.** Betalleverantören är en befintlig extern integration. Anropet som
698
+ skapar betalvyn ändras till att returnera ett återanvändbart fragment i stället för en
699
+ färdig vy, vilket är en ändring i hur integrationen används snarare än en ny koppling.
700
+
701
+ **Flöden.** Kassan är en sekvens användaren passerar i ordning. Betalsteget ändras, och
702
+ återgången till tidigare steg och tillbaka ändras. Betalsidan nås dessutom genom
703
+ omladdning, alltså finns flera vägar in till samma steg.
704
+
705
+ **Gränssnitt.** Inget nytt mönster byggs; betalleverantörens egen vy återges som förut. En
706
+ laddningsindikering återanvänds från befintliga komponenter medan vyn byggs om.
707
+
708
+ **Verifiering.** Automatiska tester täcker att betalvyn inte skapas på en instabil order
709
+ och att lyssnaren utlöser omladdning vid ändring. Hela kedjan behöver provas för hand mot
710
+ betalleverantörens testläge, i minst tre fall: ändrad varukorg med återgång, omladdning av
711
+ betalsidan, och betalförsök på ett inaktuellt belopp.
712
+
713
+ **Konsekvens av fel.** En kund kan debiteras ett annat belopp än ordern visar, alltså
714
+ felaktig betalning. Det kan slå åt båda håll och upptäcks ofta först i avstämningen mot
715
+ betalleverantören. Eftersom insticket är delat kan felet nå kunder som inte begärt
716
+ ändringen.
717
+
718
+ **Vägval.** Betalvyn byggs om vid ändring i stället för att låsas mot ändringar, eftersom
719
+ en låst varukorg i kassan hade ändrat vad kunden kan göra och det är ett utfall specen
720
+ inte tar ställning till. Stabilitetskontrollen läggs i insticket i stället för i
721
+ butikens gränssnitt, så att den gäller alla installationer som använder betalsättet.
722
+
723
+ **Antaganden.** Att betalleverantörens fragment går att återge flera gånger på samma sida
724
+ utan att deras egen kod ställer till det. Går att verifiera med ett provanrop innan
725
+ bygget.
726
+
727
+ **Beroenden.** Inga.
728
+
729
+ ---
730
+ ## Till granskaren
731
+ **Ej verifierat:** Hur betalleverantören beter sig om ordern ändras i samma ögonblick som
732
+ betalningen bekräftas. Kapplöpningen är inte utesluten.
733
+ **Avvikelse mot specen:** Specen säger att ett betalförsök på inaktuellt belopp inte ska
734
+ gå att slutföra, men inte vad kunden ska se när det inträffar.
735
+
736
+ ---
737
+
738
+ # A12 · Förbättrad kartvy för val av upphämtningsplats
739
+ **9 poäng · Kundvänd funktion**
740
+
741
+ ## Spec
742
+
743
+ **Problem.** Kartan där kunden väljer upphämtningsplats visar bara de platser som fanns
744
+ vid första sökningen. Drar kunden kartan åt sidan syns inga nya platser, och på mobil
745
+ täcker kartan hela skärmen så att sökrutan försvinner.
746
+
747
+ **Lösning.** Kartan laddar platser för det område som visas när kunden slutat dra. Kartan
748
+ visas först efter en sökning, och dess höjd anpassas så att sökrutan är kvar. Ett besked
749
+ visas när området saknar platser.
750
+
751
+ **När det är klart.** Kunden kan dra kartan och se nya platser laddas. Ett område utan
752
+ platser ger ett besked i stället för en tom karta. På mobil syns både karta och sökruta
753
+ samtidigt.
754
+
755
+ **Ingår inte.** Ingen ändring av hur platser hämtas eller vilka som visas.
756
+
757
+ ## Påverkansanalys
758
+
759
+ **Berörda repon och filer.** Kartkomponenten i butikens gränssnitt och dess formatmall.
760
+ Komponenten används av en butik. Ingen serverdel utöver den befintliga sökningen efter
761
+ platser, ingen driftmiljö.
762
+
763
+ **Datalagring.** Ingen. Platser hämtas vid behov och hålls i komponentens eget minne under
764
+ sessionen.
765
+
766
+ **Integrationspunkter.** Karttjänsten är en befintlig extern integration. Nytt är att
767
+ komponenten lyssnar på när kunden slutat dra och gör en ny sökning på det synliga
768
+ området, vilket ger fler anrop än förut.
769
+
770
+ **Flöden.** Val av upphämtningsplats är ett steg i kassans sekvens. Steget ändras men
771
+ antalet steg är detsamma. Kartan nås både från kassan och från en fristående sökning,
772
+ alltså två ingångar till samma vy.
773
+
774
+ **Gränssnitt.** Ett nytt mönster byggs för mobilvyn: kartans höjd och lagerordning
775
+ anpassas så att sökrutan ligger kvar ovanpå. Beskedet för tomt område är en ny textyta i
776
+ befintligt formspråk.
777
+
778
+ **Verifiering.** Automatiska tester täcker att en ny sökning utlöses när dragningen
779
+ avslutas och att beskedet visas för ett tomt område. Kartans beteende går inte att
780
+ bevisa automatiskt: dragning, laddning under dragning och höjdanpassningen behöver gås
781
+ igenom för hand på både mobil och dator, och i minst två skärmstorlekar på mobil.
782
+
783
+ **Konsekvens av fel.** Kunden kan välja en upphämtningsplats som inte längre finns, eller
784
+ inte hitta någon plats alls och avbryta köpet. Ingen betalning eller data påverkas
785
+ felaktigt, men ett fel i kassan stoppar köp.
786
+
787
+ **Vägval.** Ny sökning görs när dragningen avslutats i stället för löpande under
788
+ dragningen, eftersom det senare hade gett många anrop mot karttjänsten och en ryckig
789
+ upplevelse. Kartan visas först efter en sökning i stället för direkt vid sidladdning, så
790
+ att kunden inte möts av en karta utan innehåll.
791
+
792
+ **Antaganden.** Att karttjänstens anropsgräns tål det ökade antalet sökningar. Går att
793
+ verifiera mot tjänstens villkor och nuvarande förbrukning.
794
+
795
+ **Beroenden.** Inga.
796
+
797
+ ---
798
+ ## Till granskaren
799
+ **Ej verifierat:** Hur många platser som laddas per område innan prestandan påverkas.
800
+ Ingen övre gräns är satt.
801
+ **Avvikelse mot specen:** Ingen.
802
+
803
+ ---
804
+
805
+ # A13 · Import av användare och konton från fil
806
+ **12 poäng · Internt verktyg**
807
+
808
+ ## Spec
809
+
810
+ **Problem.** Nya användare läggs in en och en för hand. Vid större påfyllningar tar det
811
+ dagar och blir fel.
812
+
813
+ **Lösning.** En administratör laddar upp en fil med användare och konton, får se vad som
814
+ kommer att skapas eller uppdateras, och bekräftar innan något skrivs. Rader med fel visas
815
+ med orsak och hindrar inte de övriga.
816
+
817
+ **När det är klart.** En korrekt fil skapar användare och konton och kopplar dem rätt. En
818
+ fil med några felaktiga rader importerar de korrekta och listar de felaktiga med orsak. En
819
+ avbruten import lämnar inget skrivet.
820
+
821
+ **Ingår inte.** Ingen schemaläggning av återkommande importer.
822
+
823
+ ## Påverkansanalys
824
+
825
+ **Berörda repon och filer.** Ett nytt instick i innehållssystemet med en gränssnittsdel
826
+ som har egen vy i administrationen, och en serverdel som tolkar, validerar och skriver.
827
+ Insticket har egen konfiguration, egna typdefinitioner, valideringsregler per fält och
828
+ egna översättningar. Innehållssystemets startkonfiguration ändras för att registrera det.
829
+ Delas inte. Ingen driftmiljö.
830
+
831
+ **Datalagring.** Serverlagrad struktur skrivs men ingen struktur ändras: befintliga
832
+ innehållstyper för användare och konto tar emot rader, och kopplingen mellan dem skapas i
833
+ samma skrivning. Uppladdad fil hålls i minnet under granskningssteget och lagras inte
834
+ permanent.
835
+
836
+ **Integrationspunkter.** Inga externa. Skrivningen sker genom innehållssystemets egna
837
+ gränssnitt.
838
+
839
+ **Flöden.** En ny sekvens i tre steg som administratören passerar i ordning: ladda upp
840
+ fil, granska vad som kommer att hända, bekräfta. Stegen har bestämd ordning och går inte
841
+ att nå var för sig.
842
+
843
+ **Gränssnitt.** Ett nytt mönster byggs. Administrationen har i dag ingen vy för
844
+ filuppladdning med granskningssteg, så uppladdningsytan, resultattabellen och
845
+ felredovisningen formges nytt inom systemets befintliga formspråk.
846
+
847
+ **Verifiering.** Automatiska tester täcker tolkning av filen, valideringsreglerna per fält
848
+ och att en avbruten import inte skriver något. Hela sekvensen behöver provas för hand,
849
+ eftersom den involverar filuppladdning i webbläsaren och tre steg som ska hänga ihop.
850
+ Minst tre fall: en korrekt fil, en med felaktiga rader och en som avbryts mitt i.
851
+
852
+ **Konsekvens av fel.** En felaktig import kan skapa användare med fel kontokoppling,
853
+ vilket ger en person tillgång till fel konto, och kan skriva över uppgifter på befintliga
854
+ användare. Eftersom importen skriver många rader i följd är felmängden potentiellt stor
855
+ och det finns ingen ångra-funktion. Granskningssteget finns just för att fånga detta före
856
+ skrivning.
857
+
858
+ **Vägval.** Importen byggs som ett eget instick med egen vy i stället för som en utökning
859
+ av en befintlig listvy, eftersom sekvensen med granskning före skrivning inte får plats i
860
+ det befintliga mönstret. Valideringen körs i två omgångar, först på filens form och sedan
861
+ per rad, så att en trasig fil avvisas direkt medan en i övrigt korrekt fil kan importeras
862
+ delvis.
863
+
864
+ **Antaganden.** Att filens kolumnuppsättning är stabil mellan påfyllningar. Går att
865
+ verifiera genom att jämföra de filer som använts hittills. Varierar den behöver
866
+ kolumnmappning bli en del av granskningssteget, vilket den inte är i dag.
867
+
868
+ **Beroenden.** Inga.
869
+
870
+ ---
871
+ ## Till granskaren
872
+ **Ej verifierat:** Om befintliga användare ska uppdateras eller hoppas över när de
873
+ förekommer i filen. Implementationen uppdaterar.
874
+ **Avvikelse mot specen:** Specen säger "skapar eller uppdaterar" utan att ange hur en
875
+ dubblett känns igen. Nyckeln har valts till användarens mejladress, vilket är ett
876
+ utfallsval specen inte besvarat.
877
+
878
+ ---
879
+
880
+ # A14 · Delad komponent för lägg i varukorg
881
+ **13 poäng · Kundvänd funktion**
882
+
883
+ ## Spec
884
+
885
+ **Problem.** Knappen för att lägga i varukorgen finns i tre olika versioner på olika ytor,
886
+ med olika beteende. Ändringar måste göras på tre ställen och glöms bort.
887
+
888
+ **Lösning.** En delad komponent ersätter de tre. Den hanterar antal med plus och minus,
889
+ bekräftelse innan en rad tas bort, och beteende för både inloggad och utloggad kund.
890
+
891
+ **När det är klart.** Samma komponent används på produktsida, i listor och i
892
+ varukorgswidgeten, med samma beteende. Att ändra antal till noll frågar innan raden tas
893
+ bort. Befintliga ytor beter sig som förut eller bättre, aldrig sämre.
894
+
895
+ **Ingår inte.** Ingen ändring av kassan.
896
+
897
+ ## Påverkansanalys
898
+
899
+ **Berörda repon och filer.** En ny komponent i det delade komponentbiblioteket, en
900
+ komponent i butikens eget gränssnitt som bygger på den, en bekräftelsedialog, ikoner för
901
+ plus och minus, samt de tre ytor som byter till den nya komponenten: produktsidan,
902
+ produktlistans widget och inloggningsknappen i kassan. Formatmallar för knapp och dialog
903
+ justeras. **Komponentbiblioteket är delat mellan flera applikationer**, så ändringar i
904
+ knapp- och dialogformatet syns även utanför de tre ytorna.
905
+
906
+ **Datalagring.** Ingen strukturändring. Komponenten läser och ändrar den aktiva ordern
907
+ genom befintliga anrop.
908
+
909
+ **Integrationspunkter.** Inga externa.
910
+
911
+ **Flöden.** Ingen sekvens ändras. Komponenten används på tre ytor, alltså flera ingångar
912
+ till samma åtgärd, och det är just det som är skälet till posten.
913
+
914
+ **Gränssnitt.** Ett befintligt mönster förenas till ett. Bekräftelsedialogen före
915
+ borttagning är nytt beteende och behöver formges, men den bygger på biblioteket
916
+ befintliga dialogkomponent.
917
+
918
+ **Verifiering.** Automatiska tester täcker antalshanteringen, bekräftelsen vid noll och
919
+ beteendet för inloggad respektive utloggad kund. Att de tre ytorna faktiskt beter sig
920
+ likadant efter bytet går inte att bevisa automatiskt och behöver gås igenom för hand på
921
+ varje yta, i både inloggat och utloggat läge.
922
+
923
+ **Konsekvens av fel.** Fel antal kan hamna i varukorgen, eller en rad tas bort utan att
924
+ kunden avsett det, vilket ger fel order och fel belopp. Eftersom komponenten ersätter tre
925
+ befintliga kan ett fel dessutom bryta funktion som fungerade förut, på ytor som inte var i
926
+ fokus för ändringen.
927
+
928
+ **Vägval.** Komponenten läggs i det delade biblioteket i stället för i butikens egen kod,
929
+ eftersom syftet är att den ska kunna användas av flera applikationer. Bekräftelsen vid
930
+ noll läggs i komponenten i stället för på varje anropande yta, så att beteendet inte kan
931
+ glida isär igen, vilket är precis det problem posten ska lösa.
932
+
933
+ **Antaganden.** Att de tre befintliga versionerna inte har beteendeskillnader som någon
934
+ yta är beroende av. Går att verifiera genom att jämföra deras kod före bytet; en
935
+ skillnad som visar sig behövd måste bli en inställning på den delade komponenten.
936
+
937
+ **Beroenden.** Inga.
938
+
939
+ ---
940
+ ## Till granskaren
941
+ **Ej verifierat:** Om någon extern integration förlitar sig på den gamla komponentens
942
+ markering i sidan, till exempel för spårning.
943
+ **Avvikelse mot specen:** Specen säger att befintliga ytor aldrig ska bli sämre, men anger
944
+ inte vad som gäller om en yta har ett beteende de andra saknar.
945
+
946
+ ---
947
+
948
+ # A15 · Inloggning med extern e-legitimation, gränssnittsdelen
949
+ **16 poäng · Integration**
950
+
951
+ ## Spec
952
+
953
+ **Problem.** Kunder måste skapa lösenord för att handla, och många avbryter i det steget.
954
+ Butiken vill erbjuda inloggning med e-legitimation.
955
+
956
+ **Lösning.** Kunden kan logga in och registrera sig med e-legitimation. Inloggningen sker
957
+ i ett eget flöde med väntesteg medan legitimeringen pågår. Registrering av en ny kund
958
+ sker i två steg efter legitimeringen, där de uppgifter legitimationen ger fylls i
959
+ automatiskt. Inloggning med lösenord finns kvar.
960
+
961
+ **När det är klart.** En befintlig kund kan legitimera sig och blir inloggad. En ny kund
962
+ legitimerar sig, fyller i återstående uppgifter och får ett konto. Ett avbrutet eller
963
+ nekat försök leder tillbaka till inloggningsvalet med ett besked. Inloggning med lösenord
964
+ fungerar oförändrat.
965
+
966
+ **Ingår inte.** Ingen ändring av kassans betalflöde.
967
+
968
+ ## Påverkansanalys
969
+
970
+ **Berörda repon och filer.** Butikens gränssnittsdel: en ny komponentgrupp för
971
+ legitimering, ett omskrivet inloggningsformulär, ett tvåstegs registreringsflöde, samt
972
+ justeringar i de generella fält- och kryssrutekomponenterna. Två applikationer berörs,
973
+ butiken på webben och motsvarande mobilapplikation, som delar komponentbibliotek.
974
+ **Fält- och kryssrutekomponenterna är delade** och används av fler ytor än inloggningen,
975
+ så ändringar i dem syns på andra ställen. Widgetkonfigurationen utökas med de nya ytorna.
976
+
977
+ **Datalagring.** Ingen serverlagrad struktur ändras här; den delen ligger i serverdelen av
978
+ samma satsning. Klientlagring används för att hålla legitimeringens tillstånd mellan
979
+ väntesteg och återkomst, och rensas när flödet avslutas eller avbryts.
980
+
981
+ **Integrationspunkter.** Legitimeringstjänsten är extern och anropas genom serverdelen,
982
+ inte direkt från klienten. Ur gränssnittets perspektiv är integrationen ny, och den för
983
+ med sig väntetider och avbrottslägen som gränssnittet måste hantera.
984
+
985
+ **Flöden.** Två sekvenser som användaren passerar i ordning. Inloggningen har start,
986
+ väntesteg och utfall. Registreringen har två steg efter legitimeringen. Båda kan avbrytas
987
+ i varje läge och måste då lämna kunden i ett begripligt tillstånd. Inloggningsytan nås
988
+ dessutom från flera ställen i butiken, alltså flera ingångar till samma åtgärd.
989
+
990
+ **Gränssnitt.** Ett nytt mönster byggs. Väntesteget med statusbesked, avbrottsknapp och
991
+ återkomst finns inte i butiken sedan tidigare och formges nytt. Registreringsstegen
992
+ återanvänder befintliga formulärkomponenter i en ny stegindelning.
993
+
994
+ **Verifiering.** Automatiska tester täcker formulärens validering och att komponenterna
995
+ återger de tillstånd de får. Själva legitimeringen går inte att prova automatiskt,
996
+ eftersom den kräver den externa tjänstens testläge och en riktig legitimation. Hela kedjan
997
+ behöver gås igenom för hand för befintlig kund, ny kund, avbrutet försök och nekat försök,
998
+ på både webb och mobil eftersom flödet lämnar och återvänder till applikationen olika på
999
+ de två.
1000
+
1001
+ **Konsekvens av fel.** Ett fel i kopplingen mellan legitimering och konto kan logga in en
1002
+ kund på fel konto, alltså felaktig åtkomst till en annan persons uppgifter och
1003
+ orderhistorik. Ett fel i väntestegets tillståndshantering kan lämna kunden inloggad utan
1004
+ att legitimeringen fullföljts. De delade fält- och kryssrutekomponenterna används av
1005
+ andra formulär, så ett fel där kan bryta befintlig funktion utanför inloggningen.
1006
+
1007
+ **Vägval.** Legitimeringen anropas genom serverdelen i stället för direkt från klienten,
1008
+ eftersom nycklarna inte får finnas i webbläsaren. Väntesteget bygger på att klienten
1009
+ frågar serverdelen om status med jämna mellanrum i stället för att hålla en öppen
1010
+ förbindelse, eftersom det klarar att kunden byter flik eller låser skärmen.
1011
+ Registreringen delas i två steg i stället för ett långt formulär, så att de uppgifter
1012
+ legitimationen redan gett kan visas ifyllda innan kunden ombeds fylla i resten.
1013
+
1014
+ **Antaganden.** Att legitimeringstjänstens testläge går att nå från utvecklingsmiljön. Går
1015
+ att verifiera med ett provanrop innan bygget startar. Att mobilapplikationen kan återvända
1016
+ till rätt vy efter att legitimeringsappen öppnats — går att verifiera i mobilens
1017
+ testbygge, och om det inte fungerar krävs en annan återkomstmekanik.
1018
+
1019
+ **Beroenden.** Serverdelen som talar med legitimeringstjänsten måste finnas innan flödet
1020
+ kan provas i sin helhet.
1021
+
1022
+ ---
1023
+ ## Till granskaren
1024
+ **Ej verifierat:** Hur länge en påbörjad legitimering ska anses giltig innan väntesteget
1025
+ ger upp. Implementationen använder tjänstens egen gräns.
1026
+ **Avvikelse mot specen:** Specen säger att lösenordsinloggning finns kvar men inte om en
1027
+ kund som legitimerat sig också ska kunna sätta ett lösenord.
1028
+
1029
+ ---
1030
+
1031
+ # A16 · Strukturerad produktdata för sökmotorer
1032
+ **17 poäng · Kundvänd funktion**
1033
+
1034
+ ## Spec
1035
+
1036
+ **Problem.** Produktsidorna saknar strukturerad data, så sökmotorer visar dem utan pris,
1037
+ lagerstatus och omdömen. Konkurrenter syns med den informationen.
1038
+
1039
+ **Lösning.** Produktsidorna får strukturerad data med pris, tillgänglighet och de fält
1040
+ sökmotorernas handelsprogram kräver. Datan genereras i bakgrunden och uppdateras när
1041
+ produkten ändras. Vilka fält som ingår konfigureras per installation.
1042
+
1043
+ **När det är klart.** En produktsida innehåller strukturerad data som validerar mot
1044
+ sökmotorernas verktyg. Ändras pris eller lagerstatus uppdateras datan inom ett dygn. En
1045
+ installation som inte vill ha handelsfälten får bara grunddata.
1046
+
1047
+ **Ingår inte.** Ingen registrering hos sökmotorernas handelsprogram.
1048
+
1049
+ ## Påverkansanalys
1050
+
1051
+ **Berörda repon och filer.** Ett nytt instick som genererar strukturerad data, med en
1052
+ tjänst som bygger datan, en bakgrundsuppgift som håller den aktuell, egna typer och
1053
+ konstanter. Dessutom nya fält på produktvarianten, en migrering för dem, ett instick som
1054
+ länkar till butiken, och plattformens konfiguration. Även butikens egen konfiguration
1055
+ berörs, eftersom sidan ska återge datan. Ingen driftmiljö, men bakgrundsuppgiften måste
1056
+ vara igång i drift.
1057
+
1058
+ **Datalagring.** Serverlagrad struktur ändras: produktvarianten får flera nya fält, med en
1059
+ migrering. Fälten är valfria och saknar värde för befintliga produkter, så ingen
1060
+ bakåtfyllning krävs, men migreringen måste köras före driftsättning. Den genererade datan
1061
+ lagras för att slippa byggas om vid varje sidvisning.
1062
+
1063
+ **Integrationspunkter.** Inga anrop till externa system. Datan konsumeras av sökmotorer
1064
+ som läser sidan, alltså en ensidig koppling utan anrop åt något håll.
1065
+
1066
+ **Flöden.** Ingen sekvens användaren passerar. Genereringen sker i bakgrunden när en
1067
+ produkt ändras.
1068
+
1069
+ **Gränssnitt.** Inget kundvänt gränssnitt. De nya fälten redigeras i administrationens
1070
+ befintliga formulär för produktvarianter, med plattformens egna fältkomponenter.
1071
+
1072
+ **Verifiering.** Automatiska tester täcker att datan byggs med rätt innehåll, att den
1073
+ konfigurerbara delen respekteras och att bakgrundsuppgiften utlöses vid ändring. Att datan
1074
+ faktiskt godkänns av sökmotorernas valideringsverktyg går inte att bevisa i egna tester
1075
+ och behöver kontrolleras för hand mot verktygen, för minst en produkt med och en utan
1076
+ handelsfälten. Att uppdateringen sker inom ett dygn behöver följas upp i drift.
1077
+
1078
+ **Konsekvens av fel.** Felaktig strukturerad data kan ge sökmotorerna fel pris eller fel
1079
+ lagerstatus, vilket möter kunden som ett annat pris i sökresultatet än i butiken. I värsta
1080
+ fall kan sökmotorernas handelsprogram stänga av butiken för felaktig data, vilket tar tid
1081
+ att få tillbaka. Ingen order eller betalning påverkas direkt.
1082
+
1083
+ **Vägval.** Datan genereras i en bakgrundsuppgift och lagras i stället för att byggas vid
1084
+ varje sidvisning, eftersom den kräver flera uppslag och sidvisningarna är många.
1085
+ Fördröjningen på upp till ett dygn är priset för det, och den är godtagbar eftersom pris
1086
+ och lagerstatus i sökresultat ändå uppdateras med fördröjning hos sökmotorn. Vilka fält
1087
+ som ingår görs konfigurerbart, eftersom handelsprogrammens krav skiljer sig mellan
1088
+ marknader och ett fast fältset hade tvingat fram en ändring per installation.
1089
+
1090
+ **Antaganden.** Att produktens omdömen finns tillgängliga i systemet. Går att verifiera
1091
+ genom att söka efter fältet på produktvarianten; saknas de utgår den delen och kravet
1092
+ behöver tillbaka till specen.
1093
+
1094
+ **Beroenden.** Inga.
1095
+
1096
+ ---
1097
+ ## Till granskaren
1098
+ **Ej verifierat:** Om bakgrundsuppgiftens körintervall räcker för att hålla löftet om ett
1099
+ dygn vid stora produktkataloger.
1100
+ **Avvikelse mot specen:** Specen säger "de fält sökmotorernas handelsprogram kräver" utan
1101
+ att räkna upp dem. Fältuppsättningen är vald ur dagens dokumentation och kan ändras av
1102
+ sökmotorn.
1103
+
1104
+ ---
1105
+
1106
+ # Poängen samlat
1107
+
1108
+ | Ankare | Poäng | Typ | Uppdrag |
1109
+ | --- | --- | --- | --- |
1110
+ | A1 | 0,25 | Kundvänd funktion | Uppdatera texter i en översättningsfil |
1111
+ | A2 | 0,75 | Kundvänd funktion | Visa ett kontonummer i användarens kontovy |
1112
+ | A3 | 0,75 | Kundvänd funktion | Härled landval ur webbadressens språkdel |
1113
+ | A4 | 1 | Kundvänd funktion | Gör en rad i en produktlista klickbar |
1114
+ | A5 | 2 | Underhåll | Säkerhetsuppdatering av beroenden |
1115
+ | A6 | 2,25 | Kundvänd funktion | Normalisera filnamn vid uppladdning |
1116
+ | A7 | 2,5 | Teknisk uppsättning | Konfigurerbart spårningsskript per webbplats |
1117
+ | A8 | 3 | Integration | Kundmatchning mot affärssystem via momsnummer |
1118
+ | A9 | 4 | Internt verktyg | Låt administratörer sätta en kunds lösenord |
1119
+ | A10 | 4 | Kundvänd funktion | Förpackningsstorlek med decimaler |
1120
+ | A11 | 7 | Integration | Hantera felaktigt pris vid sidladdning i betalflödet |
1121
+ | A12 | 9 | Kundvänd funktion | Förbättrad kartvy för val av upphämtningsplats |
1122
+ | A13 | 12 | Internt verktyg | Import av användare och konton från fil |
1123
+ | A14 | 13 | Kundvänd funktion | Delad komponent för lägg i varukorg |
1124
+ | A15 | 16 | Integration | Inloggning med extern e-legitimation, gränssnittsdelen |
1125
+ | A16 | 17 | Kundvänd funktion | Strukturerad produktdata för sökmotorer |
1126
+
1127
+ ## Ett mönster värt att lägga märke till
1128
+
1129
+ A9 och A10 har samma poäng, 4, men ser olika ut. A9 bygger ett helt nytt instick med
1130
+ gränssnitt, behörighet och historik. A10 ändrar en datatyp i tre filer. Skillnaden är att
1131
+ A10 rör delad kod som används av flera installationer, vilket drar med sig migrering per
1132
+ installation och en risk som sträcker sig utanför beställaren.
1133
+
1134
+ Det är den sortens jämförelse skalan finns för. Antalet filer säger lite; vad ändringen
1135
+ drar med sig säger mycket.