SDFIdk / FIRE

🔥 FIRE - FIkspunktREgister
https://sdfidk.github.io/FIRE/
MIT License
4 stars 8 forks source link

Muliggør fejlmelding af observationer #738

Closed kbevers closed 2 months ago

kbevers commented 2 months ago

Fejlbehæftede observationer er konstateret i databasen. Dette pull request tilføjer funktionalitet til at fejlmelde dem, samt en tilføjelse af et unikt index på observationstabellen der forhindrer indsættelse af observationsdubletter.

En observation kan fejlmeldes med kommandoen fire luk observation som set i eksemplet herunder: billede

Efterfølgende vil denne observation fremgå som fjernet når den vises med fire info punkt: billede

kbevers commented 2 months ago

Ændringer, inklusiv oprydning i dubletter, er rullet ud på FIRETEST. Følgende SQL er afviklet:

-- tilføj fejlmeldt kolonne til observation
ALTER TABLE observation ADD fejlmeldt VARCHAR2(5);
COMMENT ON COLUMN observation.fejlmeldt IS 'Markering af at en observation er udgået fordi den er fejlbehæftet';

-- fyld `fejlmeldt` op
UPDATE observation SET fejlmeldt = 'false';

-- sæt `NOT NULL` constraint på observation.fejlmeldt
ALTER TABLE observation MODIFY fejlmeldt VARCHAR(5) NOT NULL;

-- tillad kun 'true' og 'false' som indhold i observation.fejlmeldt
ALTER TABLE
  observation
ADD
  CONSTRAINT observation_fejlmeldt CHECK (fejlmeldt IN ('true', 'false'));

-- opdater trigger der sikrer korrekt input ved opdateringer
CREATE OR REPLACE TRIGGER observation_au_trg
AFTER UPDATE ON observation
FOR EACH ROW
BEGIN
  IF :new.objektid != :old.objektid THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.objektid må ikke opdateres ');
  END IF;
  IF :new.registreringfra != :old.registreringfra THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.registreringfra må ikke opdateres ');
  END IF;
  IF :new.antal != :old.antal THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.antal må ikke opdateres ');
  END IF;
  IF :new.gruppe != :old.gruppe THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.gruppe må ikke opdateres ');
  END IF;
  IF :new.observationstypeid != :old.observationstypeid THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.observationstypeid må ikke opdateres ');
  END IF;
  IF :new.value1 != :old.value1 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value1 må ikke opdateres ');
  END IF;
  IF :new.value2 != :old.value2 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value2 må ikke opdateres ');
  END IF;
  IF :new.value3 != :old.value3 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value3 må ikke opdateres ');
  END IF;
  IF :new.value4 != :old.value4 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value4 må ikke opdateres ');
  END IF;
  IF :new.value5 != :old.value5 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value5 må ikke opdateres ');
  END IF;
  IF :new.value6 != :old.value6 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value6 må ikke opdateres ');
  END IF;
  IF :new.value7 != :old.value7 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value7 må ikke opdateres ');
  END IF;
  IF :new.value8 != :old.value8 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value8 må ikke opdateres ');
  END IF;
  IF :new.value9 != :old.value9 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value9 må ikke opdateres ');
  END IF;
  IF :new.value10 != :old.value10 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value10 må ikke opdateres ');
  END IF;
  IF :new.value11 != :old.value11 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value11 må ikke opdateres ');
  END IF;
  IF :new.value12 != :old.value12 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value12 må ikke opdateres ');
  END IF;
  IF :new.value13 != :old.value13 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value13 må ikke opdateres ');
  END IF;
  IF :new.value14 != :old.value14 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value14 må ikke opdateres ');
  END IF;
  IF :new.value15 != :old.value15 THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.value15 må ikke opdateres ');
  END IF;
  IF :new.sagseventfraid != :old.sagseventfraid THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.sagseventfraid må ikke opdateres ');
  END IF;
  IF :new.opstillingspunktid != :old.opstillingspunktid THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.opstillingspunktid må ikke opdateres ');
  END IF;
  IF :new.sigtepunktid != :old.sigtepunktid THEN
    RAISE_APPLICATION_ERROR(-20000,'observation.sigtepunktid må ikke opdateres ');
  END IF;

  IF :new.fejlmeldt != :old.fejlmeldt AND :new.registreringtil IS NULL THEN
    RAISE_APPLICATION_ERROR(-20001, 'Registreringtil skal sættes når en observation fejlmeldes');
  END IF;

END;
/

-- Sagshåndtering ifm observationsdubletter
INSERT INTO sag (
    id,
    registreringfra
) VALUES (
    'ab91c2df-475e-4fb7-b092-80e3198ec877',
    sysdate
);

INSERT INTO sagsinfo (
    aktiv,
    registreringfra,
    registreringtil,
    journalnummer,
    behandler,
    beskrivelse,
    sagsid
) VALUES (
    'true',
    sysdate,
    null,
    null,
    'Kristian Evers',
    'Fejlmelding og afregistrering af observationer der findes i to eller flere eksakte kopier',
    'ab91c2df-475e-4fb7-b092-80e3198ec877'
);

