import { PrismaService } from "../../../core/database/prisma/prisma.service";
import { Prisma, PurchaseOrderStatus, RobotUsageType } from '@prisma/client';
import { SnapshotProjectorService } from '../services/snapshot-projector.service';
export interface CreatePurchaseOrderInput {
    poNo: string;
    supplierId: string;
    currencyCode: string;
    orderedAt: Date | string;
    expectedAt?: Date | string;
    notes?: string;
    lines: Array<{
        lineNo: number;
        skuId: string;
        quantity: number;
        unitPrice: number;
        currencyCode: string;
        defaultUsageType?: RobotUsageType;
        placeholderPattern?: string;
        expectedAt?: Date | string;
    }>;
}
export interface UpdatePurchaseOrderInput {
    status?: PurchaseOrderStatus;
    expectedAt?: Date | string;
    closedAt?: Date | string;
    notes?: string;
    sapPoNo?: string;
}
export interface ListPurchaseOrderQuery {
    status?: PurchaseOrderStatus | PurchaseOrderStatus[];
    supplierId?: string;
    search?: string;
    includeDeleted?: boolean;
    page?: number;
    limit?: number;
}
export declare class PurchaseOrderService {
    private readonly prisma;
    private readonly projector;
    private readonly logger;
    constructor(prisma: PrismaService, projector: SnapshotProjectorService);
    private toDate;
    private generatePlaceholderSn;
    create(input: CreatePurchaseOrderInput, userId: string, organizationId: string): Promise<{
        lines: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            quantity: number;
            currencyCode: string;
            skuId: string;
            purchaseOrderId: string;
            expectedAt: Date | null;
            lineNo: number;
            unitPrice: Prisma.Decimal;
            totalPrice: Prisma.Decimal;
            defaultUsageType: import("@prisma/client").$Enums.RobotUsageType | null;
            placeholderPattern: string | null;
        }[];
    } & {
        id: string;
        createdAt: Date;
        status: import("@prisma/client").$Enums.PurchaseOrderStatus;
        updatedAt: Date;
        deletedAt: Date | null;
        organizationId: string;
        createdById: string;
        version: number;
        totalAmount: Prisma.Decimal;
        notes: string | null;
        closedAt: Date | null;
        currencyCode: string;
        supplierId: string;
        poNo: string;
        orderedAt: Date;
        expectedAt: Date | null;
        sapPoNo: string | null;
    }>;
    findAll(query: ListPurchaseOrderQuery): Promise<{
        items: ({
            _count: {
                robotUnits: number;
            };
            lines: {
                id: string;
                createdAt: Date;
                updatedAt: Date;
                quantity: number;
                currencyCode: string;
                skuId: string;
                purchaseOrderId: string;
                expectedAt: Date | null;
                lineNo: number;
                unitPrice: Prisma.Decimal;
                totalPrice: Prisma.Decimal;
                defaultUsageType: import("@prisma/client").$Enums.RobotUsageType | null;
                placeholderPattern: string | null;
            }[];
        } & {
            id: string;
            createdAt: Date;
            status: import("@prisma/client").$Enums.PurchaseOrderStatus;
            updatedAt: Date;
            deletedAt: Date | null;
            organizationId: string;
            createdById: string;
            version: number;
            totalAmount: Prisma.Decimal;
            notes: string | null;
            closedAt: Date | null;
            currencyCode: string;
            supplierId: string;
            poNo: string;
            orderedAt: Date;
            expectedAt: Date | null;
            sapPoNo: string | null;
        })[];
        total: number;
        page: number;
        limit: number;
        totalPages: number;
    }>;
    findOne(id: string): Promise<{
        lines: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            quantity: number;
            currencyCode: string;
            skuId: string;
            purchaseOrderId: string;
            expectedAt: Date | null;
            lineNo: number;
            unitPrice: Prisma.Decimal;
            totalPrice: Prisma.Decimal;
            defaultUsageType: import("@prisma/client").$Enums.RobotUsageType | null;
            placeholderPattern: string | null;
        }[];
        robotUnits: {
            id: string;
            ffsn: string;
        }[];
    } & {
        id: string;
        createdAt: Date;
        status: import("@prisma/client").$Enums.PurchaseOrderStatus;
        updatedAt: Date;
        deletedAt: Date | null;
        organizationId: string;
        createdById: string;
        version: number;
        totalAmount: Prisma.Decimal;
        notes: string | null;
        closedAt: Date | null;
        currencyCode: string;
        supplierId: string;
        poNo: string;
        orderedAt: Date;
        expectedAt: Date | null;
        sapPoNo: string | null;
    }>;
    update(id: string, input: UpdatePurchaseOrderInput, userId: string): Promise<{
        lines: {
            id: string;
            createdAt: Date;
            updatedAt: Date;
            quantity: number;
            currencyCode: string;
            skuId: string;
            purchaseOrderId: string;
            expectedAt: Date | null;
            lineNo: number;
            unitPrice: Prisma.Decimal;
            totalPrice: Prisma.Decimal;
            defaultUsageType: import("@prisma/client").$Enums.RobotUsageType | null;
            placeholderPattern: string | null;
        }[];
        robotUnits: {
            id: string;
            ffsn: string;
        }[];
    } & {
        id: string;
        createdAt: Date;
        status: import("@prisma/client").$Enums.PurchaseOrderStatus;
        updatedAt: Date;
        deletedAt: Date | null;
        organizationId: string;
        createdById: string;
        version: number;
        totalAmount: Prisma.Decimal;
        notes: string | null;
        closedAt: Date | null;
        currencyCode: string;
        supplierId: string;
        poNo: string;
        orderedAt: Date;
        expectedAt: Date | null;
        sapPoNo: string | null;
    }>;
    softDelete(id: string, userId: string): Promise<{
        message: string;
        id: string;
    }>;
}
