Skip to content

Commit

Permalink
Merge pull request #124 from ConductionNL/feature/PC108-115/documenten
Browse files Browse the repository at this point in the history
documenten
  • Loading branch information
Sudo-Thijn authored Dec 31, 2024
2 parents 508ca13 + 718883a commit d80627c
Show file tree
Hide file tree
Showing 14 changed files with 1,121 additions and 59 deletions.
76 changes: 76 additions & 0 deletions src/entities/document/document.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { Document } from './document'
import { TDocument } from './document.types'

export const mockDocumentData = (): TDocument[] => [
{
id: '15551d6f-44e3-43f3-a9d2-59e583c91eb0',
zaak: '550e8400-e29b-41d4-a716-446655440000',
url: 'https://example.com/documents/15551d6f-44e3-43f3-a9d2-59e583c91eb0',
identificatie: 'DOC-2023-001',
bronorganisatie: '123456789',
creatiedatum: '2023-01-01T00:00:00Z',
titel: 'Example Document',
vertrouwelijkheidaanduiding: 'openbaar',
auteur: 'John Doe',
status: 'definitief',
inhoudIsVervallen: false,
formaat: 'application/pdf',
taal: 'nld',
versie: 1,
beginRegistratie: '2023-01-01T00:00:00Z',
bestandsnaam: 'example.pdf',
inhoud: 'https://example.com/documents/15551d6f-44e3-43f3-a9d2-59e583c91eb0/download',
bestandsomvang: BigInt(1024),
link: 'https://example.com/viewer',
beschrijving: 'An example document',
indicatieGebruiksrecht: true,
verschijningsvorm: 'digitaal',
ondertekening: {
soort: 'digitaal',
datum: '2023-01-01T00:00:00Z',
},
integriteit: {
algoritme: 'sha_256',
waarde: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
datum: '2023-01-01T00:00:00Z',
},
informatieobjecttype: 'https://example.com/catalogi/informatieobjecttypen/1',
locked: false,
bestandsdelen: [
{
url: 'https://example.com/documents/15551d6f-44e3-43f3-a9d2-59e583c91eb0/parts/1',
volgnummer: 1,
omvang: 1024,
voltooid: true,
lock: '',
},
],
trefwoorden: ['example', 'test'],
_expand: {
informatieobjecttype: {
url: 'https://example.com/catalogi/informatieobjecttypen/1',
catalogus: 'https://example.com/catalogi/1',
omschrijving: 'Example Document Type',
vertrouwelijkheidaanduiding: 'openbaar',
beginGeldigheid: '2023-01-01',
eindeGeldigheid: null,
beginObject: null,
eindeObject: null,
concept: false,
zaaktypen: 'https://example.com/catalogi/zaaktypen/1',
besluittypen: ['https://example.com/catalogi/besluittypen/1'],
informatieobjectcategorie: 'example',
trefwoorden: ['example'],
omschrijvingGeneriek: {
informatieobjecttypeOmschrijvingGeneriek: 'Example Generic Description',
definitieInformatieobjecttypeOmschrijvingGeneriek: 'An example document type',
herkomstInformatieobjecttypeOmschrijvingGeneriek: 'KING',
hierarchieInformatieobjecttypeOmschrijvingGeneriek: 'parent',
opmerkingInformatieobjecttypeOmschrijvingGeneriek: null,
},
},
},
},
]

export const mockDocument = (data: TDocument[] = mockDocumentData()): TDocument[] => data.map(item => new Document(item))
12 changes: 12 additions & 0 deletions src/entities/document/document.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Document } from './document'
import { mockDocumentData } from './document.mock'

describe('Document Entity', () => {
it('should create a Document entity with full data', () => {
const document = new Document(mockDocumentData()[0])

expect(document).toBeInstanceOf(Document)
expect(document).toEqual(mockDocumentData()[0])
expect(document.validate().success).toBe(true)
})
})
185 changes: 185 additions & 0 deletions src/entities/document/document.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
import { SafeParseReturnType, z } from 'zod'
import { TDocument } from './document.types'

