import mongoose from 'mongoose';

interface OfficesInterface extends AuditInterface {
    legalName?: string;
    name?: string;
    status?: "Active" | "Archived";
    externalId?: string;
    address?: AddressInterface[];
    website?: string;
    email?: string;
    phone?: string;
    phone2?: string;
}
interface OfficesInterfaceServer extends AuditInterface {
    legalName?: string;
    name?: string;
    status?: "Active" | "Archived";
    externalId?: string;
    address?: mongoose.Types.ObjectId[];
    website?: string;
    email?: string;
    phone?: string;
    phone2?: string;
}

declare type TenantAggregatorRequestType = "Requesting" | "Approved" | "Rejected";
interface TenantInterface extends AuditInterface {
    legalName?: string;
    name?: string;
    status?: "Active" | "Archived";
    /**
     * @deprecated The method should not be used move to `tenantTypes`
     */
    tenantType?: TenantType;
    coa?: string;
    /**
     * @abstract New field moving from `tenantType`
     */
    tenantTypes?: string[];
    bannerURL?: string;
    thumbnailURL?: string;
    externalId?: string;
    slug?: string;
    shortDescription?: string;
    description?: string;
    address?: AddressInterface[];
    website?: string;
    email?: string;
    phone?: string;
    phone2?: string;
    legalName_lower?: string;
    name_lower?: string;
    website_lower?: string;
    email_lower?: string;
    accessToken?: string;
    referenceCode?: string;
    aggregatorIds?: string[];
    aggregators?: TenantInterface[];
    integrationTokens: {
        provider: string;
        token: any;
    }[];
    packageId?: string;
    package?: TenantPackageInterface;
}
interface TenantInterfaceServer extends AuditInterface {
    legalName?: string;
    name?: string;
    status?: "Active" | "Archived";
    /**
     * @deprecated The method should not be used move to `tenantTypes`
     */
    tenantType?: TenantType;
    coa?: string;
    /**
     * @abstract New field moving from `tenantType`
     */
    tenantTypes?: string[];
    bannerURL?: string;
    thumbnailURL?: string;
    externalId?: string;
    slug?: string;
    shortDescription?: string;
    description?: string;
    address?: mongoose.Types.ObjectId[];
    website?: string;
    email?: string;
    phone?: string;
    phone2?: string;
    legalName_lower?: string;
    name_lower?: string;
    website_lower?: string;
    email_lower?: string;
    accessToken?: string;
    referenceCode?: string;
    aggregatorIds?: string[];
    aggregators?: mongoose.Types.ObjectId[];
    integrationTokens: {
        provider: string;
        token: any;
    }[];
    packageId?: string;
    package?: mongoose.Types.ObjectId;
}
interface TenantPackageInterface extends AuditInterface {
    name: string;
    description: string;
}
interface TenantAggregatorRequestInterface extends AuditInterface {
    agencyId: string;
    agency?: TenantInterface;
    aggregatorId: string;
    aggregator?: TenantInterface;
    status: TenantAggregatorRequestType;
}
interface TenantAggregatorRequestInterfaceServer extends AuditInterface {
    agencyId: string;
    agency?: mongoose.Types.ObjectId;
    aggregatorId: string;
    aggregator?: mongoose.Types.ObjectId;
    status: TenantAggregatorRequestType;
}
interface TenantExcludeProjectInterface extends AuditInterface {
    tenantId: string;
    projectId: string;
}
interface TenantProjectInterface extends AuditInterface {
    tenantId: string;
    tenant: TenantInterface;
    projectId: string;
    project: ProjectInterface;
    projectLotIds: string[];
    projectLots: ProjectLotInterface[];
}
interface TenantProjectInterfaceServer extends AuditInterface {
    tenantId: string;
    tenant: mongoose.Types.ObjectId;
    projectId: string;
    project: mongoose.Types.ObjectId;
    projectLotIds: string[];
    projectLots: mongoose.Types.ObjectId[];
}

interface AgentInterface extends AuditInterface {
    uid?: string;
    fullName: string;
    firstName: string;
    lastName?: string;
    mobile?: string;
    phone?: string;
    image: string;
    email: string;
    dateOfBirth?: string;
    licenceNumber?: string;
    licenceExpiryDate?: string;
    address?: AddressInterface;
    /**
     * @deprecated The method should not be used move to `officeId`
     */
    OfficeId?: string;
    officeId?: string;
    office?: OfficesInterface;
    jobTitle?: string;
    specialistAreas?: string[];
    awards?: string[];
    employeeType?: EmployeeType;
    coa?: string;
    /**
     * @deprecated The method should not be used move to `tenantTypes`
     */
    tenantType?: TenantType;
    /**
     * @abstract New field moving from `tenantType`
     */
    tenantTypes?: TenantType[];
    tenantId?: string;
    tenant?: TenantInterface;
    aggregatorIds?: string[];
    aggregators?: TenantInterface[];
    profile?: string;
    profileVideo?: string;
    startDate?: string;
    contractValedDate?: string;
    showOnWeb: boolean;
    status: "Active" | "Archived";
    customToken?: string;
    facebookUrl?: string;
    instagramUrl?: string;
    linkedInUrl?: string;
    twitterUrl?: string;
    keyword?: string;
    callCalenderUrl?: string;
    agentLanguages?: string[];
    deviceToken?: string[];
    integrationTokens?: {
        provider: string;
        token: any;
    }[];
    groupId?: string;
    group?: GroupInterface;
    /**
     * @abstract just for JWT
     */
    groupAccess?: GroupAccessInterface[];
}
interface AgentInterfaceServer extends AuditInterface {
    uid?: string;
    fullName: string;
    firstName: string;
    lastName?: string;
    mobile?: string;
    phone?: string;
    image: string;
    email: string;
    dateOfBirth?: string;
    licenceNumber?: string;
    licenceExpiryDate?: string;
    address?: mongoose.Types.ObjectId;
    OfficeId?: string;
    office?: mongoose.Types.ObjectId;
    jobTitle?: string;
    specialistAreas?: string[];
    awards?: string[];
    employeeType?: EmployeeType;
    /**
     * @deprecated The method should not be used move to `tenantTypes`
     */
    tenantType?: TenantType;
    /**
     * @abstract New field moving from `tenantType`
     */
    tenantTypes?: TenantType[];
    tenantId?: string;
    tenant?: mongoose.Types.ObjectId;
    aggregatorIds?: string[];
    aggregators?: mongoose.Types.ObjectId[];
    profile?: string;
    profileVideo?: string;
    startDate?: string;
    contractValedDate?: string;
    showOnWeb: boolean;
    status: "Active" | "Archived";
    customToken?: string;
    facebookUrl?: string;
    instagramUrl?: string;
    linkedInUrl?: string;
    twitterUrl?: string;
    keyword?: string;
    callCalenderUrl?: string;
    agentLanguages?: string[];
    deviceToken?: string[];
    integrationTokens?: {
        provider: string;
        token: any;
    }[];
    groupId?: string;
    group?: mongoose.Types.ObjectId;
    /**
     * @abstract just for JWT
     */
    groupAccess?: mongoose.Types.ObjectId[];
}
interface GroupInterface extends AuditInterface {
    name: string;
    description: string;
    tenantType: TenantType;
}
/**
 * @abstract TODO: Think letter
 */
interface GroupAccessContex extends AuditInterface {
    groupId: string;
    group: GroupInterface;
}
interface GroupAccessContexServer extends AuditInterface {
    groupId: string;
    group: mongoose.Types.ObjectId;
}
interface GroupAccessInterface extends AuditInterface {
    groupId: string;
    group: GroupInterface;
    /**
     * @abstract ModelName -- Menu
     */
    menu: string;
    /**
     * @abstract Array of Field Name of model  eq: ["name", "address", "date"]
     * @abstract * for all field  ["*"]
     * @abstract !name => Except ["!name", "!address", "!date"]
     */
    view: string[];
    /**
     * @abstract Array of Field Name of model  eq: ["name", "address", "date"]
     * @abstract * for all field
     * @abstract !name => Except ["!name", "!address", "!date"]
     */
    create: string[];
    /**
     * @abstract Array of Field Name of model  eq: ["name", "address", "date"]
     * @abstract * for all field
     * @abstract !name => Except ["!name", "!address", "!date"]
     */
    update: string[];
    delete: boolean;
    exceptField?: string[];
}
interface GroupAccessInterfaceServer extends AuditInterface {
    groupId: string;
    group: mongoose.Types.ObjectId;
    /**
     * @abstract ModelName -- Menu
     */
    menu: string;
    /**
     * @abstract Array of Field Name of model  eq: ["name", "address", "date"]
     * @abstract * for all field  ["*"]
     * @abstract !name => Except ["!name", "!address", "!date"]
     */
    view: string[];
    /**
     * @abstract Array of Field Name of model  eq: ["name", "address", "date"]
     * @abstract * for all field
     * @abstract !name => Except ["!name", "!address", "!date"]
     */
    create: string[];
    /**
     * @abstract Array of Field Name of model  eq: ["name", "address", "date"]
     * @abstract * for all field
     * @abstract !name => Except ["!name", "!address", "!date"]
     */
    update: string[];
    delete: boolean;
    exceptField?: string[];
}