-- kommentar vedrørende sagens natur
INSERT INTO sagsevent (
    id,
    registreringfra,
    eventtypeid,
    sagsid
) VALUES (
    '625befd0-36cd-46d5-a467-79d9542cdcab',
    sysdate,
    9, -- kommentar
    'ab91c2df-475e-4fb7-b092-80e3198ec877'
);

INSERT INTO sagseventinfo (
    REGISTRERINGFRA,
    REGISTRERINGTIL,
    BESKRIVELSE,
    SAGSEVENTID
) VALUES (
    sysdate,
    null,
    'Oprydning i observationsdubletter. Der er identificiret omkring 1000 observation som er registreret i databasen 2 eller flere gange. For at rydde op i dette er følgende udtryk afviklet:
    UPDATE observation
    SET
        -- da der i flere tilfælde er 3 eller flere rækker med samme observationer tilføjes en tilfældig, ubetydelig 
        -- ændring på observationsværdien med henblik på at gøre alle afregistrerede dubletter unikke
        value1 = value1 + dbms_random.value * 0.000001, 
        registreringtil=registreringfra,
        fejlmeldt = ''true'',
        sagseventtilid = ''3c51d4a7-771f-41e7-9d64-b5505aeb764b''
    WHERE rowid NOT IN (
        -- første duplet (dem vi ikke vil ændre på)
        SELECT MIN(rowid)
        FROM observation
        GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
    )
        -- alle rækker med dupletter
        AND (observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid) IN (
        -- find duplet-værdier
        SELECT observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
        FROM observation
        GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid HAVING count(*) > 1
    );

Formålet med oprydningen i dubletterne er at bane vejen for et unikt index, der fremadrettet forhindrer muligheden for at dobbeltregistrere samme observation.
Forud for opdateringen er datamodellen udvidet med feltet "fejlmeldt" på observationstabellen.',
    '625befd0-36cd-46d5-a467-79d9542cdcab'
);

-- nedlægnig af observationer
INSERT INTO sagsevent (
    id,
    registreringfra,
    eventtypeid,
    sagsid
) VALUES (
    '3c51d4a7-771f-41e7-9d64-b5505aeb764b',
    sysdate,
    4, -- observation_nedlagt
    'ab91c2df-475e-4fb7-b092-80e3198ec877'
);

INSERT INTO sagseventinfo (
    REGISTRERINGFRA,
    REGISTRERINGTIL,
    BESKRIVELSE,
    SAGSEVENTID
) VALUES (
    sysdate,
    null,
    'Observationsdubletter afregistreret og fejlmeldt. Se sagsevent 625befd0-36cd-46d5-a467-79d9542cdcab for yderligere information.',
    '3c51d4a7-771f-41e7-9d64-b5505aeb764b'
);

CREATE TABLE observationbackup_20240411 AS SELECT * FROM observation;

-- slå sikkerhedsforanstaltninger fra
ALTER TRIGGER observation_au_trg DISABLE;

UPDATE observation
SET
    -- da der i flere tilfælde der 3 eller flere rækker med samme observationer tilføjes en tilfældig, ubetydelig 
    -- ændring på observationsværdien med henblik på at gøre alle afregistrerede dubletter unikke
    value1 = value1 + dbms_random.value * 0.000001, 
    registreringtil=registreringfra,
    fejlmeldt = 'true',
    sagseventtilid = '3c51d4a7-771f-41e7-9d64-b5505aeb764b'
WHERE rowid NOT IN (
    -- første duplet (dem vi ikke vil ændre på)
    SELECT MIN(rowid)
    FROM observation
    GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
)
    -- alle rækker med dupletter
    AND (observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid) IN (
    -- find duplet-værdier
    SELECT observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid
    FROM observation
    GROUP BY observationstypeid, value1, antal, gruppe,observationstidspunkt, opstillingspunktid, sigtepunktid HAVING count(*) > 1
)
;

-- genindfør sikkerhedsforanstaltninger
ALTER TRIGGER observation_au_trg ENABLE;

-- luk sag
INSERT INTO sagsinfo(aktiv, registreringfra, behandler, sagsid) VALUES ('false', sysdate, 'Kristian Evers', 'ab91c2df-475e-4fb7-b092-80e3198ec877');

-- slå unikt index til
CREATE UNIQUE INDEX observation_uniq2_idx ON observation (
  observationstypeid,
  value1,
  antal,
  gruppe,
  observationstidspunkt,
  opstillingspunktid,
  sigtepunktid,
  fejlmeldt
);

Samme smøre køres på FIREPROD når det er konstateret at der ikke sker fejl i overførsel til Databanken.

kbevers commented 2 months ago

Samme smøre køres på FIREPROD når det er konstateret at der ikke sker fejl i overførsel til Databanken.

Nu også gjort på FIREPROD