export class Document implements TDocument {

public id: string
public zaak?: string
public url: string
public identificatie?: string
public bronorganisatie: string
public creatiedatum: string
public titel: string
public vertrouwelijkheidaanduiding?: 'openbaar' | 'beperkt_openbaar' | 'intern' | 'zaakvertrouwelijk' | 'vertrouwelijk' | 'confidentieel' | 'geheim' | 'zeer_geheim'
public auteur: string
public status?: 'in_bewerking' | 'ter_vaststelling' | 'definitief' | 'gearchiveerd'
public inhoudIsVervallen?: boolean
public formaat?: string
public taal: string
public versie: number
public beginRegistratie: string
public bestandsnaam?: string
public inhoud?: string
public bestandsomvang?: bigint
public link?: string
public beschrijving?: string
public ontvangstdatum?: string
public verzenddatum?: string
public indicatieGebruiksrecht?: boolean
public verschijningsvorm?: string
public ondertekening?: {
soort: 'analoog' | 'digitaal' | 'pki'
datum: string
}

public integriteit?: {
algoritme: 'crc_16' | 'crc_32' | 'crc_64' | 'fletcher_4' | 'fletcher_8' | 'fletcher_16' | 'fletcher_32' | 'hmac' | 'md5' | 'sha_1' | 'sha_256' | 'sha_512' | 'sha_3'
waarde: string
datum: string
}

public informatieobjecttype: string
public locked: boolean
public bestandsdelen: {
url: string
volgnummer: number
omvang: number
voltooid: boolean
lock: string
}[]

public trefwoorden?: string[]
public _expand?: {
informatieobjecttype: {
url: string
catalogus: string
omschrijving: string
vertrouwelijkheidaanduiding: 'openbaar' | 'beperkt_openbaar' | 'intern' | 'zaakvertrouwelijk' | 'vertrouwelijk' | 'confidentieel' | 'geheim' | 'zeer_geheim'
beginGeldigheid: string
eindeGeldigheid?: string
beginObject?: string
eindeObject?: string
concept: boolean
zaaktypen: string
besluittypen: string[]
informatieobjectcategorie: string
trefwoorden?: string[]
omschrijvingGeneriek: {
informatieobjecttypeOmschrijvingGeneriek: string
definitieInformatieobjecttypeOmschrijvingGeneriek: string
herkomstInformatieobjecttypeOmschrijvingGeneriek: string
hierarchieInformatieobjecttypeOmschrijvingGeneriek: string
opmerkingInformatieobjecttypeOmschrijvingGeneriek?: string
}
}
}

constructor(source: TDocument) {
this.id = source.id || ''
this.zaak = source.zaak || null
this.url = source.url || ''
this.identificatie = source.identificatie || null
this.bronorganisatie = source.bronorganisatie || ''
this.creatiedatum = source.creatiedatum || ''
this.titel = source.titel || ''
this.vertrouwelijkheidaanduiding = source.vertrouwelijkheidaanduiding || null
this.auteur = source.auteur || ''
this.status = source.status || null
this.inhoudIsVervallen = source.inhoudIsVervallen || null
this.formaat = source.formaat || null
this.taal = source.taal || ''
this.versie = source.versie || 0
this.beginRegistratie = source.beginRegistratie || ''
this.bestandsnaam = source.bestandsnaam || null
this.inhoud = source.inhoud || null
this.bestandsomvang = source.bestandsomvang || null
this.link = source.link || null
this.beschrijving = source.beschrijving || null
this.ontvangstdatum = source.ontvangstdatum || null
this.verzenddatum = source.verzenddatum || null
this.indicatieGebruiksrecht = source.indicatieGebruiksrecht || null
this.verschijningsvorm = source.verschijningsvorm || null
this.ondertekening = source.ondertekening || null
this.integriteit = source.integriteit || null
this.informatieobjecttype = source.informatieobjecttype || ''
this.locked = source.locked || false
this.bestandsdelen = source.bestandsdelen || []
this.trefwoorden = source.trefwoorden || null
this._expand = source._expand || null
}

public validate(): SafeParseReturnType<TDocument, unknown> {
const schema = z.object({
id: z.string(),
zaak: z.string().nullable(),
url: z.string().min(1).max(1000).url(),
identificatie: z.string().max(40).nullable(),
bronorganisatie: z.string().max(9),
creatiedatum: z.string(),
titel: z.string().max(200),
vertrouwelijkheidaanduiding: z.enum(['openbaar', 'beperkt_openbaar', 'intern', 'zaakvertrouwelijk', 'vertrouwelijk', 'confidentieel', 'geheim', 'zeer_geheim']).nullable(),
auteur: z.string().max(200),
status: z.enum(['in_bewerking', 'ter_vaststelling', 'definitief', 'gearchiveerd']).nullable(),
inhoudIsVervallen: z.boolean().nullable(),
formaat: z.string().max(255).nullable(),
taal: z.string().length(3),
versie: z.number(),
beginRegistratie: z.string(),
bestandsnaam: z.string().max(255).nullable(),
inhoud: z.string().url().nullable(),
bestandsomvang: z.bigint().nullable(),
link: z.string().max(200).nullable(),
beschrijving: z.string().max(1000).nullable(),
ontvangstdatum: z.string().nullable(),
verzenddatum: z.string().nullable(),
indicatieGebruiksrecht: z.boolean().nullable(),
verschijningsvorm: z.string().nullable(),
ondertekening: z.object({
soort: z.enum(['analoog', 'digitaal', 'pki']),
datum: z.string(),
}).nullable(),
integriteit: z.object({
algoritme: z.enum(['crc_16', 'crc_32', 'crc_64', 'fletcher_4', 'fletcher_8', 'fletcher_16', 'fletcher_32', 'hmac', 'md5', 'sha_1', 'sha_256', 'sha_512', 'sha_3']),
waarde: z.string().max(128),
datum: z.string(),
}).nullable(),
informatieobjecttype: z.string().max(200),
locked: z.boolean(),
bestandsdelen: z.array(z.object({
url: z.string().min(1).max(1000).url(),
volgnummer: z.number(),
omvang: z.number(),
voltooid: z.boolean(),
lock: z.string(),
})),
trefwoorden: z.array(z.string()).nullable(),
_expand: z.object({
informatieobjecttype: z.object({
url: z.string().min(1).max(1000).url(),
catalogus: z.string(),
omschrijving: z.string().max(80),
vertrouwelijkheidaanduiding: z.enum(['openbaar', 'beperkt_openbaar', 'intern', 'zaakvertrouwelijk', 'vertrouwelijk', 'confidentieel', 'geheim', 'zeer_geheim']),
beginGeldigheid: z.string(),
eindeGeldigheid: z.string().nullable(),
beginObject: z.string().nullable(),
eindeObject: z.string().nullable(),
concept: z.boolean(),
zaaktypen: z.string(),
besluittypen: z.array(z.string()),
informatieobjectcategorie: z.string().max(80),
trefwoorden: z.array(z.string().max(30)).nullable(),
omschrijvingGeneriek: z.object({
informatieobjecttypeOmschrijvingGeneriek: z.string().max(80),
definitieInformatieobjecttypeOmschrijvingGeneriek: z.string().max(255),
herkomstInformatieobjecttypeOmschrijvingGeneriek: z.string().max(12),
hierarchieInformatieobjecttypeOmschrijvingGeneriek: z.string().max(80),
opmerkingInformatieobjecttypeOmschrijvingGeneriek: z.string().max(255).nullable(),
}),
}),
}).nullable(),
})

return schema.safeParse(this)
}

}
71 changes: 71 additions & 0 deletions src/entities/document/document.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// https://vng-realisatie.github.io/gemma-zaken/standaard/documenten/redoc-1.5.0#tag/enkelvoudiginformatieobjecten/operation/enkelvoudiginformatieobject_retrieve

