Repository: david-loe/abrechnung
Pull request #187: Add booking remark
Author: login: david-loe
Created: 2025-05-19T14:17:33Z | Merged: 2025-05-19T14:24:23Z

- Implemented booking remark field in advance, expense report, health care cost, and travel components.
- Updated helper functions to set advance balance based on budget.
- Modified migration logic to handle new booking remark field.
- Enhanced UI to display booking remarks in lists and detail views.
- Added localization for booking remark in English and German.
- Refactored related components to accommodate new booking remark feature.
fixes #179

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
  - Introduced a new "booking remark" field for advances, travel, expense reports, and healthcare costs, allowing users to add and view booking-related notes.
  - Added support for displaying and editing booking remarks in relevant forms and lists across the application.
  - Updated language support to include translations for "booking remark" in English and German.

- **UI Updates**
  - Replaced the "comments" column with "booking remark" in report lists and detail views.
  - Enhanced tooltips and expandable rows to display booking remarks instead of comment lists.
  - Adjusted column visibility settings to reflect the new booking remark field.

- **Bug Fixes**
  - Improved handling of approval and refund actions to include booking remarks where applicable.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Linked issue #179: Add booking remark for all reports
stop showing comments in refunded view, instead intruduce a special booking remark

Diff:
diff --git a/backend/controller/advanceController.ts b/backend/controller/advanceController.ts
index df1d4fbc..3fb5c796 100644
--- a/backend/controller/advanceController.ts
+++ b/backend/controller/advanceController.ts
@@ -3,7 +3,7 @@ import { Condition } from 'mongoose'
 import { Body, Delete, Get, Post, Produces, Queries, Query, Request, Route, Security, Tags } from 'tsoa'
 import { Advance as IAdvance, IdDocument, Locale, _id } from '../../common/types.js'
 import { reportPrinter } from '../factory.js'
-import { checkIfUserIsProjectSupervisor, writeToDisk } from '../helper.js'
+import { checkIfUserIsProjectSupervisor, setAdvanceBalance, writeToDisk } from '../helper.js'
 import i18n from '../i18n.js'
 import Advance, { AdvanceDoc } from '../models/advance.js'
 import { sendNotification } from '../notifications/notification.js'
@@ -31,7 +31,7 @@ export class AdvanceController extends Controller {
     return await this.getter(Advance, {
       query,
       filter: { owner: request.user._id, historic: false },
-      projection: { history: 0, historic: 0 },
+      projection: { history: 0, historic: 0, bookingRemark: 0 },
       sort: { createdAt: -1 }
     })
   }
