1.5.2
- feat: order confirmation PDF generation with VAT support - feat: order confirmation modal with custom item editing - fix: attendance negative duration clamping and switchProject timing - fix: Quill editor locked to Tahoma 14px, PDF heading sizes - fix: invoice/offer PDF font consistency (Tahoma enforcement) - fix: invoice alert cron improvements - fix: NAS financials manager edge cases - refactor: numbering service with unique sequence constraints Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
import prisma from "../config/database";
|
||||
import { toCzk } from "./exchange-rates";
|
||||
import {
|
||||
generateInvoiceNumber,
|
||||
releaseInvoiceNumber,
|
||||
} from "./numbering.service";
|
||||
|
||||
// Status transition rules matching PHP
|
||||
const VALID_TRANSITIONS: Record<string, string[]> = {
|
||||
@@ -147,7 +151,10 @@ export async function listInvoices(params: ListInvoicesParams) {
|
||||
return { data: enriched, total, page, limit };
|
||||
}
|
||||
|
||||
export { generateInvoiceNumber as getNextInvoiceNumberFormatted } from "./numbering.service";
|
||||
export {
|
||||
generateInvoiceNumber as getNextInvoiceNumberFormatted,
|
||||
previewInvoiceNumber as getNextInvoiceNumberPreview,
|
||||
} from "./numbering.service";
|
||||
|
||||
export async function getInvoiceStats(queryMonth?: number, queryYear?: number) {
|
||||
const now = new Date();
|
||||
@@ -293,9 +300,14 @@ export async function getInvoice(id: number) {
|
||||
}
|
||||
|
||||
export async function createInvoice(body: Record<string, any>) {
|
||||
const invoiceNumber =
|
||||
body.invoice_number !== undefined && body.invoice_number !== null
|
||||
? String(body.invoice_number)
|
||||
: (await generateInvoiceNumber()).number;
|
||||
|
||||
const invoice = await prisma.invoices.create({
|
||||
data: {
|
||||
invoice_number: body.invoice_number ? String(body.invoice_number) : null,
|
||||
invoice_number: invoiceNumber,
|
||||
order_id: body.order_id ? Number(body.order_id) : null,
|
||||
customer_id: body.customer_id ? Number(body.customer_id) : null,
|
||||
status: body.status ? String(body.status) : "issued",
|
||||
@@ -410,7 +422,7 @@ export async function updateInvoice(id: number, body: Record<string, any>) {
|
||||
}
|
||||
}
|
||||
|
||||
if (body.paid_date !== undefined)
|
||||
if (body.paid_date !== undefined && currentStatus !== "paid")
|
||||
data.paid_date = body.paid_date ? new Date(String(body.paid_date)) : null;
|
||||
|
||||
await prisma.invoices.update({ where: { id }, data });
|
||||
@@ -441,5 +453,11 @@ export async function deleteInvoice(id: number) {
|
||||
if (!existing) return null;
|
||||
|
||||
await prisma.invoices.delete({ where: { id } });
|
||||
|
||||
const year = existing.created_at
|
||||
? new Date(existing.created_at).getFullYear()
|
||||
: new Date().getFullYear();
|
||||
await releaseInvoiceNumber(year);
|
||||
|
||||
return existing;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user