init
b9eec4227408fc4eee7480801b492ba723ceaa82
73 files changed
.gitattributes.gitignoresrc/OpenKamer.DataModel/Feed.cssrc/OpenKamer.DataModel/OpenKamer.DataModel.csprojsrc/OpenKamer.DataModel/XSD/tkData-v1-0-activiteit.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-activiteitactor.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-agendapunt.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-base.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-besluit.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-commissie.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-commissiecontactinformatie.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetel.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastpersoon.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastvacature.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangerpersoon.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangervacature.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-document.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-documentactor.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-documentversie.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-fractie.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-fractieaanvullendgegeven.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetel.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelpersoon.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelvacature.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-identiteit.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-iso-8601.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-kamerstukdossier.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persoon.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persooncontactinformatie.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persoongeschenk.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persoonloopbaan.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctie.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctieinkomsten.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persoononderwijs.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-persoonreis.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-reservering.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-resource.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-stemming.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-vergadering.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-verslag.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-zaak.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-zaakactor.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0-zaal.xsdsrc/OpenKamer.DataModel/XSD/tkData-v1-0.xsdsrc/OpenKamer.DataModel/tkData-v1-0.cssrc/OpenKamer.LogicControllers/EntityController.cssrc/OpenKamer.LogicControllers/FeedController.cssrc/OpenKamer.LogicControllers/OpenKamer.LogicControllers.csprojsrc/OpenKamer.LogicControllers/Properties/launchSettings.jsonsrc/OpenKamer.LogicControllers/Web/Collections.cssrc/OpenKamer.LogicControllers/Web/Doucumenten.cssrc/OpenKamer.LogicControllers/Web/Fracties.cssrc/OpenKamer.LogicControllers/Web/HelloWorld.cssrc/OpenKamer.LogicControllers/Web/Personen.cssrc/OpenKamer.LogicControllers/Web/WebController.cssrc/OpenKamer.LogicControllers/triplejoin.txtsrc/OpenKamer.WebCore/OpenKamer.WebCore.csprojsrc/OpenKamer.WebCore/Program.cssrc/OpenKamer.WebCore/Properties/launchSettings.jsonsrc/OpenKamer.WebCore/appsettings.Development.jsonsrc/OpenKamer.WebCore/appsettings.jsonsrc/OpenKamer.WebCore/wwwroot/Default.csssrc/OpenKamer.WebCore/wwwroot/Default.htmsrc/OpenKamer.WebCore/wwwroot/Default.jssrc/OpenKamer.WebCore/wwwroot/ResetAll.csssrc/OpenKamer.WebCore/wwwroot/Ui.csssrc/OpenKamer.WebCore/wwwroot/favicon.icosrc/OpenKamer.WinForm/Form1.Designer.cssrc/OpenKamer.WinForm/Form1.cssrc/OpenKamer.WinForm/Form1.resxsrc/OpenKamer.WinForm/OpenKamer.WinForm.csprojsrc/OpenKamer.WinForm/Program.cssrc/OpenKamer.sln
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..1ff0c42
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,63 @@
+###############################################################################
+# Set default behavior to automatically normalize line endings.
+###############################################################################
+* text=auto
+
+###############################################################################
+# Set default behavior for command prompt diff.
+#
+# This is need for earlier builds of msysgit that does not have it on by
+# default for csharp files.
+# Note: This is only used by command line
+###############################################################################
+#*.cs diff=csharp
+
+###############################################################################
+# Set the merge driver for project and solution files
+#
+# Merging from the command prompt will add diff markers to the files if there
+# are conflicts (Merging from VS is not affected by the settings below, in VS
+# the diff markers are never inserted). Diff markers may cause the following
+# file extensions to fail to load in VS. An alternative would be to treat
+# these files as binary and thus will always conflict and require user
+# intervention with every merge. To do so, just uncomment the entries below
+###############################################################################
+#*.sln merge=binary
+#*.csproj merge=binary
+#*.vbproj merge=binary
+#*.vcxproj merge=binary
+#*.vcproj merge=binary
+#*.dbproj merge=binary
+#*.fsproj merge=binary
+#*.lsproj merge=binary
+#*.wixproj merge=binary
+#*.modelproj merge=binary
+#*.sqlproj merge=binary
+#*.wwaproj merge=binary
+
+###############################################################################
+# behavior for image files
+#
+# image files are treated as binary by default.
+###############################################################################
+#*.jpg binary
+#*.png binary
+#*.gif binary
+
+###############################################################################
+# diff behavior for common document formats
+#
+# Convert binary document formats to text before diffing them. This feature
+# is only available from the command line. Turn it on by uncommenting the
+# entries below.
+###############################################################################
+#*.doc diff=astextplain
+#*.DOC diff=astextplain
+#*.docx diff=astextplain
+#*.DOCX diff=astextplain
+#*.dot diff=astextplain
+#*.DOT diff=astextplain
+#*.pdf diff=astextplain
+#*.PDF diff=astextplain
+#*.rtf diff=astextplain
+#*.RTF diff=astextplain
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9491a2f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,363 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Oo]ut/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*.json
+coverage*.xml
+coverage*.info
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd
\ No newline at end of file
diff --git a/src/OpenKamer.DataModel/Feed.cs b/src/OpenKamer.DataModel/Feed.cs
new file mode 100644
index 0000000..f454ee4
--- /dev/null
+++ b/src/OpenKamer.DataModel/Feed.cs
@@ -0,0 +1,122 @@
+//
+// (c) 2022, Alphons van der Heijden
+// alphons@heijden.com
+//
+// https://opendata.tweedekamer.nl/documentatie/
+//
+
+#nullable disable
+
+namespace nl.tweedekamer.opendata.DataModel;
+
+using System.Xml;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+/// <remarks/>
+[Serializable()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2005/Atom")]
+[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom", IsNullable = false)]
+public partial class Feed
+{
+ [XmlElement("id")]
+ public string Id { get; set; }
+
+ [XmlElement("title")]
+ public string Title { get; set; }
+
+ [XmlElement("author")]
+ public FeedAuthor Author { get; set; }
+
+ [XmlElement("updated")]
+ public DateTime Updated { get; set; }
+
+ [XmlElement("link")]
+ public FeedLink[] Links { get; set; }
+
+ [XmlElement("rights")]
+ public string Rights { get; set; }
+
+ [XmlElement("entry")]
+ public FeedEntry[] Entries { get; set; }
+}
+
+/// <remarks/>
+[Serializable()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2005/Atom")]
+public partial class FeedLink
+{
+ [XmlAttribute("rel")]
+ public string Rel { get; set; }
+
+ [XmlAttribute("href")]
+ public string Href { get; set; }
+}
+
+/// <remarks/>
+[Serializable()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2005/Atom")]
+public partial class FeedAuthor
+{
+ [XmlElement("name")]
+ public string Name { get; set; }
+
+ [XmlElement("uri")]
+ public string Uri { get; set; }
+
+ [XmlElement("email")]
+ public string Email { get; set; }
+}
+
+/// <remarks/>
+[Serializable()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2005/Atom")]
+public partial class FeedEntry
+{
+ [XmlElement("id")]
+ public string Id { get; set; }
+
+ [XmlElement("title")]
+ public string Title { get; set; }
+
+ [XmlElement("author")]
+ public FeedEntryAuthor Author { get; set; }
+
+ [XmlElement("updated")]
+ public DateTime Updated { get; set; }
+
+ [XmlElement("link")]
+ public FeedLink Link { get; set; }
+
+ [XmlElement("category")]
+ public FeedEntryCategory Category { get; set; }
+
+ [XmlAnyElement("content")]
+ public XmlElement Content { get; set; }
+}
+
+/// <remarks/>
+[Serializable()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2005/Atom")]
+public partial class FeedEntryAuthor
+{
+ [XmlElement("name")]
+ public string Name { get; set; }
+}
+
+/// <remarks/>
+[Serializable()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.w3.org/2005/Atom")]
+public partial class FeedEntryCategory
+{
+ [XmlAttribute(AttributeName ="term")]
+ public string Term { get; set; }
+}
+
+
diff --git a/src/OpenKamer.DataModel/OpenKamer.DataModel.csproj b/src/OpenKamer.DataModel/OpenKamer.DataModel.csproj
new file mode 100644
index 0000000..a532f4a
--- /dev/null
+++ b/src/OpenKamer.DataModel/OpenKamer.DataModel.csproj
@@ -0,0 +1,10 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net7.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ <OutputType>Library</OutputType>
+ </PropertyGroup>
+
+</Project>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-activiteit.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-activiteit.xsd
new file mode 100644
index 0000000..09b78b9
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-activiteit.xsd
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-iso-8601.xsd"/>
+
+ <xs:element name="activiteit" type="activiteitType"/>
+
+ <xs:complexType name="activiteitType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="onderwerp" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="datumSoort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="datum" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="aanvangstijd" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="eindtijd" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="locatie" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="besloten" minOccurs="0" maxOccurs="1" type="booleanType"/>
+ <xs:element name="status" minOccurs="0" maxOccurs="1" type="stringType"/>
+ <xs:element name="vergaderjaar" minOccurs="0" nillable="true" type="vergaderjaarType"/>
+ <xs:element name="kamer" minOccurs="0" maxOccurs="1" type="stringType"/>
+ <xs:element name="noot" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="vrsNummer" minOccurs="0" maxOccurs="1" nillable="true">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:restriction base="stringType">
+ <xs:pattern value="[0-9]{8}"/>
+ </xs:restriction>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="sidVoortouw" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="voortouwnaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="voortouwafkorting" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="voortouwkortenaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="voortouwcommissie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+
+
+ <xs:element name="aanvraagdatum" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="datumVerzoekEersteVerlenging" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="datumMededelingEersteVerlenging" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="datumVerzoekTweedeVerlenging" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="datumMededelingTweedeVerlenging" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="vervaldatum" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+
+ <xs:element name="voortgezetVanuit" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="vervangenVanuit" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-activiteitactor.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-activiteitactor.xsd
new file mode 100644
index 0000000..b85235b
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-activiteitactor.xsd
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:tki="http://www.tweedekamer.nl/xsd/tkData-instantie/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-iso-8601.xsd"/>
+
+ <xs:import namespace="http://www.tweedekamer.nl/xsd/tkData-instantie/v1-0" schemaLocation="tkData-instantie-v1-0.xsd"/>
+
+ <xs:element name="activiteitActor" type="activiteitActorType"/>
+
+ <xs:complexType name="activiteitActorType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="activiteit" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="actorNaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="actorFractie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="relatie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="volgorde" minOccurs="0" maxOccurs="1" nillable="true" type="xs:unsignedInt"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="spreektijd" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="sidActor" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <!-- Link naar actoren -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="commissie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-agendapunt.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-agendapunt.xsd
new file mode 100644
index 0000000..985c1d6
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-agendapunt.xsd
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:tki="http://www.tweedekamer.nl/xsd/tkData-instantie/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-iso-8601.xsd"/>
+
+ <xs:import namespace="http://www.tweedekamer.nl/xsd/tkData-instantie/v1-0" schemaLocation="tkData-instantie-v1-0.xsd"/>
+
+ <xs:element name="agendapunt" type="agendapuntType" />
+
+ <xs:complexType name="agendapuntType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="activiteit" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="onderwerp" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="aanvangstijd" minOccurs="0" maxOccurs="1" nillable="true" type="dateTimeType"/>
+ <xs:element name="eindtijd" minOccurs="0" maxOccurs="1" nillable="true" type="dateTimeType"/>
+ <xs:element name="volgorde" minOccurs="0" maxOccurs="1" nillable="true" type="unsignedIntType"/>
+ <xs:element name="rubriek" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="noot" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="status" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-base.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-base.xsd
new file mode 100644
index 0000000..42c3212
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-base.xsd
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <!-- Include -->
+ <xs:include schemaLocation="tkData-v1-0-iso-8601.xsd"/>
+
+ <!-- Algemene attributen -->
+ <xs:attribute name="verwijderd" type="xs:boolean">
+ <xs:annotation>
+ <xs:documentation>Wanneer dit attribuut de waarde "true" heeft dan betekent dit dat het element waarop dit attribuut betrekking heeft is verwijderd.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="bijgewerkt" type="xs:dateTime">
+ <xs:annotation>
+ <xs:documentation>Het element waarop dit attribuut betrekking heeft is voor het laatst bijgewerkt op het aangegeven tijdstip (aangegeven in UTC-formaat).</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <!-- Resource attributen (downloadbare entiteit) -->
+ <xs:attribute name="contentType" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>Wanneer dit veld een waarde heeft, dan betekent het dat het element waarop dit attribuut betrekking heeft downloadbaar is.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="contentLength" type="xs:int">
+ <xs:annotation>
+ <xs:documentation>Wanneer dit veld een waarde heeft, dan betekent het dat het element waarop dit attribuut betrekking heeft downloadbaar is.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+
+ <!-- Simple Types -->
+ <xs:simpleType name="guidType">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="aanduidingType">
+ <xs:restriction base="guidType"/>
+ </xs:simpleType>
+
+ <xs:simpleType name="idType">
+ <xs:restriction base="aanduidingType"/>
+ </xs:simpleType>
+
+ <xs:simpleType name="refType">
+ <xs:restriction base="aanduidingType"/>
+ </xs:simpleType>
+
+ <!-- Attribute Groups -->
+ <xs:attributeGroup name="referenceAttributesGroup">
+ <xs:attribute name="ref" use="optional" type="refType" />
+ </xs:attributeGroup>
+
+ <!-- Complex Types -->
+ <xs:complexType name="identificatieType">
+ <xs:sequence>
+ <xs:element name="annotatie" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="id" use="required" type="idType" />
+ </xs:complexType>
+
+ <xs:complexType name="referentieLiteral">
+ <xs:sequence>
+ <xs:element name="annotatie" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attributeGroup ref="referenceAttributesGroup"/>
+ </xs:complexType>
+
+ <xs:complexType name="referentieType">
+ <xs:complexContent>
+ <xs:extension base="referentieLiteral" />
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="relatieType">
+ <xs:attribute name="id" use="required" type="idType"/>
+ <xs:attributeGroup ref="referenceAttributesGroup"/>
+ </xs:complexType>
+
+ <xs:complexType name="entiteitType" abstract="true">
+ <xs:complexContent>
+ <xs:extension base="identificatieType">
+ <xs:attribute ref="verwijderd" use="required"/>
+ <xs:attribute ref="bijgewerkt" use="required"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="downloadEntiteitType" abstract="true">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:attribute ref="contentType" use="optional"/>
+ <xs:attribute ref="contentLength" use="optional"/>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+ <!-- definities voor velden met simple types -->
+ <xs:simpleType name="token">
+ <xs:restriction base="xs:token">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="vergaderjaar">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-9]{4}-[0-9]{4}"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="datum">
+ <xs:union memberTypes="xs:date gYearWeekDay gYearWeek xs:gYearMonth xs:gYear">
+ <xs:annotation>
+ <xs:documentation>Toegestaan: CCYY-MM-DD, CCYY-Www-D, CCYY-Www, CCYY-MM, CCYY.</xs:documentation>
+ </xs:annotation>
+ </xs:union>
+ </xs:simpleType>
+
+ <!-- definities voor velden met complex content -->
+ <xs:complexType name="datumType">
+ <xs:simpleContent>
+ <xs:extension base="datum" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="vergaderjaarType">
+ <xs:simpleContent>
+ <xs:extension base="vergaderjaar" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="stringType">
+ <xs:simpleContent>
+ <xs:extension base="xs:string" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="unsignedIntType">
+ <xs:simpleContent>
+ <xs:extension base="xs:unsignedInt" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="intType">
+ <xs:simpleContent>
+ <xs:extension base="xs:int" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="shortType">
+ <xs:simpleContent>
+ <xs:extension base="xs:short" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="dateTimeType">
+ <xs:simpleContent>
+ <xs:extension base="xs:dateTime" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="durationType">
+ <xs:simpleContent>
+ <xs:extension base="xs:duration" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="dateType">
+ <xs:simpleContent>
+ <xs:extension base="xs:date" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="tokenType">
+ <xs:simpleContent>
+ <xs:extension base="token" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="longType">
+ <xs:simpleContent>
+ <xs:extension base="xs:long" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="booleanType">
+ <xs:simpleContent>
+ <xs:extension base="xs:boolean" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="anyUriType">
+ <xs:simpleContent>
+ <xs:extension base="xs:anyURI" />
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="base64BinaryType">
+ <xs:simpleContent>
+ <xs:extension base="xs:base64Binary" />
+ </xs:simpleContent>
+ </xs:complexType>
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-besluit.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-besluit.xsd
new file mode 100644
index 0000000..98436c0
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-besluit.xsd
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:tki="http://www.tweedekamer.nl/xsd/tkData-instantie/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-iso-8601.xsd"/>
+
+ <xs:import namespace="http://www.tweedekamer.nl/xsd/tkData-instantie/v1-0" schemaLocation="tkData-instantie-v1-0.xsd"/>
+
+ <xs:element name="besluit" type="besluitType"/>
+
+ <xs:complexType name="besluitType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="agendapunt" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+
+ <xs:element name="stemmingsSoort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="besluitSoort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="besluitTekst" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="opmerking" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="status" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="agendapuntZaakBesluitVolgorde" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+
+ <xs:element name="zaak" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissie.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissie.xsd
new file mode 100644
index 0000000..eaea422
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissie.xsd
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="commissie" type="commissieType"/>
+
+ <xs:complexType name="commissieType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="afkorting" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="naamNl" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="naamEn" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="naamWebNl" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="naamWebEn" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="inhoudsopgave" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="datumActief" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="datumInactief" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiecontactinformatie.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiecontactinformatie.xsd
new file mode 100644
index 0000000..ad604bf
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiecontactinformatie.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="commissieContactinformatie" type="commissieContactinformatieType"/>
+
+ <xs:complexType name="commissieContactinformatieType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="commissie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="waarde" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetel.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetel.xsd
new file mode 100644
index 0000000..4fa17c0
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetel.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="commissieZetel" type="commissieZetelType"/>
+
+ <xs:complexType name="commissieZetelType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="commissie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastpersoon.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastpersoon.xsd
new file mode 100644
index 0000000..3b9d1e4
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastpersoon.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="commissieZetelVastPersoon" type="commissieZetelVastPersoonType"/>
+
+ <xs:complexType name="commissieZetelVastPersoonType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="commissieZetel" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" nillable="true" type="referentieLiteral"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastvacature.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastvacature.xsd
new file mode 100644
index 0000000..99ab709
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvastvacature.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="commissieZetelVastVacature" type="commissieZetelVastVacatureType"/>
+
+ <xs:complexType name="commissieZetelVastVacatureType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="commissieZetel" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" nillable="true" type="referentieLiteral"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangerpersoon.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangerpersoon.xsd
new file mode 100644
index 0000000..2f6c45a
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangerpersoon.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="commissieZetelVervangerPersoon" type="commissieZetelVervangerPersoonType"/>
+
+ <xs:complexType name="commissieZetelVervangerPersoonType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="commissieZetel" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" nillable="true" type="referentieLiteral"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangervacature.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangervacature.xsd
new file mode 100644
index 0000000..73f71b6
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-commissiezetelvervangervacature.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="commissieZetelVervangerVacature" type="commissieZetelVervangerVacatureType"/>
+
+ <xs:complexType name="commissieZetelVervangerVacatureType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="commissieZetel" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" nillable="true" type="referentieLiteral"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-document.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-document.xsd
new file mode 100644
index 0000000..6fe8c3f
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-document.xsd
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="document" type="documentType"/>
+
+ <xs:complexType name="documentType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="downloadEntiteitType">
+ <xs:sequence>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="documentNummer" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ <xs:element name="titel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="onderwerp" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ <xs:element name="datum" minOccurs="0" maxOccurs="1" type="xs:dateTime"/>
+ <xs:element name="volgnummer" minOccurs="0" maxOccurs="1" type="intType"/>
+ <xs:element name="vergaderjaar" type="vergaderjaarType" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="kamer" minOccurs="0" maxOccurs="1" type="intType"/>
+ <xs:element name="citeertitel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="alias" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="datumRegistratie" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="datumOntvangst" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="aanhangselnummer" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="kenmerkAfzender" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="huidigeDocumentVersie" minOccurs="0" maxOccurs="1" nillable="true" type="referentieLiteral"/>
+ <xs:element name="bronDocument" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ <xs:element name="activiteit" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ <xs:element name="agendapunt" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ <xs:element name="zaak" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ <xs:element name="kamerstukdossier" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+
+ <xs:element name="organisatie" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-documentactor.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-documentactor.xsd
new file mode 100644
index 0000000..20fc2a0
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-documentactor.xsd
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="documentActor" type="documentActorType"/>
+
+ <xs:complexType name="documentActorType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="document" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="actorNaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="actorFractie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="relatie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="sidActor" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <!-- Link naar actoren -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="commissie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-documentversie.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-documentversie.xsd
new file mode 100644
index 0000000..ce1e608
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-documentversie.xsd
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="documentVersie" type="documentVersieType"/>
+
+ <xs:complexType name="documentVersieType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="document" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="status" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="versienummer" minOccurs="0" maxOccurs="1" nillable="true" type="unsignedIntType"/>
+ <xs:element name="bestandsgrootte" minOccurs="0" maxOccurs="1" nillable="true" type="unsignedIntType"/>
+ <xs:element name="extensie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="datum" minOccurs="0" maxOccurs="1" nillable="true" type="dateTimeType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractie.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractie.xsd
new file mode 100644
index 0000000..c885db9
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractie.xsd
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="fractie" type="fractieType"/>
+
+ <xs:complexType name="fractieType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="downloadEntiteitType">
+ <xs:sequence>
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ <xs:element name="afkorting" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="naamNl" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="naamEn" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="aantalZetels" minOccurs="0" maxOccurs="1" nillable="true" type="unsignedIntType"/>
+ <xs:element name="aantalStemmen" minOccurs="0" maxOccurs="1" nillable="true" type="unsignedIntType"/>
+ <xs:element name="datumActief" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="datumInactief" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractieaanvullendgegeven.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractieaanvullendgegeven.xsd
new file mode 100644
index 0000000..f4dcf6d
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractieaanvullendgegeven.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="fractieAanvullendGegeven" type="fractieAanvullendGegevenType"/>
+
+ <xs:complexType name="fractieAanvullendGegevenType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="waarde" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetel.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetel.xsd
new file mode 100644
index 0000000..b13e900
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetel.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="fractieZetel" type="fractieZetelType"/>
+
+ <xs:complexType name="fractieZetelType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelpersoon.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelpersoon.xsd
new file mode 100644
index 0000000..6f1d022
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelpersoon.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="fractieZetelPersoon" type="fractieZetelPersoonType"/>
+
+ <xs:complexType name="fractieZetelPersoonType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="fractieZetel" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelvacature.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelvacature.xsd
new file mode 100644
index 0000000..9be0f6f
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-fractiezetelvacature.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="fractieZetelVacature" type="fractieZetelVacatureType"/>
+
+ <xs:complexType name="fractieZetelVacatureType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="fractieZetel" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-identiteit.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-identiteit.xsd
new file mode 100644
index 0000000..2c911a5
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-identiteit.xsd
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="identiteit" type="identiteitType"/>
+ <xs:element name="aanduiding" type="aanduidingType"/>
+
+ <xs:complexType name="identiteitType">
+ <xs:choice>
+ <xs:sequence>
+ <xs:annotation>
+ <xs:documentation>De elementen in deze sequence beschrijven de identiteit in het informatiesysteem, bestaande uit de naam van de bron zelf en de waarde voor de sleutel die een begrip in de bron uniek identificeert.</xs:documentation>
+ </xs:annotation>
+ <xs:element name="bron">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="sleutel">
+ <xs:simpleType>
+ <xs:restriction base="xs:token">
+ <xs:minLength value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:choice>
+ <xs:attribute name="aanduiding" use="required" type="aanduidingType">
+ <xs:annotation>
+ <xs:documentation>Een aanduiding zie je in de entiteiten terug als de attributen @id en @ref. @aanduiding is van het type tk:aanduidingType. Dit is belangrijke informatie, aangezien tk:aanduidingType ook de base class is van tk:idType en tk:refType. Een aanduiding kan meerdere malen voorkomen in verschillende identiteiten. Dit komt omdat 1 aanduiding (na consolidatie in Gegevensmagazijn) kan overeenkomen met meerdere identiteiten uit verschillende informatiesystemen.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-iso-8601.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-iso-8601.xsd
new file mode 100644
index 0000000..9de47e2
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-iso-8601.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:simpleType name="gYearWeek">
+ <xs:annotation>
+ <xs:documentation>Codering voor datum in formaat CCYY-Www.</xs:documentation>
+ </xs:annotation>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-9]{4}-W((0[1-9])|([1-4][0-9])|5[0-3])"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="gYearWeekDay">
+ <xs:annotation>
+ <xs:documentation>Codering voor datum in formaat CCYY-Www-D.</xs:documentation>
+ </xs:annotation>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-9]{4}-W((0[1-9])|([1-4][0-9])|5[0-3])-[1-7]"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-kamerstukdossier.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-kamerstukdossier.xsd
new file mode 100644
index 0000000..80dffdb
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-kamerstukdossier.xsd
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="kamerstukdossier" type="kamerstukdossierType"/>
+
+ <xs:complexType name="kamerstukdossierType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <xs:element name="titel" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="citeertitel" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="alias" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" type="xs:unsignedInt"/>
+ <xs:element name="toevoeging" minOccurs="0" maxOccurs="1" nillable="true" type="xs:string"/>
+ <xs:element name="hoogsteVolgnummer" minOccurs="0" maxOccurs="1" type="xs:int"/>
+ <xs:element name="afgesloten" minOccurs="0" maxOccurs="1" nillable="true" type="booleanType"/>
+ <xs:element name="kamer" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoon.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoon.xsd
new file mode 100644
index 0000000..efc2ff2
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoon.xsd
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoon" type="persoonType"/>
+
+ <xs:complexType name="persoonType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="downloadEntiteitType">
+ <xs:sequence>
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ <xs:element name="titels" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="initialen" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="tussenvoegsel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="achternaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="voornamen" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="roepnaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="geslacht" minOccurs="0" maxOccurs="1" nillable="true"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="geboortedatum" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="geboorteplaats" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="geboorteland" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="overlijdensdatum" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="overlijdensplaats" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="woonplaats" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="land" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="fractielabel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persooncontactinformatie.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persooncontactinformatie.xsd
new file mode 100644
index 0000000..8abc2a0
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persooncontactinformatie.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoonContactinformatie" type="persoonContactinformatieType"/>
+
+ <xs:complexType name="persoonContactinformatieType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="waarde" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoongeschenk.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoongeschenk.xsd
new file mode 100644
index 0000000..742536e
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoongeschenk.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoonGeschenk" type="persoonGeschenkType"/>
+
+ <xs:complexType name="persoonGeschenkType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="omschrijving" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="datum" minOccurs="0" maxOccurs="1" nillable="true" type="dateType"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonloopbaan.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonloopbaan.xsd
new file mode 100644
index 0000000..70468ec
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonloopbaan.xsd
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoonLoopbaan" type="persoonLoopbaanType"/>
+
+ <xs:complexType name="persoonLoopbaanType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="werkgever" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="omschrijvingNl" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="omschrijvingEn" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="plaats" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctie.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctie.xsd
new file mode 100644
index 0000000..84985e8
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctie.xsd
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoonNevenfunctie" type="persoonNevenfunctieType"/>
+
+ <xs:complexType name="persoonNevenfunctieType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="omschrijving" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="isActief" minOccurs="0" maxOccurs="1" nillable="true" type="booleanType"/>
+ <xs:element name="periode" minOccurs="0" maxOccurs="1" nillable="true">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="vergoeding" minOccurs="0" maxOccurs="1" nillable="true">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType">
+ <xs:annotation>
+ <xs:documentation>Het soort vergoeding, bijv. bezoldigd, onbezoldigd of onkostenvergoeding.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element name="toelichting" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType">
+ <xs:annotation>
+ <xs:documentation>Optionele toelichting bij de soort vergoeding.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctieinkomsten.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctieinkomsten.xsd
new file mode 100644
index 0000000..e711970
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonnevenfunctieinkomsten.xsd
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoonNevenfunctieInkomsten" type="persoonNevenfunctieInkomstenType"/>
+
+ <xs:complexType name="persoonNevenfunctieInkomstenType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="persoonNevenfunctie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="jaar" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="bedragSoort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="bedragVoorvoegsel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="bedragValuta" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="bedrag" minOccurs="0" maxOccurs="1" nillable="true" type="xs:decimal"/>
+ <xs:element name="bedragAchtervoegsel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="frequentie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="frequentieBeschrijving" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="opmerking" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoononderwijs.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoononderwijs.xsd
new file mode 100644
index 0000000..1e83731
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoononderwijs.xsd
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoonOnderwijs" type="persoonOnderwijsType"/>
+
+ <xs:complexType name="persoonOnderwijsType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="opleidingNl" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="opleidingEn" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="instelling" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="plaats" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonreis.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonreis.xsd
new file mode 100644
index 0000000..6bdb77c
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-persoonreis.xsd
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="persoonReis" type="persoonReisType"/>
+
+ <xs:complexType name="persoonReisType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="doel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="bestemming" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="van" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ <xs:element name="totEnMet" minOccurs="0" maxOccurs="1" nillable="true" type="datumType"/>
+ <xs:element name="betaaldDoor" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="gewicht" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-reservering.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-reservering.xsd
new file mode 100644
index 0000000..141626d
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-reservering.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="reservering" type="reserveringType"/>
+
+ <xs:complexType name="reserveringType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="statusCode" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="statusNaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="activiteitNummer" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="zaal" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="activiteit" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-resource.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-resource.xsd
new file mode 100644
index 0000000..bff7917
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-resource.xsd
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="resource" type="resourceType"/>
+
+ <xs:complexType name="resourceType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="identificatieType">
+ <xs:sequence>
+ <xs:element name="bytes" minOccurs="0" maxOccurs="1" nillable="true" type="base64BinaryType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
\ No newline at end of file
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-stemming.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-stemming.xsd
new file mode 100644
index 0000000..5251f72
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-stemming.xsd
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="stemming" type="stemmingType"/>
+
+ <xs:complexType name="stemmingType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="besluit" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="fractieGrootte" minOccurs="0" maxOccurs="1" nillable="true" type="unsignedIntType"/>
+ <xs:element name="actorNaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="actorFractie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="vergissing" minOccurs="0" maxOccurs="1" nillable="true" type="booleanType"/>
+ <xs:element name="sidActorLid" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="sidActorFractie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieType"/>
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" type="referentieType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-vergadering.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-vergadering.xsd
new file mode 100644
index 0000000..f2f1ecb
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-vergadering.xsd
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-iso-8601.xsd"/>
+
+ <xs:element name="vergadering" type="vergaderingType"/>
+
+ <xs:complexType name="vergaderingType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType" />
+ <xs:element name="titel" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="zaal" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="vergaderjaar" minOccurs="0" maxOccurs="1" nillable="true" type="vergaderjaar"/>
+ <xs:element name="vergaderingNummer" minOccurs="0" maxOccurs="1" nillable="true" type="xs:unsignedInt"/>
+ <xs:element name="datum" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="aanvangstijd" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="sluiting" minOccurs="0" maxOccurs="1" nillable="true" type="xs:dateTime"/>
+ <xs:element name="kamer" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-verslag.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-verslag.xsd
new file mode 100644
index 0000000..3754162
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-verslag.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="verslag" type="verslagType"/>
+
+ <xs:complexType name="verslagType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="downloadEntiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="vergadering" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType" />
+ <xs:element name="status" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaak.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaak.xsd
new file mode 100644
index 0000000..5ae2a5b
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaak.xsd
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="zaak" type="zaakType"/>
+
+ <xs:complexType name="zaakType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <xs:element name="nummer" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ <xs:element name="soort" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="onderwerp" minOccurs="0" maxOccurs="1" type="stringType"/>
+ <xs:element name="gestartOp" minOccurs="0" maxOccurs="1" type="dateTimeType"/>
+ <xs:element name="organisatie" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="titel" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="citeertitel" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="alias" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="grondslagvoorhang" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="termijn" minOccurs="0" maxOccurs="1" nillable="true" type="dateTimeType"/>
+ <xs:element name="vergaderjaar" minOccurs="0" maxOccurs="1" type="vergaderjaarType"/>
+ <xs:element name="volgnummer" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ <xs:element name="status" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="huidigeBehandelstatus" maxOccurs="1" minOccurs="0" nillable="true" type="stringType"/>
+ <xs:element name="afgedaan" minOccurs="0" maxOccurs="1" nillable="true" type="booleanType"/>
+ <xs:element name="grootProject" minOccurs="0" maxOccurs="1" nillable="true" type="booleanType"/>
+ <xs:element name="kabinetsappreciatie" minOccurs="0" maxOccurs="1" nillable="true" type="stringType"/>
+ <xs:element name="kamerstukdossier" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="activiteit" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ <xs:element name="agendapunt" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ <xs:element name="gerelateerdVanuit" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ <xs:element name="vervangenVanuit" minOccurs="0" maxOccurs="unbounded" type="referentieLiteral"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaakactor.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaakactor.xsd
new file mode 100644
index 0000000..e7c079a
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaakactor.xsd
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ attributeFormDefault="unqualified"
+ elementFormDefault="qualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="zaakActor" type="zaakActorType"/>
+
+ <xs:complexType name="zaakActorType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <!-- Link naar parent -->
+ <xs:element name="zaak" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="actorNaam" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="actorFractie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="actorAfkorting" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="functie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="relatie" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <xs:element name="sidActor" minOccurs="0" maxOccurs="1" nillable="true" type="tokenType"/>
+ <!-- Link naar actoren -->
+ <xs:element name="persoon" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="fractie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ <xs:element name="commissie" minOccurs="0" maxOccurs="1" type="referentieLiteral"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaal.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaal.xsd
new file mode 100644
index 0000000..ea1eec3
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0-zaal.xsd
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:include schemaLocation="tkData-v1-0-base.xsd"/>
+
+ <xs:element name="zaal" type="zaalType"/>
+
+ <xs:complexType name="zaalType" final="#all">
+ <xs:complexContent>
+ <xs:extension base="entiteitType">
+ <xs:sequence>
+ <xs:element name="naam" minOccurs="0" maxOccurs="1" type="tokenType"/>
+ <xs:element name="sysCode" minOccurs="0" maxOccurs="1" nillable="true" type="intType"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+
+</xs:schema>
diff --git a/src/OpenKamer.DataModel/XSD/tkData-v1-0.xsd b/src/OpenKamer.DataModel/XSD/tkData-v1-0.xsd
new file mode 100644
index 0000000..190205f
--- /dev/null
+++ b/src/OpenKamer.DataModel/XSD/tkData-v1-0.xsd
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xs:schema
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ targetNamespace="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns="http://www.tweedekamer.nl/xsd/tkData/v1-0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <!-- Entiteiten (Actoren) -->
+ <xs:include schemaLocation="tkData-v1-0-persoon.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-persooncontactinformatie.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-persoongeschenk.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-persoonloopbaan.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-persoonnevenfunctie.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-persoonnevenfunctieinkomsten.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-persoononderwijs.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-persoonreis.xsd"/>
+
+ <xs:include schemaLocation="tkData-v1-0-commissie.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-commissiecontactinformatie.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-commissiezetel.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-commissiezetelvastpersoon.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-commissiezetelvastvacature.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-commissiezetelvervangerpersoon.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-commissiezetelvervangervacature.xsd"/>
+
+ <xs:include schemaLocation="tkData-v1-0-fractie.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-fractieaanvullendgegeven.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-fractiezetel.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-fractiezetelpersoon.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-fractiezetelvacature.xsd"/>
+
+ <!-- Entiteiten (Parlementaire informatie) -->
+ <xs:include schemaLocation="tkData-v1-0-activiteit.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-activiteitactor.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-agendapunt.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-besluit.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-stemming.xsd"/>
+
+ <xs:include schemaLocation="tkData-v1-0-document.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-documentactor.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-documentversie.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-kamerstukdossier.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-zaal.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-reservering.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-vergadering.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-verslag.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-zaak.xsd"/>
+ <xs:include schemaLocation="tkData-v1-0-zaakactor.xsd"/>
+
+ <!-- Resources -->
+ <xs:include schemaLocation="tkData-v1-0-resource.xsd"/>
+
+ <!-- Identiteiten -->
+ <xs:include schemaLocation="tkData-v1-0-identiteit.xsd"/>
+</xs:schema>
\ No newline at end of file
diff --git a/src/OpenKamer.DataModel/tkData-v1-0.cs b/src/OpenKamer.DataModel/tkData-v1-0.cs
new file mode 100644
index 0000000..9efe698
--- /dev/null
+++ b/src/OpenKamer.DataModel/tkData-v1-0.cs
@@ -0,0 +1,1470 @@
+//
+// (c) 2022, Alphons van der Heijden
+//
+// https://opendata.tweedekamer.nl/documentatie/
+// alphons@heijden.com
+//
+
+
+// Produced by: xsd tkData-v1-0.xsd and edited (a lot)
+//
+// id and ref are Guid
+//
+// tokenType => string
+// stringType => string
+//
+// datumType => string
+//
+// dateType => DateTime
+// dateTimeType => DateTime
+//
+// geslachtField => string
+// geslacht => string
+// activiteitTypeVrsNummer => string
+//
+// vergaderjaarType => string
+//
+// base64BinaryType => byte[]
+//
+// booleanType => bool
+//
+// usignedIntType => uint
+// intType => int
+//
+//
+// [XmlElement("annotatie")]
+// [JsonIgnore]
+//
+// [XmlAttribute("id")]
+// [JsonPropertyName("_id")] // shortcut for mongodb
+//
+// [XmlElement(IsNullable = true)] => Nullable<T>
+//
+
+
+namespace nl.tweedekamer.opendata.DataModel;
+
+#nullable disable
+
+#pragma warning disable IDE1006
+
+using System;
+using System.Xml.Serialization;
+using System.Xml.Schema;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Text.Json.Serialization;
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoon", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonType : downloadEntiteitType
+{
+ public string nummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string titels { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string initialen { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string tussenvoegsel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string achternaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string voornamen { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string roepnaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string geslacht { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> geboortedatum { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string geboorteplaats { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string geboorteland { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> overlijdensdatum { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string overlijdensplaats { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string woonplaats { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string land { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string fractielabel { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public partial class relatieType
+{
+ [XmlAttribute("id")]
+ [JsonPropertyName("_id")] // shortcut for mongo
+ public string id { get; set; }
+
+ [XmlAttribute("ref")]
+ [JsonPropertyName("ref")]
+ public string @ref { get; set; }
+}
+
+[XmlInclude(typeof(referentieType))]
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public partial class referentieLiteral
+{
+ [XmlElement("annotatie")]
+ [JsonIgnore]
+ public object[] annotatie { get; set; }
+
+ [XmlAttribute("ref")]
+ public Guid @ref { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public partial class referentieType : referentieLiteral
+{
+}
+
+[XmlInclude(typeof(resourceType))]
+[XmlInclude(typeof(entiteitType))]
+[XmlInclude(typeof(zaakActorType))]
+[XmlInclude(typeof(zaakType))]
+[XmlInclude(typeof(vergaderingType))]
+[XmlInclude(typeof(reserveringType))]
+[XmlInclude(typeof(zaalType))]
+[XmlInclude(typeof(kamerstukdossierType))]
+[XmlInclude(typeof(documentVersieType))]
+[XmlInclude(typeof(documentActorType))]
+[XmlInclude(typeof(stemmingType))]
+[XmlInclude(typeof(besluitType))]
+[XmlInclude(typeof(agendapuntType))]
+[XmlInclude(typeof(activiteitActorType))]
+[XmlInclude(typeof(activiteitType))]
+[XmlInclude(typeof(fractieZetelVacatureType))]
+[XmlInclude(typeof(fractieZetelPersoonType))]
+[XmlInclude(typeof(fractieZetelType))]
+[XmlInclude(typeof(fractieAanvullendGegevenType))]
+[XmlInclude(typeof(commissieZetelVervangerVacatureType))]
+[XmlInclude(typeof(commissieZetelVervangerPersoonType))]
+[XmlInclude(typeof(commissieZetelVastVacatureType))]
+[XmlInclude(typeof(commissieZetelVastPersoonType))]
+[XmlInclude(typeof(commissieZetelType))]
+[XmlInclude(typeof(commissieContactinformatieType))]
+[XmlInclude(typeof(commissieType))]
+[XmlInclude(typeof(persoonReisType))]
+[XmlInclude(typeof(persoonOnderwijsType))]
+[XmlInclude(typeof(persoonNevenfunctieInkomstenType))]
+[XmlInclude(typeof(persoonNevenfunctieType))]
+[XmlInclude(typeof(persoonLoopbaanType))]
+[XmlInclude(typeof(persoonGeschenkType))]
+[XmlInclude(typeof(persoonContactinformatieType))]
+[XmlInclude(typeof(downloadEntiteitType))]
+[XmlInclude(typeof(verslagType))]
+[XmlInclude(typeof(documentType))]
+[XmlInclude(typeof(fractieType))]
+[XmlInclude(typeof(persoonType))]
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public partial class identificatieType
+{
+
+ [XmlElement("annotatie")]
+ [JsonIgnore]
+ public object[] annotatie { get; set; }
+
+ [XmlAttribute("id")]
+ [JsonPropertyName("_id")] // shortcut for mongo
+
+ public Guid id { get; set; }
+}
+
+[XmlInclude(typeof(zaakActorType))]
+[XmlInclude(typeof(zaakType))]
+[XmlInclude(typeof(vergaderingType))]
+[XmlInclude(typeof(reserveringType))]
+[XmlInclude(typeof(zaalType))]
+[XmlInclude(typeof(kamerstukdossierType))]
+[XmlInclude(typeof(documentVersieType))]
+[XmlInclude(typeof(documentActorType))]
+[XmlInclude(typeof(stemmingType))]
+[XmlInclude(typeof(besluitType))]
+[XmlInclude(typeof(agendapuntType))]
+[XmlInclude(typeof(activiteitActorType))]
+[XmlInclude(typeof(activiteitType))]
+[XmlInclude(typeof(fractieZetelVacatureType))]
+[XmlInclude(typeof(fractieZetelPersoonType))]
+[XmlInclude(typeof(fractieZetelType))]
+[XmlInclude(typeof(fractieAanvullendGegevenType))]
+[XmlInclude(typeof(commissieZetelVervangerVacatureType))]
+[XmlInclude(typeof(commissieZetelVervangerPersoonType))]
+[XmlInclude(typeof(commissieZetelVastVacatureType))]
+[XmlInclude(typeof(commissieZetelVastPersoonType))]
+[XmlInclude(typeof(commissieZetelType))]
+[XmlInclude(typeof(commissieContactinformatieType))]
+[XmlInclude(typeof(commissieType))]
+[XmlInclude(typeof(persoonReisType))]
+[XmlInclude(typeof(persoonOnderwijsType))]
+[XmlInclude(typeof(persoonNevenfunctieInkomstenType))]
+[XmlInclude(typeof(persoonNevenfunctieType))]
+[XmlInclude(typeof(persoonLoopbaanType))]
+[XmlInclude(typeof(persoonGeschenkType))]
+[XmlInclude(typeof(persoonContactinformatieType))]
+[XmlInclude(typeof(downloadEntiteitType))]
+[XmlInclude(typeof(verslagType))]
+[XmlInclude(typeof(documentType))]
+[XmlInclude(typeof(fractieType))]
+[XmlInclude(typeof(persoonType))]
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public abstract partial class entiteitType : identificatieType
+{
+ [XmlAttribute(Form = XmlSchemaForm.Qualified)]
+ public bool verwijderd { get; set; }
+
+ [XmlAttribute(Form = XmlSchemaForm.Qualified)]
+ public DateTime bijgewerkt { get; set; }
+
+}
+
+[XmlInclude(typeof(verslagType))]
+[XmlInclude(typeof(documentType))]
+[XmlInclude(typeof(fractieType))]
+[XmlInclude(typeof(persoonType))]
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public abstract partial class downloadEntiteitType : entiteitType
+{
+ [XmlAttribute(Form = XmlSchemaForm.Qualified)]
+ public string contentType { get; set; }
+
+ [XmlAttribute(Form = XmlSchemaForm.Qualified)]
+ public int contentLength { get; set; }
+
+ [XmlIgnore()]
+ public bool contentLengthSpecified { get; set; }
+
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoonContactinformatie", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonContactinformatieType : entiteitType
+{
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string waarde { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoonGeschenk", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonGeschenkType : entiteitType
+{
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string omschrijving { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datum { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoonLoopbaan", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonLoopbaanType : entiteitType
+{
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string werkgever { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string omschrijvingNl { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string omschrijvingEn { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string plaats { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string totEnMet { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoonNevenfunctie", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonNevenfunctieType : entiteitType
+{
+
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string omschrijving { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<bool> isActief { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public persoonNevenfunctieTypePeriode periode { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public persoonNevenfunctieTypeVergoeding vergoeding { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public partial class persoonNevenfunctieTypePeriode
+{
+ [XmlElement(IsNullable = true)]
+ public string van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string totEnMet { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(AnonymousType = true, Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+public partial class persoonNevenfunctieTypeVergoeding
+{
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string toelichting { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoonNevenfunctieInkomsten", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonNevenfunctieInkomstenType : entiteitType
+{
+ public referentieLiteral persoonNevenfunctie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string jaar { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string bedragSoort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string bedragVoorvoegsel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string bedragValuta { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<decimal> bedrag { get; set; }
+
+ [XmlIgnore()]
+ public bool bedragSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string bedragAchtervoegsel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string frequentie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string frequentieBeschrijving { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string opmerking { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoonOnderwijs", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonOnderwijsType : entiteitType
+{
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string opleidingNl { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string opleidingEn { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string instelling { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string plaats { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string totEnMet { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("persoonReis", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class persoonReisType : entiteitType
+{
+
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string doel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string bestemming { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string totEnMet { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string betaaldDoor { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("commissie", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class commissieType : entiteitType
+{
+
+ public string nummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string afkorting { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string naamNl { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string naamEn { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string naamWebNl { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string naamWebEn { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string inhoudsopgave { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumActief { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumInactief { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("commissieContactinformatie", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class commissieContactinformatieType : entiteitType
+{
+
+ public referentieLiteral commissie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string waarde { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("commissieZetel", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class commissieZetelType : entiteitType
+{
+
+ public referentieLiteral commissie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("commissieZetelVastPersoon", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class commissieZetelVastPersoonType : entiteitType
+{
+
+ public referentieLiteral commissieZetel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> totEnMet { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("commissieZetelVastVacature", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class commissieZetelVastVacatureType : entiteitType
+{
+
+ public referentieLiteral commissieZetel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public referentieLiteral fractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> totEnMet { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("commissieZetelVervangerPersoon", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class commissieZetelVervangerPersoonType : entiteitType
+{
+
+ public referentieLiteral commissieZetel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> totEnMet { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("commissieZetelVervangerVacature", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class commissieZetelVervangerVacatureType : entiteitType
+{
+
+ public referentieLiteral commissieZetel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public referentieLiteral fractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> totEnMet { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("fractie", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class fractieType : downloadEntiteitType
+{
+
+ public string nummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string afkorting { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string naamNl { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string naamEn { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> aantalZetels { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> aantalStemmen { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumActief { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumInactief { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("fractieAanvullendGegeven", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class fractieAanvullendGegevenType : entiteitType
+{
+
+ public referentieLiteral fractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string waarde { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("fractieZetel", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class fractieZetelType : entiteitType
+{
+
+ public referentieLiteral fractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> gewicht { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("fractieZetelPersoon", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class fractieZetelPersoonType : entiteitType
+{
+
+ public referentieLiteral fractieZetel { get; set; }
+
+ public referentieLiteral persoon { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> totEnMet { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("fractieZetelVacature", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class fractieZetelVacatureType : entiteitType
+{
+
+ public referentieLiteral fractieZetel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> van { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> totEnMet { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("activiteit", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class activiteitType : entiteitType
+{
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string nummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string onderwerp { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string datumSoort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datum { get; set; }
+
+ [XmlIgnore()]
+ public bool datumSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> aanvangstijd { get; set; }
+
+ [XmlIgnore()]
+ public bool aanvangstijdSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> eindtijd { get; set; }
+
+ [XmlIgnore()]
+ public bool eindtijdSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string locatie { get; set; }
+
+ public bool besloten { get; set; }
+
+ public string status { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string vergaderjaar { get; set; }
+
+ public string kamer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string noot { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string vrsNummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string sidVoortouw { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string voortouwnaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string voortouwafkorting { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string voortouwkortenaam { get; set; }
+
+ public referentieLiteral voortouwcommissie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> aanvraagdatum { get; set; }
+
+ [XmlIgnore()]
+ public bool aanvraagdatumSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumVerzoekEersteVerlenging { get; set; }
+
+ [XmlIgnore()]
+ public bool datumVerzoekEersteVerlengingSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumMededelingEersteVerlenging { get; set; }
+
+ [XmlIgnore()]
+ public bool datumMededelingEersteVerlengingSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumVerzoekTweedeVerlenging { get; set; }
+
+ [XmlIgnore()]
+ public bool datumVerzoekTweedeVerlengingSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumMededelingTweedeVerlenging { get; set; }
+
+ [XmlIgnore()]
+ public bool datumMededelingTweedeVerlengingSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> vervaldatum { get; set; }
+
+ [XmlIgnore()]
+ public bool vervaldatumSpecified { get; set; }
+
+ public referentieLiteral voortgezetVanuit { get; set; }
+
+ public referentieLiteral vervangenVanuit { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("activiteitActor", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class activiteitActorType : entiteitType
+{
+ public referentieLiteral activiteit { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorNaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorFractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string relatie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> volgorde { get; set; }
+
+ [XmlIgnore()]
+ public bool volgordeSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string spreektijd { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string sidActor { get; set; }
+
+ public referentieLiteral persoon { get; set; }
+
+ public referentieLiteral fractie { get; set; }
+
+ public referentieLiteral commissie { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("agendapunt", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class agendapuntType : entiteitType
+{
+ public referentieLiteral activiteit { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string nummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string onderwerp { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> aanvangstijd { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> eindtijd { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> volgorde { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string rubriek { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string noot { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string status { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("besluit", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class besluitType : entiteitType
+{
+
+ public referentieLiteral agendapunt { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string stemmingsSoort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string besluitSoort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string besluitTekst { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string opmerking { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string status { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> agendapuntZaakBesluitVolgorde { get; set; }
+
+ [XmlElement("zaak")]
+ public referentieLiteral[] zaak { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("stemming", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class stemmingType : entiteitType
+{
+
+ public referentieLiteral besluit { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> fractieGrootte { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorNaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorFractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<bool> vergissing { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string sidActorLid { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string sidActorFractie { get; set; }
+
+ public referentieType persoon { get; set; }
+
+ public referentieType fractie { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("document", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class documentType : downloadEntiteitType
+{
+
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ public string documentNummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string titel { get; set; }
+
+ public string onderwerp { get; set; }
+
+ public DateTime datum { get; set; }
+
+ [XmlIgnore()] // Is this correct????
+ public bool datumSpecified { get; set; }
+
+ public int volgnummer { get; set; }
+
+ public string vergaderjaar { get; set; }
+
+ public int kamer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string citeertitel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string alias { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumRegistratie { get; set; }
+
+ [XmlIgnore()] // Is this correct?
+ public bool datumRegistratieSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datumOntvangst { get; set; }
+
+ [XmlIgnore()]
+ public bool datumOntvangstSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string aanhangselnummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string kenmerkAfzender { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public referentieLiteral huidigeDocumentVersie { get; set; }
+
+ [XmlElement("bronDocument")]
+ public referentieLiteral[] bronDocument { get; set; }
+
+ [XmlElement("activiteit")]
+ public referentieLiteral[] activiteit { get; set; }
+
+ [XmlElement("agendapunt")]
+ public referentieLiteral[] agendapunt { get; set; }
+
+ [XmlElement("zaak")]
+ public referentieLiteral[] zaak { get; set; }
+
+ public referentieLiteral kamerstukdossier { get; set; }
+
+ public string organisatie { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("documentActor", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class documentActorType : entiteitType
+{
+
+ public referentieLiteral document { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorNaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorFractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string relatie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string sidActor { get; set; }
+
+ public referentieLiteral persoon { get; set; }
+
+ public referentieLiteral fractie { get; set; }
+
+ public referentieLiteral commissie { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("documentVersie", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class documentVersieType : entiteitType
+{
+
+ public referentieLiteral document { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string status { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> versienummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> bestandsgrootte { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string extensie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datum { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("kamerstukdossier", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class kamerstukdossierType : entiteitType
+{
+
+ [XmlElement(IsNullable = true)]
+ public string titel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string citeertitel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string alias { get; set; }
+
+ public uint nummer { get; set; }
+
+ [XmlIgnore()]
+ public bool nummerSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string toevoeging { get; set; }
+
+ public int hoogsteVolgnummer { get; set; }
+
+ [XmlIgnore()]
+ public bool hoogsteVolgnummerSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<bool> afgesloten { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string kamer { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("zaal", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class zaalType : entiteitType
+{
+
+ public string naam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> sysCode { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("reservering", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class reserveringType : entiteitType
+{
+
+ [XmlElement(IsNullable = true)]
+ public string nummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string statusCode { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string statusNaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string activiteitNummer { get; set; }
+
+ public referentieLiteral zaal { get; set; }
+
+ [XmlElement("activiteit")]
+ public referentieLiteral[] activiteit { get; set; }
+}
+
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("vergadering", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class vergaderingType : entiteitType
+{
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string titel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string zaal { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string vergaderjaar { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<uint> vergaderingNummer { get; set; }
+
+ [XmlIgnore()]
+ public bool vergaderingNummerSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> datum { get; set; }
+
+ [XmlIgnore()]
+ public bool datumSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> aanvangstijd { get; set; }
+
+ [XmlIgnore()]
+ public bool aanvangstijdSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> sluiting { get; set; }
+
+ [XmlIgnore()]
+ public bool sluitingSpecified { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string kamer { get; set; }
+
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("verslag", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class verslagType : downloadEntiteitType
+{
+ public referentieLiteral vergadering { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string status { get; set; }
+
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("zaak", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class zaakType : entiteitType
+{
+ public string nummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string soort { get; set; }
+ public string onderwerp { get; set; }
+ public DateTime gestartOp { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string organisatie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string titel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string citeertitel { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string alias { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string grondslagvoorhang { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<DateTime> termijn { get; set; }
+ public string vergaderjaar { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<int> volgnummer { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string status { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string huidigeBehandelstatus { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<bool> afgedaan { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public Nullable<bool> grootProject { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string kabinetsappreciatie { get; set; }
+ public referentieLiteral kamerstukdossier { get; set; }
+
+ [XmlElement("activiteit")]
+ public referentieLiteral[] activiteit { get; set; }
+
+ [XmlElement("agendapunt")]
+ public referentieLiteral[] agendapunt { get; set; }
+
+ [XmlElement("gerelateerdVanuit")]
+ public referentieLiteral[] gerelateerdVanuit { get; set; }
+
+ [XmlElement("vervangenVanuit")]
+ public referentieLiteral[] vervangenVanuit { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("zaakActor", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class zaakActorType : entiteitType
+{
+ public referentieLiteral zaak { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorNaam { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorFractie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string actorAfkorting { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string functie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string relatie { get; set; }
+
+ [XmlElement(IsNullable = true)]
+ public string sidActor { get; set; }
+ public referentieLiteral persoon { get; set; }
+ public referentieLiteral fractie { get; set; }
+ public referentieLiteral commissie { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("resource", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class resourceType : identificatieType
+{
+ [XmlElement(IsNullable = true)]
+ public byte[] bytes { get; set; }
+}
+
+[Serializable()]
+[DebuggerStepThrough()]
+[DesignerCategory("code")]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0")]
+[XmlRoot("identiteit", Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IsNullable = false)]
+public partial class identiteitType
+{
+ [XmlElement("bron", typeof(string), DataType = "token")]
+ [XmlElement("sleutel", typeof(string), DataType = "token")]
+ [XmlChoiceIdentifier("ItemsElementName")]
+ public string[] Items { get; set; }
+
+ [XmlElement("ItemsElementName")]
+ [XmlIgnore()]
+ public ItemsChoiceType[] ItemsElementName { get; set; }
+
+ [XmlAttribute()]
+ public string aanduiding { get; set; }
+}
+
+[Serializable()]
+[XmlType(Namespace = "http://www.tweedekamer.nl/xsd/tkData/v1-0", IncludeInSchema = false)]
+public enum ItemsChoiceType
+{
+ bron,
+ sleutel,
+}
+
+#pragma warning restore IDE1006
+
diff --git a/src/OpenKamer.LogicControllers/EntityController.cs b/src/OpenKamer.LogicControllers/EntityController.cs
new file mode 100644
index 0000000..62d50f5
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/EntityController.cs
@@ -0,0 +1,248 @@
+//
+// (c) 2022, Alphons van der Heijden
+//
+// https://opendata.tweedekamer.nl/documentatie/
+//
+
+using System.Xml;
+using System.Xml.Serialization;
+using System.Diagnostics;
+
+using nl.tweedekamer.opendata.DataModel;
+
+
+namespace OpenKamer.LogicControllers;
+
+public class EntityController
+{
+
+ private readonly string DB;
+ public EntityController(string DB)
+ {
+ this.DB = DB;
+ }
+
+ public delegate Task AsyncEventHandler(object sender, EventArgs e);
+
+ public event AsyncEventHandler? OnEntity;
+
+ public event EventHandler? OnLog;
+
+ private void Log(string message)
+ {
+ OnLog?.Invoke(message, new EventArgs());
+ }
+
+ async public Task DecodeEntriesAsync(string? skiptoken)
+ {
+ Log("DecodeEntriesAsync");
+
+ XmlSerializer serializer = new(typeof(Feed));
+
+ if (string.IsNullOrWhiteSpace(skiptoken))
+ skiptoken = "empty";
+
+ do
+ {
+ Log("Skiptoken: " + skiptoken);
+
+ string FileName = DB + @"\" + skiptoken + ".xml";
+
+ using StreamReader reader = new(FileName);
+
+ var feed = (Feed?)serializer.Deserialize(reader);
+
+ if (feed == null)
+ {
+ Log("no valid feed exit");
+ return;
+ }
+
+ var resumeNode = feed.Links.FirstOrDefault(x => x.Rel == "resume");
+ if (resumeNode != null)
+ {
+ Log("Resume (not complete) exit");
+ return;
+ }
+
+ var nextNode = feed.Links.FirstOrDefault(x => x.Rel == "next");
+ if (nextNode == null || nextNode.Href == null)
+ {
+ Log("Normal exit");
+ return;
+ }
+
+ var intI = nextNode.Href.IndexOf("skiptoken=");
+ if (intI < 0)
+ {
+ Log("Abnormal skiptoken exit");
+ return;
+ }
+ if (intI > 0)
+ skiptoken = nextNode.Href[(intI + 10)..];
+
+ await ProcessEntitiesAsync2(feed);
+
+ } while (!string.IsNullOrWhiteSpace(skiptoken));
+
+ Log("Abnormal empty skiptoken exit");
+ }
+
+ async private Task<T?> GetEntityAsync<T>(XmlNode xmlNode)
+ {
+ XmlSerializer serializer = new(typeof(T));
+
+ if (xmlNode.Name == "ns1:verslag") // referentieLiteral unknown type
+ xmlNode.InnerXml = xmlNode.InnerXml.Replace("xsi:type=\"ns1:referentieLiteral\"", string.Empty);
+
+ try
+ {
+ var result = (T?)serializer.Deserialize(new XmlNodeReader(xmlNode));
+ if(result != null && OnEntity != null)
+ await OnEntity.Invoke(result, new EventArgs());
+ return result;
+ }
+ catch (Exception eeee)
+ {
+ Debug.WriteLine(eeee.ToString());
+ Debug.WriteLine(xmlNode.OuterXml);
+ return default;
+ }
+ }
+
+ #pragma warning disable IDE0059
+
+ async private Task ProcessEntitiesAsync2(Feed feed)
+ {
+
+ var entries = feed.Entries;
+
+ if (entries == null)
+ {
+ Log("no entries found");
+ return;
+ }
+
+ foreach (var entry in entries)
+ {
+ if (entry.Content.FirstChild == null)
+ continue;
+
+ switch (entry.Category.Term)
+ {
+ default:
+ Log($"Unknown Category {entry.Category.Term}");
+ break;
+ case "zaal":
+ var zaal = await GetEntityAsync<zaalType>(entry.Content.FirstChild);
+ break;
+ case "reservering":
+ var reservering = await GetEntityAsync<reserveringType>(entry.Content.FirstChild);
+ break;
+ case "vergadering":
+ var vergadering = await GetEntityAsync<vergaderingType>(entry.Content.FirstChild);
+ break;
+ case "verslag":
+ var verslag = await GetEntityAsync<verslagType>(entry.Content.FirstChild);
+ break;
+ case "activiteit":
+ var activiteit = await GetEntityAsync<activiteitType>(entry.Content.FirstChild);
+ break;
+ case "documentVersie":
+ var documentversie = await GetEntityAsync<documentVersieType>(entry.Content.FirstChild);
+ break;
+ case "document":
+ var document = await GetEntityAsync<documentType>(entry.Content.FirstChild); // document.Soort == "Motie"
+ break;
+ case "zaak":
+ var zaak = await GetEntityAsync<zaakType>(entry.Content.FirstChild);
+ break;
+ case "agendapunt":
+ var agendapunt = await GetEntityAsync<agendapuntType>(entry.Content.FirstChild);
+ break;
+ case "besluit":
+ var besluit = await GetEntityAsync<besluitType>(entry.Content.FirstChild);
+ break;
+ case "kamerstukdossier":
+ var kamerstukdossier = await GetEntityAsync<kamerstukdossierType>(entry.Content.FirstChild);
+ break;
+ case "activiteitActor":
+ var activiteitActor = await GetEntityAsync<activiteitActorType>(entry.Content.FirstChild);
+ break;
+ case "zaakActor":
+ var zaakActor = await GetEntityAsync<zaakActorType>(entry.Content.FirstChild);
+ break;
+ case "documentActor":
+ var documentActor = await GetEntityAsync<documentActorType>(entry.Content.FirstChild);
+ break;
+ case "stemming":
+ var stemming = await GetEntityAsync<stemmingType>(entry.Content.FirstChild);
+ break;
+ case "persoon":
+ var persoon = await GetEntityAsync<persoonType>(entry.Content.FirstChild);
+ break;
+ case "fractie":
+ var fractie = await GetEntityAsync<fractieType>(entry.Content.FirstChild);
+ break;
+ case "persoonNevenfunctie":
+ var persoonNevenfunctie = await GetEntityAsync<persoonNevenfunctieType>(entry.Content.FirstChild);
+ break;
+ case "commissie":
+ var commissie = await GetEntityAsync<commissieType>(entry.Content.FirstChild);
+ break;
+ case "persoonGeschenk":
+ var persoonGeschenk = await GetEntityAsync<persoonGeschenkType>(entry.Content.FirstChild);
+ break;
+ case "persoonReis":
+ var persoonReis = await GetEntityAsync<persoonReisType>(entry.Content.FirstChild);
+ break;
+ case "persoonLoopbaan":
+ var persoonLoopbaan = await GetEntityAsync<persoonLoopbaanType>(entry.Content.FirstChild);
+ break;
+ case "persoonOnderwijs":
+ var persoonOnderwijs = await GetEntityAsync<persoonOnderwijsType>(entry.Content.FirstChild);
+ break;
+ case "commissieZetel":
+ var commissieZetel = await GetEntityAsync<commissieZetelType>(entry.Content.FirstChild);
+ break;
+ case "commissieZetelVastPersoon":
+ var commissieZetelVastPersoon = await GetEntityAsync<commissieZetelVastPersoonType>(entry.Content.FirstChild);
+ break;
+ case "commissieZetelVervangerVacature":
+ var commissieZetelVervangerVacature = await GetEntityAsync<commissieZetelVervangerVacatureType>(entry.Content.FirstChild);
+ break;
+ case "commissieZetelVervangerPersoon":
+ var commissieZetelVervangerPersoon = await GetEntityAsync<commissieZetelVervangerPersoonType>(entry.Content.FirstChild);
+ break;
+ case "commissieZetelVastVacature":
+ var commissieZetelVastVacature = await GetEntityAsync<commissieZetelVastVacatureType>(entry.Content.FirstChild);
+ break;
+ case "fractieZetel":
+ var fractieZetel = await GetEntityAsync<fractieZetelType>(entry.Content.FirstChild);
+ break;
+ case "fractieZetelPersoon":
+ var fractieZetelPersoon = await GetEntityAsync<fractieZetelPersoonType>(entry.Content.FirstChild);
+ break;
+ case "fractieZetelVacature":
+ var fractieZetelVacature = await GetEntityAsync<fractieZetelVacatureType>(entry.Content.FirstChild);
+ break;
+ case "persoonNevenfunctieInkomsten":
+ var persoonNevenfunctieInkomsten = await GetEntityAsync<persoonNevenfunctieInkomstenType>(entry.Content.FirstChild);
+ break;
+ case "commissieContactinformatie":
+ var commissieContactinformatie = await GetEntityAsync<commissieContactinformatieType>(entry.Content.FirstChild);
+ break;
+ case "persoonContactinformatie":
+ var persoonContactinformatie = await GetEntityAsync<persoonContactinformatieType>(entry.Content.FirstChild);
+ break;
+ }
+ }
+
+ //Log($"{entries.Length}");
+ }
+
+#pragma warning restore IDE0059
+
+
+
+}
diff --git a/src/OpenKamer.LogicControllers/FeedController.cs b/src/OpenKamer.LogicControllers/FeedController.cs
new file mode 100644
index 0000000..4d78f3e
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/FeedController.cs
@@ -0,0 +1,141 @@
+//
+// (c) 2022, Alphons van der Heijden
+//
+// https://opendata.tweedekamer.nl/documentatie/
+// https://opendata.tweedekamer.nl/documentatie/syncfeed-api
+//
+
+using System.Xml;
+
+namespace OpenKamer.LogicControllers;
+
+
+public class FeedController
+{
+ private static readonly string FEED = "https://gegevensmagazijn.tweedekamer.nl/SyncFeed/2.0/";
+
+ private string DB = @"\\192.168.28.195\f$\gegevensmagazijn";
+
+ public FeedController(string DB)
+ {
+ this.DB = DB;
+ }
+
+ public event EventHandler? OnLog;
+
+
+ private void Log(string message)
+ {
+ OnLog?.Invoke(message, new EventArgs());
+ }
+
+
+ async public Task SyncFeedAsync(string? skiptoken)
+ {
+ Log("SyncFeedAsync");
+
+ XmlNamespaceManager? nsmgr = null;
+
+ HttpClient httpclient = new();
+
+ XmlDocument xmlDoc = new();
+
+ string urlFeed = FEED;
+
+ if (string.IsNullOrWhiteSpace(skiptoken) == false)
+ urlFeed += "?skiptoken=" + skiptoken;
+
+ if (string.IsNullOrWhiteSpace(skiptoken))
+ skiptoken = "empty";
+
+ do
+ {
+ Log("Skiptoken: " + skiptoken);
+
+ string FileName = DB + @"\" + skiptoken + ".xml";
+
+ var refresh = true;
+
+ if (File.Exists(FileName))
+ {
+ xmlDoc.Load(FileName);
+
+ nsmgr = new(xmlDoc.NameTable);
+ if (xmlDoc.DocumentElement != null)
+ nsmgr.AddNamespace("ns", xmlDoc.DocumentElement.NamespaceURI);
+
+ var resumeNode = xmlDoc.SelectSingleNode("/ns:feed/ns:link[@rel='resume']", nsmgr);
+
+ refresh = resumeNode != null;
+
+ if (refresh)
+ Log("Refresh");
+ else
+ Log("Cached");
+ }
+
+ if (refresh)
+ {
+ var xml = await httpclient.GetStringAsync(urlFeed);
+
+ await File.WriteAllTextAsync(FileName, xml);
+
+ Log("Saved");
+
+ xmlDoc.LoadXml(xml);
+
+ nsmgr = new(xmlDoc.NameTable);
+ if (xmlDoc.DocumentElement != null)
+ nsmgr.AddNamespace("ns", xmlDoc.DocumentElement.NamespaceURI);
+ }
+
+ if (nsmgr == null)
+ {
+ Log("XmlNamespaceManager missing");
+ return;
+ }
+
+ var nextNode = xmlDoc.SelectSingleNode("/ns:feed/ns:link[@rel='next']", nsmgr);
+
+ if (nextNode == null)
+ {
+ Log("Normal exit");
+ return;
+ }
+
+ if (nextNode.Attributes == null)
+ {
+ Log("Abnormal Attributes exit");
+ return;
+ }
+
+ var attr = nextNode.Attributes["href"];
+
+ if (attr == null)
+ {
+ Log("Abnormal href exit");
+ return;
+ }
+
+ urlFeed = attr.Value;
+
+ if (urlFeed == null)
+ {
+ Log("Abnormal feed exit");
+ return;
+ }
+
+ var intI = urlFeed.IndexOf("skiptoken=");
+ if (intI < 0)
+ {
+ Log("Abnormal skiptoken exit");
+ return;
+ }
+
+ skiptoken = urlFeed[(intI + 10)..];
+
+ } while (!string.IsNullOrWhiteSpace(skiptoken));
+
+ Log("Abnormal empty skiptoken exit");
+ }
+}
diff --git a/src/OpenKamer.LogicControllers/OpenKamer.LogicControllers.csproj b/src/OpenKamer.LogicControllers/OpenKamer.LogicControllers.csproj
new file mode 100644
index 0000000..323e09f
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/OpenKamer.LogicControllers.csproj
@@ -0,0 +1,18 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>net7.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ <OutputType>Library</OutputType>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="MongoDB.MvcCore" Version="1.0.9" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\OpenKamer.DataModel\OpenKamer.DataModel.csproj" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/OpenKamer.LogicControllers/Properties/launchSettings.json b/src/OpenKamer.LogicControllers/Properties/launchSettings.json
new file mode 100644
index 0000000..9d1b6ff
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "OpenKamer.LogicControllers": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:2775;http://localhost:2776"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/OpenKamer.LogicControllers/Web/Collections.cs b/src/OpenKamer.LogicControllers/Web/Collections.cs
new file mode 100644
index 0000000..793b042
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/Web/Collections.cs
@@ -0,0 +1,90 @@
+
+using Microsoft.AspNetCore.Mvc;
+
+using nl.tweedekamer.opendata.DataModel;
+
+using MongoDB.Driver;
+using MongoDB.MvcCore;
+
+
+namespace OpenKamer.LogicControllers.Web;
+
+public partial class WebController : ControllerBase
+{
+ [HttpPost]
+ [Route("~/api/ShowCollections")]
+ public async Task<IActionResult> ShowCollections()
+ {
+ var List = await db.ListCollectionNames().ToListAsync();
+
+ return Ok(new
+ {
+ List
+ });
+ }
+
+ [HttpPost]
+ [Route("~/api/ShowCollection")]
+ public async Task<IActionResult> ShowCollection(string ColName)
+ {
+ object? List = null;
+ switch (ColName)
+ {
+ default:
+ List = await db.GetCollection(ColName).Find("{}").ToListAsync();
+ break;
+ case "commissieType":
+ var commissies = await db.GetCollection<commissieType>(ColName).Find("{}").ToListAsync();
+ List = commissies.Select(x => new
+ {
+ naam = x.naamNl,
+ x.nummer,
+ x.afkorting,
+ x.soort
+ }).ToList();
+ break;
+ case "zaalType":
+ var list = await db.GetCollection<zaalType>(ColName).Find("{}").ToListAsync();
+ List = list.Select(x => new { x.id, x.naam, x.sysCode, x.bijgewerkt, x.verwijderd }).ToList();
+ break;
+ case "persoonType":
+ var personen = await db.GetCollection<persoonType>(ColName).Find("{ functie: 'Tweede Kamerlid' }").ToListAsync();
+ List = personen.Select(x => new
+ {
+ //x.id,
+ x.titels,
+ x.initialen,
+ fullnaam = $"{x.roepnaam} {x.tussenvoegsel} {x.achternaam}",
+ x.voornamen,
+ geboortedatum = x.geboortedatum != null ? x.geboortedatum.Value.ToString("yyyy-MM-dd") : string.Empty,
+ x.geboorteplaats,
+ x.geboorteland,
+ //x.overlijdensdatum,
+ //x.overlijdensplaats,
+ //x.functie,
+ x.nummer,
+ //x.geslacht,
+ x.bijgewerkt,
+ x.achternaam,
+ //x.verwijderd
+ }).OrderBy(x => x.achternaam).ToList();
+ break;
+ case "fractieType":
+ var fracties = await db.GetCollection<fractieType>(ColName).Find("{ 'aantalZetels' : { $gt : 0 } }").ToListAsync();
+ List = fracties.Select(x => new
+ {
+ x.nummer,
+ x.aantalZetels,
+ x.afkorting,
+ x.naamNl
+ }).OrderByDescending(x => x.aantalZetels).ToList();
+ break;
+ }
+
+ return Ok(new
+ {
+ List
+ });
+ }
+
+}
diff --git a/src/OpenKamer.LogicControllers/Web/Doucumenten.cs b/src/OpenKamer.LogicControllers/Web/Doucumenten.cs
new file mode 100644
index 0000000..be4684c
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/Web/Doucumenten.cs
@@ -0,0 +1,49 @@
+using Microsoft.AspNetCore.Mvc;
+
+using MongoDB.Driver;
+using MongoDB.MvcCore;
+
+namespace OpenKamer.LogicControllers.Web;
+
+public partial class WebController : ControllerBase
+{
+ [HttpPost]
+ [Route("~/api/Moties")]
+ public async Task<IActionResult> Moties()
+ {
+ var a = @"
+[
+ {
+ $match:
+ {
+ 'organisatie' : 'Tweede Kamer',
+ 'soort' : 'Motie',
+ 'vergaderjaar' : '2021-2022'
+ }
+ },
+ {
+ $project:
+ {
+ _id : 0,
+ titel: '$titel',
+ onderwerp: '$onderwerp',
+ datum: '$datum',
+ jaar: '$vergaderjaar'
+
+ }
+ },
+
+{ $skip: 0 },
+{ $limit: 100 }
+]
+";
+
+
+ var List = await db.GetCollection("documentType").Aggregate(a).ToListAsync();
+
+ return Ok(new
+ {
+ List
+ });
+ }
+}
diff --git a/src/OpenKamer.LogicControllers/Web/Fracties.cs b/src/OpenKamer.LogicControllers/Web/Fracties.cs
new file mode 100644
index 0000000..bff39e0
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/Web/Fracties.cs
@@ -0,0 +1,38 @@
+
+using Microsoft.AspNetCore.Mvc;
+
+using MongoDB.Driver;
+using MongoDB.MvcCore;
+
+namespace OpenKamer.LogicControllers.Web;
+
+public partial class WebController : ControllerBase
+{
+ [HttpPost]
+ [Route("~/api/Fracties")]
+ public async Task<IActionResult> Fracties()
+ {
+ var a = @"
+[
+{ $match: { verwijderd: false, 'aantalZetels' : { $gt : 0 } } },
+{ $project:
+ {
+ _id: 0,
+ afko: '$afkorting',
+ naam: '$naamNl',
+ zetels: '$aantalZetels',
+ stemmen: '$aantalStemmen',
+ }
+},
+{ $skip: 0 },
+{ $limit: 50 }
+]";
+ var List = await db.GetCollection("fractieType").Aggregate(a).ToListAsync();
+
+ return Ok(new
+ {
+ List
+ });
+ }
+
+}
diff --git a/src/OpenKamer.LogicControllers/Web/HelloWorld.cs b/src/OpenKamer.LogicControllers/Web/HelloWorld.cs
new file mode 100644
index 0000000..c81aa90
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/Web/HelloWorld.cs
@@ -0,0 +1,24 @@
+using Microsoft.AspNetCore.Mvc;
+using MongoDB.MvcCore;
+
+namespace OpenKamer.LogicControllers.Web;
+
+public partial class WebController : ControllerBase
+{
+ [HttpGet]
+ [Route("~/api/HelloWorld")]
+ public async Task<IActionResult> HelloWorld()
+ {
+ // Forces a session cooky
+ HttpContext.Session.SetString("Hello", "World");
+ await HttpContext.Session.CommitAsync();
+
+
+ var Version = $"MongoDB.MvcCore.BsonJsonSerializer: {typeof(BsonJsonSerializer).Assembly.GetName().Version})";
+
+ return Ok(new
+ {
+ Version
+ });
+ }
+}
diff --git a/src/OpenKamer.LogicControllers/Web/Personen.cs b/src/OpenKamer.LogicControllers/Web/Personen.cs
new file mode 100644
index 0000000..f650669
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/Web/Personen.cs
@@ -0,0 +1,407 @@
+
+using Microsoft.AspNetCore.Mvc;
+
+using MongoDB.Driver;
+using MongoDB.MvcCore;
+
+namespace OpenKamer.LogicControllers.Web;
+
+public partial class WebController : ControllerBase
+{
+ [HttpPost]
+ [Route("~/api/Personen")]
+ public async Task<IActionResult> Personen()
+ {
+ // collection: persoonType met:
+ // contact
+ // nevenfuncties
+ // geschenk
+ // loopbaan
+ // onderwijs
+ // reis
+ // zetelhistory
+
+ var a = @"
+[
+ {
+ $match: { 'functie' : 'Tweede Kamerlid', 'verwijderd': false }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'fractieZetelPersoonType',
+ foreignField: 'persoon.ref',
+ as: 'zetelhistory',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $lookup:
+ {
+ localField: 'fractieZetel.ref',
+ from: 'fractieZetelType',
+ foreignField: '_id',
+ as: 'fractiezetel',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $lookup:
+ {
+ localField: 'fractie.ref',
+ from: 'fractieType',
+ foreignField: '_id',
+ as: 'fractie'
+ }
+ },
+ {
+ $project:
+ {
+ _id:1,
+ fractie:1,
+ gewicht: '$gewicht'
+ }
+ },
+ {
+ $unwind: '$fractie'
+ }
+
+ ]
+ }
+
+ },
+ {
+ $sort:
+ {
+ 'van' : -1
+ }
+
+ },
+ {
+ $unwind: '$fractiezetel'
+ },
+ {
+ $project:
+ {
+ _id:0,
+ functie:'$functie',
+ tot: { $substr: [ '$totEnMet', 0, 10 ] },
+ van: { $substr: [ '$van', 0, 10 ] }
+
+ afko: '$fractiezetel.fractie.afkorting',
+ naamNL: '$fractiezetel.fractie.naamNl',
+ naamEN: '$fractiezetel.fractie.naamEn',
+ zetels: '$fractiezetel.fractie.aantalZetels',
+ stemmen: '$fractiezetel.fractie.aantalStemmen'
+ }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonOnderwijsType',
+ foreignField: 'persoon.ref',
+ as: 'onderwijs',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ opleidingNL:'$opleidingNl',
+ opleidingEN:'$opleidingEn',
+ instelling:'$instelling',
+ plaats: '$plaats',
+ van: '$van'
+ tot: '$totEnMet'
+ }
+ },
+ {
+ $sort: { 'gewicht' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonReisType',
+ foreignField: 'persoon.ref',
+ as: 'reis',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ doel:'$doel',
+ bestemming:'$bestemming',
+ van: '$van'
+ tot: '$totEnMet'
+ pay: '$betaaldDoor'
+ }
+ },
+ {
+ $sort: { 'gewicht' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonLoopbaanType',
+ foreignField: 'persoon.ref',
+ as: 'loopbaan',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ functie:'$functie',
+ werkgever:'$werkgever',
+ omschrijvingNL:'$omschrijvingNl',
+ omschrijvingEN:'$omschrijvingEn',
+ plaats: '$plaats',
+ van: '$van'
+ tot: '$totEnMet'
+ }
+ },
+ {
+ $sort: { 'gewicht' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonGeschenkType',
+ foreignField: 'persoon.ref',
+ as: 'geschenk',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ omschrijving:'$omschrijving',
+ datums: { $substr: [ '$datum', 0, 10 ] }
+ }
+ },
+ {
+ $sort: { 'gewicht' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonContactinformatieType',
+ foreignField: 'persoon.ref',
+ as: 'contact',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ type:'$soort',
+ val:'$waarde'
+ }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonNevenfunctieType',
+ foreignField: 'persoon.ref',
+ as: 'nevenfuncties',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonNevenfunctieInkomstenType',
+ foreignField: 'persoonNevenfunctie.ref',
+ as: 'inkomsten',
+ pipeline:
+ [
+ {
+ $project:
+ {
+ _id:0,
+ jaar: '$jaar',
+ bedrag: { $ifNull: ['$bedrag', ""?"" ] },
+ }
+ },
+ {
+ $sort: { jaar: 1 }
+ }
+ ]
+ }
+ },
+ {
+ $project:
+ {
+ _id:0,
+ omschrijving:'$omschrijving',
+ soort: '$vergoeding.soort',
+ inkomsten:1
+ }
+ },
+ {
+ $set:
+ {
+ 'inkomsten':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$inkomsten' }, 0 ]
+ },
+ '$$REMOVE',
+ '$inkomsten'
+ ]
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ $project:
+ {
+ _id:0,
+ roepnaam : '$roepnaam',
+ tussenvoegsel: { $ifNull: ['$tussenvoegsel', """" ] },
+ achternaam: '$achternaam',
+ zetelhistory: 1,
+ nevenfuncties:1,
+ contact:1,
+ geschenk:1,
+ loopbaan:1,
+ onderwijs:1,
+ reis:1
+ }
+ },
+ {
+ $set:
+ {
+ 'nevenfuncties':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$nevenfuncties' }, 0 ]
+ },
+ '$$REMOVE',
+ '$nevenfuncties'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'geschenk':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$geschenk' }, 0 ]
+ },
+ '$$REMOVE',
+ '$geschenk'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'loopbaan':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$loopbaan' }, 0 ]
+ },
+ '$$REMOVE',
+ '$loopbaan'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'onderwijs':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$onderwijs' }, 0 ]
+ },
+ '$$REMOVE',
+ '$onderwijs'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'reis':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$reis' }, 0 ]
+ },
+ '$$REMOVE',
+ '$reis'
+ ]
+ }
+ }
+ },
+ {
+ $sort:
+ {
+ achternaam: 1
+ }
+ },
+ {
+ $skip: 0 },
+ {
+ $limit: 150 }
+]
+";
+ var List = await db.GetCollection("persoonType").Aggregate(a).ToListAsync();
+
+ return Ok(new
+ {
+ List
+ });
+ }
+}
diff --git a/src/OpenKamer.LogicControllers/Web/WebController.cs b/src/OpenKamer.LogicControllers/Web/WebController.cs
new file mode 100644
index 0000000..39b67d1
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/Web/WebController.cs
@@ -0,0 +1,15 @@
+
+using Microsoft.AspNetCore.Mvc;
+
+using MongoDB.Driver;
+
+namespace OpenKamer.LogicControllers.Web;
+
+public partial class WebController : ControllerBase
+{
+ private readonly IMongoDatabase db;
+ public WebController(IMongoDatabase db)
+ {
+ this.db = db;
+ }
+}
diff --git a/src/OpenKamer.LogicControllers/triplejoin.txt b/src/OpenKamer.LogicControllers/triplejoin.txt
new file mode 100644
index 0000000..f401c59
--- /dev/null
+++ b/src/OpenKamer.LogicControllers/triplejoin.txt
@@ -0,0 +1,374 @@
+[
+ {
+ $match: { 'functie.Value' : 'Tweede Kamerlid', 'verwijderd': false }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'fractieZetelPersoonType',
+ foreignField: 'persoon.ref',
+ as: 'zetelhistory',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $lookup:
+ {
+ localField: 'fractieZetel.ref',
+ from: 'fractieZetelType',
+ foreignField: '_id',
+ as: 'fractiezetel',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $lookup:
+ {
+ localField: 'fractie.ref',
+ from: 'fractieType',
+ foreignField: '_id',
+ as: 'fractie'
+ }
+ },
+ {
+ $project:
+ {
+ _id:1,
+ fractie:1,
+ gewicht: '$gewicht.Value'
+ }
+ },
+ {
+ $unwind: '$fractie'
+ }
+
+ ]
+ }
+
+ },
+ {
+ $sort:
+ {
+ 'van.Value' : -1
+ }
+
+ },
+ {
+ $unwind: '$fractiezetel'
+ },
+ {
+ $project:
+ {
+ _id:0,
+ functie:'$functie.Value',
+ tot: { $substr: [ '$totEnMet.Value', 0, 10 ] },
+ van: { $substr: [ '$van.Value', 0, 10 ] }
+
+ afko: '$fractiezetel.fractie.afkorting.Value',
+ naamNL: '$fractiezetel.fractie.naamNl.Value',
+ naamEN: '$fractiezetel.fractie.naamEn.Value',
+ zetels: '$fractiezetel.fractie.aantalZetels.Value',
+ stemmen: '$fractiezetel.fractie.aantalStemmen.Value'
+ }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonOnderwijsType',
+ foreignField: 'persoon.ref',
+ as: 'onderwijs',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ opleidingNL:'$opleidingNl.Value',
+ opleidingEN:'$opleidingEn.Value',
+ instelling:'$instelling.Value',
+ plaats: '$plaats.Value',
+ van: '$van.Value'
+ tot: '$totEnMet.Value'
+ }
+ },
+ {
+ $sort: { 'gewicht.Value' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonReisType',
+ foreignField: 'persoon.ref',
+ as: 'reis',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ doel:'$doel.Value',
+ bestemming:'$bestemming.Value',
+ van: '$van.Value'
+ tot: '$totEnMet.Value'
+ pay: '$betaaldDoor.Value'
+ }
+ },
+ {
+ $sort: { 'gewicht.Value' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonLoopbaanType',
+ foreignField: 'persoon.ref',
+ as: 'loopbaan',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ functie:'$functie.Value',
+ werkgever:'$werkgever.Value',
+ omschrijvingNL:'$omschrijvingNl.Value',
+ omschrijvingEN:'$omschrijvingEn.Value',
+ plaats: '$plaats.Value',
+ van: '$van.Value'
+ tot: '$totEnMet.Value'
+ }
+ },
+ {
+ $sort: { 'gewicht.Value' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonGeschenkType',
+ foreignField: 'persoon.ref',
+ as: 'geschenk',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ omschrijving:'$omschrijving.Value',
+ datums: { $substr: [ '$datum.Value', 0, 10 ] }
+ }
+ },
+ {
+ $sort: { 'gewicht.Value' : 1 }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonContactinformatieType',
+ foreignField: 'persoon.ref',
+ as: 'contact',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $project:
+ {
+ _id:0,
+ type:'$soort.Value',
+ val:'$waarde.Value'
+ }
+ }
+ ]
+ }
+ },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonNevenfunctieType',
+ foreignField: 'persoon.ref',
+ as: 'nevenfuncties',
+ pipeline:
+ [
+ { $match: { 'verwijderd': false } },
+ {
+ $lookup:
+ {
+ localField: '_id',
+ from: 'persoonNevenfunctieInkomstenType',
+ foreignField: 'persoonNevenfunctie.ref',
+ as: 'inkomsten',
+ pipeline:
+ [
+ {
+ $project:
+ {
+ _id:0,
+ jaar: '$jaar.Value',
+ bedrag: { $ifNull: ['$bedrag', "?" ] },
+ }
+ },
+ {
+ $sort: { jaar: 1 }
+ }
+ ]
+ }
+ },
+ {
+ $project:
+ {
+ _id:0,
+ omschrijving:'$omschrijving.Value',
+ soort: '$vergoeding.soort.Value',
+ inkomsten:1
+ }
+ },
+ {
+ $set:
+ {
+ 'inkomsten':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$inkomsten' }, 0 ]
+ },
+ '$$REMOVE',
+ '$inkomsten'
+ ]
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ $project:
+ {
+ _id:0,
+ roepnaam : '$roepnaam.Value',
+ tussenvoegsel: { $ifNull: ['$tussenvoegsel.Value', "" ] },
+ achternaam: '$achternaam.Value',
+ zetelhistory: 1,
+ nevenfuncties:1,
+ contact:1,
+ geschenk:1,
+ loopbaan:1,
+ onderwijs:1,
+ reis:1
+ }
+ },
+ {
+ $set:
+ {
+ 'nevenfuncties':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$nevenfuncties' }, 0 ]
+ },
+ '$$REMOVE',
+ '$nevenfuncties'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'geschenk':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$geschenk' }, 0 ]
+ },
+ '$$REMOVE',
+ '$geschenk'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'loopbaan':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$loopbaan' }, 0 ]
+ },
+ '$$REMOVE',
+ '$loopbaan'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'onderwijs':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$onderwijs' }, 0 ]
+ },
+ '$$REMOVE',
+ '$onderwijs'
+ ]
+ }
+ }
+ },
+ {
+ $set:
+ {
+ 'reis':
+ {
+ $cond:
+ [
+ {
+ $eq: [ { $size: '$reis' }, 0 ]
+ },
+ '$$REMOVE',
+ '$reis'
+ ]
+ }
+ }
+ },
+ {
+ $sort:
+ {
+ achternaam: 1
+ }
+ },
+ {
+ $skip: 2 },
+ {
+ $limit: 1 }
+]
diff --git a/src/OpenKamer.WebCore/OpenKamer.WebCore.csproj b/src/OpenKamer.WebCore/OpenKamer.WebCore.csproj
new file mode 100644
index 0000000..6581a60
--- /dev/null
+++ b/src/OpenKamer.WebCore/OpenKamer.WebCore.csproj
@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>net7.0</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <RootNamespace>OpenKamer.WebCore</RootNamespace>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Mvc.ModelBinding.MultiParameter" Version="1.1.4" />
+ <PackageReference Include="netproxy" Version="1.1.4" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\OpenKamer.LogicControllers\OpenKamer.LogicControllers.csproj" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/OpenKamer.WebCore/Program.cs b/src/OpenKamer.WebCore/Program.cs
new file mode 100644
index 0000000..b094dae
--- /dev/null
+++ b/src/OpenKamer.WebCore/Program.cs
@@ -0,0 +1,50 @@
+//
+// (c) 2022, Alphons van der Heijden
+//
+// https://opendata.tweedekamer.nl/documentatie/
+//
+
+using MongoDB.Driver;
+using MongoDB.MvcCore;
+
+var builder = WebApplication.CreateBuilder(new WebApplicationOptions
+{
+ // the 'real' root of the application
+ ContentRootPath = AppDomain.CurrentDomain.BaseDirectory
+});
+
+builder.Services
+ .AddMvcCore()
+ .WithMultiParameterModelBinding()
+ .AddBsonJsonConverters(); // Serialization in API controller;
+
+builder.Services.AddDistributedMemoryCache();
+
+builder.Services.AddSession();
+
+var mongoSection = builder.Configuration.GetSection("Mongo");
+
+var mongoclient = new MongoClient(mongoSection["ConnectionString"]);
+
+//builder.Services.AddSingleton<IMongoClient>(mongoclient);
+
+var db = mongoclient.GetDatabase(mongoSection["DbName"]);
+
+builder.Services.AddSingleton<IMongoDatabase>(db);
+
+
+
+
+var app = builder.Build();
+
+app.UseRouting();
+
+app.UseSession();
+
+app.UseDefaultFiles();
+
+app.UseStaticFiles();
+
+app.MapControllers();
+
+app.Run();
diff --git a/src/OpenKamer.WebCore/Properties/launchSettings.json b/src/OpenKamer.WebCore/Properties/launchSettings.json
new file mode 100644
index 0000000..3a732fe
--- /dev/null
+++ b/src/OpenKamer.WebCore/Properties/launchSettings.json
@@ -0,0 +1,28 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:52757",
+ "sslPort": 0
+ }
+ },
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "http://localhost:5281",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/OpenKamer.WebCore/appsettings.Development.json b/src/OpenKamer.WebCore/appsettings.Development.json
new file mode 100644
index 0000000..770d3e9
--- /dev/null
+++ b/src/OpenKamer.WebCore/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "DetailedErrors": true,
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/src/OpenKamer.WebCore/appsettings.json b/src/OpenKamer.WebCore/appsettings.json
new file mode 100644
index 0000000..6ca53ab
--- /dev/null
+++ b/src/OpenKamer.WebCore/appsettings.json
@@ -0,0 +1,13 @@
+{
+ "Mongo": {
+ "ConnectionString": "mongodb://127.0.0.1:27017",
+ "DbName": "tweedekamer"
+ },
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/OpenKamer.WebCore/wwwroot/Default.css b/src/OpenKamer.WebCore/wwwroot/Default.css
new file mode 100644
index 0000000..831ebe3
--- /dev/null
+++ b/src/OpenKamer.WebCore/wwwroot/Default.css
@@ -0,0 +1,201 @@
+html
+{
+ box-sizing: border-box;
+}
+
+*, *:before, *:after
+{
+ box-sizing: inherit;
+}
+
+body
+{
+ line-height: 1;
+ font-family: Arial;
+ padding: 10px;
+}
+
+a
+{
+ text-decoration: none;
+ color: dimgrey;
+}
+
+ a:hover
+ {
+ color: #444;
+ }
+
+#NetProxySpinner
+{
+ display: none;
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ margin-top: -25px;
+ margin-left: -25px;
+ z-index: 1;
+}
+
+
+.panel
+{
+ display: none;
+}
+
+.active input
+{
+ background-color: red;
+}
+
+.hideMe
+{
+ display: none;
+}
+
+.stopfloating
+{
+ clear: both;
+}
+
+.Error
+{
+ color: red;
+}
+
+body
+{
+ font-family: 'Arial';
+}
+
+.Flexing
+{
+ display: flex;
+ flex-wrap: wrap;
+}
+
+#video
+{
+ width: 640px;
+ height: 480px;
+}
+
+video::-webkit-media-controls-timeline
+{
+ display:none;
+}
+
+video::-webkit-media-controls-current-time-display
+{
+ display: none;
+}
+
+video::-webkit-media-controls-time-remaining-display
+{
+ display: none;
+}
+
+body
+{
+ padding: 20px;
+ overflow-x: auto;
+}
+
+.Hidden
+{
+ display: none;
+}
+
+
+#Title
+{
+ display: inline-block;
+ font-size: 120%;
+ font-weight: bold;
+}
+
+.AdminPanel .ui-input-text
+{
+ margin-top: 0;
+ padding: 10px;
+}
+
+.Navigate td
+{
+ width: 100px;
+}
+
+.TableNormal
+{
+ border-collapse: separate;
+ border-spacing: 0;
+ border: 1px solid #ddd;
+ border-radius: 10px;
+ padding: 4px;
+ min-width: 600px;
+}
+
+ .TableNormal td, .TableNormal th
+ {
+ border: 1px solid #ddd;
+ padding: 8px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ height: 26px;
+ }
+
+ .TableNormal tr:nth-child(even)
+ {
+ background-color: #f2f2f2;
+ }
+
+ .TableNormal th
+ {
+ padding-top: 12px;
+ padding-bottom: 12px;
+ text-align: left;
+ background-color: #4CAF50;
+ color: white;
+ }
+
+ .TableNormal tr:hover
+ {
+ background-color: #c0c0ff;
+ cursor: pointer;
+ }
+
+
+tbody.t_Users td.p_Id
+{
+ color: red;
+}
+
+.Search .ui-input-text
+{
+ position: relative;
+ top: -14px;
+ margin: 0px;
+}
+
+.Search #Title
+{
+ position: relative;
+ top: -14px;
+}
+
+#Result{
+ font-family:'Courier New';
+}
+
+div.error
+{
+ width:800px;
+ background-color:pink;
+}
+
+div.ok
+{
+ width: 800px;
+ background-color: lightgreen;
+}
diff --git a/src/OpenKamer.WebCore/wwwroot/Default.htm b/src/OpenKamer.WebCore/wwwroot/Default.htm
new file mode 100644
index 0000000..b70be0d
--- /dev/null
+++ b/src/OpenKamer.WebCore/wwwroot/Default.htm
@@ -0,0 +1,115 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <title>Just Testing</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta charset="utf-8" />
+
+ <!-- nugetpackage netproxy -->
+ <link href="css/netproxyspinner.css" rel="stylesheet" />
+ <script src="scripts/macros.js" defer></script>
+ <script src="scripts/netproxy.js" defer></script>
+
+ <link href="Default.css" rel="stylesheet" />
+ <link href="Ui.css" rel="stylesheet" />
+ <script src="Default.js" defer></script>
+
+</head>
+<body>
+ <img src="images/netproxyspinner.gif" id="netproxyspinner" />
+
+ <div><span id="ShowCollections" class="ui-btn">ShowCollections</span></div>
+
+ <div><span id="Fracties" class="ui-btn">Fracties</span></div>
+
+ <div><span id="Personen" class="ui-btn">Personen</span></div>
+
+ <div><span id="Moties" class="ui-btn">Moties</span></div>
+
+ <div id="Output"></div>
+
+
+ <script type="text/template" id="TemplateList">
+ <table class="TableNormal">
+ <tr>
+ <th>Index</th>
+ <th>Name</th>
+ </tr>
+ {{ this.List.forEach(function (item,index) { }}
+ <tr><td>{{=index}}</td><td>{{=item}}</td></tr>
+ {{ }); }}
+ </table>
+ </script>
+
+ <script type="text/template" id="TemplateIdList">
+ <table class="TableNormal">
+ <tr>
+ <th>Index</th>
+ <th>Name</th>
+ </tr>
+ {{ this.List.forEach(function (item,index) { }}
+ <tr><td>{{=index}}</td><td>{{=item._id}}</td></tr>
+ {{ }); }}
+ </table>
+ </script>
+
+ <script type="text/template" id="TemplateObjectProperties">
+ <table class="TableNormal">
+ <tbody>
+ {{ this.List.forEach(function (item,index) { }}
+ {{ if(index == 0){ }}
+ <tr>
+ {{ Object.getOwnPropertyNames(item).forEach(function (propname) { }}
+ <th>{{=propname}}</th>
+ {{ }); }}
+ </tr>
+ {{ } }}
+ <tr>
+ {{ Object.getOwnPropertyNames(item).forEach(function (propname) { }}
+ <td>
+ {{=item[propname]}}
+ </td>
+ {{ }); }}
+ </tr>
+ {{ }); }}
+ </tbody>
+ </table>
+ </script>
+
+ <script type="text/template" id="TemplateNevenfuncties">
+ <table class="TableNormal">
+ <tbody>
+ <tr>
+ <th>Naam</th>
+ <th>Nevenfuncties</th>
+ </tr>
+ {{ this.List.forEach(function (persoon) { }}
+ <tr>
+ <td>
+ {{=persoon["roepnaam"]}} {{=persoon["tussenvoegsel"]}} {{=persoon["achternaam"]}}
+ </td>
+ <td>
+ {{ if(persoon.nevenfuncties) { }}
+ {{ persoon.nevenfuncties.forEach(function (nevenfunctie) { }}
+ <p><b>{{=nevenfunctie.omschrijving}} ({{=nevenfunctie.soort}})</b></p>
+ {{ if(nevenfunctie.inkomsten) { }}
+ {{ nevenfunctie.inkomsten.forEach(function (inkomst) { }}
+ <table>
+ <tr>
+ <td>{{=inkomst.jaar}}</td>
+ <td>{{=inkomst.bedrag}}</td>
+ </tr>
+ </table>
+ {{ }); }}
+ {{ } }}
+ {{ }); }}
+ {{ } }}
+ </td>
+ </tr>
+ {{ }); }}
+ </tbody>
+ </table>
+ </script>
+
+</body>
+</html>
diff --git a/src/OpenKamer.WebCore/wwwroot/Default.js b/src/OpenKamer.WebCore/wwwroot/Default.js
new file mode 100644
index 0000000..f15baf2
--- /dev/null
+++ b/src/OpenKamer.WebCore/wwwroot/Default.js
@@ -0,0 +1,85 @@
+'use strict';
+
+const Entities = $id("Entities");
+const Output = $id("Output");
+const TemplateList = $id("TemplateList");
+const TemplateObjectProperties = $id("TemplateObjectProperties");
+
+(function ()
+{
+ PageEvents();
+ Init();
+})();
+
+function PageEvents()
+{
+ document.addEventListener("click", function (e)
+ {
+ if (typeof window[e.target.id] === "function")
+ window[e.target.id].call(e, e);
+ });
+
+ Entities.on("click", function (e)
+ {
+ var tr = e.target.parentElement;
+ if (tr.tagName !== "TR")
+ return;
+ ShowCollection(tr.qsall('td')[1].innerText);
+ });
+}
+
+function Init()
+{
+ HelloWorld();
+}
+
+function HelloWorld()
+{
+ netproxy("./api/HelloWorld", null, function ()
+ {
+ Output.innerText = this.Version;
+ });
+
+}
+
+
+function ShowCollection(colName)
+{
+ netproxy("./api/ShowCollection", { ColName: colName }, function ()
+ {
+ Output.Template(TemplateObjectProperties, this, false);
+ });
+}
+
+
+function ShowCollections()
+{
+ netproxy("./api/ShowCollections", {}, function ()
+ {
+ Output.Template(TemplateList, this, false);
+ });
+}
+
+function Personen()
+{
+ netproxy("./api/Personen", {}, function ()
+ {
+ Output.Template(TemplateNevenfuncties, this, false);
+ });
+}
+
+function Fracties()
+{
+ netproxy("./api/Fracties", {}, function ()
+ {
+ Output.Template(TemplateObjectProperties, this, false);
+ });
+}
+
+function Moties()
+{
+ netproxy("./api/Moties", {}, function ()
+ {
+ Output.Template(TemplateObjectProperties, this, false);
+ });
+}
\ No newline at end of file
diff --git a/src/OpenKamer.WebCore/wwwroot/ResetAll.css b/src/OpenKamer.WebCore/wwwroot/ResetAll.css
new file mode 100644
index 0000000..8510527
--- /dev/null
+++ b/src/OpenKamer.WebCore/wwwroot/ResetAll.css
@@ -0,0 +1,72 @@
+/* https://w3bits.com/box-sizing-reset/ */
+html
+{
+ box-sizing: border-box;
+}
+
+*, *:before, *:after
+{
+ box-sizing: inherit;
+}
+
+/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video
+{
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section
+{
+ display: block;
+}
+
+body
+{
+ line-height: 1;
+}
+
+ol, ul
+{
+ list-style: none;
+}
+
+blockquote, q
+{
+ quotes: none;
+}
+
+ blockquote:before, blockquote:after,
+ q:before, q:after
+ {
+ content: '';
+ content: none;
+ }
+
+table
+{
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+body
+{
+ font-family: sans-serif;
+}
diff --git a/src/OpenKamer.WebCore/wwwroot/Ui.css b/src/OpenKamer.WebCore/wwwroot/Ui.css
new file mode 100644
index 0000000..98a8d8e
--- /dev/null
+++ b/src/OpenKamer.WebCore/wwwroot/Ui.css
@@ -0,0 +1,321 @@
+@import "ResetAll.css";
+
+body
+{
+ overflow-x: hidden;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+ #NetProxySpinner img
+ {
+ width:50px;
+ height:50px;
+ }
+
+ .ui-btn
+ {
+ position: relative;
+ background-color: #f6f6f6;
+ border: solid 1px #ddd;
+ border-radius: 0.3215em;
+ display: inline-block;
+ text-align: center;
+ cursor: pointer;
+ user-select: none;
+ text-shadow: 1px 1px #fff;
+ text-decoration: none !important;
+ color: #333;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ font-family: sans-serif;
+ font-weight: 700;
+ padding: 0.7em 1.0em;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.15);
+ }
+
+ .ui-btn:hover
+ {
+ background-color: #eaeaea;
+ }
+
+.ui-select .ui-btn
+{
+ width:100%;
+}
+
+ .ui-select .ui-btn select
+ {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ min-height: 1.5em;
+ min-height: 100%;
+ height: 3em;
+ max-height: 100%;
+ outline: 0;
+ -webkit-border-radius: inherit;
+ border-radius: inherit;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ cursor: pointer;
+ filter: Alpha(Opacity=0);
+ opacity: 0;
+ z-index: 2;
+ }
+
+.ui-btn-wide
+{
+ width: 100%;
+}
+
+
+input, select
+{
+ font-size: 1em;
+ line-height: 1.3;
+ font-family: sans-serif;
+}
+
+.ui-btn-icon:after
+{
+ font-size: 1.5em;
+ display: inline-block;
+ content: "";
+ position: absolute;
+ top: calc(50% - 0.5em);
+ height: 1em;
+ width: 1em;
+ background-color: rgba(0,0,0,.3);
+ background-position: center center;
+ background-repeat: no-repeat;
+ border-radius: 1em;
+ border: solid 1px #fff;
+}
+
+.ui-btn.ui-btn-notext
+{
+ height: 0.1em;
+ width: 2px !important;
+ border-radius: 1.2em;
+ padding:1.1em;
+ vertical-align:middle;
+}
+
+
+input[type="file"]::-webkit-file-upload-button
+{
+ width: 0;
+ padding-left: 0px;
+ padding-right: 0px;
+ padding-top: 0.4em;
+ border: none;
+}
+
+input.ui-btn
+{
+ width: 100%;
+}
+
+.ui-btn-icon-left
+{
+ padding-left: 2.0em;
+}
+
+.ui-btn-icon-right
+{
+ padding-left: 0.5em;
+ padding-right: 2.0em;
+}
+
+.ui-btn-icon-left:after
+{
+ left: 0.25em;
+}
+
+.ui-btn-icon-right:after
+{
+ right: 0.25em;
+}
+
+button.ui-btn-icon-left, input.ui-btn-icon-left
+{
+ padding-left: 2.0em;
+}
+
+button.ui-btn-icon-right, input.ui-btn-icon-right
+{
+ padding-right: 2.0em;
+}
+
+.ui-grid-a
+{
+ display: grid;
+ grid-template-columns: auto auto;
+ grid-gap: 5px;
+}
+
+.ui-block
+{
+ grid-column-end: span 2;
+}
+
+.ui-block-a
+{
+ grid-column: 1;
+}
+
+.ui-block-b
+{
+ grid-column: 2;
+}
+
+
+/* PAGES */
+
+:root
+{
+ --menu-width: 100%;
+}
+
+.ui-page-container
+{
+ position: relative;
+ height: 100%;
+ display: grid;
+ grid-template-columns: var(--menu-width) 100% 100% 100% 100% 100% 100% 100%;
+ transition: transform 0.4s;
+ transform: translateX(calc(0px - var(--menu-width)));
+}
+
+.ui-page
+{
+ display: none;
+ vertical-align: baseline;
+ line-height: 1.5em;
+ text-shadow: 0 1px 0 #f3f3f3;
+}
+
+ .ui-page .ui-content
+ {
+ padding:10px;
+ }
+
+td
+{
+ box-sizing: content-box;
+ vertical-align:middle;
+}
+
+.ui-header
+{
+ background-color: #e0e0e0;
+}
+ .ui-header .ui-btn
+ {
+ position: absolute;
+ top: 0.25em;
+ }
+
+ .ui-header .ui-btn.ui-btn-icon-right.ui-btn-notext
+ {
+ position: absolute;
+ top: 0.5em !important;
+ right: 0.5em;
+ }
+
+ .ui-header .ui-btn.ui-btn-icon-left.ui-btn-notext
+ {
+ position: absolute;
+ top: 0.5em !important;
+ left: 0.5em;
+ }
+
+ .ui-header h1
+ {
+ text-align: center;
+ display:block;
+ font-size: 1.5em;
+ font-weight: bold;
+ margin: 0 20%;
+ padding: 0.75em 0;
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space: nowrap;
+ }
+
+.ui-field-contain
+{
+ border-bottom-color: #828282;
+ border-bottom-color: rgba(0,0,0,.15);
+ border-bottom-width: 1px;
+ border-bottom-style: solid;
+ display: block;
+ position: relative;
+ overflow: visible;
+ clear: both;
+ padding: .8em 1em;
+}
+
+input:focus, button:focus
+{
+ box-shadow: 0 0 12px #38c;
+}
+
+.ui-input-text
+{
+ margin: .5em 0;
+ border-width: 1px;
+ border-style: solid;
+
+ background-color: #fff;
+ border-color: #ddd;
+ color: #333;
+ text-shadow: 0 1px 0 #f3f3f3;
+}
+
+.ui-input-text input
+{
+ width:100%;
+ margin: 0;
+ min-height: 2.2em;
+ text-align: left;
+ border: 0;
+ background: transparent none;
+ border-radius: inherit;
+
+ padding: .4em;
+ line-height: 1.4em;
+ display: block;
+ box-sizing: border-box;
+ outline: 0;
+}
+
+.ui-shadow-inset
+{
+ box-shadow: inset 0 1px 3px rgba(0,0,0,.2);
+}
+
+.ui-popup
+{
+ display:none;
+ position: fixed;
+ width: 92.5%;
+ max-width: 500px;
+ min-height: 200px;
+ border-radius: .3125em;
+ box-shadow: 0 0 12px rgba(0,0,0,.6);
+ background-color: white;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+}
+
+ .ui-popup .ui-content
+ {
+ padding: 5px;
+ }
+
+
diff --git a/src/OpenKamer.WebCore/wwwroot/favicon.ico b/src/OpenKamer.WebCore/wwwroot/favicon.ico
new file mode 100644
index 0000000..63e859b
Binary files /dev/null and b/src/OpenKamer.WebCore/wwwroot/favicon.ico differ
diff --git a/src/OpenKamer.WinForm/Form1.Designer.cs b/src/OpenKamer.WinForm/Form1.Designer.cs
new file mode 100644
index 0000000..7925fde
--- /dev/null
+++ b/src/OpenKamer.WinForm/Form1.Designer.cs
@@ -0,0 +1,269 @@
+namespace OpenKamer.WinForm
+{
+ partial class Form1
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.button1 = new System.Windows.Forms.Button();
+ this.textBox1 = new System.Windows.Forms.TextBox();
+ this.button2 = new System.Windows.Forms.Button();
+ this.txtSkipToken = new System.Windows.Forms.TextBox();
+ this.txtMongoConnectionString = new System.Windows.Forms.TextBox();
+ this.txtDbFileSystem = new System.Windows.Forms.TextBox();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.txtDbName = new System.Windows.Forms.TextBox();
+ this.label5 = new System.Windows.Forms.Label();
+ this.lblCount = new System.Windows.Forms.Label();
+ this.lblErrors = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.lblSpeed = new System.Windows.Forms.Label();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.groupBox1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(143, 50);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(94, 23);
+ this.button1.TabIndex = 0;
+ this.button1.Text = "Feed Refresh";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.Button1_Click);
+ //
+ // textBox1
+ //
+ this.textBox1.AcceptsReturn = true;
+ this.textBox1.AcceptsTab = true;
+ this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.textBox1.Location = new System.Drawing.Point(360, 12);
+ this.textBox1.Multiline = true;
+ this.textBox1.Name = "textBox1";
+ this.textBox1.ReadOnly = true;
+ this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+ this.textBox1.Size = new System.Drawing.Size(306, 243);
+ this.textBox1.TabIndex = 1;
+ //
+ // button2
+ //
+ this.button2.Location = new System.Drawing.Point(243, 50);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(94, 23);
+ this.button2.TabIndex = 2;
+ this.button2.Text = "Get Entries";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.Button2_Click);
+ //
+ // txtSkipToken
+ //
+ this.txtSkipToken.Location = new System.Drawing.Point(67, 50);
+ this.txtSkipToken.Name = "txtSkipToken";
+ this.txtSkipToken.Size = new System.Drawing.Size(70, 23);
+ this.txtSkipToken.TabIndex = 3;
+ this.txtSkipToken.Text = "15113529";
+ //
+ // txtMongoConnectionString
+ //
+ this.txtMongoConnectionString.Location = new System.Drawing.Point(69, 80);
+ this.txtMongoConnectionString.Name = "txtMongoConnectionString";
+ this.txtMongoConnectionString.Size = new System.Drawing.Size(268, 23);
+ this.txtMongoConnectionString.TabIndex = 4;
+ this.txtMongoConnectionString.Text = "mongodb://127.0.0.1:27017";
+ //
+ // txtDbFileSystem
+ //
+ this.txtDbFileSystem.Location = new System.Drawing.Point(69, 138);
+ this.txtDbFileSystem.Name = "txtDbFileSystem";
+ this.txtDbFileSystem.Size = new System.Drawing.Size(268, 23);
+ this.txtDbFileSystem.TabIndex = 5;
+ this.txtDbFileSystem.Text = "d:\\gegevensmagazijn";
+ //
+ // groupBox1
+ //
+ this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)));
+ this.groupBox1.Controls.Add(this.lblSpeed);
+ this.groupBox1.Controls.Add(this.lblErrors);
+ this.groupBox1.Controls.Add(this.label8);
+ this.groupBox1.Controls.Add(this.lblCount);
+ this.groupBox1.Controls.Add(this.label5);
+ this.groupBox1.Controls.Add(this.label4);
+ this.groupBox1.Controls.Add(this.label3);
+ this.groupBox1.Controls.Add(this.label2);
+ this.groupBox1.Controls.Add(this.label1);
+ this.groupBox1.Controls.Add(this.txtDbName);
+ this.groupBox1.Controls.Add(this.txtMongoConnectionString);
+ this.groupBox1.Controls.Add(this.txtDbFileSystem);
+ this.groupBox1.Controls.Add(this.button1);
+ this.groupBox1.Controls.Add(this.button2);
+ this.groupBox1.Controls.Add(this.txtSkipToken);
+ this.groupBox1.Location = new System.Drawing.Point(12, 12);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(342, 243);
+ this.groupBox1.TabIndex = 6;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "settings";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(23, 53);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(38, 15);
+ this.label4.TabIndex = 10;
+ this.label4.Text = "Token";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(6, 141);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(58, 15);
+ this.label3.TabIndex = 9;
+ this.label3.Text = "FileCache";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(9, 112);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(55, 15);
+ this.label2.TabIndex = 8;
+ this.label2.Text = "DataBase";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(10, 83);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(54, 15);
+ this.label1.TabIndex = 7;
+ this.label1.Text = "MongDB";
+ //
+ // txtDbName
+ //
+ this.txtDbName.Location = new System.Drawing.Point(69, 109);
+ this.txtDbName.Name = "txtDbName";
+ this.txtDbName.Size = new System.Drawing.Size(268, 23);
+ this.txtDbName.TabIndex = 6;
+ this.txtDbName.Text = "tweedekamer";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(22, 22);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(43, 15);
+ this.label5.TabIndex = 11;
+ this.label5.Text = "Count:";
+ //
+ // lblCount
+ //
+ this.lblCount.AutoSize = true;
+ this.lblCount.Location = new System.Drawing.Point(69, 22);
+ this.lblCount.Name = "lblCount";
+ this.lblCount.Size = new System.Drawing.Size(16, 15);
+ this.lblCount.TabIndex = 12;
+ this.lblCount.Text = "...";
+ //
+ // lblErrors
+ //
+ this.lblErrors.AutoSize = true;
+ this.lblErrors.Location = new System.Drawing.Point(173, 22);
+ this.lblErrors.Name = "lblErrors";
+ this.lblErrors.Size = new System.Drawing.Size(16, 15);
+ this.lblErrors.TabIndex = 14;
+ this.lblErrors.Text = "...";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(126, 22);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(40, 15);
+ this.label8.TabIndex = 13;
+ this.label8.Text = "Errors:";
+ //
+ // lblSpeed
+ //
+ this.lblSpeed.AutoSize = true;
+ this.lblSpeed.Location = new System.Drawing.Point(273, 22);
+ this.lblSpeed.Name = "lblSpeed";
+ this.lblSpeed.Size = new System.Drawing.Size(16, 15);
+ this.lblSpeed.TabIndex = 15;
+ this.lblSpeed.Text = "...";
+ //
+ // timer1
+ //
+ this.timer1.Interval = 1000;
+ this.timer1.Tick += new System.EventHandler(this.Timer1_Tick);
+ //
+ // Form1
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(678, 267);
+ this.Controls.Add(this.groupBox1);
+ this.Controls.Add(this.textBox1);
+ this.Name = "Form1";
+ this.Text = "3e kamer";
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private Button button1;
+ private TextBox textBox1;
+ private Button button2;
+ private TextBox txtSkipToken;
+ private TextBox txtMongoConnectionString;
+ private TextBox txtDbFileSystem;
+ private GroupBox groupBox1;
+ private TextBox txtDbName;
+ private Label label4;
+ private Label label3;
+ private Label label2;
+ private Label label1;
+ private Label lblSpeed;
+ private Label lblErrors;
+ private Label label8;
+ private Label lblCount;
+ private Label label5;
+ private System.Windows.Forms.Timer timer1;
+ }
+}
\ No newline at end of file
diff --git a/src/OpenKamer.WinForm/Form1.cs b/src/OpenKamer.WinForm/Form1.cs
new file mode 100644
index 0000000..e4965e6
--- /dev/null
+++ b/src/OpenKamer.WinForm/Form1.cs
@@ -0,0 +1,130 @@
+//
+// (c) 2022, Alphons van der Heijden
+//
+
+// nuget MongoDB.MvcCore
+
+using MongoDB.Bson;
+using MongoDB.Driver;
+using MongoDB.MvcCore;
+
+using System.Diagnostics;
+
+using OpenKamer.LogicControllers;
+
+namespace OpenKamer.WinForm
+{
+ public partial class Form1 : Form
+ {
+ private IMongoDatabase? db;
+
+ private Stopwatch? sw;
+ private long lngError;
+ private long lngCount;
+
+ public Form1()
+ {
+ InitializeComponent();
+
+ this.Text += $" (MongoDB.MvcCore.BsonJsonSerializer: {typeof(BsonJsonSerializer).Assembly.GetName().Version})";
+ }
+
+ private void OnLog(object? sender, EventArgs e)
+ {
+ Log(string.Empty+sender);
+ }
+
+ private void Log(string line)
+ {
+ this.textBox1.Invoke((MethodInvoker)delegate
+ {
+ this.textBox1.AppendText(line + Environment.NewLine);
+ });
+ }
+
+ async private void Button1_Click(object sender, EventArgs e)
+ {
+ this.groupBox1.Enabled = false;
+
+ FeedController feedController = new(this.txtDbFileSystem.Text);
+
+ feedController.OnLog += OnLog;
+
+ await feedController.SyncFeedAsync(this.txtSkipToken.Text); // whitespace tot build DB
+
+ this.groupBox1.Enabled = true;
+ }
+
+ async private void Button2_Click(object sender, EventArgs e)
+ {
+ this.groupBox1.Enabled = false;
+
+ MongoClient mongo = new(this.txtMongoConnectionString.Text);
+ this.db = mongo.GetDatabase(this.txtDbName.Text);
+
+ this.lngCount = 0;
+ this.lngError = 0;
+
+ this.sw = Stopwatch.StartNew();
+ this.timer1.Start();
+
+ EntityController entityController = new(this.txtDbFileSystem.Text);
+ entityController.OnLog += OnLog;
+ entityController.OnEntity += EntityController_OnEntity;
+ await entityController.DecodeEntriesAsync(this.txtSkipToken.Text); // whitespace tot start from beginning
+
+ this.timer1.Stop();
+
+ this.groupBox1.Enabled = true;
+ }
+
+ /// <summary>
+ /// Replacing (or adding) entity to mongo db
+ /// </summary>
+ /// <param name="entity"></param>
+ /// <param name="e"></param>
+ /// <returns></returns>
+ async private Task EntityController_OnEntity(object entity, EventArgs e)
+ {
+ if (db == null)
+ return;
+
+ var collection = this.db.GetCollection(entity.GetType().Name);
+
+ if (collection == null)
+ return;
+
+ try
+ {
+ var replaceOneResult = await collection.ReplaceOneByIdAsync(entity);
+ this.lngCount++;
+ }
+ catch (BsonSerializationException)
+ {
+ this.lngError++;
+ }
+ catch (MongoWriteException)
+ {
+ this.lngError++;
+ }
+ catch (Exception)
+ {
+ this.lngError++;
+ }
+ }
+
+ private void Timer1_Tick(object sender, EventArgs e)
+ {
+ this.lblCount.Text = this.lngCount.ToString();
+ this.lblErrors.Text = this.lngError.ToString();
+
+ if (this.sw == null)
+ return;
+
+ var speed = (1000 * this.lngCount) / this.sw.ElapsedMilliseconds;
+
+ this.lblSpeed.Text = $"{speed} e/sec";
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/OpenKamer.WinForm/Form1.resx b/src/OpenKamer.WinForm/Form1.resx
new file mode 100644
index 0000000..d731088
--- /dev/null
+++ b/src/OpenKamer.WinForm/Form1.resx
@@ -0,0 +1,63 @@
+<root>
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root>
\ No newline at end of file
diff --git a/src/OpenKamer.WinForm/OpenKamer.WinForm.csproj b/src/OpenKamer.WinForm/OpenKamer.WinForm.csproj
new file mode 100644
index 0000000..b59a4ec
--- /dev/null
+++ b/src/OpenKamer.WinForm/OpenKamer.WinForm.csproj
@@ -0,0 +1,16 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <OutputType>WinExe</OutputType>
+ <TargetFramework>net7.0-windows</TargetFramework>
+ <Nullable>enable</Nullable>
+ <UseWindowsForms>true</UseWindowsForms>
+ <ImplicitUsings>enable</ImplicitUsings>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\OpenKamer.LogicControllers\OpenKamer.LogicControllers.csproj" />
+ </ItemGroup>
+
+
+</Project>
\ No newline at end of file
diff --git a/src/OpenKamer.WinForm/Program.cs b/src/OpenKamer.WinForm/Program.cs
new file mode 100644
index 0000000..03dea21
--- /dev/null
+++ b/src/OpenKamer.WinForm/Program.cs
@@ -0,0 +1,17 @@
+namespace OpenKamer.WinForm
+{
+ internal static class Program
+ {
+ /// <summary>
+ /// The main entry point for the application.
+ /// </summary>
+ [STAThread]
+ static void Main()
+ {
+ // To customize application configuration such as set high DPI settings or default font,
+ // see https://aka.ms/applicationconfiguration.
+ ApplicationConfiguration.Initialize();
+ Application.Run(new Form1());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/OpenKamer.sln b/src/OpenKamer.sln
new file mode 100644
index 0000000..7a73bcb
--- /dev/null
+++ b/src/OpenKamer.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.4.33103.184
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenKamer.WinForm", "OpenKamer.WinForm\OpenKamer.WinForm.csproj", "{A772E04E-E46A-40EA-89C4-FE88C3721E3B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenKamer.DataModel", "OpenKamer.DataModel\OpenKamer.DataModel.csproj", "{663A365E-99EC-4ACA-9FFC-C786CEE1A0BA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenKamer.WebCore", "OpenKamer.WebCore\OpenKamer.WebCore.csproj", "{4AF5BC66-035E-488D-BBA1-A07A02DB28D6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenKamer.LogicControllers", "OpenKamer.LogicControllers\OpenKamer.LogicControllers.csproj", "{B093EB65-335C-455B-84F3-27421D0F5888}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A772E04E-E46A-40EA-89C4-FE88C3721E3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A772E04E-E46A-40EA-89C4-FE88C3721E3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A772E04E-E46A-40EA-89C4-FE88C3721E3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A772E04E-E46A-40EA-89C4-FE88C3721E3B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {663A365E-99EC-4ACA-9FFC-C786CEE1A0BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {663A365E-99EC-4ACA-9FFC-C786CEE1A0BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {663A365E-99EC-4ACA-9FFC-C786CEE1A0BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {663A365E-99EC-4ACA-9FFC-C786CEE1A0BA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4AF5BC66-035E-488D-BBA1-A07A02DB28D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4AF5BC66-035E-488D-BBA1-A07A02DB28D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4AF5BC66-035E-488D-BBA1-A07A02DB28D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4AF5BC66-035E-488D-BBA1-A07A02DB28D6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B093EB65-335C-455B-84F3-27421D0F5888}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B093EB65-335C-455B-84F3-27421D0F5888}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B093EB65-335C-455B-84F3-27421D0F5888}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B093EB65-335C-455B-84F3-27421D0F5888}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {26DDFD04-747C-4BAB-AF32-9D2587EB0E46}
+ EndGlobalSection
+EndGlobal