interface GooglePlacesInterface extends AuditInterface {
    business_status?: string;
    geometry: {
        location: {
            lat: number;
            lng: number;
        };
        viewport: {
            northeast: {
                lat: number;
                lng: number;
            };
            southwest: {
                lat: number;
                lng: number;
            };
        };
    };
    icon: string;
    icon_background_color: string;
    icon_mask_base_uri: string;
    name: string;
    opening_hours?: any;
    photos: [
        {
            height: 1252;
            html_attributions: string[];
            photo_reference: string;
            width: 1600;
        }
    ];
    place_id: string;
    plus_code: any;
    reference: string;
    rating?: number;
    scope: string;
    types: string[];
    vicinity: string;
    user_ratings_total?: string[];
}
interface ProjectGooglePlacesInterface extends AuditInterface {
    projectId: string;
    project: ProjectInterface;
    googlePlacesId: string;
    googlePlaces: GooglePlacesInterface;
}

declare const PaymentGatewayOption: string[];
declare type PaymentGatewayType = "SQUAREUP" | "DOKU" | "BRAINTREE" | "TAZAPAY" | "NAB" | "PAYPALL";
declare const SocialMediaName: string[];
declare type SocialMediaNameType = "FACEBOOK" | "INSTAGRAM" | "YOUTUBE" | "LINKEDIN" | "TIKTOK" | "GOOGLE+" | "TWITER" | "PINTEREST";
declare const TemplateTypeData: string[];
declare type TemplateType = "NAVBAR" | "FOOTER" | "SECTION";
interface MenuType {
    name: any;
    url: string;
    subItems?: MenuType[];
    class?: string;
    col?: number;
    active?: boolean;
}
interface CustomRelationshipManagement {
    name?: string;
    credential?: unknown;
    active?: boolean;
}
interface WhiteLabelInterface extends AuditInterface {
    logo: string;
    cssRoot: string;
    menu?: MenuType[];
    footer: string;
    type: "MULTI PROJECTS" | "SINGLE PROJECT";
    accessToken: string;
    domainName: string;
    proejctUrl?: string;
    favicon?: string;
    metaTitle?: string;
    metaDescription?: string;
    keyword?: string;
    bannerUrl?: string;
    metaImage?: string;
    menus?: {
        [code: string]: MenuType[];
    };
    /**
     * @abstract New Field for Whitelabel
     */
    tenantId: string;
    tenant: TenantInterface;
    headerTracker?: string;
    footerTracker?: string;
    /**
     * @abstract New available on version 1.1.17
     */
    socialMedia?: SocialMediaInterface[];
    darkLogo?: string;
    lightLogo?: string;
    pipedriveToken?: string;
    customerRelationshipManagement?: CustomRelationshipManagement[];
    officeTime?: {
        iconUrl?: string;
        title?: string;
        description?: string;
    };
}
interface WhiteLabelInterfaceServer extends AuditInterface {
    logo: string;
    cssRoot: string;
    menu?: MenuType[];
    footer: string;
    type: "MULTI PROJECTS" | "SINGLE PROJECT";
    accessToken: string;
    domainName: string;
    proejctUrl?: string;
    favicon?: string;
    metaTitle?: string;
    metaDescription?: string;
    keyword?: string;
    bannerUrl?: string;
    metaImage?: string;
    menus?: {
        [code: string]: MenuType[];
    };
    /**
     * @abstract New Field for Whitelabel
     */
    tenantId: string;
    tenant: mongoose.Types.ObjectId;
    headerTracker?: string;
    footerTracker?: string;
    /**
     * @abstract New available on version 1.1.17
     */
    socialMedia?: mongoose.Types.ObjectId[];
    darkLogo?: string;
    lightLogo?: string;
    officeTime?: {
        iconUrl?: string;
        title?: string;
        description?: string;
    };
}
/**
 * @abstract New available on version 1.1.17
 */
interface TemplateDesignInterface extends AuditInterface {
    name: string;
    imageUrl: string;
    type: TemplateType;
    exampleURL?: string;
    dataType?: "ARRAY" | "OBJECT";
    templateDataType: string;
}
interface SocialMediaInterface {
    name: SocialMediaNameType;
    url: string;
    tile: string;
}
interface NavbarDataInterface {
}
interface FooterSectionInterface {
    title?: string;
    image?: string;
    shortDescription?: string;
    menus?: MenuType[];
    listStyle?: "list-none" | "list-disc" | "list-decimal";
    listStylePosition?: "list-inside" | "list-outside";
    listPosition?: "row" | "Col";
    listStyleImage?: string;
    lineHeight?: number;
}
interface FooterDataInterface {
    [code: number]: FooterSectionInterface[];
}
interface WhitelabelTemplateInterface {
    navbarDesignId: string;
    navbarDesign: TemplateDesignInterface;
    navbarData: NavbarDataInterface;
    footerDesignId: string;
    footerDesign: TemplateDesignInterface;
    footerData: FooterDataInterface;
}
interface WhitelabelTemplateInterfaceServer {
    navbarDesignId: string;
    navbarDesign: mongoose.Types.ObjectId;
    navbarData: NavbarDataInterface;
    footerDesignId: string;
    footerDesign: mongoose.Types.ObjectId;
    footerData: FooterDataInterface;
}
/**
 * @abstract ===== END update version
 */
interface WhiteLabelPaymentGatewayInterface extends AuditInterface {
    whitelableId: string;
    whiteLabel: WhiteLabelInterface;
    projectId: string;
    project: ProjectInterface;
    paymentGateway: PaymentGatewayType;
    token: any;
}
interface WhiteLabelPaymentGatewayInterfaceServer extends AuditInterface {
    whitelableId: string;
    whiteLabel: mongoose.Types.ObjectId;
    projectId: string;
    project: mongoose.Types.ObjectId;
    paymentGateway: PaymentGatewayType;
    token: any;
}

interface BlogInterface extends AuditInterface {
    title?: string;
    slug?: string;
    shortDescription?: string;
    description?: string;
    categoryIds?: string[];
    categories?: CategoryInterface[];
    status?: StatusType;
    blogDisplay?: BlogDisplay;
    bannerURL?: string;
    thumbnailURL?: string;
    videoUrl?: string;
    author?: string;
}

interface AdditionalInformationContact {
    name: string;
    value: string;
}
interface AdditionalInformationContactServer extends AdditionalInformationContact {
}
interface ContactInterfaceServer extends AuditInterface {
    firstName: string;
    lastName: string;
    phoneNumber: string;
    mobileNumber?: string;
    email: string;
    source?: SourceList;
    address: mongoose.Types.ObjectId;
    canSeeContactAgentIds?: string[];
    canSeeContactAgents?: mongoose.Types.ObjectId[];
    belongsToAgentId?: string;
    belongsToAgent?: mongoose.Types.ObjectId;
    image: string;
    subscribed: string[];
    status: "Active" | "Archived";
}
interface ContactInterface extends AuditInterface {
    firstName: string;
    lastName: string;
    phoneNumber: string;
    mobileNumber?: string;
    email: string;
    source?: SourceList;
    address: AddressInterface;
    canSeeContactAgentIds?: string[];
    canSeeContactAgents?: AgentInterface[];
    belongsToAgentId?: string;
    belongsToAgent?: AgentInterface;
    image: string;
    subscribed: string[];
    status: "Active" | "Archived";
    id?: string;
    dealId?: string;
    leadsId?: string;
    pipedrivePersonId?: string;
    organization?: string;
    owner?: string;
    date?: string;
    country?: string;
    birthday?: string;
    jobTitle?: string;
    postCode?: string;
    leadSource?: string;
    campaign?: string;
    adset?: string;
    ads?: string;
    pageUrl?: string;
    message?: string;
    note?: string;
    extras?: object;
    whiteLabel?: string;
}

