refactor: extract numbering logic into numbering.service.ts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@ import { success, error, parseId } from '../../utils/response';
|
||||
import { parsePagination, buildPaginationMeta } from '../../utils/pagination';
|
||||
import { parseBody } from '../../schemas/common';
|
||||
import { CreateOrderFromQuotationSchema, CreateOrderSchema, UpdateOrderSchema } from '../../schemas/orders.schema';
|
||||
import { generateSharedNumber } from '../../services/numbering.service';
|
||||
|
||||
import multipart from '@fastify/multipart';
|
||||
|
||||
@@ -17,37 +18,6 @@ const VALID_TRANSITIONS: Record<string, string[]> = {
|
||||
stornovana: [],
|
||||
};
|
||||
|
||||
// Shared number generator matching PHP generateSharedNumber()
|
||||
// Format: YYtypeCode + 4-digit sequence, shared between orders and projects
|
||||
async function generateSharedNumber(): Promise<string> {
|
||||
const settings = await prisma.company_settings.findFirst({ select: { order_type_code: true } });
|
||||
const typeCode = settings?.order_type_code || '71';
|
||||
const yy = String(new Date().getFullYear()).slice(-2);
|
||||
const prefix = `${yy}${typeCode}`;
|
||||
const prefixLen = prefix.length;
|
||||
const likePattern = `${prefix}%`;
|
||||
|
||||
const result = await prisma.$queryRaw<[{ max_seq: bigint | null }]>`
|
||||
SELECT COALESCE(MAX(seq), 0) as max_seq FROM (
|
||||
SELECT CAST(SUBSTRING(order_number, ${prefixLen} + 1) AS UNSIGNED) AS seq
|
||||
FROM orders WHERE order_number LIKE ${likePattern}
|
||||
UNION ALL
|
||||
SELECT CAST(SUBSTRING(project_number, ${prefixLen} + 1) AS UNSIGNED) AS seq
|
||||
FROM projects WHERE project_number LIKE ${likePattern}
|
||||
) combined
|
||||
`;
|
||||
const nextNum = Number(result[0]?.max_seq ?? 0) + 1;
|
||||
return `${prefix}${String(nextNum).padStart(4, '0')}`;
|
||||
}
|
||||
|
||||
async function generateOrderNumber(): Promise<string> {
|
||||
return generateSharedNumber();
|
||||
}
|
||||
|
||||
async function generateProjectNumber(): Promise<string> {
|
||||
return generateSharedNumber();
|
||||
}
|
||||
|
||||
interface OrderItemInput { description?: string; item_description?: string; quantity?: number; unit?: string; unit_price?: number; is_included_in_total?: boolean; position?: number }
|
||||
interface OrderSectionInput { title?: string; title_cz?: string; content?: string; position?: number }
|
||||
|
||||
@@ -56,7 +26,7 @@ export default async function ordersRoutes(fastify: FastifyInstance): Promise<vo
|
||||
|
||||
// GET /api/admin/orders/next-number
|
||||
fastify.get('/next-number', { preHandler: requirePermission('orders.create') }, async (_request, reply) => {
|
||||
const number = await generateOrderNumber();
|
||||
const number = await generateSharedNumber();
|
||||
return success(reply, { number, next_number: number });
|
||||
});
|
||||
|
||||
@@ -198,8 +168,8 @@ export default async function ordersRoutes(fastify: FastifyInstance): Promise<vo
|
||||
if (!quotation) return error(reply, 'Nabídka nenalezena', 404);
|
||||
if (quotation.order_id) return error(reply, 'Z této nabídky již byla vytvořena objednávka', 400);
|
||||
|
||||
const orderNumber = await generateOrderNumber();
|
||||
const projectNumber = await generateProjectNumber();
|
||||
const orderNumber = await generateSharedNumber();
|
||||
const projectNumber = await generateSharedNumber();
|
||||
|
||||
const result = await prisma.$transaction(async (tx) => {
|
||||
// Create the order
|
||||
@@ -301,8 +271,8 @@ export default async function ordersRoutes(fastify: FastifyInstance): Promise<vo
|
||||
if (!quotation) return error(reply, 'Nabídka nenalezena', 404);
|
||||
if (quotation.order_id) return error(reply, 'Z této nabídky již byla vytvořena objednávka', 400);
|
||||
|
||||
const orderNumber = await generateOrderNumber();
|
||||
const projectNumber = await generateProjectNumber();
|
||||
const orderNumber = await generateSharedNumber();
|
||||
const projectNumber = await generateSharedNumber();
|
||||
|
||||
const result = await prisma.$transaction(async (tx) => {
|
||||
const order = await tx.orders.create({
|
||||
|
||||
Reference in New Issue
Block a user