feat: payments plans, phase auto-cascade, transcripts, manual timer

- Pagamenti: totale ereditato dalla somma accepted_total delle offerte
  attive (con override) + selettore schema rate 1/2/3 step; nuova colonna
  payments.percent per rescalare gli importi preservando label/stato
- Fasi & Task: recomputePhaseStatus auto-cascade (task -> fase) su
  updateTaskStatus/addTask, fix UI stale, etichette Da iniziare/In corso/Completata
- Pagina pubblica: colori fasi (grigio/blu/#1A463C) + fasi collassabili
- Transcript del cliente visibili in tab Documenti admin e dashboard pubblica
- Timer: inserimento manuale (+30/+60, minuti liberi, data) + elimina entry
- CLAUDE.md: procedura Deploy & DB Access; push su main automatico

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 10:38:56 +02:00
parent 988f6f425a
commit 186bb9ea19
21 changed files with 1037 additions and 196 deletions
+13 -1
View File
@@ -2,6 +2,14 @@
import { TimerCell } from "@/components/admin/TimerCell";
import { ProfitabilityCard } from "@/components/admin/ProfitabilityCard";
import { ManualTimeEntry } from "@/components/admin/ManualTimeEntry";
type TimeEntry = {
id: string;
started_at: Date;
ended_at: Date | null;
duration_seconds: number | null;
};
type TimerTabProps = {
projectId: string;
@@ -10,6 +18,7 @@ type TimerTabProps = {
activeTimerStartedAt: Date | null;
totalTrackedSeconds: number;
targetHourlyRate: number;
recentEntries: TimeEntry[];
};
export function TimerTab({
@@ -19,6 +28,7 @@ export function TimerTab({
activeTimerStartedAt,
totalTrackedSeconds,
targetHourlyRate,
recentEntries,
}: TimerTabProps) {
return (
<div className="space-y-6 max-w-sm">
@@ -33,6 +43,8 @@ export function TimerTab({
/>
</div>
<ManualTimeEntry projectId={projectId} recentEntries={recentEntries} />
<ProfitabilityCard
acceptedTotal={acceptedTotal}
totalTrackedSeconds={totalTrackedSeconds}
@@ -40,4 +52,4 @@ export function TimerTab({
/>
</div>
);
}
}