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