v1.6.8: remove offer exchange rate, add invoice item description, offer filters, table animations

- Remove exchange_rate and exchange_rate_date from quotations (schema, service, PDF, form)
- Add item_description field to invoice_items (schema, migration, service, form, PDF)
- Add offer status/customer/order filters with tab-based UI
- Clean up offer statuses to active/ordered/invalidated
- Allow invalidate action for non-ordered offers (not just expired)
- Add fade animations on offers and invoices table data changes

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
BOHA
2026-05-28 12:58:51 +02:00
parent 66b98e2765
commit 0330453ad6
20 changed files with 3126 additions and 3029 deletions

View File

@@ -34,7 +34,7 @@ export interface InvoiceStats {
export interface InvoiceItem {
id?: number;
description: string;
item_description?: string;
item_description: string;
quantity: number;
unit: string;
unit_price: number;

View File

@@ -70,6 +70,9 @@ export const offerListOptions = (filters: {
order?: string;
page?: number;
perPage?: number;
status?: string;
customer_id?: number;
has_order?: string;
}) =>
queryOptions({
queryKey: ["offers", "list", filters],
@@ -80,6 +83,10 @@ export const offerListOptions = (filters: {
if (filters.order) params.set("order", filters.order);
if (filters.page) params.set("page", String(filters.page));
if (filters.perPage) params.set("per_page", String(filters.perPage));
if (filters.status) params.set("status", filters.status);
if (filters.customer_id)
params.set("customer_id", String(filters.customer_id));
if (filters.has_order) params.set("has_order", filters.has_order);
const qs = params.toString();
return paginatedJsonQuery(`/api/admin/offers${qs ? `?${qs}` : ""}`);
},
@@ -127,7 +134,6 @@ export interface OfferDetailData {
language: string;
vat_rate: number;
apply_vat: boolean;
exchange_rate: string;
scope_title: string;
scope_description: string;
items?: OfferItemData[];