From f0d39f2eee2ef96d5c7e55a3ad1d8a67f648c2d3 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 16 Oct 2026 13:36:34 +0000 Subject: [PATCH] =?UTF-8?q?Arbeitsbl=C3=A4tter:=20Abo-Vorgabe=20bei=20Einr?= =?UTF-8?q?ichtungs-Tickets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bei Tickets mit einrichtungAbrechnung 'abo' steht "Vom Abo-Stundenkonto abziehen" im Dialog von Anfang an auf an (auch wenn der Abo-Status erst nach dem Öffnen ankommt), beim Nachtragen der Zeit eines Git-Blatts wird countsToPlan beim ersten Eintragen gesetzt. 'projekt', Kommentare und Kunden ohne Wartungs-Abo bekommen keine Vorgabe; ein von Hand abgehakter Haken bleibt aus. Co-Authored-By: Claude Sonnet 5.5 --- src/components/CreateWorksheetModal.jsx | 14 ++++++++-- src/hooks/useWorksheets.js | 7 +++-- src/lib/planVorgabe.js | 32 +++++++++++++++++++++ src/pages/TicketPage.jsx | 3 +- tests/unit/planVorgabe.test.mjs | 37 +++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 src/lib/planVorgabe.js create mode 100644 tests/unit/planVorgabe.test.mjs diff --git a/src/components/CreateWorksheetModal.jsx b/src/components/CreateWorksheetModal.jsx index d6828b9..62633d6 100644 --- a/src/components/CreateWorksheetModal.jsx +++ b/src/components/CreateWorksheetModal.jsx @@ -7,6 +7,7 @@ import { Button, DateTimeInput, Dialog, DurationSelect, Field } from './ui' import { roundUpToStep, isValidStep } from '../lib/timeSteps' import { validateSupporters } from '../lib/support' import SupportersEditor from './SupportersEditor' +import { countsToPlanWert } from '../lib/planVorgabe' // Akquise-Tickets: Ergebnis des Kundenkontakts (statt technischer Status) const ACQUISITION_STATUS = ['In Kontakt', 'Zugesagt', 'Abgesagt'] @@ -31,7 +32,7 @@ const initialForm = (workorder, newStatus) => ({ endTime: '', details: '', isComment: false, - countsToPlan: false, + countsToPlan: null, // null = unberührt: dann gilt die Abo-Vorgabe des Tickets (planVorgabe.js) supporters: [] }) @@ -50,6 +51,13 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre : (workorder?.status || 'Open') const [formData, setFormData] = useState(() => initialForm(workorder, defaultStatus)) + // Der Abo-Status kommt oft erst nach dem Öffnen: der Wert wird bei jedem Rendern aus Handwahl und Vorgabe berechnet + const countsToPlan = countsToPlanWert({ + gewaehlt: formData.countsToPlan, + ticket: workorder, + aboHoursAllowed, + isComment: formData.isComment + }) const [loading, setLoading] = useState(false) const [error, setError] = useState('') @@ -130,7 +138,7 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre endTime: timeToWoms(formData.endTime), details: formData.details, isComment: formData.isComment, - countsToPlan: aboHoursAllowed && !formData.isComment && formData.countsToPlan, + countsToPlan, employeeShort: user?.prefs?.shortCode || '', // Aus User-Preferences supporters } @@ -222,7 +230,7 @@ export default function CreateWorksheetModal({ isOpen, onClose, workorder, onCre