interface LeadsInterface extends AuditInterface {
    _id?: string;
    id?: string;
    dealId?: string;
    leadsId?: string;
    organization?: string;
    owner?: string;
    date?: string;
    firstName?: string;
    lastName?: string;
    email?: string;
    phoneNumber?: string;
    country?: string;
    birthday?: string;
    jobTitle?: string;
    postCode?: string;
    leadSource?: string;
    campaign?: string;
    adset?: string;
    ads?: string;
    pageUrl?: string;
    message?: string;
    note?: string;
    extras?: object;
}

interface TAAddress {
    street1: string;
    street2: string;
    city: string;
    state: string;
    country: string;
    postalcode: string;
    address_string: string;
    phone: string;
    latitude: number;
    longitude: number;
}
interface TARankingData {
    geo_location_id: number;
    ranking_string: string;
    geo_location_name: string;
    ranking_out_of: number;
}
interface TAAncestor {
    abbrv: string;
    level: string;
    name: string;
    location_id: number;
    latitude: number;
    longitude: number;
    timezone: string;
    email: string;
    phone: string;
    website: string;
    write_review: string;
    ranking_data: TARankingData;
    ranking: number;
}
interface TAAward {
    award_type: string;
    year: number;
    images: {
        tiny: string;
        small: string;
        large: string;
    };
    categories: string[];
    display_name: string;
}
interface TALocalize {
    name: string;
    localized_name: string;
    rating_image_url?: string;
    value?: string;
}
interface TALocation extends AuditInterface {
    location_id: number;
    name: string;
    description?: string;
    web_url?: string;
    address_obj: TAAddress;
    ancestors?: TAAncestor[];
    rating_image_url?: string;
    num_reviews?: string;
    review_rating_count?: {
        [code: string]: string;
    };
    subratings?: {
        [code: string]: TALocalize;
    };
    photo_count?: number;
    see_all_photos?: string;
    price_level?: string;
    hours?: {
        periods: {
            open: {
                day: number;
                time: string;
            };
            close: {
                day: number;
                time: string;
            };
        }[];
        weekday_text: string[];
        subcategory: TALocalize;
    };
    amenities?: string[];
    features?: string[];
    cuisine?: TALocalize[];
    parent_brand?: string;
    brand?: string;
    category?: TALocalize;
    subcategory?: TALocalize[];
    groups?: TALocalize[];
    styles?: string[];
    neighborhood_info?: TALocation[];
    trip_types?: TALocalize[];
    awards?: TAAward[];
    distance?: string;
    rating?: string;
    bearing?: string;
}

interface GdriveMetaData {
    id: string;
    name: string;
    modifiedTime: string;
    mimeType: string;
    parents?: string[];
}
interface ProjectDriveIntegration extends GdriveMetaData {
    watch: boolean;
    provider: string;
    listDataFile?: GdriveMetaData;
    interior?: GdriveMetaData;
    exterior?: GdriveMetaData;
    floorPlans?: GdriveMetaData;
    brochure?: GdriveMetaData;
    collateral?: GdriveMetaData;
    specifications?: GdriveMetaData;
    lotsData?: GdriveMetaData;
}

interface ProjectMainInformation extends AuditInterface {
    /**
     *
     */
    status: ProjectStatus;
    headLine: string;
    shortDescription: string;
    content: string;
    featured: boolean;
    hideOnWebsite: boolean;
    featuredByTenant?: {
        [tenantId: string]: boolean;
    };
    hideOnWebsiteByTenant?: {
        [tenantId: string]: boolean;
    };
    address: string;
    addressCordinat: Cordinat | Cordinat[];
    suburbId: string;
    suburb: SuburbInterface;
    suburbName: string;
    stateId: string;
    state: StateInterface;
    stateName: string;
    countryId: string;
    country: CountryInterface;
    countryName: string;
    region: RegionInterface;
    regionId: string;
    regionName: string;
    postcode: string;
    additionalInformation?: AdditionalInformation[];
    taxIncluded?: boolean;
    tax?: number;
    tenantIds?: string[];
    tenants?: TenantInterface[];
    aggregatorIds?: string[];
    aggregators?: TenantInterface[];
    developerId?: string;
    developerDetail?: TenantInterface;
    developer?: TenantInterface;
    projectOwnerId?: string;
    projectOwner?: TenantInterface;
    /**
     * @deprecated The method should not be used move to `projectTypeIds`
     */
    projectTypeId: string;
    /**
     * @deprecated The method should not be used move to `projectTypes`
     */
    projectType: ProjectTypeInterface;
    /**
     * @abstract New field moving from `projectTypeId`
     */
    projectTypeIds?: string[];
    /**
     * @abstract New field moving from `projectTypes`
     */
    projectTypes?: ProjectTypeInterface[];
    autdoorFeature: string[];
    indoorFeatures: string[];
    driveIntegration?: ProjectDriveIntegration;
}
interface ProjectMainInformationServer extends AuditInterface {
    /**
     *
     */
    status: ProjectStatus;
    headLine: string;
    shortDescription: string;
    content: string;
    featured: boolean;
    hideOnWebsite: boolean;
    featuredByTenant?: {
        [tenantId: string]: boolean;
    };
    hideOnWebsiteByTenant?: {
        [tenantId: string]: boolean;
    };
    address: string;
    addressCordinat: Cordinat | Cordinat[];
    suburbId: string;
    suburb: mongoose.Types.ObjectId;
    suburbName: string;
    stateId: string;
    state: mongoose.Types.ObjectId;
    stateName: string;
    countryId: string;
    country: mongoose.Types.ObjectId;
    countryName: string;
    region: mongoose.Types.ObjectId;
    regionId: string;
    regionName: string;
    postcode: string;
    additionalInformation?: AdditionalInformation[];
    taxIncluded?: boolean;
    tax?: number;
    tenantIds?: string[];
    tenants?: mongoose.Types.ObjectId[];
    aggregatorIds?: string[];
    aggregators?: mongoose.Types.ObjectId[];
    developerId?: string;
    developerDetail?: mongoose.Types.ObjectId;
    developer?: mongoose.Types.ObjectId;
    projectOwnerId?: string;
    projectOwner?: mongoose.Types.ObjectId;
    /**
     * @deprecated The method should not be used move to `projectTypeIds`
     */
    projectTypeId: string;
    /**
     * @deprecated The method should not be used move to `projectTypes`
     */
    projectType: mongoose.Types.ObjectId;
    /**
     * @abstract New field moving from `projectTypeId`
     */
    projectTypeIds?: string[];
    /**
     * @abstract New field moving from `projectTypes`
     */
    projectTypes?: mongoose.Types.ObjectId[];
    autdoorFeature: string[];
    indoorFeatures: string[];
    driveIntegration?: ProjectDriveIntegration;
}