@@ -143,11 +143,15 @@ export class AdvanceApproveController extends Controller {
 
   @Post('approved')
   public async postAnyBackApproved(
-    @Body() requestBody: (AdvanceApplication & { owner: IdDocument }) | { _id: _id; comment?: string },
+    @Body() requestBody:
+      | (AdvanceApplication & { owner: IdDocument; bookingRemark?: string | null })
+      | { _id: _id; comment?: string; bookingRemark?: string | null },
     @Request() request: AuthenticatedExpressRequest
   ) {
     const extendedBody = Object.assign(requestBody, { state: 'approved', editor: request.user._id })
     if (!extendedBody._id) {
+      ;(extendedBody as any).log = { appliedFor: { date: new Date(), editor: request.user._id } }
+      setAdvanceBalance(extendedBody as AdvanceApplication as IAdvance)
       if (!(extendedBody as AdvanceApplication).name) {
         const date = new Date()
         ;(extendedBody as AdvanceApplication).name =
diff --git a/backend/controller/expenseReportController.ts b/backend/controller/expenseReportController.ts
index e32757a8..c0ca1fd9 100644
--- a/backend/controller/expenseReportController.ts
+++ b/backend/controller/expenseReportController.ts
@@ -23,7 +23,7 @@ export class ExpenseReportController extends Controller {
     return await this.getter(ExpenseReport, {
       query,
       filter: { owner: request.user._id, historic: false },
-      projection: { history: 0, historic: 0, expenses: 0 },
+      projection: { history: 0, historic: 0, expenses: 0, bookingRemark: 0 },
       allowedAdditionalFields: ['expenses'],
       sort: { createdAt: -1 }
     })
@@ -279,9 +279,12 @@ export class ExpenseReportExamineController extends Controller {
     @Request() request: AuthenticatedExpressRequest
   ) {
     const extendedBody = Object.assign(requestBody, { state: 'inWork', editor: request.user._id })
-    if (!extendedBody._id && !extendedBody.name) {
-      const date = new Date()
-      extendedBody.name = `${i18n.t('labels.expenses', { lng: request.user.settings.language })} ${i18n.t(`monthsShort.${date.getUTCMonth()}`, { lng: request.user.settings.language })} ${date.getUTCFullYear()}`
+    if (!extendedBody._id) {
+      ;(extendedBody as any).log = { inWork: { date: new Date(), editor: request.user._id } }
+      if (!extendedBody.name) {
+        const date = new Date()
+        extendedBody.name = `${i18n.t('labels.expenses', { lng: request.user.settings.language })} ${i18n.t(`monthsShort.${date.getUTCMonth()}`, { lng: request.user.settings.language })} ${date.getUTCFullYear()}`
+      }
     }
     return await this.setter(ExpenseReport, {
       requestBody: extendedBody,
@@ -298,7 +301,10 @@ export class ExpenseReportExamineController extends Controller {
   }
 
   @Post('refunded')
-  public async postRefunded(@Body() requestBody: { _id: _id; comment?: string }, @Request() request: AuthenticatedExpressRequest) {
+  public async postRefunded(
+    @Body() requestBody: { _id: _id; comment?: string; bookingRemark?: string | null },
+    @Request() request: AuthenticatedExpressRequest
+  ) {
     const extendedBody = Object.assign(requestBody, { state: 'refunded', editor: request.user._id })
 
     const cb = async (expenseReport: IExpenseReport) => {
diff --git a/backend/controller/healthCareCostController.ts b/backend/controller/healthCareCostController.ts
index 019b140e..54f84fdd 100644
--- a/backend/controller/healthCareCostController.ts
+++ b/backend/controller/healthCareCostController.ts
@@ -24,7 +24,7 @@ export class HealthCareCostController extends Controller {
     return await this.getter(HealthCareCost, {
       query,
       filter: { owner: request.user._id, historic: false },
-      projection: { history: 0, historic: 0, expenses: 0 },
+      projection: { history: 0, historic: 0, expenses: 0, bookingRemark: 0 },
       allowedAdditionalFields: ['expenses'],
       sort: { createdAt: -1 }
     })
@@ -255,7 +255,7 @@ export class HealthCareCostExamineController extends Controller {
 
   @Post('underExaminationByInsurance')
   public async postUnderExaminationByInsurance(
-    @Body() requestBody: { _id: _id; comment?: string },
+    @Body() requestBody: { _id: _id; comment?: string; bookingRemark?: string | null },
     @Request() request: AuthenticatedExpressRequest
   ) {
     const extendedBody = Object.assign(requestBody, {
@@ -325,9 +325,12 @@ export class HealthCareCostExamineController extends Controller {
     @Request() request: AuthenticatedExpressRequest
   ) {
     const extendedBody = Object.assign(requestBody, { state: 'inWork', editor: request.user._id })
-    if (!extendedBody._id && !extendedBody.name) {
-      const date = new Date()
-      extendedBody.name = `${requestBody.patientName} ${i18n.t(`monthsShort.${date.getUTCMonth()}`, { lng: request.user.settings.language })} ${date.getUTCFullYear()}`
+    if (!extendedBody._id) {
+      ;(extendedBody as any).log = { inWork: { date: new Date(), editor: request.user._id } }
+      if (!extendedBody.name) {
+        const date = new Date()
+        extendedBody.name = `${requestBody.patientName} ${i18n.t(`monthsShort.${date.getUTCMonth()}`, { lng: request.user.settings.language })} ${date.getUTCFullYear()}`
+      }
     }
     return await this.setter(HealthCareCost, {
       requestBody: extendedBody,
diff --git a/backend/controller/travelController.ts b/backend/controller/travelController.ts
index 20ecd7cc..2262b929 100644
--- a/backend/controller/travelController.ts
+++ b/backend/controller/travelController.ts
@@ -23,7 +23,7 @@ export class TravelController extends Controller {
     return await this.getter(Travel, {
       query,
       filter: { owner: request.user._id, historic: false },
-      projection: { history: 0, historic: 0, expenses: 0, stages: 0, days: 0 },
+      projection: { history: 0, historic: 0, expenses: 0, stages: 0, days: 0, bookingRemark: 0 },
       allowedAdditionalFields: ['expenses', 'stages', 'days'],
       sort: { startDate: -1 }
     })
@@ -275,6 +275,7 @@ export class TravelApproveController extends Controller {
   ) {
     const extendedBody = Object.assign(requestBody, { state: 'approved', editor: request.user._id })
     if (!extendedBody._id) {
+      ;(extendedBody as any).log = { appliedFor: { date: new Date(), editor: request.user._id } }
       const travelApplication = extendedBody as TravelApplication
       ;(travelApplication as any).lastPlaceOfWork = { country: travelApplication.destinationPlace?.country, place: '' }
       if (!travelApplication.name && travelApplication.startDate) {
@@ -460,7 +461,10 @@ export class TravelExamineController extends Controller {
   }
 
   @Post('refunded')
-  public async postRefunded(@Body() requestBody: { _id: _id; comment?: string }, @Request() request: AuthenticatedExpressRequest) {
+  public async postRefunded(
+    @Body() requestBody: { _id: _id; comment?: string; bookingRemark?: string | null },
+    @Request() request: AuthenticatedExpressRequest
+  ) {
     const extendedBody = Object.assign(requestBody, { state: 'refunded', editor: request.user._id })
 
     const cb = async (travel: ITravel) => {
diff --git a/backend/helper.ts b/backend/helper.ts
index 3c263927..386eefff 100644
--- a/backend/helper.ts
+++ b/backend/helper.ts
@@ -4,7 +4,8 @@ import { NextFunction, Request, Response } from 'express'
 import jwt from 'jsonwebtoken'
 import { Types } from 'mongoose'
 import multer from 'multer'
-import { DocumentFile as IDocumentFile, User as IUser, _id } from '../common/types.js'
+import { getBaseCurrencyAmount } from '../common/scripts.js'
+import { BaseCurrencyMoneyNotNull, DocumentFile as IDocumentFile, User as IUser, Money, _id } from '../common/types.js'
 import { logger } from './logger.js'
 import DocumentFile from './models/documentFile.js'
 
@@ -169,3 +170,7 @@ export function genAuthenticatedLink(
     })
   })
 }
+
+export function setAdvanceBalance(advance: { budget: Money; balance?: BaseCurrencyMoneyNotNull }) {
+  advance.balance = { amount: getBaseCurrencyAmount(advance.budget) }
+}
diff --git a/backend/migrations.ts b/backend/migrations.ts
index 2b8959ae..707d5207 100644
--- a/backend/migrations.ts
+++ b/backend/migrations.ts
@@ -114,7 +114,7 @@ export async function checkForMigrations() {
                       ? {}
                       : { appliedFor: report.log.appliedFor ?? { date: report.createdAt, editor: travelApprover?._id } },
                   state: report.state === 'appliedFor' ? 'appliedFor' : 'approved',
-                  editor: report.editor
+                  editor: report.state === 'appliedFor' ? report.editor : travelApprover?._id
                 })
                 await advance.save()
                 report.advances = [advance]
diff --git a/backend/models/advance.ts b/backend/models/advance.ts
index a928900d..a3190bbc 100644
--- a/backend/models/advance.ts
+++ b/backend/models/advance.ts
@@ -13,6 +13,7 @@ import {
   advanceStates,
   baseCurrency
 } from '../../common/types.js'
+import { setAdvanceBalance } from '../helper.js'
 import { addExchangeRate } from './exchangeRate.js'
 import { costObject, populateAll, populateSelected, requestBaseSchema } from './helper.js'
 
@@ -75,8 +76,7 @@ schema.methods.saveToHistory = async function (this: AdvanceDoc, save = true, se
   this.markModified('history')
   this.log[this.state] = { date: new Date(), editor: this.editor }
   if (this.state === 'appliedFor') {
-    const budgetAmount = getBaseCurrencyAmount(this.budget)
-    this.balance.amount = budgetAmount
+    setAdvanceBalance(this)
   }
   if (save) {
     await this.save({ session })
diff --git a/backend/models/documentFile.ts b/backend/models/documentFile.ts
index e8fcdad0..d0cbb86a 100644
--- a/backend/models/documentFile.ts
+++ b/backend/models/documentFile.ts
@@ -1,5 +1,4 @@
 import { Schema, model } from 'mongoose'
-
 import { DocumentFile, documentFileTypes } from '../../common/types.js'
 
 const fileSchema = () =>
diff --git a/backend/models/helper.ts b/backend/models/helper.ts
index fd0e6753..e8204642 100644
--- a/backend/models/helper.ts
+++ b/backend/models/helper.ts
@@ -94,6 +94,7 @@ export function requestBaseSchema<S extends AnyState = AnyState>(
         }
       ]
     },
+    bookingRemark: { type: String },
     history: { type: [{ type: Schema.Types.ObjectId, ref: modelName }] },
     historic: { type: Boolean, required: true, default: false }
   }
diff --git a/common/locales/de.json b/common/locales/de.json
index 18d77ba8..ea0127dd 100755
--- a/common/locales/de.json
+++ b/common/locales/de.json
@@ -196,6 +196,7 @@
     "backToApplicant": "Zurück zum Antragsteller",
     "balance": "Saldo",
     "bankDetails": "Bankverbindung",
+    "bookingRemark": "Buchungsvermerk",
     "borderColor": "Rahmenfarbe",
     "borderThickness": "Rahmenstärke",
     "bottom": "Unten",
diff --git a/common/locales/en.json b/common/locales/en.json
index a745a912..611df38b 100755
--- a/common/locales/en.json
+++ b/common/locales/en.json
@@ -196,6 +196,7 @@
     "backToApplicant": "Back to applicant",
     "balance": "Balance",
     "bankDetails": "Bank details",
+    "bookingRemark": "Booking remark",
     "borderColor": "Border color",
     "borderThickness": "Border Thickness",
     "bottom": "Bottom",
diff --git a/common/types.ts b/common/types.ts
index d516e913..640ba737 100644
--- a/common/types.ts
+++ b/common/types.ts
@@ -431,6 +431,7 @@ export interface ReportSimple<S extends AnyState = AnyState> {
   editor: UserSimple
   project: Project
   comment?: string | null
+  bookingRemark?: string | null
   comments: Comment<S>[]
   state: S
   log: Log<S>
diff --git a/frontend/src/components/HomePage.vue b/frontend/src/components/HomePage.vue
index e2eec226..960130b7 100644
--- a/frontend/src/components/HomePage.vue
+++ b/frontend/src/components/HomePage.vue
@@ -105,7 +105,7 @@
           class="mb-4"
           ref="travelList"
           endpoint="travel"
-          :columns-to-hide="['owner', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation', 'comments']"
+          :columns-to-hide="['owner', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation', 'bookingRemark']"
           @clicked-applied="(t) => showModal('view', 'travel', t)"></TravelList>
       </template>
       <template v-if="!APP_DATA.settings.disableReportType.expenseReport">
@@ -114,7 +114,7 @@
           class="mb-4"
           ref="expenseReportList"
           endpoint="expenseReport"
-          :columns-to-hide="['owner', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation', 'comments']"></ExpenseReportList>
+          :columns-to-hide="['owner', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation', 'bookingRemark']"></ExpenseReportList>
       </template>
       <template v-if="!APP_DATA.settings.disableReportType.healthCareCost">
         <h3>{{ t('labels.healthCareCost') }}</h3>
@@ -127,7 +127,7 @@
             'report',
             'addUp.totalTotal',
             'organisation',
-            'comments',
+            'bookingRemark',
             'log.underExamination.date'
           ]"></HealthCareCostList>
       </template>
@@ -136,7 +136,7 @@
         <AdvanceList
           ref="advanceList"
           endpoint="advance"
-          :columns-to-hide="['owner', 'updatedAt', 'report', 'organisation', 'comments', 'log.underExamination.date']"
+          :columns-to-hide="['owner', 'updatedAt', 'report', 'organisation', 'bookingRemark', 'log.approved.date']"
           @clicked="(t) => showModal('view', 'advance', t)"></AdvanceList>
       </template>
     </div>
diff --git a/frontend/src/components/advance/AdvanceList.vue b/frontend/src/components/advance/AdvanceList.vue
index 6ec3c5db..a316fa64 100644
--- a/frontend/src/components/advance/AdvanceList.vue
+++ b/frontend/src/components/advance/AdvanceList.vue
@@ -122,14 +122,12 @@
         <i class="bi bi-download"></i>
       </a>
     </template>
-    <template #item-updatedAt="{ updatedAt }">
-      {{ $formatter.dateTime(updatedAt) }}
-    </template>
-    <template #item-comments="{ comments }">
-      <span v-if="comments.length > 0">
-        <TooltipElement
-          html
-          :text="comments.map((comment: Comment) => `<b>${comment.author.name.givenName} ${comment.author.name.familyName.substring(0, 1)}</b>: ${comment.text}`).join('<br>')">
+    <template #item-log.approved.date="{ log }">
+      {{ $formatter.dateTime(log.appliedFor?.date) }}
+    </template>
+    <template #item-bookingRemark="{ bookingRemark }">
+      <span v-if="bookingRemark">
+        <TooltipElement html :text="bookingRemark.replace(/\n/g, '<br>')">
           <i class="bi bi-chat-left-text"></i>
         </TooltipElement>
       </span>
@@ -144,7 +142,7 @@
 
 <script lang="ts" setup>
 import { getById } from '@/../../common/scripts.js'
-import { AdvanceSimple, AdvanceState, Comment, advanceStates } from '@/../../common/types.js'
+import { AdvanceSimple, AdvanceState, advanceStates } from '@/../../common/types.js'
 import APP_LOADER from '@/appData.js'
 import DateInput from '@/components/elements/DateInput.vue'
 import ListElement, { Filter } from '@/components/elements/ListElement.vue'
@@ -194,9 +192,9 @@ if (window.innerWidth > bp.md) {
     { text: t('labels.balance'), value: 'balance' },
     { text: t('labels.owner'), value: 'owner' },
     { text: t('labels.editor'), value: 'editor' },
-    { text: t('labels.updatedAt'), value: 'updatedAt' },
+    { text: t('labels.approvedOn'), value: 'log.approved.date' },
     { text: '', value: 'report', width: 40 },
-    { text: '', value: 'comments', width: 25 }
+    { text: '', value: 'bookingRemark', width: 25 }
   )
 }
 
diff --git a/frontend/src/components/advance/ApprovePage.vue b/frontend/src/components/advance/ApprovePage.vue
index c4b6769c..05649447 100644
--- a/frontend/src/components/advance/ApprovePage.vue
+++ b/frontend/src/components/advance/ApprovePage.vue
@@ -12,7 +12,7 @@
               :advance="(modalAdvance as AdvanceSimple)"
               :loading="modalFormIsLoading"
               @cancel="resetAndHide()"
-              @decision="(d, c) => approveAdvance((modalAdvance as AdvanceSimple), d, c)"></AdvanceApproveForm>
+              @decision="(d, c, br) => approveAdvance((modalAdvance as AdvanceSimple), d, c, br)"></AdvanceApproveForm>
             <Advance v-else :advance="(modalAdvance as AdvanceSimple)" endpointPrefix="approve/"></Advance>
           </template>
         </template>
@@ -23,6 +23,7 @@
           :advance="modalAdvance"
           minStartDate=""
           askOwner
+          askBookingRemark
           :loading="modalFormIsLoading"
           @add="(t) => approveAdvance(t as AdvanceSimple, 'approved')">
         </AdvanceForm>
@@ -46,7 +47,7 @@
         endpoint="approve/advance"
         stateFilter="appliedFor"
         @clicked="(a) => router.push(`/approve/advance/${a._id}`)"
-        :columns-to-hide="['balance', 'state', 'editor', 'updatedAt', 'report', 'organisation', 'comments']"></AdvanceList>
+        :columns-to-hide="['balance', 'state', 'editor', 'updatedAt', 'report', 'organisation', 'bookingRemark']"></AdvanceList>
       <button v-if="!show" type="button" class="btn btn-light" @click="show = 'approved'">
         {{ $t('labels.showX', { X: $t('labels.approvedX', { X: $t('labels.advances') }) }) }} <i class="bi bi-chevron-down"></i>
       </button>
@@ -58,7 +59,7 @@
         <AdvanceList
           endpoint="approve/advance"
           :stateFilter="{ $in: ['approved', 'completed'] }"
-          :columns-to-hide="['updatedAt', 'report', 'organisation', 'comments']"
+          :columns-to-hide="['updatedAt', 'report', 'organisation']"
           @clicked="(a) => router.push(`/approve/advance/${a._id}`)">
         </AdvanceList>
       </template>
@@ -111,9 +112,19 @@ function resetAndHide() {
   hideModal()
 }
 
-async function approveAdvance(advance: AdvanceSimple, decision: 'approved' | 'rejected', comment?: string) {
+async function approveAdvance(
+  advance: AdvanceSimple,
+  decision: 'approved' | 'rejected',
+  comment?: string | null,
+  bookingRemark?: string | null
+) {
   if (advance) {
-    advance.comment = comment
+    if (comment) {
+      advance.comment = comment
+    }
+    if (decision === 'approved' && bookingRemark) {
+      advance.bookingRemark = bookingRemark
+    }
     modalFormIsLoading.value = true
     const result = await API.setter<AdvanceSimple>(`approve/advance/${decision}`, advance)
     modalFormIsLoading.value = false
diff --git a/frontend/src/components/advance/forms/AdvanceApproveForm.vue b/frontend/src/components/advance/forms/AdvanceApproveForm.vue
index 0c0d5564..4330d642 100644
--- a/frontend/src/components/advance/forms/AdvanceApproveForm.vue
+++ b/frontend/src/components/advance/forms/AdvanceApproveForm.vue
@@ -2,14 +2,19 @@
   <div>
     <Advance :advance="advance"></Advance>
     <div class="mb-3">
-      <label for="comment" class="form-label">{{ $t('labels.comment') }}</label>
+      <label for="comment" class="form-label">{{ t('labels.comment') }}</label>
       <TextArea id="comment" v-model="comment"></TextArea>
     </div>
+
+    <div class="mb-3">
+      <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+      <TextArea id="bookingRemark" v-model="bookingRemark"></TextArea>
+    </div>
     <div class="mb-1 d-flex align-items-center">
-      <button type="submit" class="btn btn-success me-2" @click="emit('decision', 'approved', comment)" :disabled="loading">
+      <button type="submit" class="btn btn-success me-2" @click="emit('decision', 'approved', comment, bookingRemark)" :disabled="loading">
         {{ $t('labels.approve') }}
       </button>
-      <button type="button" class="btn btn-danger me-2" @click="emit('decision', 'rejected', comment)" :disabled="loading">
+      <button type="button" class="btn btn-danger me-2" @click="emit('decision', 'rejected', comment, bookingRemark)" :disabled="loading">
         {{ $t('labels.reject') }}
       </button>
       <button type="button" class="btn btn-light" v-on:click="emit('cancel')">
@@ -24,16 +29,21 @@ import { AdvanceSimple } from '@/../../common/types.js'
 import Advance from '@/components/advance/Advance.vue'
 import TextArea from '@/components/elements/TextArea.vue'
 import { ref, watch } from 'vue'
+import { useI18n } from 'vue-i18n'
+
+const { t } = useI18n()
 
 const props = defineProps<{ advance: AdvanceSimple; loading: boolean }>()
-const comment = ref('')
+const comment = ref(undefined as string | null | undefined)
+const bookingRemark = ref(undefined as string | null | undefined)
 
-const emit = defineEmits<{ decision: ['approved' | 'rejected', string]; cancel: [] }>()
+const emit = defineEmits<{ decision: ['approved' | 'rejected', string | null | undefined, string | null | undefined]; cancel: [] }>()
 
 watch(
   () => props.advance,
   () => {
-    comment.value = ''
+    comment.value = undefined
+    bookingRemark.value = undefined
   }
 )
 </script>
diff --git a/frontend/src/components/advance/forms/AdvanceForm.vue b/frontend/src/components/advance/forms/AdvanceForm.vue
index d6aff449..5016a279 100644
--- a/frontend/src/components/advance/forms/AdvanceForm.vue
+++ b/frontend/src/components/advance/forms/AdvanceForm.vue
@@ -35,6 +35,11 @@
       <TextArea v-model="formAdvance.comment"></TextArea>
     </div>
 
+    <div v-if="askBookingRemark" class="mb-3">
+      <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
+      <TextArea id="comment" v-model="formAdvance.bookingRemark" :disabled="disabled"></TextArea>
+    </div>
+
     <div class="mb-1 d-flex align-items-center">
       <button type="submit" class="btn btn-primary me-2" v-if="!disabled" :disabled="loading">
         {{ mode === 'add' ? t('labels.addX', { X: t('labels.advance') }) : t('labels.save') }}
@@ -78,6 +83,7 @@ const props = defineProps({
   },
   disabled: { type: Boolean, default: false },
   askOwner: { type: Boolean, default: false },
+  askBookingRemark: { type: Boolean, default: false },
   loading: { type: Boolean, default: false }
 })
 
@@ -102,7 +108,8 @@ function defaultAdvance() {
     },
     owner: undefined as UserWithNameAndProject | undefined,
     project: undefined as Project | undefined,
-    comment: undefined as string | undefined
+    comment: undefined as string | undefined,
+    bookingRemark: undefined as string | undefined
   }
 }
 
diff --git a/frontend/src/components/expenseReport/ExaminePage.vue b/frontend/src/components/expenseReport/ExaminePage.vue
index 6f76051b..7bc3b0f7 100644
--- a/frontend/src/components/expenseReport/ExaminePage.vue
+++ b/frontend/src/components/expenseReport/ExaminePage.vue
@@ -30,7 +30,7 @@
         class="mb-5"
         endpoint="examine/expenseReport"
         stateFilter="underExamination"
-        :columns-to-hide="['state', 'editor', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation']">
+        :columns-to-hide="['state', 'editor', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation', 'bookingRemark']">
       </ExpenseReportList>
       <template v-if="!show">
         <button type="button" class="btn btn-light me-2" @click="show = 'refunded'">
diff --git a/frontend/src/components/expenseReport/ExpenseReportList.vue b/frontend/src/components/expenseReport/ExpenseReportList.vue
index 046e1ebd..1da4a5d7 100644
--- a/frontend/src/components/expenseReport/ExpenseReportList.vue
+++ b/frontend/src/components/expenseReport/ExpenseReportList.vue
@@ -140,11 +140,9 @@
     <template #item-updatedAt="{ updatedAt }">
       {{ $formatter.dateTime(updatedAt) }}
     </template>
-    <template #item-comments="{ comments }">
-      <span v-if="comments.length > 0">
-        <TooltipElement
-          html
-          :text="comments.map((comment: Comment) => `<b>${comment.author.name.givenName} ${comment.author.name.familyName.substring(0, 1)}</b>: ${comment.text}`).join('<br>')">
+    <template #item-bookingRemark="{ bookingRemark }">
+      <span v-if="bookingRemark">
+        <TooltipElement html :text="bookingRemark.replace(/\n/g, '<br>')">
           <i class="bi bi-chat-left-text"></i>
         </TooltipElement>
       </span>
@@ -159,7 +157,7 @@
 
 <script lang="ts" setup>
 import { getById, getTotalBalance, getTotalTotal } from '@/../../common/scripts.js'
-import { Comment, ExpenseReportState, expenseReportStates } from '@/../../common/types.js'
+import { ExpenseReportState, expenseReportStates } from '@/../../common/types.js'
 import APP_LOADER from '@/appData.js'
 import Badge from '@/components/elements/Badge.vue'
 import CategorySelector from '@/components/elements/CategorySelector.vue'
@@ -216,7 +214,7 @@ if (window.innerWidth > bp.md) {
     { text: t('labels.editor'), value: 'editor' },
     { text: t('labels.updatedAt'), value: 'updatedAt' },
     { text: '', value: 'report', width: 40 },
-    { text: '', value: 'comments', width: 25 }
+    { text: '', value: 'bookingRemark', width: 25 }
   )
 }
 
diff --git a/frontend/src/components/expenseReport/ExpenseReportPage.vue b/frontend/src/components/expenseReport/ExpenseReportPage.vue
index 1c30a69f..1b24b28c 100644
--- a/frontend/src/components/expenseReport/ExpenseReportPage.vue
+++ b/frontend/src/components/expenseReport/ExpenseReportPage.vue
@@ -199,7 +199,14 @@
                     v-model="expenseReport.comment as string | undefined"
                     :disabled="isReadOnly && !(endpointPrefix === 'examine/' && expenseReport.state === 'underExamination')"></TextArea>
                 </div>
-                <template v-if="expenseReport.state === 'inWork'">
+                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
+                  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="bookingRemark"
+                    v-model="expenseReport.bookingRemark"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && expenseReport.state === 'underExamination')"></TextArea>
+                </div>
+                <div v-if="expenseReport.state === 'inWork'">
                   <TooltipElement v-if="expenseReport.expenses.length < 1" :text="t('alerts.noData.expense')">
                     <button class="btn btn-primary" disabled>
                       <i class="bi bi-pencil-square"></i>
@@ -210,28 +217,30 @@
                     <i class="bi bi-pencil-square"></i>
                     <span class="ms-1">{{ t('labels.toExamination') }}</span>
                   </button>
-                </template>
+                </div>
                 <template v-else-if="expenseReport.state === 'underExamination'">
-                  <button v-if="endpointPrefix === 'examine/'" class="btn btn-success mb-2" @click="refund()">
-                    <i class="bi bi-coin"></i>
-                    <span class="ms-1">{{ t('labels.refund') }}</span>
-                  </button>
-                  <button
-                    class="btn btn-secondary"
-                    @click="expenseReport.editor._id !== expenseReport.owner._id ? null : backToInWork()"
-                    :disabled="expenseReport.editor._id !== expenseReport.owner._id">
-                    <i class="bi bi-arrow-counterclockwise"></i>
-                    <span class="ms-1">{{ t(endpointPrefix === 'examine/' ? 'labels.backToApplicant' : 'labels.editAgain') }}</span>
-                  </button>
+                  <div class="mb-2" v-if="endpointPrefix === 'examine/'">
+                    <button class="btn btn-success" @click="refund()">
+                      <i class="bi bi-coin"></i>
+                      <span class="ms-1">{{ t('labels.refund') }}</span>
+                    </button>
+                  </div>
+                  <div>
+                    <button
+                      class="btn btn-secondary"
+                      @click="expenseReport.editor._id !== expenseReport.owner._id ? null : backToInWork()"
+                      :disabled="expenseReport.editor._id !== expenseReport.owner._id">
+                      <i class="bi bi-arrow-counterclockwise"></i>
+                      <span class="ms-1">{{ t(endpointPrefix === 'examine/' ? 'labels.backToApplicant' : 'labels.editAgain') }}</span>
+                    </button>
+                  </div>
                 </template>
-                <a
-                  v-else-if="expenseReport.state === 'refunded'"
-                  class="btn btn-primary"
-                  :href="reportLink"
-                  :download="expenseReport.name + '.pdf'">
-                  <i class="bi bi-download"></i>
-                  <span class="ms-1">{{ t('labels.downloadX', { X: t('labels.report') }) }}</span>
-                </a>
+                <div v-else-if="expenseReport.state === 'refunded'">
+                  <a class="btn btn-primary" :href="reportLink" :download="expenseReport.name + '.pdf'">
+                    <i class="bi bi-download"></i>
+                    <span class="ms-1">{{ t('labels.downloadX', { X: t('labels.report') }) }}</span>
+                  </a>
+                </div>
               </div>
             </div>
           </div>
@@ -356,7 +365,8 @@ async function backToInWork() {
 async function refund() {
   const result = await API.setter<ExpenseReport>('examine/expenseReport/refunded', {
     _id: expenseReport.value._id,
-    comment: expenseReport.value.comment
+    comment: expenseReport.value.comment,
+    bookingRemark: expenseReport.value.bookingRemark
   })
   if (result.ok) {
     router.push({ path: '/examine/expenseReport' })
diff --git a/frontend/src/components/expenseReport/RefundedPage.vue b/frontend/src/components/expenseReport/RefundedPage.vue
index 4c4701db..c6674c9e 100644
--- a/frontend/src/components/expenseReport/RefundedPage.vue
+++ b/frontend/src/components/expenseReport/RefundedPage.vue
@@ -18,12 +18,9 @@
       :rows-per-page="10"
       :rows-items="[10, 20, 50]"
       @loaded="hideExpandColumn">
-      <template #expand="{ comments }">
-        <div class="m-1" v-for="comment in comments" :key="comment._id">
-          <small>
-            <i>{{ `${(comment as Comment).author.name.givenName} ${(comment as Comment).author.name.familyName.substring(0, 1)}: ` }}</i>
-            <span>{{ (comment as Comment).text }}</span>
-          </small>
+      <template #expand="{ bookingRemark }">
+        <div v-if="bookingRemark" class="px-3 pb-1 border-bottom border-4">
+          <small style="white-space: pre-wrap">{{ bookingRemark }}</small>
         </div>
       </template>
     </ExpenseReportList>
@@ -31,7 +28,6 @@
 </template>
 
 <script lang="ts" setup>
-import { Comment } from '@/../../common/types'
 import APP_LOADER from '@/appData.js'
 import ExpenseReportList from '@/components/expenseReport/ExpenseReportList.vue'
 import { expandCollapseComments, hideExpandColumn as hideExpCol } from '@/helper'
@@ -48,7 +44,7 @@ function hideExpandColumn() {
 
 const { handlePrint } = useVueToPrint({
   content: tableRef as any,
-  documentTitle: 'AwesomeFileName',
+  documentTitle: 'List',
   removeAfterPrint: true,
   onBeforeGetContent() {
     return new Promise((resolve) => {
diff --git a/frontend/src/components/healthCareCost/ExaminePage.vue b/frontend/src/components/healthCareCost/ExaminePage.vue
index 0843de78..fa91d886 100644
--- a/frontend/src/components/healthCareCost/ExaminePage.vue
+++ b/frontend/src/components/healthCareCost/ExaminePage.vue
@@ -32,7 +32,7 @@
         class="mb-5"
         endpoint="examine/healthCareCost"
         stateFilter="underExamination"
-        :columns-to-hide="['state', 'editor', 'updatedAt', 'report', 'organisation', 'log.underExamination.date']">
+        :columns-to-hide="['state', 'editor', 'updatedAt', 'report', 'organisation', 'log.underExamination.date', 'bookingRemark']">
       </HealthCareCostList>
       <template v-if="!show">
         <button type="button" class="btn btn-light me-2" @click="show = 'underExaminationByInsurance'">
diff --git a/frontend/src/components/healthCareCost/HealthCareCostList.vue b/frontend/src/components/healthCareCost/HealthCareCostList.vue
index 670e1732..128ad381 100644
--- a/frontend/src/components/healthCareCost/HealthCareCostList.vue
+++ b/frontend/src/components/healthCareCost/HealthCareCostList.vue
@@ -154,11 +154,9 @@
         {{ $formatter.dateTime((log as Log).underExamination!.date) }}
       </span>
     </template>
-    <template #item-comments="{ comments }">
-      <span v-if="comments.length > 0">
-        <TooltipElement
-          html
-          :text="comments.map((comment: Comment) => `<b>${comment.author.name.givenName} ${comment.author.name.familyName.substring(0, 1)}</b>: ${comment.text}`).join('<br>')">
+    <template #item-bookingRemark="{ bookingRemark }">
+      <span v-if="bookingRemark">
+        <TooltipElement html :text="bookingRemark.replace(/\n/g, '<br>')">
           <i class="bi bi-chat-left-text"></i>
         </TooltipElement>
       </span>
@@ -173,7 +171,7 @@
 
 <script lang="ts" setup>
 import { getById, getTotalBalance, getTotalTotal } from '@/../../common/scripts.js'
-import { Comment, HealthCareCostState, Log, healthCareCostStates } from '@/../../common/types.js'
+import { HealthCareCostState, Log, healthCareCostStates } from '@/../../common/types.js'
 import APP_LOADER from '@/appData.js'
 import DateInput from '@/components/elements/DateInput.vue'
 import HealthInsuranceSelector from '@/components/elements/HealthInsuranceSelector.vue'
@@ -234,7 +232,7 @@ if (window.innerWidth > bp.md) {
     { text: t('labels.updatedAt'), value: 'updatedAt' },
     { text: t('labels.examinedOn'), value: 'log.underExamination.date' },
     { text: '', value: 'report', width: 40 },
-    { text: '', value: 'comments', width: 25 }
+    { text: '', value: 'bookingRemark', width: 25 }
   )
 }
 
diff --git a/frontend/src/components/healthCareCost/HealthCareCostPage.vue b/frontend/src/components/healthCareCost/HealthCareCostPage.vue
index 8d02ad30..b0254fd8 100644
--- a/frontend/src/components/healthCareCost/HealthCareCostPage.vue
+++ b/frontend/src/components/healthCareCost/HealthCareCostPage.vue
@@ -220,7 +220,14 @@
                       )
                     "></TextArea>
                 </div>
-                <template v-if="healthCareCost.state === 'inWork'">
+                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
+                  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="bookingRemark"
+                    v-model="healthCareCost.bookingRemark"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && healthCareCost.state === 'underExamination')"></TextArea>
+                </div>
+                <div v-if="healthCareCost.state === 'inWork'">
                   <TooltipElement v-if="healthCareCost.expenses.length < 1" :text="t('alerts.noData.expense')">
                     <button class="btn btn-primary" disabled>
                       <i class="bi bi-pencil-square"></i>
@@ -231,33 +238,37 @@
                     <i class="bi bi-pencil-square"></i>
                     <span class="ms-1">{{ t('labels.toExamination') }}</span>
                   </button>
-                </template>
+                </div>
                 <template v-else-if="healthCareCost.state === 'underExamination'">
-                  <a
-                    v-if="endpointPrefix === 'examine/'"
-                    class="btn btn-primary mb-2"
-                    :href="mailToInsuranceLink"
-                    @click="toExaminationByInsurance()">
-                    <i class="bi bi-pencil-square"></i>
-                    <span class="ms-1">{{ t('labels.toExaminationByInsurance') }}</span>
-                  </a>
-                  <button
-                    class="btn btn-secondary"
-                    @click="healthCareCost.editor._id !== healthCareCost.owner._id ? null : backToInWork()"
-                    :disabled="healthCareCost.editor._id !== healthCareCost.owner._id">
-                    <i class="bi bi-arrow-counterclockwise"></i>
-                    <span class="ms-1">{{ t(endpointPrefix === 'examine/' ? 'labels.backToApplicant' : 'labels.editAgain') }}</span>
-                  </button>
+                  <div v-if="endpointPrefix === 'examine/'" class="mb-2">
+                    <a class="btn btn-primary" :href="mailToInsuranceLink" @click="toExaminationByInsurance()">
+                      <i class="bi bi-pencil-square"></i>
+                      <span class="ms-1">{{ t('labels.toExaminationByInsurance') }}</span>
+                    </a>
+                  </div>
+                  <div>
+                    <button
+                      class="btn btn-secondary"
+                      @click="healthCareCost.editor._id !== healthCareCost.owner._id ? null : backToInWork()"
+                      :disabled="healthCareCost.editor._id !== healthCareCost.owner._id">
+                      <i class="bi bi-arrow-counterclockwise"></i>
+                      <span class="ms-1">{{ t(endpointPrefix === 'examine/' ? 'labels.backToApplicant' : 'labels.editAgain') }}</span>
+                    </button>
+                  </div>
                 </template>
                 <template v-else-if="healthCareCost.state === 'refunded' || healthCareCost.state === 'underExaminationByInsurance'">
-                  <a class="btn btn-primary" :href="reportLink" :download="healthCareCost.name + '.pdf'">
-                    <i class="bi bi-download"></i>
-                    <span class="ms-1">{{ t('labels.downloadX', { X: t('labels.report') }) }}</span>
-                  </a>
-                  <a v-if="endpointPrefix === 'examine/'" class="btn btn-secondary mt-2" :href="mailToInsuranceLink">
-                    <i class="bi bi-envelope"></i>
-                    <span class="ms-1">{{ t('labels.mailToInsurance') }}</span>
-                  </a>
+                  <div>
+                    <a class="btn btn-primary" :href="reportLink" :download="healthCareCost.name + '.pdf'">
+                      <i class="bi bi-download"></i>
+                      <span class="ms-1">{{ t('labels.downloadX', { X: t('labels.report') }) }}</span>
+                    </a>
+                  </div>
+                  <div class="mt-2">
+                    <a v-if="endpointPrefix === 'examine/'" class="btn btn-secondary" :href="mailToInsuranceLink">
+                      <i class="bi bi-envelope"></i>
+                      <span class="ms-1">{{ t('labels.mailToInsurance') }}</span>
+                    </a>
+                  </div>
                 </template>
                 <form
                   class="mt-3"
@@ -417,7 +428,8 @@ async function backToInWork() {
 async function toExaminationByInsurance() {
   const result = await API.setter<HealthCareCost>('examine/healthCareCost/underExaminationByInsurance', {
     _id: healthCareCost.value._id,
-    comment: healthCareCost.value.comment
+    comment: healthCareCost.value.comment,
+    bookingRemark: healthCareCost.value.bookingRemark
   })
   if (result.ok) {
     await getHealthCareCost()
diff --git a/frontend/src/components/healthCareCost/RefundedPage.vue b/frontend/src/components/healthCareCost/RefundedPage.vue
index 52ca20bf..0f0d0a29 100644
--- a/frontend/src/components/healthCareCost/RefundedPage.vue
+++ b/frontend/src/components/healthCareCost/RefundedPage.vue
@@ -17,12 +17,9 @@
       :rows-per-page="10"
       :rows-items="[10, 20, 50]"
       @loaded="hideExpandColumn">
-      <template #expand="{ comments }">
-        <div class="m-1" v-for="comment in comments" :key="comment._id">
-          <small>
-            <i>{{ `${(comment as Comment).author.name.givenName} ${(comment as Comment).author.name.familyName.substring(0, 1)}: ` }}</i>
-            <span>{{ (comment as Comment).text }}</span>
-          </small>
+      <template #expand="{ bookingRemark }">
+        <div v-if="bookingRemark" class="px-3 pb-1 border-bottom border-4">
+          <small style="white-space: pre-wrap">{{ bookingRemark }}</small>
         </div>
       </template>
     </HealthCareCostList>
@@ -30,7 +27,6 @@
 </template>
 
 <script lang="ts" setup>
-import { Comment } from '@/../../common/types'
 import APP_LOADER from '@/appData.js'
 import HealthCareCostList from '@/components/healthCareCost/HealthCareCostList.vue'
 import { expandCollapseComments, hideExpandColumn as hideExpCol } from '@/helper'
@@ -47,7 +43,7 @@ function hideExpandColumn() {
 
 const { handlePrint } = useVueToPrint({
   content: tableRef as any,
-  documentTitle: 'AwesomeFileName',
+  documentTitle: 'List',
   removeAfterPrint: true,
   onBeforeGetContent() {
     return new Promise((resolve) => {
diff --git a/frontend/src/components/travel/ApprovePage.vue b/frontend/src/components/travel/ApprovePage.vue
index 1709266f..0a4b4531 100644
--- a/frontend/src/components/travel/ApprovePage.vue
+++ b/frontend/src/components/travel/ApprovePage.vue
@@ -49,7 +49,7 @@
           'updatedAt',
           'report',
           'organisation',
-          'comments'
+          'bookingRemark'
         ]"></TravelList>
       <button v-if="!show" type="button" class="btn btn-light" @click="show = 'approved'">
         {{ $t('labels.showX', { X: $t('labels.approvedX', { X: $t('labels.travels') }) }) }} <i class="bi bi-chevron-down"></i>
@@ -62,7 +62,7 @@
         <TravelList
           endpoint="approve/travel"
           stateFilter="approved"
-          :columns-to-hide="['state', 'addUp.totalTotal', 'addUp.totalBalance', 'updatedAt', 'report', 'organisation', 'comments']">
+          :columns-to-hide="['state', 'addUp.totalTotal', 'addUp.totalBalance', 'updatedAt', 'report', 'organisation', 'bookingRemark']">
         </TravelList>
       </template>
     </div>
diff --git a/frontend/src/components/travel/ExaminePage.vue b/frontend/src/components/travel/ExaminePage.vue
index 62138739..bb809318 100644
--- a/frontend/src/components/travel/ExaminePage.vue
+++ b/frontend/src/components/travel/ExaminePage.vue
@@ -6,7 +6,7 @@
       ref="travelListRef"
       endpoint="examine/travel"
       stateFilter="underExamination"
-      :columns-to-hide="['state', 'editor', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation']">
+      :columns-to-hide="['state', 'editor', 'updatedAt', 'report', 'addUp.totalTotal', 'organisation', 'bookingRemark']">
     </TravelList>
     <template v-if="!show">
       <button type="button" class="btn btn-light me-2" @click="show = 'refunded'">
diff --git a/frontend/src/components/travel/RefundedPage.vue b/frontend/src/components/travel/RefundedPage.vue
index 2e4f80a6..b61942dd 100644
--- a/frontend/src/components/travel/RefundedPage.vue
+++ b/frontend/src/components/travel/RefundedPage.vue
@@ -17,12 +17,9 @@
       :rows-per-page="10"
       :rows-items="[10, 20, 50]"
       @loaded="hideExpandColumn">
-      <template #expand="{ comments }">
-        <div class="m-1" v-for="comment in comments" :key="comment._id">
-          <small>
-            <i>{{ `${(comment as Comment).author.name.givenName} ${(comment as Comment).author.name.familyName.substring(0, 1)}: ` }}</i>
-            <span>{{ (comment as Comment).text }}</span>
-          </small>
+      <template #expand="{ bookingRemark }">
+        <div v-if="bookingRemark" class="px-3 pb-1 border-bottom border-4">
+          <small style="white-space: pre-wrap">{{ bookingRemark }}</small>
         </div>
       </template>
     </TravelList>
@@ -30,7 +27,6 @@
 </template>
 
 <script lang="ts" setup>
-import { Comment } from '@/../../common/types'
 import APP_LOADER from '@/appData.js'
 import TravelList from '@/components/travel/TravelList.vue'
 import { expandCollapseComments, hideExpandColumn as hideExpCol } from '@/helper'
@@ -47,7 +43,7 @@ function hideExpandColumn() {
 
 const { handlePrint } = useVueToPrint({
   content: tableRef as any,
-  documentTitle: 'AwesomeFileName',
+  documentTitle: 'List',
   removeAfterPrint: true,
   onBeforeGetContent() {
     return new Promise((resolve) => {
diff --git a/frontend/src/components/travel/TravelList.vue b/frontend/src/components/travel/TravelList.vue
index 72d445f8..2010bc61 100644
--- a/frontend/src/components/travel/TravelList.vue
+++ b/frontend/src/components/travel/TravelList.vue
@@ -155,11 +155,9 @@
     <template #item-updatedAt="{ updatedAt }">
       {{ $formatter.dateTime(updatedAt) }}
     </template>
-    <template #item-comments="{ comments }">
-      <span v-if="comments.length > 0">
-        <TooltipElement
-          html
-          :text="comments.map((comment: Comment) => `<b>${comment.author.name.givenName} ${comment.author.name.familyName.substring(0, 1)}</b>: ${comment.text}`).join('<br>')">
+    <template #item-bookingRemark="{ bookingRemark }">
+      <span v-if="bookingRemark">
+        <TooltipElement html :text="bookingRemark.replace(/\n/g, '<br>')">
           <i class="bi bi-chat-left-text"></i>
         </TooltipElement>
       </span>
@@ -174,7 +172,7 @@
 
 <script lang="ts" setup>
 import { getById, getTotalBalance, getTotalTotal } from '@/../../common/scripts.js'
-import { Comment, TravelSimple, TravelState, travelStates } from '@/../../common/types.js'
+import { TravelSimple, TravelState, travelStates } from '@/../../common/types.js'
 import APP_LOADER from '@/appData.js'
 import CountrySelector from '@/components/elements/CountrySelector.vue'
 import DateInput from '@/components/elements/DateInput.vue'
@@ -233,7 +231,7 @@ if (window.innerWidth > bp.md) {
     { text: t('labels.editor'), value: 'editor' },
     { text: t('labels.updatedAt'), value: 'updatedAt' },
     { text: '', value: 'report', width: 40 },
-    { text: '', value: 'comments', width: 25 }
+    { text: '', value: 'bookingRemark', width: 25 }
   )
 }
 
diff --git a/frontend/src/components/travel/TravelPage.vue b/frontend/src/components/travel/TravelPage.vue
index 0acfe553..e051a5d8 100644
--- a/frontend/src/components/travel/TravelPage.vue
+++ b/frontend/src/components/travel/TravelPage.vue
@@ -313,15 +313,22 @@
                     </p>
                   </small>
                 </div>
+                <div v-if="travel.state !== 'refunded'" class="mb-3">
+                  <label for="comment" class="form-label">{{ t('labels.comment') }}</label>
+                  <TextArea
+                    id="comment"
+                    v-model="travel.comment"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && travel.state === 'underExamination')"></TextArea>
+                </div>
+                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
+                  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="bookingRemark"
+                    v-model="travel.bookingRemark"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && travel.state === 'underExamination')"></TextArea>
+                </div>
                 <template v-if="travel.state !== 'refunded'">
-                  <div class="mb-3">
-                    <label for="comment" class="form-label">{{ t('labels.comment') }}</label>
-                    <TextArea
-                      id="comment"
-                      v-model="travel.comment"
-                      :disabled="isReadOnly && !(endpointPrefix === 'examine/' && travel.state === 'underExamination')"></TextArea>
-                  </div>
-                  <template v-if="travel.state === 'approved'">
+                  <div v-if="travel.state === 'approved'">
                     <TooltipElement v-if="travel.stages.length < 1" :text="t('alerts.noData.stage')">
                       <button class="btn btn-primary" disabled>
                         <i class="bi bi-pencil-square"></i>
@@ -332,25 +339,31 @@
                       <i class="bi bi-pencil-square"></i>
                       <span class="ms-1">{{ t('labels.toExamination') }}</span>
                     </button>
-                  </template>
+                  </div>
                   <template v-else-if="travel.state === 'underExamination'">
-                    <button v-if="endpointPrefix === 'examine/'" class="btn btn-success mb-2" @click="refund()">
-                      <i class="bi bi-coin"></i>
-                      <span class="ms-1">{{ t('labels.refund') }}</span>
-                    </button>
-                    <button
-                      class="btn btn-secondary"
-                      @click="travel.editor._id !== travel.owner._id ? null : backToApproved()"
-                      :disabled="travel.editor._id !== travel.owner._id">
-                      <i class="bi bi-arrow-counterclockwise"></i>
-                      <span class="ms-1">{{ t(endpointPrefix === 'examine/' ? 'labels.backToApplicant' : 'labels.editAgain') }}</span>
-                    </button>
+                    <div v-if="endpointPrefix === 'examine/'" class="mb-2">
+                      <button class="btn btn-success" @click="refund()">
+                        <i class="bi bi-coin"></i>
+                        <span class="ms-1">{{ t('labels.refund') }}</span>
+                      </button>
+                    </div>
+                    <div>
+                      <button
+                        class="btn btn-secondary"
+                        @click="travel.editor._id !== travel.owner._id ? null : backToApproved()"
+                        :disabled="travel.editor._id !== travel.owner._id">
+                        <i class="bi bi-arrow-counterclockwise"></i>
+                        <span class="ms-1">{{ t(endpointPrefix === 'examine/' ? 'labels.backToApplicant' : 'labels.editAgain') }}</span>
+                      </button>
+                    </div>
                   </template>
                 </template>
-                <a v-else-if="travel.state === 'refunded'" class="btn btn-primary" :href="reportLink" :download="travel.name + '.pdf'">
-                  <i class="bi bi-download"></i>
-                  <span class="ms-1">{{ t('labels.downloadX', { X: t('labels.report') }) }}</span>
-                </a>
+                <div v-else>
+                  <a class="btn btn-primary" :href="reportLink" :download="travel.name + '.pdf'">
+                    <i class="bi bi-download"></i>
+                    <span class="ms-1">{{ t('labels.downloadX', { X: t('labels.report') }) }}</span>
+                  </a>
+                </div>
               </div>
             </div>
           </div>
@@ -544,7 +557,11 @@ async function backToApproved() {
 }
 
 async function refund() {
-  const result = await API.setter<Travel>('examine/travel/refunded', { _id: travel.value._id, comment: travel.value.comment })
+  const result = await API.setter<Travel>('examine/travel/refunded', {
+    _id: travel.value._id,
+    comment: travel.value.comment,
+    bookingRemark: travel.value.bookingRemark
+  })
   if (result.ok) {
     router.push({ path: '/examine/travel' })
   }


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 4**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>frontend/src/components/healthCareCost/RefundedPage.vue (1)</summary><blockquote>

`46-46`: **Improved printed document title.**

Changed the printed document title from 'AwesomeFileName' to the more appropriate 'List'.

Consider using a more descriptive name like 'Health Care Cost Refunded List' that clearly identifies the content being printed.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**
**Cache: Disabled due to data retention organization setting**
**Knowledge Base: Disabled due to data retention organization setting**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 98abf037000947fb5a531bfa49980c6b72351f46 and d17598dc952dbfd7b7fc6088ea3c4a57cb5a87d7.

</details>

<details>
<summary>📒 Files selected for processing (30)</summary>

* `backend/controller/advanceController.ts` (3 hunks)
* `backend/controller/expenseReportController.ts` (3 hunks)
* `backend/controller/healthCareCostController.ts` (3 hunks)
* `backend/controller/travelController.ts` (3 hunks)
* `backend/helper.ts` (2 hunks)
* `backend/migrations.ts` (1 hunks)
* `backend/models/advance.ts` (2 hunks)
* `backend/models/documentFile.ts` (0 hunks)
* `backend/models/helper.ts` (1 hunks)
* `common/locales/de.json` (1 hunks)
* `common/locales/en.json` (1 hunks)
* `common/types.ts` (1 hunks)
* `frontend/src/components/HomePage.vue` (4 hunks)
* `frontend/src/components/advance/AdvanceList.vue` (3 hunks)
* `frontend/src/components/advance/ApprovePage.vue` (5 hunks)
* `frontend/src/components/advance/forms/AdvanceApproveForm.vue` (2 hunks)
* `frontend/src/components/advance/forms/AdvanceForm.vue` (3 hunks)
* `frontend/src/components/expenseReport/ExaminePage.vue` (1 hunks)
* `frontend/src/components/expenseReport/ExpenseReportList.vue` (3 hunks)
* `frontend/src/components/expenseReport/ExpenseReportPage.vue` (3 hunks)
* `frontend/src/components/expenseReport/RefundedPage.vue` (2 hunks)
* `frontend/src/components/healthCareCost/ExaminePage.vue` (1 hunks)
* `frontend/src/components/healthCareCost/HealthCareCostList.vue` (3 hunks)
* `frontend/src/components/healthCareCost/HealthCareCostPage.vue` (3 hunks)
* `frontend/src/components/healthCareCost/RefundedPage.vue` (2 hunks)
* `frontend/src/components/travel/ApprovePage.vue` (2 hunks)
* `frontend/src/components/travel/ExaminePage.vue` (1 hunks)
* `frontend/src/components/travel/RefundedPage.vue` (2 hunks)
* `frontend/src/components/travel/TravelList.vue` (3 hunks)
* `frontend/src/components/travel/TravelPage.vue` (3 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (1)</summary>

* backend/models/documentFile.ts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (6)</summary>

<details>
<summary>backend/models/advance.ts (1)</summary><blockquote>

<details>
<summary>backend/helper.ts (1)</summary>

* `setAdvanceBalance` (174-176)

</details>

</blockquote></details>
<details>
<summary>backend/helper.ts (2)</summary><blockquote>

<details>
<summary>common/types.ts (2)</summary>

* `Money` (335-342)
* `BaseCurrencyMoneyNotNull` (328-330)

</details>
<details>
<summary>common/scripts.ts (1)</summary>

* `getBaseCurrencyAmount` (197-208)

</details>

</blockquote></details>
<details>
<summary>backend/controller/expenseReportController.ts (2)</summary><blockquote>

<details>
<summary>common/types.ts (1)</summary>

* `_id` (6-6)

</details>
<details>
<summary>backend/controller/types.ts (1)</summary>

* `AuthenticatedExpressRequest` (5-7)

</details>

</blockquote></details>
<details>
<summary>backend/controller/healthCareCostController.ts (1)</summary><blockquote>

<details>
<summary>common/types.ts (1)</summary>

* `_id` (6-6)

</details>

</blockquote></details>
<details>
<summary>backend/controller/travelController.ts (2)</summary><blockquote>

<details>
<summary>common/types.ts (1)</summary>

* `_id` (6-6)

</details>
<details>
<summary>backend/controller/types.ts (1)</summary>

* `AuthenticatedExpressRequest` (5-7)

</details>

</blockquote></details>
<details>
<summary>backend/controller/advanceController.ts (3)</summary><blockquote>

<details>
<summary>common/types.ts (2)</summary>

* `IdDocument` (8-8)
* `_id` (6-6)

</details>
<details>
<summary>backend/controller/types.ts (1)</summary>

* `AuthenticatedExpressRequest` (5-7)

</details>
<details>
<summary>backend/helper.ts (1)</summary>

* `setAdvanceBalance` (174-176)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: build-and-test / Backend Tests

</details>

<details>
<summary>🔇 Additional comments (65)</summary><blockquote>

<details>
<summary>common/locales/en.json (1)</summary>

`199-199`: **Add English translation for booking remark label.**

The new `"bookingRemark": "Booking remark"` entry integrates the UI label for the booking remark feature across the application.

</details>
<details>
<summary>common/locales/de.json (1)</summary>

`199-199`: **Add German translation for booking remark label.**

The new `"bookingRemark": "Buchungsvermerk"` entry ensures consistent localization support for the booking remark feature in German.

</details>
<details>
<summary>frontend/src/components/expenseReport/ExaminePage.vue (1)</summary>

`33-33`: **Hide booking remark column in Under Examination view.**

Including `'bookingRemark'` in the `columns-to-hide` array prevents the new remark column from showing by default in the examination list.

</details>
<details>
<summary>frontend/src/components/healthCareCost/ExaminePage.vue (1)</summary>

`35-35`: **Hide booking remark column in Under Examination view.**

Adding `'bookingRemark'` to the hidden columns ensures the new field doesn’t display by default in the health care cost examination list.

</details>
<details>
<summary>frontend/src/components/travel/ApprovePage.vue (2)</summary>

`52-52`: **Hide booking remark column in Applied-For travel list.**

The `'bookingRemark'` entry in the first `columns-to-hide` array aligns the applied-for travel list with the new booking remark feature, keeping it hidden by default.

---

`65-65`: **Hide booking remark column in Approved travel list.**

Updating the approved-state `columns-to-hide` array to include `'bookingRemark'` maintains consistency across both travel list views.

</details>
<details>
<summary>frontend/src/components/travel/ExaminePage.vue (1)</summary>

`9-9`: **Updated column hiding to include booking remark.**

The new `bookingRemark` field is now hidden in the "underExamination" travel list view, which is consistent with the PR's objective of introducing this new field across the application.

</details>
<details>
<summary>common/types.ts (1)</summary>

`434-434`: **Correctly added bookingRemark to the ReportSimple interface.**

The field is properly defined as optional with nullable string type, which allows for backward compatibility with existing records. This type definition is essential for TypeScript type safety across the application.

</details>
<details>
<summary>backend/models/helper.ts (1)</summary>

`97-97`: **Schema updated with bookingRemark field.**

The bookingRemark field has been properly added to the base schema without making it required, which is appropriate for an optional field that's being introduced to an existing system.

</details>
<details>
<summary>frontend/src/components/travel/RefundedPage.vue (2)</summary>

`20-23`: **Updated expand slot to display booking remark instead of comments.**

The template now correctly displays the bookingRemark with proper formatting. The `white-space: pre-wrap` style ensures that multiline booking remarks are displayed with their original formatting.

---

`46-46`: **Document title improved for printing.**

Changed from a hardcoded filename to a more descriptive and generic 'List' title, which is more appropriate for a printed document.

</details>
<details>
<summary>frontend/src/components/HomePage.vue (4)</summary>

`108-108`: **Consistent update to use new bookingRemark field.**

The change from hiding `'comments'` to hiding `'bookingRemark'` aligns with the PR objective of introducing a new booking remark field to replace the previous comments functionality for travel reports.

---

`117-117`: **Updated column hiding for expense reports.**

Similar to the travel list changes, this update consistently replaces the `'comments'` column with the new `'bookingRemark'` column in the hidden columns array.

---

`130-130`: **Updated column hiding for health care costs.**

The change from hiding `'comments'` to hiding `'bookingRemark'` is consistent with the other list component updates in this file.

---

`139-139`: **Multiple column hiding updates for advances.**

Two changes were made to the advance list:
1. Replaced `'comments'` with `'bookingRemark'` for consistency
2. Changed `'log.underExamination.date'` to `'log.approved.date'`

Both changes are appropriate - the first matches the pattern of other components, while the second appears to better align with the workflow of advance reports.

</details>
<details>
<summary>backend/models/advance.ts (2)</summary>

`16-16`: **New import for centralized advance balance function.**

Added import for the `setAdvanceBalance` function from the helper module, which will be used to replace inline balance calculation.

---

`79-79`: **Refactored balance calculation to use shared helper function.**

Replaced inline balance calculation with a call to `setAdvanceBalance`, which centralizes the logic for setting an advance's balance based on its budget. This is a good refactoring that promotes code reuse and consistency.

</details>
<details>
<summary>backend/migrations.ts (1)</summary>

`117-117`: **Improved editor assignment logic in advance migration.**

The change makes the editor assignment conditional on the report's state:
- For reports in 'appliedFor' state, it uses the report's editor
- For other states, it uses the travelApprover's ID

This refinement ensures proper attribution during the migration process, improving data consistency.

</details>
<details>
<summary>frontend/src/components/healthCareCost/RefundedPage.vue (1)</summary>

`20-23`: **Updated expandable row to display booking remarks instead of comments.**

The template for expandable rows has been modified to:
1. Accept `bookingRemark` instead of `comments` in its scope
2. Conditionally render content only when `bookingRemark` exists
3. Display the booking remark with preserved whitespace formatting

This change properly implements the UI portion of the booking remark feature, ensuring that remarks maintain their formatting when displayed.

</details>
<details>
<summary>frontend/src/components/advance/forms/AdvanceForm.vue (3)</summary>

`38-41`: **Good implementation of the new booking remark field**

The new conditional booking remark textarea is implemented correctly, following the same pattern as other form fields. It's properly bound to the model and respects the form's disabled state.

---

`86-86`: **Properly added new askBookingRemark prop**

The new prop follows the established pattern with appropriate default value.

---

`111-113`: **Properly extended the form model**

The bookingRemark field is correctly added to the default advance object with appropriate typing.

</details>
<details>
<summary>frontend/src/components/expenseReport/ExpenseReportList.vue (3)</summary>

`143-149`: **Good implementation of bookingRemark tooltip**

The new bookingRemark tooltip implementation is well-executed, properly handling line breaks for display and conditionally rendering when a booking remark exists.

---

`160-160`: **Clean up of unused import**

The Comment type import was appropriately removed since it's no longer used after switching to the bookingRemark field.

---

`217-217`: **Properly configured bookingRemark column**

The new bookingRemark column has been added with an appropriate width.

</details>
<details>
<summary>frontend/src/components/expenseReport/RefundedPage.vue (2)</summary>

`21-24`: **Good transition from comments to bookingRemark**

The expandable row slot has been properly updated to display the bookingRemark instead of comments, with preserved whitespace for better readability.

---

`47-47`: **Improved document title for printing**

Changed from a placeholder name to a more descriptive 'List'.

</details>
<details>
<summary>frontend/src/components/travel/TravelList.vue (3)</summary>

`158-164`: **Good implementation of bookingRemark tooltip**

The bookingRemark tooltip implementation follows the same pattern as in the expense report list, properly handling line breaks and conditionally rendering.

---

`175-175`: **Clean up of unused import**

The Comment type import was correctly removed since it's no longer used after switching to the bookingRemark field.

---

`234-234`: **Properly configured bookingRemark column**

The bookingRemark column has been added with an appropriate width, consistent with other list components.

</details>
<details>
<summary>backend/helper.ts (2)</summary>

`7-8`: **Import update for new function.**

The imports are correctly updated to include `getBaseCurrencyAmount` from scripts.js and the necessary types `BaseCurrencyMoneyNotNull` and `Money` to support the new helper function.

---

`174-176`: **Good abstraction of advance balance calculation.**

This new helper function nicely centralizes the logic for setting an advance's balance based on its budget. This improves code maintainability by extracting what was likely duplicated logic across multiple places.


The function follows the single responsibility principle and handles the specific task of converting a budget in any currency to a base currency amount for the balance field.

</details>
<details>
<summary>frontend/src/components/healthCareCost/HealthCareCostList.vue (3)</summary>

`157-163`: **Booking remark display replaces comment display.**

The template correctly implements the new booking remark display with HTML line break conversion for proper formatting. This change aligns with the broader update across the application to use a centralized booking remark field.

---

`174-174`: **Updated type imports.**

The import statement is updated to include `Log` and remove the now unused `Comment` type, keeping the code clean of unused imports.

---

`235-235`: **Updated table header definition.**

The header array is correctly updated to reference 'bookingRemark' instead of 'comments', maintaining consistency with the new data model.

</details>
<details>
<summary>frontend/src/components/advance/forms/AdvanceApproveForm.vue (3)</summary>

`14-18`: **Updated event emissions to include booking remark.**

The click handlers correctly pass the new bookingRemark parameter to the decision event, ensuring it's available for processing in the parent component.

---

`32-40`: **Updated imports and type definitions.**

Good implementation of the useI18n composable and proper type definitions for the new bookingRemark field and event emissions.

---

`44-47`: **Reset booking remark on advance change.**

The watcher correctly resets both comment and bookingRemark when the advance changes, maintaining a clean state for new items.

</details>
<details>
<summary>backend/controller/expenseReportController.ts (3)</summary>

`26-26`: **Excluded booking remark from default projection.**

The bookingRemark field is correctly excluded from the default projection, which aligns with how other similar fields are handled. This prevents unnecessary data from being returned in list queries.

---

`282-288`: **Added log metadata for new expense reports.**

Good enhancement to add metadata (creation date and editor) when creating a new expense report. This improves traceability and maintains a consistent record of document lifecycle.


The refactored code now properly nests the default naming logic inside the "new document" condition, making the flow more logical.

---

`304-307`: **Added booking remark to refunded endpoint.**

The postRefunded method signature is correctly updated to accept an optional bookingRemark field, allowing this information to be saved during the refund process.


The optional nature of the field is correctly typed with `string | null`, maintaining compatibility with existing code.

</details>
<details>
<summary>frontend/src/components/advance/AdvanceList.vue (4)</summary>

`125-127`: **Good implementation of the approval date display.**

This effectively replaces the previous updatedAt field with a more semantic field showing the approval date from the log object.

---

`128-133`: **Well-structured booking remark implementation.**

The conditional display with tooltip for booking remarks is implemented correctly, including proper handling of newlines.

---

`145-145`: **Clean dependency update.**

Correctly updated imports to remove the now unused Comment type.

---

`195-195`: **Appropriate header updates for new fields.**

The headers properly reflect the UI changes from generic timestamps to more specific approval dates and booking remarks.



Also applies to: 197-197

</details>
<details>
<summary>backend/controller/healthCareCostController.ts (3)</summary>

`27-27`: **Consistent projection handling.**

Properly excluding the bookingRemark field from the default projection in the getOwn method, maintaining consistency with other similar fields like history and historic.

---

`258-258`: **API contract extension.**

Good addition of the optional bookingRemark field to the request body type, maintaining backward compatibility.

---

`328-333`: **Improved log tracking for new records.**

The implementation properly adds a log property with date and editor tracking, organizing the code more cleanly by grouping related operations within the same conditional.

</details>
<details>
<summary>backend/controller/advanceController.ts (4)</summary>

`6-6`: **Good modularization.**

Imported the setAdvanceBalance helper function to improve code reusability across controllers.

---

`34-34`: **Consistent projection handling.**

Properly excluding the bookingRemark field from the default projection in the getOwn method, maintaining consistency with other controllers.

---

`146-148`: **Comprehensive API contract update.**

The request body type is properly expanded to handle both the new bookingRemark field and maintain the existing functionality.

---

`153-154`: **Improved record creation and balance calculation.**

The implementation properly adds the log property for new advances and uses the centralized helper function to set the advance balance, improving code consistency.

</details>
<details>
<summary>frontend/src/components/healthCareCost/HealthCareCostPage.vue (2)</summary>

`230-241`: **Good UI structure refinement.**

The restructuring of the template conditionals into distinct div elements makes the code more maintainable and easier to understand, while preserving the same functionality.



Also applies to: 242-258, 259-272

---

`431-432`: **Complete API integration.**

Properly added the bookingRemark field to the API call payload, ensuring the data is saved correctly when transitioning states.

</details>
<details>
<summary>frontend/src/components/advance/ApprovePage.vue (4)</summary>

`15-15`: **Event handler is properly updated to include bookingRemark parameter.**

The decision event handler now passes the booking remark parameter (br) to the approveAdvance function, which allows for the complete flow of booking remark data through the component.

---

`26-26`: **AdvanceForm is properly configured to request booking remark input.**

The askBookingRemark prop is appropriately set to enable the booking remark input field in the AdvanceForm component.

---

`50-50`: **Column visibility settings updated correctly.**

The columns-to-hide arrays have been properly updated to include 'bookingRemark' in the first list and to show it in the second list (approved advances), which aligns with the feature requirements.



Also applies to: 62-62

---

`115-127`: **Proper implementation of bookingRemark handling in approveAdvance function.**

The function now correctly handles the optional bookingRemark parameter and conditionally adds it to the advance object only when the decision is 'approved'. This implementation ensures booking remarks are only stored for approved advances.

</details>
<details>
<summary>frontend/src/components/expenseReport/ExpenseReportPage.vue (2)</summary>

`209-366`: **UI structure for state-specific controls is well organized.**

The UI has been properly restructured to separate booking remark input from comments and to organize state-specific buttons inside their own container elements. This approach improves maintainability and makes the conditional rendering logic clearer.

---

`365-370`: **API payload correctly updated to include bookingRemark.**

The refund function now properly includes the bookingRemark in the API request, which completes the data flow from UI to backend.

</details>
<details>
<summary>frontend/src/components/travel/TravelPage.vue (2)</summary>

`330-366`: **UI restructuring for state-specific controls is well organized.**

The template has been cleanly restructured to wrap buttons in their own container elements and provide appropriate conditional rendering based on state and user role, improving maintainability.

---

`559-564`: **API payload correctly updated to include bookingRemark.**

The refund function now properly includes the bookingRemark in the API request payload, ensuring the data is passed to the backend correctly.

</details>
<details>
<summary>backend/controller/travelController.ts (3)</summary>

`26-26`: **Correctly excluded bookingRemark from default projection.**

The bookingRemark field has been added to the projection exclusion list, which is appropriate for fields that aren't needed in list views or general queries, reducing payload size.

---

`278-278`: **Enhanced audit logging for travel application creation.**

Adding a log entry with timestamp and editor information improves the audit trail for travel applications, which is a good practice for financial transactions.

---

`464-466`: **Method signature properly updated to accept bookingRemark.**

The postRefunded method now correctly accepts an optional bookingRemark parameter, allowing this data to be stored when a travel is refunded. This change correctly completes the backend integration of the feature.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T14:21:28Z

Review comments:
diff_hunk: @@ -2,14 +2,19 @@
   <div>
     <Advance :advance="advance"></Advance>
     <div class="mb-3">
-      <label for="comment" class="form-label">{{ $t('labels.comment') }}</label>
+      <label for="comment" class="form-label">{{ t('labels.comment') }}</label>
       <TextArea id="comment" v-model="comment"></TextArea>
     </div>
+
+    <div class="mb-3">
+      <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
+      <TextArea id="comment" v-model="bookingRemark"></TextArea>
+    </div>
path: frontend/src/components/advance/forms/AdvanceApproveForm.vue
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix duplicate HTML ID attribute.**

Both textarea elements have the same `id="comment"`, which violates HTML standards requiring unique IDs. This could cause accessibility issues and problems with form controls.


```diff
-<label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
-<TextArea id="comment" v-model="bookingRemark"></TextArea>
+<label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+<TextArea id="bookingRemark" v-model="bookingRemark"></TextArea>
```

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In frontend/src/components/advance/forms/AdvanceApproveForm.vue around lines 9
to 12, the textarea element uses a duplicate id attribute "comment" which
violates HTML standards. Update the id attribute to a unique value for this
textarea to ensure no duplicate IDs exist in the form, improving accessibility
and form control behavior.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T14:21:26Z
author_association: CONTRIBUTOR
diff_hunk: @@ -220,7 +220,14 @@
                       )
                     "></TextArea>
                 </div>
-                <template v-if="healthCareCost.state === 'inWork'">
+                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
+                  <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="comment"
+                    v-model="healthCareCost.bookingRemark"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && healthCareCost.state === 'underExamination')"></TextArea>
+                </div>
path: frontend/src/components/healthCareCost/HealthCareCostPage.vue
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix duplicate HTML ID attribute.**

The textarea for booking remarks is using the same ID as the comment textarea above, which can cause accessibility issues.


```diff
-                  <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
-                  <TextArea
-                    id="comment"
+                  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="bookingRemark"
                     v-model="healthCareCost.bookingRemark"
                     :disabled="isReadOnly && !(endpointPrefix === 'examine/' && healthCareCost.state === 'underExamination')"></TextArea>
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
-                  <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
-                  <TextArea
-                    id="comment"
+                  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="bookingRemark"
                     v-model="healthCareCost.bookingRemark"
                     :disabled="isReadOnly && !(endpointPrefix === 'examine/' && healthCareCost.state === 'underExamination')"></TextArea>
                </div>
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In frontend/src/components/healthCareCost/HealthCareCostPage.vue around lines
223 to 229, the textarea element uses an ID "comment" that duplicates another
textarea's ID, causing accessibility issues. Change the ID attribute of this
textarea to a unique value that clearly identifies it, such as "bookingRemark",
to avoid duplicate HTML IDs.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T14:21:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -199,7 +199,14 @@
                     v-model="expenseReport.comment as string | undefined"
                     :disabled="isReadOnly && !(endpointPrefix === 'examine/' && expenseReport.state === 'underExamination')"></TextArea>
                 </div>
-                <template v-if="expenseReport.state === 'inWork'">
+                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
+                  <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="comment"
+                    v-model="expenseReport.bookingRemark"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && expenseReport.state === 'underExamination')"></TextArea>
+                </div>
path: frontend/src/components/expenseReport/ExpenseReportPage.vue
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix duplicate HTML element IDs.**

Both the comment and bookingRemark TextArea components use the same id="comment", which violates HTML specifications requiring unique IDs. This could lead to accessibility issues and JavaScript DOM selection problems.


```diff
-  <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
-  <TextArea
-    id="comment"
+  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+  <TextArea
+    id="bookingRemark"
     v-model="expenseReport.bookingRemark"
     :disabled="isReadOnly && !(endpointPrefix === 'examine/' && expenseReport.state === 'underExamination')"></TextArea>
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
                  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
                  <TextArea
                    id="bookingRemark"
                    v-model="expenseReport.bookingRemark"
                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && expenseReport.state === 'underExamination')"></TextArea>
                </div>
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In frontend/src/components/expenseReport/ExpenseReportPage.vue around lines 202
to 208, the TextArea component uses a duplicate id="comment" which conflicts
with another element's ID. Change the id attribute of the TextArea to a unique
value, such as "bookingRemark" or another distinct identifier, to ensure all
HTML element IDs are unique and avoid accessibility and DOM selection issues.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T14:21:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -313,15 +313,22 @@
                     </p>
                   </small>
                 </div>
+                <div v-if="travel.state !== 'refunded'" class="mb-3">
+                  <label for="comment" class="form-label">{{ t('labels.comment') }}</label>
+                  <TextArea
+                    id="comment"
+                    v-model="travel.comment"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && travel.state === 'underExamination')"></TextArea>
+                </div>
+                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
+                  <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
+                  <TextArea
+                    id="comment"
+                    v-model="travel.bookingRemark"
+                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && travel.state === 'underExamination')"></TextArea>
+                </div>
path: frontend/src/components/travel/TravelPage.vue
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Fix duplicate HTML element IDs.**

Both the comment and bookingRemark TextArea components use the same id="comment", which violates HTML specifications requiring unique IDs. This could lead to accessibility issues and JavaScript DOM selection problems.


```diff
-  <label for="comment" class="form-label">{{ t('labels.bookingRemark') }}</label>
-  <TextArea
-    id="comment"
+  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
+  <TextArea
+    id="bookingRemark"
     v-model="travel.bookingRemark"
     :disabled="isReadOnly && !(endpointPrefix === 'examine/' && travel.state === 'underExamination')"></TextArea>
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion
                <div v-if="endpointPrefix === 'examine/'" class="mb-3">
                  <label for="bookingRemark" class="form-label">{{ t('labels.bookingRemark') }}</label>
                  <TextArea
                    id="bookingRemark"
                    v-model="travel.bookingRemark"
                    :disabled="isReadOnly && !(endpointPrefix === 'examine/' && travel.state === 'underExamination')"></TextArea>
                </div>
```

</details>

<!-- suggestion_end -->

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
In frontend/src/components/travel/TravelPage.vue around lines 323 to 329, the
TextArea component uses a duplicate id="comment" which conflicts with another
element's ID. Change the id attribute to a unique value, such as
id="bookingRemark", and update the corresponding label's for attribute to match
this new unique ID to ensure valid HTML and proper accessibility.
```

</details>

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-19T14:21:27Z
author_association: CONTRIBUTOR

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-05-19T14:17:39Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: skip review by coderabbit.ai -->

> [!IMPORTANT]
> ## Review skipped
> 
> Auto reviews are disabled on base/target branches other than the default branch.
> 
> 
> 
> Please check the settings in the CodeRabbit UI or the `.coderabbit.yaml` file in this repository. To trigger a single review, invoke the `@coderabbitai review` command.
> 
> You can disable this status message by setting the `reviews.review_status` to `false` in the CodeRabbit configuration file.

<!-- end of auto-generated comment: skip review by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

The changes introduce a new "bookingRemark" field across all report types in both backend and frontend. This field is added to schemas, APIs, and UI components, replacing the previous handling of generic comments in refunded and approval contexts. All relevant data flows, projections, and user interfaces are updated to support and display this new booking remark field.

## Changes

| File(s)                                                                                         | Change Summary |
|-------------------------------------------------------------------------------------------------|---------------|
| backend/controller/advanceController.ts<br>backend/controller/expenseReportController.ts<br>backend/controller/healthCareCostController.ts<br>backend/controller/travelController.ts | API endpoints updated to support optional `bookingRemark` in request bodies, projections exclude `bookingRemark`, and log metadata added on creation. |
| backend/helper.ts<br>backend/models/advance.ts                                                  | Added `setAdvanceBalance` helper and refactored balance logic in `Advance` model to use it. |
| backend/models/helper.ts                                                                        | Added optional `bookingRemark` field to base schema for reports. |
| backend/migrations.ts                                                                           | Migration logic updated: conditional assignment of `editor` based on report state. |
| backend/models/documentFile.ts                                                                  | Removed a trailing blank line (no logic changes). |
| common/types.ts                                                                                 | Added optional `bookingRemark` property to `ReportSimple` interface. |
| common/locales/en.json<br>common/locales/de.json                                                | Added "bookingRemark" label in English and German locales. |
| frontend/src/components/HomePage.vue<br>frontend/src/components/travel/ApprovePage.vue<br>frontend/src/components/travel/ExaminePage.vue | Updated hidden columns in lists to use `bookingRemark` instead of `comments`. |
| frontend/src/components/advance/AdvanceList.vue<br>frontend/src/components/expenseReport/ExpenseReportList.vue<br>frontend/src/components/healthCareCost/HealthCareCostList.vue<br>frontend/src/components/travel/TravelList.vue | Replaced comments column with bookingRemark column in tables, tooltips, and headers. |
| frontend/src/components/advance/ApprovePage.vue<br>frontend/src/components/advance/forms/AdvanceApproveForm.vue<br>frontend/src/components/advance/forms/AdvanceForm.vue | Approval form and logic updated to handle `bookingRemark` input and event emission. |
| frontend/src/components/expenseReport/ExpenseReportPage.vue<br>frontend/src/components/healthCareCost/HealthCareCostPage.vue<br>frontend/src/components/travel/TravelPage.vue | Added UI and API logic to input and send `bookingRemark` in relevant states. |
| frontend/src/components/expenseReport/ExaminePage.vue<br>frontend/src/components/healthCareCost/ExaminePage.vue | Updated columns-to-hide to include `bookingRemark`. |
| frontend/src/components/expenseReport/RefundedPage.vue<br>frontend/src/components/healthCareCost/RefundedPage.vue<br>frontend/src/components/travel/RefundedPage.vue | Refunded view now displays only `bookingRemark` instead of comments. |
| frontend/src/components/advance/AdvanceList.vue<br>frontend/src/components/advance/forms/AdvanceForm.vue | Updated approval date and booking remark display, removed comment-related code. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant Frontend
    participant Backend
    participant Database

    User->>Frontend: Fill report form (with bookingRemark)
    Frontend->>Backend: Submit report (bookingRemark included)
    Backend->>Database: Save report with bookingRemark
    Database-->>Backend: Acknowledge save
    Backend-->>Frontend: Confirmation/updated report data
    Frontend-->>User: Display report with bookingRemark

    User->>Frontend: Approve/refund report (add bookingRemark)
    Frontend->>Backend: Send approval/refund with bookingRemark
    Backend->>Database: Update report with bookingRemark
    Database-->>Backend: Acknowledge update
    Backend-->>Frontend: Updated report data
    Frontend-->>User: Show bookingRemark in refunded/approved view
```

## Assessment against linked issues

| Objective                                                                 | Addressed | Explanation |
|---------------------------------------------------------------------------|-----------|-------------|
| Add booking remark for all reports, stop showing comments in refunded view (#179) | ✅        |             |

## Poem

> A bunny with a ledger, so clever and stark,  
> Hopped through the code and left a remark.  
> No more old comments in the refunded view,  
> Now "bookingRemark" shines, fresh and new!  
> Reports are clearer, the UI’s a delight—  
> This rabbit’s booking magic makes everything right!  
> 🐇✨

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=david-loe/abrechnung&utm_content=187):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: david-loe
created_at: 2025-05-19T14:17:48Z
body: @coderabbitai review
author_association: OWNER
user: login: coderabbitai[bot]
created_at: 2025-05-19T14:17:53Z
body: <!-- This is an auto-generated reply by CodeRabbit -->
<details>
<summary>✅ Actions performed</summary>

Review triggered.

> Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

</details>
author_association: CONTRIBUTOR