Skip to content

Commit 9154d44

Browse files
authored
Fix voting data range && include agendapunten (#64)
1 parent 0568d2e commit 9154d44

7 files changed

Lines changed: 72 additions & 21 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-- AddColumn: Add stemming_datum (voting date) to besluiten (decisions) table
2+
ALTER TABLE "besluiten" ADD COLUMN "stemming_datum" TIMESTAMPTZ(6);
3+
4+
-- CreateIndex: Add index on stemming_datum for better query performance
5+
CREATE INDEX "idx_besluiten_stemming_datum" ON "besluiten"("stemming_datum");
6+
7+
-- Comment: This field stores the actual voting date extracted from Agendapunt->Activiteit
8+
COMMENT ON COLUMN "besluiten"."stemming_datum" IS 'Actual voting date extracted from Agendapunt->Activiteit.Datum';

app/backend/prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ model Decision {
1818
comment String? @map("opmerking")
1919
status String? @map("status")
2020
agendaPointCaseDecisionOrder BigInt? @map("agendapunt_zaak_besluit_volgorde")
21+
votingDate DateTime? @map("stemming_datum") @db.Timestamptz(6)
2122
updatedAt DateTime? @map("gewijzigd_op") @db.Timestamptz(6)
2223
apiUpdatedAt DateTime? @map("api_gewijzigd_op") @db.Timestamptz(6)
2324

app/backend/src/routers/statistics.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ const os = implement(apiContract);
1414
export const statisticsRouter = {
1515
getPartyLikenessMatrix: os.statistics.getPartyLikenessMatrix.handler(
1616
async ({ input }) => {
17-
const { dateFrom, dateTo } = input || {};
17+
const { dateFrom, dateTo} = input || {};
1818

1919
const dateFilter =
2020
dateFrom && dateTo
21-
? Prisma.sql`AND z.gestart_op BETWEEN ${dateFrom} AND ${dateTo}`
21+
? Prisma.sql`AND b.stemming_datum BETWEEN ${dateFrom} AND ${dateTo}`
2222
: Prisma.empty;
2323

2424
// Simplified approach: directly compare votes between parties
@@ -104,15 +104,15 @@ export const statisticsRouter = {
104104

105105
const dateFilter =
106106
dateFrom && dateTo
107-
? Prisma.sql`AND z.gestart_op BETWEEN ${dateFrom} AND ${dateTo}`
107+
? Prisma.sql`AND b.stemming_datum BETWEEN ${dateFrom} AND ${dateTo}`
108108
: Prisma.empty;
109109

110110
const results: PartyFocusCategory[] = await db.$queryRaw`
111111
SELECT
112112
mc.id AS "categoryId",
113113
mc.name AS "categoryName",
114114
mc.type AS "categoryType",
115-
COUNT(z.id) AS "motionCount"
115+
COUNT(DISTINCT z.id) AS "motionCount"
116116
FROM
117117
zaak_actors za
118118
JOIN
@@ -123,6 +123,8 @@ export const statisticsRouter = {
123123
zaak_categories zc ON z.id = zc.zaak_id
124124
JOIN
125125
motion_categories mc ON zc.category_id = mc.id
126+
JOIN
127+
besluiten b ON z.id = b.zaak_id
126128
WHERE
127129
f.id = ${partyId}
128130
AND za.relatie = 'Indiener'
@@ -149,7 +151,7 @@ export const statisticsRouter = {
149151

150152
const dateFilter =
151153
dateFrom && dateTo
152-
? Prisma.sql`AND z.gestart_op BETWEEN ${dateFrom} AND ${dateTo}`
154+
? Prisma.sql`AND b.stemming_datum BETWEEN ${dateFrom} AND ${dateTo}`
153155
: Prisma.empty;
154156

155157
// Simplified approach: directly analyze votes by category

app/frontend/src/hooks/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export const useParties = (params?: {
7373
dateTo?: Date;
7474
}) => {
7575
const { activeOnly = true, dateFrom, dateTo } = params ?? {};
76-
const useRange = Boolean(dateFrom && dateTo);
76+
const useRange = dateFrom !== undefined && dateTo !== undefined;
7777

7878
return useQuery(
7979
useRange

etl/internal/config/importer/importer.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,12 @@ func (imp *SimpleImporter) extractEntities(ctx context.Context, zaken []models.Z
193193
zaak := &zaken[i]
194194
for _, besluit := range zaak.Besluit {
195195
besluit.ZaakID = &zaak.ID
196+
197+
// Extract voting date from Agendapunt -> Activiteit
198+
if besluit.Agendapunt != nil && besluit.Agendapunt.Activiteit != nil {
199+
besluit.StemmingDatum = besluit.Agendapunt.Activiteit.Datum
200+
}
201+
196202
entities.Besluiten = append(entities.Besluiten, besluit)
197203

198204
for _, stemming := range besluit.Stemming {

etl/internal/models/models.go

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -205,26 +205,60 @@ func (Zaak) TableName() string {
205205
}
206206

207207
type Besluit struct {
208-
ID string `json:"Id" gorm:"primaryKey;column:id"`
209-
AgendapuntId *string `json:"Agendapunt_Id" gorm:"column:agendapunt_id"`
210-
ZaakID *string `json:"zaak_id,omitempty" gorm:"column:zaak_id;index"`
211-
StemmingsSoort *string `json:"StemmingsSoort" gorm:"column:stemmings_soort"`
212-
BesluitSoort *string `json:"BesluitSoort" gorm:"column:besluit_soort"`
213-
BesluitTekst *string `json:"BesluitTekst" gorm:"column:besluit_tekst"`
214-
Opmerking *string `json:"Opmerking" gorm:"column:opmerking"`
215-
Status *string `json:"Status" gorm:"column:status"`
216-
AgendapuntZaakBesluitVolgorde *int64 `json:"AgendapuntZaakBesluitVolgorde" gorm:"column:agendapunt_zaak_besluit_volgorde"`
217-
GewijzigdOp *time.Time `json:"GewijzigdOp" gorm:"column:gewijzigd_op"`
218-
ApiGewijzigdOp *time.Time `json:"ApiGewijzigdOp" gorm:"column:api_gewijzigd_op"`
219-
220-
Stemming []Stemming `json:"Stemming,omitempty" gorm:"-"`
221-
Zaak *Zaak `json:"Zaak,omitempty" gorm:"-"`
208+
ID string `json:"Id" gorm:"primaryKey;column:id"`
209+
AgendapuntId *string `json:"Agendapunt_Id" gorm:"column:agendapunt_id"`
210+
ZaakID *string `json:"zaak_id,omitempty" gorm:"column:zaak_id;index"`
211+
StemmingsSoort *string `json:"StemmingsSoort" gorm:"column:stemmings_soort"`
212+
BesluitSoort *string `json:"BesluitSoort" gorm:"column:besluit_soort"`
213+
BesluitTekst *string `json:"BesluitTekst" gorm:"column:besluit_tekst"`
214+
Opmerking *string `json:"Opmerking" gorm:"column:opmerking"`
215+
Status *string `json:"Status" gorm:"column:status"`
216+
AgendapuntZaakBesluitVolgorde *int64 `json:"AgendapuntZaakBesluitVolgorde" gorm:"column:agendapunt_zaak_besluit_volgorde"`
217+
StemmingDatum *CustomDate `json:"stemming_datum,omitempty" gorm:"column:stemming_datum"`
218+
GewijzigdOp *time.Time `json:"GewijzigdOp" gorm:"column:gewijzigd_op"`
219+
ApiGewijzigdOp *time.Time `json:"ApiGewijzigdOp" gorm:"column:api_gewijzigd_op"`
220+
221+
Stemming []Stemming `json:"Stemming,omitempty" gorm:"-"`
222+
Zaak *Zaak `json:"Zaak,omitempty" gorm:"-"`
223+
Agendapunt *Agendapunt `json:"Agendapunt,omitempty" gorm:"-"`
222224
}
223225

224226
func (Besluit) TableName() string {
225227
return "besluiten"
226228
}
227229

230+
type Agendapunt struct {
231+
ID string `json:"Id" gorm:"primaryKey;column:id"`
232+
ActiviteitId *string `json:"Activiteit_Id" gorm:"column:activiteit_id"`
233+
Nummer *int64 `json:"Nummer" gorm:"column:nummer"`
234+
Onderwerp *string `json:"Onderwerp" gorm:"column:onderwerp"`
235+
Volgorde *int64 `json:"Volgorde" gorm:"column:volgorde"`
236+
Status *string `json:"Status" gorm:"column:status"`
237+
GewijzigdOp *time.Time `json:"GewijzigdOp" gorm:"column:gewijzigd_op"`
238+
ApiGewijzigdOp *time.Time `json:"ApiGewijzigdOp" gorm:"column:api_gewijzigd_op"`
239+
240+
Activiteit *Activiteit `json:"Activiteit,omitempty" gorm:"-"`
241+
}
242+
243+
func (Agendapunt) TableName() string {
244+
return "agendapunten"
245+
}
246+
247+
type Activiteit struct {
248+
ID string `json:"Id" gorm:"primaryKey;column:id"`
249+
Soort *string `json:"Soort" gorm:"column:soort"`
250+
Datum *CustomDate `json:"Datum" gorm:"column:datum"`
251+
DatumSoort *string `json:"DatumSoort" gorm:"column:datum_soort"`
252+
Aanvangstijd *CustomDate `json:"Aanvangstijd" gorm:"column:aanvangstijd"`
253+
Eindtijd *CustomDate `json:"Eindtijd" gorm:"column:eindtijd"`
254+
GewijzigdOp *time.Time `json:"GewijzigdOp" gorm:"column:gewijzigd_op"`
255+
ApiGewijzigdOp *time.Time `json:"ApiGewijzigdOp" gorm:"column:api_gewijzigd_op"`
256+
}
257+
258+
func (Activiteit) TableName() string {
259+
return "activiteiten"
260+
}
261+
228262
type Stemming struct {
229263
ID string `json:"Id" gorm:"primaryKey;column:id"`
230264
BesluitId *string `json:"Besluit_Id" gorm:"column:besluit_id_raw"`

etl/pkg/odata/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (c *Client) GetMotiesWithVotesAfter(ctx context.Context, skip int, top int,
8585

8686
options := QueryOptions{
8787
Filter: filter,
88-
Expand: "Besluit($filter=Verwijderd eq false and Stemming/any(s: s/Verwijderd eq false);$expand=Stemming($filter=Verwijderd eq false;$expand=Persoon,Fractie)),ZaakActor($filter=relatie eq 'Indiener'),Kamerstukdossier($expand=Document($filter=Soort eq 'Motie' and Verwijderd eq false;$orderby=Volgnummer desc);$filter=HoogsteVolgnummer gt 0;$select=Id,Nummer,HoogsteVolgnummer)",
88+
Expand: "Besluit($filter=Verwijderd eq false and Stemming/any(s: s/Verwijderd eq false);$expand=Stemming($filter=Verwijderd eq false;$expand=Persoon,Fractie),Agendapunt($expand=Activiteit)),ZaakActor($filter=relatie eq 'Indiener'),Kamerstukdossier($expand=Document($filter=Soort eq 'Motie' and Verwijderd eq false;$orderby=Volgnummer desc);$filter=HoogsteVolgnummer gt 0;$select=Id,Nummer,HoogsteVolgnummer)",
8989
Skip: skip,
9090
}
9191

0 commit comments

Comments
 (0)