diff --git a/apps/judicial-system/backend/src/app/formatters/confirmedIndictmentPdf.ts b/apps/judicial-system/backend/src/app/formatters/confirmedIndictmentPdf.ts index 1c663df0edfd..f5798cf30849 100644 --- a/apps/judicial-system/backend/src/app/formatters/confirmedIndictmentPdf.ts +++ b/apps/judicial-system/backend/src/app/formatters/confirmedIndictmentPdf.ts @@ -4,14 +4,14 @@ import { formatDate, lowercase } from '@island.is/judicial-system/formatters' import { calculatePt, + Confirmation, drawTextWithEllipsisPDFKit, - IndictmentConfirmation, smallFontSize, } from './pdfHelpers' import { PDFKitCoatOfArms } from './PDFKitCoatOfArms' export const createConfirmedIndictment = async ( - confirmation: IndictmentConfirmation, + confirmation: Confirmation, indictmentPDF: Buffer, ): Promise => { const pdfDoc = await PDFDocument.load(indictmentPDF) diff --git a/apps/judicial-system/backend/src/app/formatters/index.ts b/apps/judicial-system/backend/src/app/formatters/index.ts index 084da81ca6b5..120d7279c56e 100644 --- a/apps/judicial-system/backend/src/app/formatters/index.ts +++ b/apps/judicial-system/backend/src/app/formatters/index.ts @@ -29,7 +29,7 @@ export { formatPostponedCourtDateEmailNotification, stripHtmlTags, } from './formatters' -export { IndictmentConfirmation } from './pdfHelpers' +export { Confirmation } from './pdfHelpers' export { getRequestPdfAsBuffer, getRequestPdfAsString } from './requestPdf' export { getRulingPdfAsBuffer, getRulingPdfAsString } from './rulingPdf' export { createCaseFilesRecord } from './caseFilesRecordPdf' diff --git a/apps/judicial-system/backend/src/app/formatters/indictmentPdf.ts b/apps/judicial-system/backend/src/app/formatters/indictmentPdf.ts index c19da2711a7f..5ab70b81c81a 100644 --- a/apps/judicial-system/backend/src/app/formatters/indictmentPdf.ts +++ b/apps/judicial-system/backend/src/app/formatters/indictmentPdf.ts @@ -16,7 +16,7 @@ import { addNormalPlusJustifiedText, addNormalPlusText, addNormalText, - IndictmentConfirmation, + Confirmation, setTitle, } from './pdfHelpers' @@ -52,7 +52,7 @@ const roman = (num: number) => { export const createIndictment = async ( theCase: Case, formatMessage: FormatMessage, - confirmation?: IndictmentConfirmation, + confirmation?: Confirmation, ): Promise => { const doc = new PDFDocument({ size: 'A4', diff --git a/apps/judicial-system/backend/src/app/formatters/pdfHelpers.ts b/apps/judicial-system/backend/src/app/formatters/pdfHelpers.ts index d348032ebc35..4f44aa249e93 100644 --- a/apps/judicial-system/backend/src/app/formatters/pdfHelpers.ts +++ b/apps/judicial-system/backend/src/app/formatters/pdfHelpers.ts @@ -5,7 +5,7 @@ import { formatDate, lowercase } from '@island.is/judicial-system/formatters' import { coatOfArms } from './coatOfArms' import { policeStar } from './policeStar' -export interface IndictmentConfirmation { +export interface Confirmation { actor: string title?: string institution: string @@ -22,6 +22,10 @@ export const largeFontSize = 18 export const hugeFontSize = 26 export const giganticFontSize = 33 +const lightGray = '#FAFAFA' +const darkGray = '#CBCBCB' +const gold = '#ADA373' + const setFont = (doc: PDFKit.PDFDocument, font?: string) => { if (font) { doc.font(font) @@ -106,13 +110,105 @@ export const addPoliceStar = (doc: PDFKit.PDFDocument) => { doc.scale(25).translate(-270, -70) } +export const addConfirmation = ( + doc: PDFKit.PDFDocument, + confirmation: Confirmation, +) => { + const pageMargin = calculatePt(18) + const shaddowHeight = calculatePt(70) + const coatOfArmsWidth = calculatePt(105) + const coatOfArmsX = pageMargin + calculatePt(8) + const titleHeight = calculatePt(24) + const titleX = coatOfArmsX + coatOfArmsWidth + calculatePt(8) + const institutionWidth = calculatePt(160) + const confirmedByWidth = institutionWidth + calculatePt(48) + const shaddowWidth = institutionWidth + confirmedByWidth + coatOfArmsWidth + const titleWidth = institutionWidth + confirmedByWidth + + // Draw the shadow + doc + .rect(pageMargin, pageMargin + calculatePt(8), shaddowWidth, shaddowHeight) + .fill(lightGray) + .stroke() + + // Draw the coat of arms + doc + .rect(coatOfArmsX, pageMargin, coatOfArmsWidth, shaddowHeight) + .fillAndStroke('white', darkGray) + + addCoatOfArms(doc, calculatePt(49), calculatePt(24)) + + // Draw the title + doc + .rect(coatOfArmsX + coatOfArmsWidth, pageMargin, titleWidth, titleHeight) + .fillAndStroke(lightGray, darkGray) + doc.fill('black') + doc.font('Times-Bold') + doc + .fontSize(calculatePt(smallFontSize)) + .text('Réttarvörslugátt', titleX, pageMargin + calculatePt(9)) + doc.font('Times-Roman') + // The X value here is approx. 8px after the title + doc.text('Rafræn staðfesting', calculatePt(210), pageMargin + calculatePt(9)) + doc.text( + formatDate(confirmation.date) || '', + shaddowWidth - calculatePt(24), + pageMargin + calculatePt(9), + ) + + // Draw the institution + doc + .rect( + coatOfArmsX + coatOfArmsWidth, + pageMargin + titleHeight, + institutionWidth, + shaddowHeight - titleHeight, + ) + .fillAndStroke('white', darkGray) + doc.fill('black') + doc.font('Times-Bold') + doc.text('Dómstóll', titleX, pageMargin + titleHeight + calculatePt(10)) + doc.font('Times-Roman') + drawTextWithEllipsis( + doc, + confirmation.institution, + titleX, + pageMargin + titleHeight + calculatePt(22), + institutionWidth - calculatePt(16), + ) + + // Draw the actor + doc + .rect( + coatOfArmsX + coatOfArmsWidth + institutionWidth, + pageMargin + titleHeight, + confirmedByWidth, + shaddowHeight - titleHeight, + ) + .fillAndStroke('white', darkGray) + doc.fill('black') + doc.font('Times-Bold') + doc.text( + 'Samþykktaraðili', + titleX + institutionWidth, + pageMargin + titleHeight + calculatePt(10), + ) + doc.font('Times-Roman') + doc.text( + `${confirmation.actor}${ + confirmation.title ? `, ${lowercase(confirmation.title)}` : '' + }`, + titleX + institutionWidth, + pageMargin + titleHeight + calculatePt(22), + ) + + doc.fillColor('black') +} + export const addIndictmentConfirmation = ( doc: PDFKit.PDFDocument, - confirmation: IndictmentConfirmation, + confirmation: Confirmation, ) => { - const lightGray = '#FAFAFA' - const darkGray = '#CBCBCB' - const gold = '#ADA373' const pageMargin = calculatePt(18) const shaddowHeight = calculatePt(90) const coatOfArmsWidth = calculatePt(105) diff --git a/apps/judicial-system/backend/src/app/formatters/subpoenaPdf.ts b/apps/judicial-system/backend/src/app/formatters/subpoenaPdf.ts index 313088079040..4af8001053e8 100644 --- a/apps/judicial-system/backend/src/app/formatters/subpoenaPdf.ts +++ b/apps/judicial-system/backend/src/app/formatters/subpoenaPdf.ts @@ -13,6 +13,7 @@ import { subpoena as strings } from '../messages' import { Case } from '../modules/case' import { Defendant } from '../modules/defendant' import { + addConfirmation, addEmptyLines, addFooter, addHugeHeading, @@ -49,6 +50,11 @@ export const createSubpoena = ( doc.on('data', (chunk) => sinc.push(chunk)) setTitle(doc, formatMessage(strings.title)) + + if (dateLog) { + addEmptyLines(doc, 5) + } + addNormalText(doc, `${theCase.court?.name}`, 'Times-Bold', true) addNormalRightAlignedText( @@ -148,6 +154,15 @@ export const createSubpoena = ( addFooter(doc) + if (dateLog) { + addConfirmation(doc, { + actor: theCase.judge?.name || '', + title: theCase.judge?.title, + institution: theCase.judge?.institution?.name || '', + date: dateLog.created, + }) + } + doc.end() return new Promise((resolve) => diff --git a/apps/judicial-system/backend/src/app/modules/case/case.controller.ts b/apps/judicial-system/backend/src/app/modules/case/case.controller.ts index f6aaa0a14fd3..7b0da96f91d1 100644 --- a/apps/judicial-system/backend/src/app/modules/case/case.controller.ts +++ b/apps/judicial-system/backend/src/app/modules/case/case.controller.ts @@ -68,7 +68,7 @@ import { prosecutorRule, publicProsecutorStaffRule, } from '../../guards' -import { CaseEvent, EventService } from '../event' +import { EventService } from '../event' import { UserService } from '../user' import { CreateCaseDto } from './dto/createCase.dto' import { TransitionCaseDto } from './dto/transitionCase.dto' diff --git a/apps/judicial-system/backend/src/app/modules/case/case.service.ts b/apps/judicial-system/backend/src/app/modules/case/case.service.ts index 65a7daca3a84..eabf3a6cee0b 100644 --- a/apps/judicial-system/backend/src/app/modules/case/case.service.ts +++ b/apps/judicial-system/backend/src/app/modules/case/case.service.ts @@ -56,7 +56,7 @@ import { import { AwsS3Service } from '../aws-s3' import { CourtService } from '../court' import { Defendant, DefendantService } from '../defendant' -import { CaseEvent, EventService } from '../event' +import { EventService } from '../event' import { EventLog, EventLogService } from '../event-log' import { CaseFile, FileService } from '../file' import { IndictmentCount } from '../indictment-count' diff --git a/apps/judicial-system/backend/src/app/modules/case/filters/case.filter.ts b/apps/judicial-system/backend/src/app/modules/case/filters/case.filter.ts index d49a4ea4a964..7228bb2fda08 100644 --- a/apps/judicial-system/backend/src/app/modules/case/filters/case.filter.ts +++ b/apps/judicial-system/backend/src/app/modules/case/filters/case.filter.ts @@ -5,7 +5,6 @@ import { CaseDecision, CaseState, CaseType, - DateType, getIndictmentVerdictAppealDeadline, IndictmentCaseReviewDecision, InstitutionType, diff --git a/apps/judicial-system/backend/src/app/modules/case/internalCase.controller.ts b/apps/judicial-system/backend/src/app/modules/case/internalCase.controller.ts index 9149585ce497..0d73789d2686 100644 --- a/apps/judicial-system/backend/src/app/modules/case/internalCase.controller.ts +++ b/apps/judicial-system/backend/src/app/modules/case/internalCase.controller.ts @@ -23,7 +23,7 @@ import { restrictionCases, } from '@island.is/judicial-system/types' -import { CaseEvent, EventService } from '../event' +import { EventService } from '../event' import { DeliverDto } from './dto/deliver.dto' import { DeliverCancellationNoticeDto } from './dto/deliverCancellationNotice.dto' import { InternalCasesDto } from './dto/internalCases.dto' diff --git a/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts b/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts index ebee2422a741..235d74f860a0 100644 --- a/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts +++ b/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts @@ -53,7 +53,7 @@ import { AwsS3Service } from '../aws-s3' import { CourtDocumentFolder, CourtService } from '../court' import { courtSubtypes } from '../court/court.service' import { Defendant, DefendantService } from '../defendant' -import { CaseEvent, EventService } from '../event' +import { EventService } from '../event' import { CaseFile, FileService } from '../file' import { IndictmentCount, IndictmentCountService } from '../indictment-count' import { Institution } from '../institution' diff --git a/apps/judicial-system/backend/src/app/modules/case/limitedAccessCase.controller.ts b/apps/judicial-system/backend/src/app/modules/case/limitedAccessCase.controller.ts index 809dcfc390cc..42c90d58ec5e 100644 --- a/apps/judicial-system/backend/src/app/modules/case/limitedAccessCase.controller.ts +++ b/apps/judicial-system/backend/src/app/modules/case/limitedAccessCase.controller.ts @@ -40,7 +40,7 @@ import { import { nowFactory } from '../../factories' import { defenderRule, prisonSystemStaffRule } from '../../guards' -import { CaseEvent, EventService } from '../event' +import { EventService } from '../event' import { User } from '../user' import { TransitionCaseDto } from './dto/transitionCase.dto' import { UpdateCaseDto } from './dto/updateCase.dto' diff --git a/apps/judicial-system/backend/src/app/modules/case/pdf.service.ts b/apps/judicial-system/backend/src/app/modules/case/pdf.service.ts index 8289b8d636ec..6b956856ebb1 100644 --- a/apps/judicial-system/backend/src/app/modules/case/pdf.service.ts +++ b/apps/judicial-system/backend/src/app/modules/case/pdf.service.ts @@ -22,6 +22,7 @@ import { } from '@island.is/judicial-system/types' import { + Confirmation, createCaseFilesRecord, createIndictment, createSubpoena, @@ -29,7 +30,6 @@ import { getCustodyNoticePdfAsBuffer, getRequestPdfAsBuffer, getRulingPdfAsBuffer, - IndictmentConfirmation, } from '../../formatters' import { AwsS3Service } from '../aws-s3' import { Defendant } from '../defendant' @@ -206,7 +206,7 @@ export class PdfService { ) } - let confirmation: IndictmentConfirmation | undefined = undefined + let confirmation: Confirmation | undefined = undefined if (hasIndictmentCaseBeenSubmittedToCourt(theCase.state)) { if (theCase.indictmentHash) { diff --git a/apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createPresignedPostGuards.spec.ts b/apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createPresignedPostGuards.spec.ts index 310e6b9f70c2..fcb2e12d9efd 100644 --- a/apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createPresignedPostGuards.spec.ts +++ b/apps/judicial-system/backend/src/app/modules/file/test/limitedAccessFileController/createPresignedPostGuards.spec.ts @@ -4,11 +4,7 @@ import { restrictionCases, } from '@island.is/judicial-system/types' -import { - CaseCompletedGuard, - CaseTypeGuard, - CaseWriteGuard, -} from '../../../case' +import { CaseTypeGuard, CaseWriteGuard } from '../../../case' import { LimitedAccessFileController } from '../../limitedAccessFile.controller' describe('LimitedAccessFileController - Create presigned post guards', () => { diff --git a/apps/judicial-system/backend/src/app/modules/notification/internalNotification.service.ts b/apps/judicial-system/backend/src/app/modules/notification/internalNotification.service.ts index 2c6aa5278d6d..ebce85337c80 100644 --- a/apps/judicial-system/backend/src/app/modules/notification/internalNotification.service.ts +++ b/apps/judicial-system/backend/src/app/modules/notification/internalNotification.service.ts @@ -73,10 +73,9 @@ import { } from '../../formatters' import { notifications } from '../../messages' import { type Case, DateLog } from '../case' -import { ExplanatoryComment } from '../case/models/explanatoryComment.model' import { CourtService } from '../court' import { type Defendant, DefendantService } from '../defendant' -import { CaseEvent, EventService } from '../event' +import { EventService } from '../event' import { DeliverResponse } from './models/deliver.response' import { Notification, Recipient } from './models/notification.model' import { BaseNotificationService } from './baseNotification.service' diff --git a/apps/judicial-system/backend/src/app/modules/notification/notification.service.ts b/apps/judicial-system/backend/src/app/modules/notification/notification.service.ts index 8a9e78671c95..8103b1106f14 100644 --- a/apps/judicial-system/backend/src/app/modules/notification/notification.service.ts +++ b/apps/judicial-system/backend/src/app/modules/notification/notification.service.ts @@ -11,7 +11,7 @@ import { type User } from '@island.is/judicial-system/types' import { CaseState, NotificationType } from '@island.is/judicial-system/types' import { type Case } from '../case' -import { CaseEvent, EventService } from '../event' +import { EventService } from '../event' import { SendNotificationResponse } from './models/sendNotification.response' @Injectable() diff --git a/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.spec.tsx b/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.spec.tsx index fdb75baa1555..65ec62d224ed 100644 --- a/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.spec.tsx +++ b/apps/judicial-system/web/src/components/IndictmentCaseFilesList/IndictmentCaseFilesList.spec.tsx @@ -1,7 +1,6 @@ import { render, screen } from '@testing-library/react' import { - CaseDecision, CaseFileCategory, CaseType, } from '@island.is/judicial-system-web/src/graphql/schema' diff --git a/apps/judicial-system/web/src/routes/PublicProsecutor/Indictments/Overview/Overview.tsx b/apps/judicial-system/web/src/routes/PublicProsecutor/Indictments/Overview/Overview.tsx index 9908cf73787a..c554555f7593 100644 --- a/apps/judicial-system/web/src/routes/PublicProsecutor/Indictments/Overview/Overview.tsx +++ b/apps/judicial-system/web/src/routes/PublicProsecutor/Indictments/Overview/Overview.tsx @@ -5,7 +5,6 @@ import { useRouter } from 'next/router' import { Box, Option, Select, Text } from '@island.is/island-ui/core' import * as constants from '@island.is/judicial-system/consts' import { formatDate } from '@island.is/judicial-system/formatters' -import { isCompletedCase } from '@island.is/judicial-system/types' import { core, titles } from '@island.is/judicial-system-web/messages' import { BlueBox,