export type TDocument = {
id: string;
zaak?: string; // zaak id property to link to a zaak, this is not in the gemma-zaken documentation
url: string; // min 1 character, max 1000 characters, string as uri
identificatie?: string; // max 40 characters
bronorganisatie: string; // max 9 characters
creatiedatum: string; // string as iso date time string
titel: string; // max 200 characters
vertrouwelijkheidaanduiding?: 'openbaar' | 'beperkt_openbaar' | 'intern' | 'zaakvertrouwelijk' | 'vertrouwelijk' | 'confidentieel' | 'geheim' | 'zeer_geheim';
auteur: string; // max 200 characters
status?: 'in_bewerking' | 'ter_vaststelling' | 'definitief' | 'gearchiveerd';
inhoudIsVervallen?: boolean;
formaat?: string; // max 255 characters
taal: string; // 3 characters, ISO 639-2/B language code
versie: number;
beginRegistratie: string; // string as iso date time string
bestandsnaam?: string; // max 255 characters
inhoud?: string; // string as uri
bestandsomvang?: bigint; // int64
link?: string; // max 200 characters
beschrijving?: string; // max 1000 characters
ontvangstdatum?: string; // deprecated
verzenddatum?: string; // deprecated
indicatieGebruiksrecht?: boolean;
verschijningsvorm?: string;
ondertekening?: {
soort: 'analoog' | 'digitaal' | 'pki';
datum: string; // string as iso date time string
};
integriteit?: {
algoritme: 'crc_16' | 'crc_32' | 'crc_64' | 'fletcher_4' | 'fletcher_8' | 'fletcher_16' | 'fletcher_32' | 'hmac' | 'md5' | 'sha_1' | 'sha_256' | 'sha_512' | 'sha_3';
waarde: string; // max 128 characters
datum: string;
};
informatieobjecttype: string; // max 200 characters
locked: boolean;
bestandsdelen: {
url: string; // min 1 character, max 1000 characters, string as uri
volgnummer: number;
omvang: number;
voltooid: boolean;
lock: string;
}[];
trefwoorden?: string[];
_expand?: {
informatieobjecttype: {
url: string; // min 1 character, max 1000 characters, string as uri
catalogus: string;
omschrijving: string; // max 80 characters
vertrouwelijkheidaanduiding: 'openbaar' | 'beperkt_openbaar' | 'intern' | 'zaakvertrouwelijk' | 'vertrouwelijk' | 'confidentieel' | 'geheim' | 'zeer_geheim';
beginGeldigheid: string; // string as iso date time string
eindeGeldigheid?: string; // string as iso date time string
beginObject?: string; // string as iso date time string
eindeObject?: string; // string as iso date time string
concept: boolean;
zaaktypen: string;
besluittypen: string[]; // string as uri, has to be unique
informatieobjectcategorie: string; // max 80 characters
trefwoorden?: string[]; // max 30 characters per string
omschrijvingGeneriek: {
informatieobjecttypeOmschrijvingGeneriek: string; // max 80 characters
definitieInformatieobjecttypeOmschrijvingGeneriek: string; // max 255 characters
herkomstInformatieobjecttypeOmschrijvingGeneriek: string; // max 12 characters
hierarchieInformatieobjecttypeOmschrijvingGeneriek: string; // max 80 characters
opmerkingInformatieobjecttypeOmschrijvingGeneriek?: string; // max 255 characters
}
}
}
}
3 changes: 3 additions & 0 deletions src/entities/document/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './document.ts'
export * from './document.types.ts'
export * from './document.mock.ts'
1 change: 1 addition & 0 deletions src/entities/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export * from './medewerkers/index.js'
export * from './contactmoment/index.js'
export * from './resultaat/index.js'
export * from './besluit/index.js'
export * from './document/index.js'
7 changes: 7 additions & 0 deletions src/modals/Modals.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ import { navigationStore } from '../store/store.js'
<!-- besluiten -->
<BesluitForm v-if="navigationStore.modal === 'besluitForm'" />
<DeleteBesluit v-if="navigationStore.modal === 'deleteBesluit'" />
<!-- documenten -->
<DocumentForm v-if="navigationStore.modal === 'documentForm'" />
<DeleteDocument v-if="navigationStore.modal === 'deleteDocument'" />
</div>
</template>

Expand Down Expand Up @@ -67,6 +70,8 @@ import DeleteResultaat from './resultaten/DeleteResultaat.vue'
import BesluitForm from './besluiten/BesluitForm.vue'
import DeleteBesluit from './besluiten/DeleteBesluit.vue'
import ViewContactMoment from './contactMomenten/ViewContactMoment.vue'
import DocumentForm from './documenten/DocumentForm.vue'
import DeleteDocument from './documenten/DeleteDocument.vue'
export default {
name: 'Modals',
Expand Down Expand Up @@ -95,6 +100,8 @@ export default {
BesluitForm,
DeleteBesluit,
ViewContactMoment,
DocumentForm,
DeleteDocument,
},
}
</script>
Loading

0 comments on commit d80627c

Please sign in to comment.