interface ProjectInterface extends ProjectImageFileAndOtherInfo {
    /**
     * @deprecated The method should not be used
     */
    type: ProjectType;
    coa: string;
    /**
     * @abstract Image URl
     */
    sellingPoint: string;
    url: string;
    landingUrl: string;
    currency: CurrencyId;
    preSaleType: "Percentage" | "Fix Price";
    preSalePercentage?: number;
    preSalePrice?: number;
    percentageDeposit: number;
    /**
     * @deprecated The method should not be used
     */
    aboutProject: string;
    /**
     * @deprecated The method should not be used
     */
    step1?: string;
    /**
     * @deprecated The method should not be used
     */
    step2?: string;
    /**
     * @deprecated The method should not be used
     */
    step3?: string;
    /**
     * @deprecated The method should not be used
     */
    step4?: string;
    /**
     * @deprecated The method should not be used
     */
    blogIds?: string[];
    /**
     * @deprecated The method should not be used
     */
    blogs?: BlogInterface[];
    projectStatus?: ProjectStatusType;
    totalUnit?: number;
    startDate?: string;
    completionDate?: string;
    /**
     * @deprecated The method should not be used move to `projectlot`
     */
    variationTitle: string;
    /**
     * @deprecated The method should not be used will be move to `projectvariance`
     */
    variationPricing: "ADD" | "REPLACE" | "MULTIPLE" | "DEVIDE";
    rentalRevenueEstimate?: RentalRevenueEstimateInterface[];
    /**
     * @abstract when `true` if sold ? no information on front end
     */
    hidePriceOnSold?: boolean;
    summary?: ProjectSummaryInterface;
    /**
     * @abstract New field for summary by `proejctid`
     */
    summaryByProjectTypeIds?: {
        [projectTypeId: string]: ProjectSummaryInterface;
    };
    /**
     * @abstract Interfce only not for data to model
     * */
    searchPrice?: number;
    searchPriceMin?: number;
    searchPriceMax?: number;
    /**
     * @abstract New field for summary by proejctid
     */
    projectImageFileAndOtherInfoByTenants: {
        [tenantId: string]: ProjectImageFileAndOtherInfo;
    };
    /**
     *@abstract New field stating from version 1.1.14
     */
    fractionalAvailable: boolean;
}
interface ProjectInterfaceServer extends ProjectImageFileAndOtherInfoServer {
    /**
     * @deprecated The method should not be used
     */
    type: ProjectType;
    coa: string;
    /**
     * @abstract Image URl
     */
    sellingPoint: string;
    url: string;
    landingUrl: string;
    currency: CurrencyId;
    preSaleType: "Percentage" | "Fix Price";
    preSalePercentage?: number;
    preSalePrice?: number;
    percentageDeposit: number;
    /**
     * @deprecated The method should not be used
     */
    aboutProject: string;
    /**
     * @deprecated The method should not be used
     */
    step1?: string;
    /**
     * @deprecated The method should not be used
     */
    step2?: string;
    /**
     * @deprecated The method should not be used
     */
    step3?: string;
    /**
     * @deprecated The method should not be used
     */
    step4?: string;
    /**
     * @deprecated The method should not be used
     */
    blogIds?: string[];
    /**
     * @deprecated The method should not be used
     */
    blogs?: BlogInterface[];
    projectStatus?: ProjectStatusType;
    totalUnit?: number;
    startDate?: string;
    completionDate?: string;
    /**
     * @deprecated The method should not be used move to `projectlot`
     */
    variationTitle: string;
    /**
     * @deprecated The method should not be used will be move to `projectvariance`
     */
    variationPricing: "ADD" | "REPLACE" | "MULTIPLE" | "DEVIDE";
    rentalRevenueEstimate?: mongoose.Types.ObjectId[];
    /**
     * @abstract when `true` if sold ? no information on front end
     */
    hidePriceOnSold?: boolean;
    summary?: ProjectSummaryInterface;
    /**
     * @abstract New field for summary by `proejctid`
     */
    summaryByProjectTypeIds?: {
        [projectTypeId: string]: ProjectSummaryInterface;
    };
    /**
     * @abstract Interfce only not for data to model
     * */
    searchPrice?: number;
    searchPriceMin?: number;
    searchPriceMax?: number;
    /**
     * @abstract New field for summary by proejctid
     */
    projectImageFileAndOtherInfoByTenants: {
        [tenantId: string]: ProjectImageFileAndOtherInfo;
    };
    /**
     *@abstract New field stating from version 1.1.14
     */
    fractionalAvailable: boolean;
}

interface ProjectDesignInterface extends AuditInterface {
    projectId: string;
    project?: ProjectInterface;
    name: string;
    shortDescription: string;
    content?: string;
    bannerURL?: string;
    thumbnailURL?: string;
    gelleries?: string[];
}
interface ProjectDesignInterfaceServer extends AuditInterface {
    projectId: string;
    project?: mongoose.Types.ObjectId;
    name: string;
    shortDescription: string;
    content?: string;
    bannerURL?: string;
    thumbnailURL?: string;
    gelleries?: string[];
}

interface ProjectSummaryInterface extends AuditInterface {
    unitAvailable: number;
    sold: number;
    minPrice: number;
    maxPrice: number;
    bed?: {
        min: number;
        max: number;
    };
    bath?: {
        min: number;
        max: number;
    };
    garage?: {
        min: number;
        max: number;
    };
    area?: {
        min: number;
        max: number;
    };
    prc?: number;
    booked?: number;
    onHold?: number;
    headLine?: string;
    value?: any[];
}

interface ProjectLotMainInformation extends ProjectImageFileAndOtherInfo {
    projectId: string;
    project: ProjectInterface;
    tenantIds?: string[];
    tenants?: TenantInterface[];
    scheme: string;
    aspect: string;
    guarantee: string;
    level?: string;
    lot?: string;
    bed?: number;
    bath?: number;
    garage: number;
    internal: number;
    external: number;
    total: number;
    living: number;
    /**
     * @deprecated The method should not be used
     */
    type: string;
    price: number;
    cogs?: number;
    projectUrl?: string;
    stage?: string;
    builder?: string;
    additionalOptions?: AdditionalOption[];
    builderId?: string;
    builderDetail?: TenantInterface;
    projectDesignId?: string;
    projectDesign?: ProjectDesignInterface;
    projectFacadeId?: string;
    projectFacade?: ProjectFacadeInterface;
    builders?: string[];
    builderIds?: string[];
    builderDetails?: TenantInterface[];
    projectDesignIds?: string[];
    projectDesigns?: ProjectDesignInterface[];
    projectFacadeIds?: string[];
    projectFacades?: ProjectFacadeInterface[];
}
interface ProjectLotMainInformationServer extends ProjectImageFileAndOtherInfoServer {
    projectId: string;
    project: mongoose.Types.ObjectId;
    tenantIds?: string[];
    tenants?: mongoose.Types.ObjectId[];
    scheme: string;
    aspect: string;
    guarantee: string;
    level?: string;
    lot?: string;
    bed?: number;
    bath?: number;
    garage: number;
    internal: number;
    external: number;
    total: number;
    living: number;
    type: string;
    price: number;
    cogs?: number;
    projectUrl?: string;
    stage?: string;
    builder?: string;
    additionalOptions?: AdditionalOption[];
    builderId?: string;
    builderDetail?: mongoose.Types.ObjectId;
    projectDesignId?: string;
    projectDesign?: mongoose.Types.ObjectId;
    projectFacadeId?: string;
    projectFacade?: mongoose.Types.ObjectId;
    builders?: string[];
    builderIds?: string[];
    builderDetails?: mongoose.Types.ObjectId[];
    projectDesignIds?: string[];
    projectDesigns?: mongoose.Types.ObjectId[];
    projectFacadeIds?: string[];
    projectFacades?: mongoose.Types.ObjectId[];
}

interface ProjectLotVarianceInterface extends ProjectLotMainInformation {
    variationPricing: "ADD" | "REPLACE" | "MULTIPLE" | "DEVIDE" | "FRACTIONAL";
    fractionalValue: number;
    projectImageFileAndOtherInfoByTenants: {
        [tenantId: string]: ProjectImageFileAndOtherInfo;
    };
    additionalOptions: AdditionalOption[];
    projectTypeId: string;
    projectType: ProjectTypeInterface;
    builder?: string;
    builderId?: string;
    builderDetail?: TenantInterface;
    projectDesignId?: string;
    projectDesign?: ProjectDesignInterface;
    projectFacadeId?: string;
    projectFacade?: ProjectFacadeInterface;
}
interface ProjectLotVarianceInterfaceServer extends ProjectLotMainInformationServer {
    variationPricing: "ADD" | "REPLACE" | "MULTIPLE" | "DEVIDE" | "FRACTIONAL";
    fractionalValue: number;
    projectImageFileAndOtherInfoByTenants: {
        [tenantId: string]: ProjectImageFileAndOtherInfo;
    };
    additionalOptions: AdditionalOption[];
    projectTypeId: string;
    projectType: mongoose.Types.ObjectId;
    builder?: string;
    builderId?: string;
    builderDetail?: mongoose.Types.ObjectId;
    projectDesignId?: string;
    projectDesign?: mongoose.Types.ObjectId;
    projectFacadeId?: string;
    projectFacade?: mongoose.Types.ObjectId;
}

interface LotVariancesInterface {
    projectLotVarianceId: string;
    projectLotVariance: ProjectLotVarianceInterface;
    status: ProjectStatus;
    price: number;
    landPrice: number;
    housePrice: number;
    salesPackNumber: string;
    availabilityStock: number;
    additionalInformation?: AdditionalInformation[];
    additionalConst?: number;
    projectTypeId: string;
    projectType?: ProjectTypeInterface;
    variationPricing?: "ADD" | "REPLACE" | "MULTIPLE" | "DEVIDE";
    fractional?: boolean;
    fractionalRange?: number;
}
interface LotVariancesInterfaceServer {
    projectLotVarianceId: string;
    projectLotVariance: mongoose.Types.ObjectId;
    status: ProjectStatus;
    price: number;
    landPrice: number;
    housePrice: number;
    salesPackNumber: string;
    availabilityStock: number;
    additionalInformation?: AdditionalInformation[];
    additionalConst?: number;
    projectTypeId: string;
    projectType?: mongoose.Types.ObjectId;
    variationPricing?: "ADD" | "REPLACE" | "MULTIPLE" | "DEVIDE";
    fractional?: boolean;
    fractionalRange?: number;
}

