feat: per-version R## tracking and billing separation
Each revision (R00, R01, R02) is now an independent trackable unit: invoiceVersionRules: add deriveVersionStatus, buildInvoiceStatusByKey, parseVersionFromItemDescription for per-version status derivation Tasks.jsx + ProjectDetail.jsx: - Fetch invoice_items joined with invoice.status (team only) - allRows/rows now flatMap per version (one row per R##) - Status derived from: invoice_items > past version > task.status - R00 paid shows as paid; R01 in_progress shows separately - tr keys use rowKey (taskId:version) to avoid duplicate key warnings Invoice lifecycle (TeamInvoiceDetail, TeamInvoices, TeamCreateInvoice): - Remove task.status sync on invoice paid/sent/created - Keep invoiced:true flag for double-billing prevention - Task work status (not_started → client_approved) stays work-flow only ProjectDetail completion bar uses task.status === client_approved only (no longer polluted by invoiced/paid status from invoice sync) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -410,7 +410,7 @@ export default function Invoices() {
|
||||
const validItems = invItems.filter(i => i.description);
|
||||
if (validItems.length > 0) await supabase.from('invoice_items').insert(validItems.map(it => ({ invoice_id: invoice.id, task_id: it.task_id || null, submission_id: it.submission_id || null, description: it.description, quantity: Number(it.quantity) || 1, unit_price: Number(it.unit_price) || 0 })));
|
||||
const taskIds = [...new Set(validItems.filter(i => i.task_id && !i.submission_id).map(i => i.task_id))];
|
||||
if (taskIds.length > 0) await supabase.from('tasks').update({ invoiced: true, status: 'invoiced' }).in('id', taskIds).eq('status', 'client_approved');
|
||||
if (taskIds.length > 0) await supabase.from('tasks').update({ invoiced: true }).in('id', taskIds);
|
||||
const subIds = [...new Set(validItems.filter(i => i.submission_id).map(i => i.submission_id))];
|
||||
if (subIds.length > 0) await supabase.from('submissions').update({ invoiced: true }).in('id', subIds);
|
||||
if (status === 'sent') {
|
||||
|
||||
Reference in New Issue
Block a user