mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-15 09:14:08 +00:00
New backend endpoint POST /invoices/{id}/convert-to-estimate that
creates a draft estimate from an invoice, copying items, taxes,
custom fields, and financial data. Frontend wired with dropdown
action, store method, and API service call.
126 lines
3.3 KiB
TypeScript
126 lines
3.3 KiB
TypeScript
import { client } from '../client'
|
|
import { API } from '../endpoints'
|
|
import type { Invoice, CreateInvoicePayload } from '@v2/types/domain/invoice'
|
|
import type {
|
|
ApiResponse,
|
|
PaginatedResponse,
|
|
ListParams,
|
|
DateRangeParams,
|
|
NextNumberResponse,
|
|
DeletePayload,
|
|
} from '@v2/types/api'
|
|
|
|
export interface InvoiceListParams extends ListParams, DateRangeParams {
|
|
status?: string
|
|
customer_id?: number
|
|
}
|
|
|
|
export interface InvoiceListMeta {
|
|
current_page: number
|
|
last_page: number
|
|
per_page: number
|
|
total: number
|
|
invoice_total_count: number
|
|
}
|
|
|
|
export interface InvoiceListResponse {
|
|
data: Invoice[]
|
|
meta: InvoiceListMeta
|
|
}
|
|
|
|
export interface SendInvoicePayload {
|
|
id: number
|
|
subject?: string | null
|
|
body?: string | null
|
|
from?: string | null
|
|
to?: string | null
|
|
cc?: string | null
|
|
bcc?: string | null
|
|
}
|
|
|
|
export interface InvoiceStatusPayload {
|
|
id: number
|
|
status: string
|
|
}
|
|
|
|
export interface SendPreviewParams {
|
|
id: number
|
|
from?: string | null
|
|
to?: string | null
|
|
cc?: string | null
|
|
bcc?: string | null
|
|
subject?: string | null
|
|
body?: string | null
|
|
}
|
|
|
|
export interface InvoiceTemplate {
|
|
name: string
|
|
path: string
|
|
}
|
|
|
|
export interface InvoiceTemplatesResponse {
|
|
invoiceTemplates: InvoiceTemplate[]
|
|
}
|
|
|
|
export const invoiceService = {
|
|
async list(params?: InvoiceListParams): Promise<InvoiceListResponse> {
|
|
const { data } = await client.get(API.INVOICES, { params })
|
|
return data
|
|
},
|
|
|
|
async get(id: number): Promise<ApiResponse<Invoice>> {
|
|
const { data } = await client.get(`${API.INVOICES}/${id}`)
|
|
return data
|
|
},
|
|
|
|
async create(payload: CreateInvoicePayload): Promise<ApiResponse<Invoice>> {
|
|
const { data } = await client.post(API.INVOICES, payload)
|
|
return data
|
|
},
|
|
|
|
async update(id: number, payload: Partial<CreateInvoicePayload>): Promise<ApiResponse<Invoice>> {
|
|
const { data } = await client.put(`${API.INVOICES}/${id}`, payload)
|
|
return data
|
|
},
|
|
|
|
async delete(payload: DeletePayload): Promise<{ success: boolean }> {
|
|
const { data } = await client.post(API.INVOICES_DELETE, payload)
|
|
return data
|
|
},
|
|
|
|
async send(payload: SendInvoicePayload): Promise<ApiResponse<Invoice>> {
|
|
const { data } = await client.post(`${API.INVOICES}/${payload.id}/send`, payload)
|
|
return data
|
|
},
|
|
|
|
async sendPreview(params: SendPreviewParams): Promise<ApiResponse<string>> {
|
|
const { data } = await client.get(`${API.INVOICES}/${params.id}/send/preview`, { params })
|
|
return data
|
|
},
|
|
|
|
async clone(id: number): Promise<ApiResponse<Invoice>> {
|
|
const { data } = await client.post(`${API.INVOICES}/${id}/clone`)
|
|
return data
|
|
},
|
|
|
|
async convertToEstimate(id: number): Promise<ApiResponse<Record<string, unknown>>> {
|
|
const { data } = await client.post(`${API.INVOICES}/${id}/convert-to-estimate`)
|
|
return data
|
|
},
|
|
|
|
async changeStatus(payload: InvoiceStatusPayload): Promise<ApiResponse<Invoice>> {
|
|
const { data } = await client.post(`${API.INVOICES}/${payload.id}/status`, payload)
|
|
return data
|
|
},
|
|
|
|
async getNextNumber(params?: { key?: string }): Promise<NextNumberResponse> {
|
|
const { data } = await client.get(API.NEXT_NUMBER, { params: { key: 'invoice', ...params } })
|
|
return data
|
|
},
|
|
|
|
async getTemplates(): Promise<InvoiceTemplatesResponse> {
|
|
const { data } = await client.get(API.INVOICE_TEMPLATES)
|
|
return data
|
|
},
|
|
}
|