interface ProjectLotInterface extends ProjectLotMainInformation {
    /**
     *@abstract moving from `Projects`
     */
    variationTitle: string;
    fractionalIds?: string[];
    fractionals: ProjectLotInterface[];
    /**
     * @deprecated The method should not be used move to `variances`
     */
    projectLotVarianceIds?: string[];
    /**
     * @deprecated The method should not be used move to `variances`
     */
    projectLotVariances?: ProjectLotVarianceInterface[];
    variances?: LotVariancesInterface[];
    city: string;
    estate: string;
    landPrice: number;
    housePrice: number;
    salesPackNumber: string;
    landRegistration: string;
    stockType: "NORMAL" | "PARTIAL" | "FRACTIONAL";
    stock: number;
    /**
     * Default availability stock is 1
     * when sold on variance availability stock  0-1 (100) equal to 100%
     */
    availabilityStock: number;
    /**
     * @abstract setup lot available for fractional
     */
    fractional?: number;
    fractionalRange?: number;
    projectImageFileAndOtherInfoByTenants: {
        [tenantId: string]: ProjectImageFileAndOtherInfo;
    };
    /**
     *@abstract New field stating from version 1.1.14
     */
    fractionalAvailable: boolean;
}
interface ProjectLotInterfaceServer extends ProjectLotMainInformationServer {
    /**
     *@abstract moving from `Projects`
     */
    variationTitle: string;
    fractionalIds?: string[];
    fractionals: mongoose.Types.ObjectId[];
    /**
     * @deprecated The method should not be used move to `variances`
     */
    projectLotVarianceIds?: string[];
    /**
     * @deprecated The method should not be used move to `variances`
     */
    projectLotVariances?: mongoose.Types.ObjectId[];
    variances?: mongoose.Types.ObjectId[];
    city: string;
    estate: string;
    landPrice: number;
    housePrice: number;
    salesPackNumber: string;
    landRegistration: string;
    stockType: "NORMAL" | "PARTIAL" | "FRACTIONAL";
    stock: number;
    /**
     * Default availability stock is 1
     * when sold on variance availability stock  0-1 (100) equal to 100%
     */
    availabilityStock: number;
    /**
     * @abstract setup lot available for fractional
     */
    fractional?: boolean;
    fractionalRange?: number;
    projectImageFileAndOtherInfoByTenants: {
        [tenantId: string]: ProjectImageFileAndOtherInfo;
    };
    /**
     *@abstract New field stating from version 1.1.14
     */
    fractionalAvailable: boolean;
}

interface ProjectRequestInterface extends AuditInterface {
    projectId: string;
    project?: ProjectInterface;
    agencyId: string;
    agency?: TenantInterface;
    developerId: string;
    developer?: TenantInterface;
    aggregatorId: string;
    aggregator?: TenantInterface;
}
interface ProjectRequestInterfaceServer extends AuditInterface {
    projectId: string;
    project?: mongoose.Types.ObjectId;
    agencyId: string;
    agency?: mongoose.Types.ObjectId;
    developerId: string;
    developer?: mongoose.Types.ObjectId;
    aggregatorId: string;
    aggregator?: mongoose.Types.ObjectId;
}

declare type ProjectStatus = "DRAFT" | "AVAILABLE" | "NOTAVAILABLE" | "DELETED" | "LEASED" | "BOOKED" | "SOLD" | "HOLD" | "CONTRACT" | "PARTIAL";
declare const ProjectStatusOptions: string[];
declare type ProjectType = "Apartment" | "House & Land" | "Land" | "Office" | "Semi/Duplex" | "Block Of Units" | "Townhouse" | "Unit" | "Villa" | "Warehouse" | "Hotel/Leisure" | "Other" | "Motel" | "Resort" | "Retreat" | "Rural";
declare type CurrencyId = "EUR" | "SGD" | "GBP" | "AUD" | "USD" | "IDR" | "THB";
declare const CurrencyIdOptions: string[];
declare type ProjectStatusType = "Off The Plan" | "Completed" | "Under Construction";
declare const ProjectStatusTypeOptions: string[];
interface AdditionalInformation {
    icon: string;
    headline: string;
    content: string;
}
interface AdditionalOption {
    icon: string;
    headline: string;
    content: string;
    priceType: string;
    price: number;
}
interface RentalRevenueEstimateInterface {
    headline: string;
    price: number;
    occupancy: number;
    rate: number;
    percentageCost: number;
    investmentTime: number;
}

interface ProjectImageFileAndOtherInfo extends ProjectMainInformation {
    videoUrl: string[];
    onlineTourUrl: string[];
    images: string[];
    interior: string[];
    exterior: string[];
    floorPlans: string[] | MetaDataFileInterface[];
    brochure: string[] | MetaDataFileInterface[];
    collateral: string[] | MetaDataFileInterface[];
    specifications: string[] | MetaDataFileInterface[];
    constractionUpdate: MetaDataFileInterface[];
    areaGuide: string;
    presentation: string;
    news: string[];
    podcast: string[];
    webinar: string;
    threesixty: string;
    threesixtys: {
        headline: string;
        link: string;
        imageUrl: string;
    }[];
}
interface ProjectImageFileAndOtherInfoServer extends ProjectMainInformationServer {
    videoUrl: string[];
    onlineTourUrl: string[];
    images: string[];
    interior: string[];
    exterior: string[];
    floorPlans: string[] | MetaDataFileInterface[];
    brochure: string[] | MetaDataFileInterface[];
    collateral: string[] | MetaDataFileInterface[];
    specifications: string[] | MetaDataFileInterface[];
    constractionUpdate: MetaDataFileInterface[];
    areaGuide: string;
    presentation: string;
    news: string[];
    podcast: string[];
    webinar: string;
    threesixty: string;
    threesixtys: {
        headline: string;
        link: string;
        imageUrl: string;
    }[];
}

interface ProjectFacadeInterface extends ProjectDesignInterface {
}

/**
 * @deprecated The method should not be used
 */
interface ProjectTripadvisorInterface extends AuditInterface {
    projectId: string;
    project: ProjectInterface | mongoose.Types.ObjectId;
    tripadvisorId: string;
    tripadvisor: TALocation;
    distance?: string;
    bearing?: string;
}

declare type ListingType = "Sale" | "Lease" | "Sale & Lease";
declare type ListingStatus = "Appraisal" | "Presentation" | "Pending" | "Available" | "Conditional" | "Unconditional" | "Settled" | "Leased" | "Withdrawn" | "Archived";
declare type MarketingStatusType = "Not Listed" | "Available" | "Under Contract" | "Sold" | "Leased" | "Available Under Contract";
declare type PropertyType = "Residential" | "Rural" | "Commercial" | "Holiday" | "Business";
declare type PropertyCategory = "Apartment" | "Development" | "Factory" | "House" | "Land" | "Office" | "Semi/Duplex" | "Retail" | "Studio" | "Block Of Units" | "Terrace" | "Townhouse" | "Unit" | "Villa" | "Warehouse" | "Showroom" | "Cropping" | "Dairy" | "Farmlet" | "Horticulture" | "Lifestyle" | "Livestock" | "Viticulture" | "Mixed Farming" | "Acreage" | "Hotel/Leisure" | "Medical/Consulting" | "Other" | "BackpackerHostel" | "BedAndBreakfast" | "Campground" | "CaravanHolidayPark" | "ExecutiveRental" | "FarmStay" | "Flat" | "HouseBoat" | "Lodge" | "Motel" | "Resort" | "Retreat" | "SelfContainedCottage" | "ServicedApartment" | "Car Space" | "Accommodation/Tourism" | "Automotive" | "Beauty/Health" | "Food/Hospitality" | "Import/Export/Whole" | "Services" | "Education/Training" | "Franchise" | "Home/Garden" | "Industrial/Manufacturing" | "Leisure/Entertainment" | "Professional" | "Rural" | "Transport/Distribution";
declare type OrederBy = "soldPrice" | "searchPrice" | "address" | "lastModified" | "firstCreated" | "listedDate" | "nextInspectionDate" | "onMarketDate" | "auctionDate" | "soldDate" | "appraisalDate" | "presentationDate" | "status" | "marketingStatus" | "leasedDate";
declare type AuthorityType = "Exclusive" | "Multi List" | "Conjunctional" | "Open" | "Sale by Negotiation";
interface ListingParam {
    id?: string;
    page: number;
    limit: number;
    orderBy?: string;
    include?: string;
    order?: "ASC" | "DESC";
    filter?: ListingInterface;
    select?: string;
}
interface ListingInterface extends AppraisalInterface {
    fullAddressDisplay: boolean;
    addressDisplay?: string;
    marketingStatus: MarketingStatusType;
    authority: AuthorityType;
    listingDate?: string;
    listingExpiryDate?: string;
    priceDisplay?: string;
    price: number;
}

