import { Types } from 'mongoose';
import { Response } from 'express';
import { ModelsService } from 'src/models/models.service';
import { CommonService } from 'src/common/common.service';
import { CustomersService } from 'src/customers/customers.service';
import { StatusHistoryService } from 'src/status-history/status-history.service';
import { Invoice, InvoiceType } from './schema/invoice.schema';
import { InvoiceSelectionDto, CreateInvoiceDto } from './dto/invoice-selection.dto';
import { OpeningBalanceSelectionDto, CreateOpeningBalanceInvoiceDto } from './dto/opening-balance-invoice.dto';
import { UpdateInvoiceDto } from './dto/update-invoice.dto';
import { CancelInvoiceDto } from './dto/cancel-invoice.dto';
import { ListInvoiceDto } from './dto/list-invoice.dto';
export interface TripConflict {
    trip_id: string;
    invoice_number: string;
}
export declare class InvoiceService {
    private readonly model;
    private readonly commonService;
    private readonly customersService;
    private readonly statusHistoryService;
    constructor(model: ModelsService, commonService: CommonService, customersService: CustomersService, statusHistoryService: StatusHistoryService);
    private generateInvoiceNumber;
    private peekNextInvoiceNumber;
    private findConflicts;
    private toTripRow;
    private toTripSnapshot;
    private fromTripSnapshot;
    private resolveSelection;
    preview(dto: InvoiceSelectionDto, user: any): Promise<{
        draft_invoice_number: string;
        is_reserved: boolean;
        invoice_type: InvoiceType;
        customer: {
            _id: Types.ObjectId;
            name: string;
            gst_number: string;
        };
        trips: {
            _id: any;
            trip_id: any;
            date: any;
            route: string;
            vehicle: any;
            freight_amount: any;
            gst_amount: any;
            outstanding_balance: any;
        }[];
        subtotal_freight: any;
        gst_amount: any;
        grand_total: any;
        advance_received: number;
        previous_outstanding: number;
        amount_due: number;
        billing_period_start: number | null;
        billing_period_end: number | null;
        duplicate_warnings: TripConflict[];
        payment_terms: string;
        due_date: number;
    }>;
    create(dto: CreateInvoiceDto, user: any): Promise<import("mongoose").Document<unknown, {}, import("mongoose").Document<unknown, {}, Invoice, {}> & Invoice & {
        _id: Types.ObjectId;
    } & {
        __v: number;
    }, {}> & import("mongoose").Document<unknown, {}, Invoice, {}> & Invoice & {
        _id: Types.ObjectId;
    } & {
        __v: number;
    } & Required<{
        _id: Types.ObjectId;
    }>>;
    private resolveOpeningBalanceSelection;
    previewOpeningBalanceInvoice(dto: OpeningBalanceSelectionDto, user: any): Promise<{
        draft_invoice_number: string;
        is_reserved: boolean;
        invoice_type: InvoiceType;
        customer: {
            _id: any;
            name: any;
            gst_number: any;
        };
        trips: never[];
        subtotal_freight: number;
        gst_amount: number;
        grand_total: number;
        advance_received: number;
        previous_outstanding: number;
        amount_due: number;
        opening_balance_date: any;
        opening_balance_description: any;
        duplicate_warnings: never[];
        payment_terms: string;
        due_date: number;
    }>;
    createOpeningBalanceInvoice(dto: CreateOpeningBalanceInvoiceDto, user: any): Promise<import("mongoose").Document<unknown, {}, import("mongoose").Document<unknown, {}, Invoice, {}> & Invoice & {
        _id: Types.ObjectId;
    } & {
        __v: number;
    }, {}> & import("mongoose").Document<unknown, {}, Invoice, {}> & Invoice & {
        _id: Types.ObjectId;
    } & {
        __v: number;
    } & Required<{
        _id: Types.ObjectId;
    }>>;
    list(dto: ListInvoiceDto, user: any): Promise<{
        status: string;
        message: string;
        data: any[];
        pagination: {
            total: number;
            page: number;
            limit: number;
            totalPages: number;
            hasNextPage: boolean;
            hasPrevPage: boolean;
        };
    }>;
    getById(id: string, user: any): Promise<any>;
    private resolveSettledDate;
    private settleInvoiceTrips;
    private settleOpeningBalance;
    update(id: string, dto: UpdateInvoiceDto, user: any): Promise<any>;
    cancel(id: string, dto: CancelInvoiceDto, user: any): Promise<any>;
    generatePdf(id: string, user: any, res: Response): Promise<void>;
}