interface PropectSearchParams {
    id?: string;
    page: number;
    limit: number;
    orderBy?: string;
    include?: string;
    order?: "ASC" | "DESC";
    filter: ProspectInterface;
    select?: string;
}
interface ProspectInterface extends AuditInterface, AddressInterface {
    propertyType: PropertyType;
    propertyCategory: PropertyCategory;
    listingType: ListingType;
    interestLevel: "HOT" | "WARM" | "COLD";
    status: "Active" | "Archived";
    canSeeContactAgentIds?: string[];
    canSeeContactAgents?: AgentInterface[];
    belongsToAgentId?: string;
    belongsToAgent?: AgentInterface;
    officeId?: string;
    office?: OfficesInterface;
    ownerIds?: string[];
    owners?: ContactInterface[];
    tenantIds?: string[];
    tenants?: ContactInterface[];
    listingId?: string;
    listing?: ListingInterface;
    appraisalId?: string;
    appraisal?: AppraisalInterface;
}

interface AppraisalInterface extends ProspectInterface {
    displayName: string;
    displayName_lower: string;
    description?: string;
    description_lower?: string;
    agentIds?: string[];
    agents?: AgentInterface[];
    bedrooms?: number;
    bathrooms?: number;
    ensuites?: number;
    toilets?: number;
    frontage?: number;
    rearDepth?: number;
    landSize?: number;
    livingAreas?: number;
    buildingSize?: number;
    garageSpaces?: number;
    carportSpaces?: number;
    openCarSpaces?: number;
    outDoorFeatures?: string[];
    inDoorFeatures?: string[];
    allowances?: string[];
    expectedPrice?: number;
    rentalEstimate?: number;
    minPrice: number;
    maxPrice: number;
    note: string;
    note_lower: string;
    occupancyTitle: "Whole Building" | "Parcial Building";
    prospectId?: string;
    prospect?: ProspectInterface;
    appraisalDate?: string;
    appraisalDocuments?: string[];
    appraisalDocumentsWithMetaData?: MetaDataFileInterface[];
    videoUrls?: string[];
    onlineTourUrl?: string;
    documents?: string[];
    documentsWithMetaData?: MetaDataFileInterface[];
    images?: string[];
    thumbnails?: {
        small: string;
        medium: string;
        large: string;
    }[];
    imagesMetaDataFile?: MetaDataFileInterface[];
    floorPlans?: string[];
    floorPlansMetaDataFile?: MetaDataFileInterface[];
}

interface TestimonialButton {
    type: string;
    label: string;
}
interface TestimonialInterface extends AuditInterface {
    order: number;
    imageUrl: string;
    headline: string;
    description: string;
    name: string;
    role: string;
    rating: number;
    status: string;
    reviewUrl: string;
    button: TestimonialButton;
}
interface TestimonialInterfaceServer extends AuditInterface {
    order: number;
    imageUrl: string;
    headline: string;
    description: string;
    name: string;
    role: string;
    rating: number;
    status: string;
}

interface TokenData {
    token: string;
    expiresIn: number;
}
interface DataStoredInToken {
    _id: string;
}

interface UserInterface extends AuditInterface {
    uid: string;
    name?: string;
    fullname?: string;
    fullName: string;
    displayName?: string;
    firstName?: string;
    lastName?: string;
    email?: string;
    email_verified?: boolean;
    emailVerified?: boolean;
    phoneNumber?: string;
    isAnonymous?: boolean;
    photoURL?: string;
    address?: AddressInterface;
    status: StatusType;
    validThrough?: string;
    slug?: string;
    birthDay?: string;
    nationality?: string;
    socialMedia?: {
        [code: string]: string;
    };
    wishlist?: string[];
    mobile?: string;
    phone?: string;
    image: string;
    dateOfBirth?: string;
    licenceNumber?: string;
    licenceExpiryDate?: string;
    jobTitle?: string;
    tenantId?: string;
    tenant?: TenantInterface;
    profile?: string;
    profileVideo?: string;
    startDate?: string;
    contractValedDate?: string;
    showOnWeb: boolean;
    customToken?: string;
    facebookUrl?: string;
    instagramUrl?: string;
    linkedInUrl?: string;
    twitterUrl?: string;
    keyword?: string;
    callCalenderUrl?: string;
    deviceToken?: string[];
    groupId?: string;
}
interface UserInterfaceServer extends AuditInterface {
    uid: string;
    name?: string;
    fullname?: string;
    fullName: string;
    displayName?: string;
    firstName?: string;
    lastName?: string;
    email?: string;
    email_verified?: boolean;
    emailVerified?: boolean;
    phoneNumber?: string;
    isAnonymous?: boolean;
    photoURL?: string;
    address?: mongoose.Types.ObjectId;
    status: StatusType;
    validThrough?: string;
    slug?: string;
    birthDay?: string;
    nationality?: string;
    socialMedia?: {
        [code: string]: string;
    };
    wishlist?: string[];
    mobile?: string;
    phone?: string;
    image: string;
    dateOfBirth?: string;
    licenceNumber?: string;
    licenceExpiryDate?: string;
    jobTitle?: string;
    tenantId?: string;
    tenant?: mongoose.Types.ObjectId;
    profile?: string;
    profileVideo?: string;
    startDate?: string;
    contractValedDate?: string;
    showOnWeb: boolean;
    customToken?: string;
    facebookUrl?: string;
    instagramUrl?: string;
    linkedInUrl?: string;
    twitterUrl?: string;
    keyword?: string;
    callCalenderUrl?: string;
    deviceToken?: string[];
    groupId?: string;
}
interface UserWishlistInterface extends AuditInterface {
    uid: string;
    userId: string;
    user: UserInterface;
    projectId: string;
    Project: ProjectInterface;
}
interface UserWishlistInterfaceServer extends AuditInterface {
    uid: string;
    userId: string;
    user: mongoose.Types.ObjectId;
    projectId: string;
    Project: mongoose.Types.ObjectId;
}

declare type NotificationType = "NEW" | "READED";
interface NotificationInterface extends AuditInterface {
    headline?: string;
    description?: string;
    link?: string;
    userIdReaded?: string[];
    status?: string;
    type?: string;
    to?: {
        type: "USER" | "TENANT";
        id: string;
    }[];
}

interface IndustryReportInterface extends AuditInterface {
    title?: string;
    file?: string;
    thumbnailUrl?: string;
}

declare type TransactionType = "EOI" | "HOLD" | "CONTRACT" | "DEPOSIT" | "FALL OVER" | "SOLD" | "BOOKED" | "ACTIVE";
declare type TransactionCategory = "FRACTIONAL" | "NORMAL" | "PARTIAL";
interface TransactionInterface extends AuditInterface {
    id: string;
    projectId: string;
    project: ProjectInterface;
    fractionalId?: string;
    fractional?: ProjectLotInterface;
    fractionalLabel?: string;
    lotId?: string;
    lot?: ProjectLotInterface;
    lotVarianceId?: string;
    lotVariance?: ProjectLotVarianceInterface;
    lastStatus: TransactionType;
    whiteLabelId?: string;
    whiteLabel?: WhiteLabelInterface;
    whiteLabelDomain: string;
    tenantId?: string;
    tenant?: TenantInterface;
    description?: string;
    clientId: string;
    client: ContactInterface;
    realPrice?: number;
    promoCode?: string;
    promoValue?: number;
    pipedriveDealId?: number;
    pipedriveDeal?: any;
    promoType?: "Percentage" | "Fix Price";
    price: number;
    expiredDate?: string;
    deposit: number;
    currency: CurrencyId;
    salesRefId?: string;
    salesRef?: AgentInterface;
    salesRefIds?: string[];
    salesRefs?: AgentInterface[];
    leadSource?: string;
    ownership?: number;
    transactionType: "FRACTIONAL" | "NORMAL" | "PARTIAL";
    paymentStatus?: string;
    paymentType?: string;
    financing?: string;
    note?: string;
    transactionUrl?: string;
}
interface TransactionInterfaceServer extends AuditInterface {
    id: string;
    projectId: string;
    project: mongoose.Types.ObjectId;
    fractionalId?: string;
    fractional?: mongoose.Types.ObjectId;
    fractionalLabel?: string;
    lotId?: string;
    lot?: mongoose.Types.ObjectId;
    lotVarianceId?: string;
    lotVariance?: mongoose.Types.ObjectId;
    lastStatus: TransactionType;
    whiteLabelId?: string;
    whiteLabel?: mongoose.Types.ObjectId;
    whiteLabelDomain: string;
    tenantId?: string;
    tenant: mongoose.Types.ObjectId;
    description?: string;
    clientId: string;
    client: mongoose.Types.ObjectId | ContactInterface;
    realPrice?: number;
    promoCode?: string;
    promoValue?: number;
    promoType?: "Percentage" | "Fix Price";
    price: number;
    expiredDate?: string;
    deposit: number;
    currency: CurrencyId;
    salesRefId?: string;
    salesRef?: mongoose.Types.ObjectId | AgentInterface;
    salesRefIds?: string[];
    salesRefs?: AgentInterface[];
    leadSource?: string;
    ownership?: number;
    transactionType: "FRACTIONAL" | "NORMAL" | "PARTIAL";
    paymentStatus?: string;
    paymentType?: string;
    financing?: string;
    note?: string;
    transactionUrl?: string;
}
interface TransactionDetailInterface extends AuditInterface {
    id: string;
    transactionID: string;
    transaction: TransactionInterface;
    type: TransactionType;
    description?: string;
    expiredDate?: string;
}
interface TransactionDetailInterfaceServer extends AuditInterface {
    id: string;
    transactionID: string;
    transaction: mongoose.Types.ObjectId;
    type: TransactionType;
    description?: string;
    expiredDate?: string;
}

declare type PermissionTypeEnum = "EVERYONE" | "SELECT" | "EXCLUSIVE";
declare type SourceList = "Website" | "Facebook" | "Instagram" | "Phone-in" | "Newspaper" | "Wolk-in" | "Door Knoking" | "Other";
declare type EmployeeType = "Administrator" | "Director" | "Personal Sisten" | "Office Admin" | "Agent Repesentative" | "Property Management" | "Sales Repesentative" | "Inactive";
declare const EmployeeTypeData: string[];
declare type TenantType = "Developer" | "Agency" | "Geonet" | "Aggregator" | "M2" | "Builder";
declare type BlogDisplay = "APPS" | "WEBSITE" | "BOTH";
declare type StatusType = "Active" | "Archived";
declare type EditorState = "ADD" | "DELETE" | "UPDATE" | "VIEW";

interface Cordinat {
    lat: number;
    lng: number;
}
interface CategoryInterface extends AuditInterface {
    name?: string;
    shortDescription?: string;
    description?: string;
    slug?: string;
    parentCategoryId?: string;
    parentCategory?: CategoryInterface;
    bannerURL?: string;
    thumbnailURL?: string;
    status?: StatusType;
}
interface CategoryInterfaceServer extends AuditInterface {
    name?: string;
    shortDescription?: string;
    description?: string;
    slug?: string;
    parentCategoryId?: string;
    parentCategory?: mongoose.Types.ObjectId;
    bannerURL?: string;
    thumbnailURL?: string;
    status?: StatusType;
}
declare const PipeLineFlowData: string[];
declare const SourceListData: string[];
interface GroupRole {
    code: EmployeeType;
    role: string;
    allow: boolean;
}
declare type agentLanguage = "English" | "Bahasa" | "French" | "Mandarin";
declare const agentLanguageOption: string[];
declare const PropertyTypeData: string[];
declare const ProductCategoryData: string[];
declare const SubscribedOptions: string[];
interface MetaDataFileInterface {
    name: string;
    url: string;
    fileType: string;
}
interface AuditInterface {
    _id?: string;
    _ids?: string;
    featured?: boolean;
    hideOnWebsite?: boolean;
    extraFilter?: any;
    keyword?: string;
    order?: number;
    createdAt: string;
    createdBy: string;
    createdByDetail?: AgentInterface;
    updateddAt?: string;
    updatedAt?: string;
    updatedBy?: string;
    updatedByDetail?: AgentInterface;
    archivedAt?: string;
    archivedBy?: string;
    archivedByDetail?: AgentInterface;
    ArchivedAt?: string;
    ArchivedBy?: string;
    ArchivedByDetail?: AgentInterface;
}
interface AuditInterfaceServer {
    _id?: string;
    _ids?: string;
    featured?: boolean;
    hideOnWebsite?: boolean;
    extraFilter?: any;
    keyword?: string;
    order?: number;
    createdAt: string;
    createdBy: string;
    createdByDetail?: mongoose.Types.ObjectId;
    updateddAt?: string;
    updatedAt?: string;
    updatedBy?: string;
    updatedByDetail?: mongoose.Types.ObjectId;
    archivedAt?: string;
    archivedBy?: string;
    archivedByDetail?: AgentInterface;
    ArchivedAt?: string;
    ArchivedBy?: string;
    ArchivedByDetail?: mongoose.Types.ObjectId;
}
interface AuditLogInterface extends AuditInterface {
    type: string;
    data: {
        field: string;
        value: string;
    }[];
    description?: string;
}
interface SearchParamInterface<DATA> {
    id?: string;
    page?: number;
    limit?: number;
    orderBy?: string;
    include?: string;
    order?: "ASC" | "DESC";
    sort?: any;
    filter?: DATA | string;
    select?: string;
    total?: number;
}
interface singgleResponse<DATA> {
    data?: DATA;
    haveError: boolean;
    errorCode?: string;
    errorMessage?: string;
    code?: string;
    message?: string;
}
interface SingleResponse<D> {
    data?: D;
    haveError: boolean;
    errorCode?: string;
    errorMessage?: string;
    code?: string;
    message?: string;
}
interface ListResponse<DATA> {
    total: number;
    page: number;
    limit: number;
    data: DATA[];
    haveError: boolean;
}
interface AddressInterface {
    _id?: string;
    streetAddress: string;
    suburb: string;
    state: string;
    postcode: string;
    country: string;
    location: locationType;
}
interface locationType {
    _id?: string;
    lat: number;
    long: number;
}
interface LocationType {
    _id?: string;
    lat: number;
    long: number;
}
interface ImageThumbnail {
    height: number;
    size: string;
    url: string;
    width: number;
}
interface ImageInterface {
    id: number;
    lastModified: string;
    order: number;
    thumbnails: ImageThumbnail[];
    title: string;
    url: string;
}
interface ProjectTypeInterface extends AuditInterface {
    name: string;
    bannerURL?: string;
    iconURL?: string;
    thumbnailURL?: string;
    slug?: string;
    shortDescription?: string;
    description?: string;
    promotionBanner?: {
        general: string;
        country: {
            [slug: string]: string;
        };
        state: {
            [slug: string]: string;
        };
        suburb: {
            [slug: string]: string;
        };
    };
    byTenants: {
        [tenantId: string]: {
            bannerURL?: string;
            thumbnailURL?: string;
            iconUrl?: string;
            promotionBanner?: {
                general: string;
                country: {
                    [slug: string]: string;
                };
                state: {
                    [slug: string]: string;
                };
                suburb: {
                    [slug: string]: string;
                };
            };
        };
    };
}
interface AddressDetail extends AuditInterface {
    name: string;
    displayName: string;
    bannerURL?: string;
    thumbnailURL?: string;
    iconUrl?: string;
    slug?: string;
    shortDescription?: string;
    description?: string;
    tenantIds?: string[];
    tenants?: TenantInterface[];
}
interface AddressDetailServer extends AuditInterface {
    name: string;
    displayName: string;
    bannerURL?: string;
    thumbnailURL?: string;
    iconUrl?: string;
    slug?: string;
    shortDescription?: string;
    description?: string;
    tenantIds?: string[];
    tenants?: mongoose.Types.ObjectId[];
}
interface CountryInterface extends AddressDetail {
    byTenants: {
        [tenantId: string]: {
            bannerURL?: string;
            thumbnailURL?: string;
            iconUrl?: string;
        };
    };
}
interface StateInterface extends CountryInterface {
    countryId: string;
    country: CountryInterface;
}
interface StateInterfaceServer extends CountryInterface {
    countryId: string;
    country: mongoose.Types.ObjectId;
}
interface RegionInterface extends StateInterface {
    stateId: string;
    state: StateInterface;
}
interface RegionInterfaceServer extends StateInterface {
    stateId: string;
    state: mongoose.Types.ObjectId;
}
interface SuburbInterface extends RegionInterface {
    regionId: string;
    region: RegionInterface;
}
interface SuburbInterfaceServer extends RegionInterface {
    regionId: string;
    region: mongoose.Types.ObjectId;
}
interface SuburbDataReport extends AuditInterface {
    headline: string;
    type: string;
    label: string;
    value: string;
    valueType: "percent" | "money";
    suburbId: string;
    suburb: SuburbInterface;
}
interface SuburbDataReportServer extends AuditInterface {
    headline: string;
    type: string;
    label: string;
    value: string;
    valueType: "percent" | "money";
    suburbId: string;
    suburb: mongoose.Types.ObjectId;
}
interface SuburbDemographic extends AuditInterface {
    label: string;
    icon: string;
    value: string;
    suburbId: string;
    suburb: SuburbInterface;
}
interface SuburbDemographicServer extends AuditInterface {
    label: string;
    icon: string;
    value: string;
    suburbId: string;
    suburb: mongoose.Types.ObjectId;
}
interface SuburbStatistic extends AuditInterface {
    category: string;
    label: string;
    value: number;
    suburbId: string;
    suburb: SuburbInterface;
}
interface SuburbStatisticServer extends AuditInterface {
    category: string;
    label: string;
    value: number;
    suburbId: string;
    suburb: mongoose.Types.ObjectId;
}
interface CurrencyDataInterface {
    _id?: string;
    code: string;
    value: number;
}
interface AuthInterface {
    uid: string;
    token: string;
    sessionTime: string;
}

interface PageInterface extends AuditInterface {
    tenantId: string;
    tenant: TenantInterface;
    slug: string;
    title: string;
    description: string;
    imageUrl: string;
}
interface PageDetailInterface extends AuditInterface {
    pageId: string;
    page: PageInterface;
    templateId: string;
    template: TemplateDesignInterface;
    order: number;
    templateData: string[];
}

declare const MakeId: (length: number) => string;
declare const makeId: (length: number) => string;

interface FormatMoneyInterface {
    num: number;
    currencyCode?: string;
    format?: "en-US";
    minimumFractionDigits?: number;
}
declare const formatMoney: (data: FormatMoneyInterface) => string;

declare const CerateSlug: (str: string) => string;
declare const createSlug: (str: string) => string;

/**
 * Generates a random UUID
 * @param a - The parameter a is a number that is used to generate the UUID. If you don't pass a
 * parameter, the function will generate a random number.
 */
/**
 * Return a new array with the elements of the original array in a random order.
 * @param arr - The array to shuffle.
 */
declare const shuffleArray: (arr: any[]) => any[];
/**
 * It takes an array, converts it to a Set, and then converts it back to an array
 * @param arr - The array to be filtered.
 */
declare const getUniqueArray: (arr: any[]) => any[];
/**
 * If the current element is an array, flatten it, otherwise, add it to the accumulator.
 */
/**
 * Generate a random hex colour code.
 */
declare const generateRandomHexColor: () => string;
/**
* It takes three numbers, one for red, one for green, and one for blue, and returns a hexadecimal
* string representing the color
* @param r - red value
* @param g - The green value of the color.
* @param b - blue
*/
declare const rgbToHex: (r: number, g: number, b: number) => string;
/**
 * It converts a hexadecimal color code to an RGB color code.
 * @param hex - The hexadecimal color code.
 */
declare const hexToRgb: (hex: any) => any;
/**
 * Given an array of numbers, return the average of those numbers.
 */
declare const average: (arr: any[]) => number;
/**
 * It converts a string to camel case.
 */
declare const toCamelCase: (str: string) => string;
/**
 * Replace all words in a string with the first letter capitalized and the rest of the letters
 * lowercase.
 */
declare const toTitleCase: (str: string) => string;
/**
 * Replace all whitespace characters with underscores and convert the string to lowercase.
 */
declare const toSnakeCase: (str: string) => string;

export { AdditionalInformation, AdditionalInformationContact, AdditionalInformationContactServer, AdditionalOption, AddressDetail, AddressDetailServer, AddressInterface, AgentInterface, AgentInterfaceServer, AppraisalInterface, AuditInterface, AuditInterfaceServer, AuditLogInterface, AuthInterface, AuthorityType, BlogDisplay, BlogInterface, CategoryInterface, CategoryInterfaceServer, CerateSlug, ContactInterface, ContactInterfaceServer, Cordinat, CountryInterface, CurrencyDataInterface, CurrencyId, CurrencyIdOptions, CustomRelationshipManagement, DataStoredInToken, EditorState, EmployeeType, EmployeeTypeData, FooterDataInterface, FooterSectionInterface, GdriveMetaData, GooglePlacesInterface, GroupAccessContex, GroupAccessContexServer, GroupAccessInterface, GroupAccessInterfaceServer, GroupInterface, GroupRole, ImageInterface, ImageThumbnail, IndustryReportInterface, LeadsInterface, ListResponse, ListingInterface, ListingParam, ListingStatus, ListingType, LocationType, LotVariancesInterface, LotVariancesInterfaceServer, MakeId, MarketingStatusType, MenuType, MetaDataFileInterface, NavbarDataInterface, NotificationInterface, NotificationType, OfficesInterface, OfficesInterfaceServer, OrederBy, PageDetailInterface, PageInterface, PaymentGatewayOption, PaymentGatewayType, PermissionTypeEnum, PipeLineFlowData, ProductCategoryData, ProjectDesignInterface, ProjectDesignInterfaceServer, ProjectDriveIntegration, ProjectFacadeInterface, ProjectGooglePlacesInterface, ProjectImageFileAndOtherInfo, ProjectImageFileAndOtherInfoServer, ProjectInterface, ProjectInterfaceServer, ProjectLotInterface, ProjectLotInterfaceServer, ProjectLotMainInformation, ProjectLotMainInformationServer, ProjectLotVarianceInterface, ProjectLotVarianceInterfaceServer, ProjectMainInformation, ProjectMainInformationServer, ProjectRequestInterface, ProjectRequestInterfaceServer, ProjectStatus, ProjectStatusOptions, ProjectStatusType, ProjectStatusTypeOptions, ProjectSummaryInterface, ProjectTripadvisorInterface, ProjectType, ProjectTypeInterface, PropectSearchParams, PropertyCategory, PropertyType, PropertyTypeData, ProspectInterface, RegionInterface, RegionInterfaceServer, RentalRevenueEstimateInterface, SearchParamInterface, SingleResponse, SocialMediaInterface, SocialMediaName, SocialMediaNameType, SourceList, SourceListData, StateInterface, StateInterfaceServer, StatusType, SubscribedOptions, SuburbDataReport, SuburbDataReportServer, SuburbDemographic, SuburbDemographicServer, SuburbInterface, SuburbInterfaceServer, SuburbStatistic, SuburbStatisticServer, TAAddress, TAAncestor, TAAward, TALocalize, TALocation, TARankingData, TemplateDesignInterface, TemplateType, TemplateTypeData, TenantAggregatorRequestInterface, TenantAggregatorRequestInterfaceServer, TenantAggregatorRequestType, TenantExcludeProjectInterface, TenantInterface, TenantInterfaceServer, TenantPackageInterface, TenantProjectInterface, TenantProjectInterfaceServer, TenantType, TestimonialInterface, TestimonialInterfaceServer, TokenData, TransactionCategory, TransactionDetailInterface, TransactionDetailInterfaceServer, TransactionInterface, TransactionInterfaceServer, TransactionType, UserInterface, UserInterfaceServer, UserWishlistInterface, UserWishlistInterfaceServer, WhiteLabelInterface, WhiteLabelInterfaceServer, WhiteLabelPaymentGatewayInterface, WhiteLabelPaymentGatewayInterfaceServer, WhitelabelTemplateInterface, WhitelabelTemplateInterfaceServer, agentLanguage, agentLanguageOption, average, createSlug, formatMoney, generateRandomHexColor, getUniqueArray, hexToRgb, locationType, makeId, rgbToHex, shuffleArray, singgleResponse, toCamelCase, toSnakeCase, toTitleCase };
