import {z} from 'zod' export type PropertyDescriptionUpdateAttributes = {full_description?: (string | null) | undefined, short_description?: (string | null) | undefined, location_summary?: (string | null) | undefined, full_description_lettings?: (string | null) | undefined, short_description_lettings?: (string | null) | undefined, location_summary_lettings?: (string | null) | undefined, virtual_tour?: (string | null) | undefined, property_urls?: (Array<{title: string, type: 'image' | 'floor_plan' | 'brochure' | 'virtual_tour' | 'audio_tour' | 'ipack', url: string}> | null) | undefined}; export type PatchApiPropertiesPropertyIdArgs = {body: {data: {type?: 'property' | undefined, id?: string | undefined, attributes?: PropertyDescriptionUpdateAttributes | undefined}}}; export type PatchApiPropertiesPropertyIdOptions = {baseUrl?: string | undefined, yourApiToken?: string | undefined, fetch?: typeof fetch | undefined}; export const addressSimple = z.object({single_line: z.string().optional(), anon_single_line: z.string().optional(), building_number: z.string().nullable().optional(), building_name: z.string().nullable().optional(), street: z.string().nullable().optional(), line_1: z.string().optional(), line_2: z.string().nullable().optional(), line_3: z.string().nullable().optional(), line_4: z.string().nullable().optional(), town: z.string().nullable().optional(), country: z.string().optional(), postcode: z.string().optional(), udprn: z.string().nullable().optional(), geo: z.object({lat: z.number().nullable().optional(), lng: z.number().nullable().optional()}).optional(), royal_mail: z.object({postcode: z.string().optional(), post_town: z.string().optional(), thoroughfare: z.string().optional(), building_name: z.string().nullable().optional(), building_number: z.string().nullable().optional(), department_name: z.string().nullable().optional(), organisation_name: z.string().nullable().optional(), sub_building_name: z.string().nullable().optional(), dependent_locality: z.string().nullable().optional(), dependent_thoroughfare: z.string().nullable().optional(), double_dependent_locality: z.string().nullable().optional()}).nullable().optional(), street_group_property_id: z.string().nullable().optional()}); export const meta = z.object({}); export const link = z.union([z.string(), z.object({href: z.string(), meta: meta.optional()})]); export const property = z.object({id: z.string().optional(), type: z.literal("property").optional(), attributes: z.object({is_sales: z.boolean().optional(), is_lettings: z.boolean().optional(), company_owned: z.boolean().optional(), is_commercial: z.boolean().optional(), is_residential: z.boolean().optional(), address: addressSimple.optional(), inline_address: z.string().optional(), public_address: z.string().optional(), status: z.enum(["Not On The Market", "Valuation Lost", "Valuation Booked", "Provisional Valuation Booked", "Valuation Pending", "Valuation Cancelled", "Valuation Completed", "Instructed", "For Sale", "Under Offer", "Sold STC", "Exchanged", "Let", "To Let", "Let Agreed", "For Sale and To Let", "Withdrawn Sales", "Withdrawn Lettings", "Withdrawn Sales And Lettings", "Completed"]).optional(), bedrooms: z.number().int().optional(), bathrooms: z.number().int().optional(), receptions: z.number().int().optional(), floor_area: z.string().nullable().optional(), plot_area: z.string().nullable().optional(), land_area: z.string().nullable().optional(), full_description: z.string().nullable().optional(), short_description: z.string().nullable().optional(), location_summary: z.string().nullable().optional(), full_description_lettings: z.string().nullable().optional(), short_description_lettings: z.string().nullable().optional(), location_summary_lettings: z.string().nullable().optional(), property_type: z.string().optional(), property_style: z.string().optional(), property_age_bracket: z.string().optional(), construction_year: z.union([z.string(), z.number().int()]).nullable().optional(), is_listed_building: z.boolean().nullable().optional(), is_conservation_area: z.boolean().nullable().optional(), tenure: z.string().optional(), tenure_notes: z.string().nullable().optional(), lease_expiry_year: z.string().nullable().optional(), lease_expiry_date: z.string().nullable().optional(), lease_start_date: z.string().nullable().optional(), lease_term_years: z.number().int().nullable().optional(), display_property_style: z.string().optional(), work_required: z.boolean().optional(), heating_system: z.string().optional(), council_tax_band: z.string().optional(), council_tax_cost: z.number().int().nullable().optional(), local_authority: z.string().nullable().optional(), service_charge: z.number().int().optional(), service_charge_period: z.string().optional(), service_charge_notes: z.string().nullable().optional(), ground_rent: z.number().int().nullable().optional(), ground_rent_period: z.string().optional(), ground_rent_review_period_years: z.number().int().nullable().optional(), ground_rent_uplift: z.number().int().nullable().optional(), ground_rent_expiry: z.string().nullable().optional(), has_outdoor_space: z.boolean().nullable().optional(), shared_ownership: z.boolean().optional(), shared_ownership_notes: z.string().nullable().optional(), shared_ownership_rent: z.number().int().nullable().optional(), shared_ownership_rent_frequency: z.string().nullable().optional(), shared_ownership_percentage_sold: z.number().int().nullable().optional(), tags: z.array(z.object({name: z.string().optional(), slug: z.string().optional(), order: z.number().optional()})).optional(), features: z.array(z.object({id: z.string().optional(), name: z.string().optional(), order: z.number().optional(), include_on_portals: z.boolean().optional(), highlight: z.boolean().optional()})).optional(), material_information: z.object({council_tax_band: z.string().max(1).nullable().optional(), lease_expiry_date: z.string().nullable().optional(), lease_start_date: z.string().nullable().optional(), lease_term_years: z.number().int().nullable().optional(), ground_rent_pence: z.number().int().nullable().optional(), ground_rent_period: z.string().nullable().optional(), ground_rent_expiry: z.string().nullable().optional(), ground_rent_review_period_years: z.number().int().nullable().optional(), ground_rent_uplift: z.number().int().nullable().optional(), service_charge_pence: z.number().int().nullable().optional(), service_charge_period: z.string().nullable().optional(), service_charge_notes: z.string().nullable().optional(), water_supply: z.array(z.enum(["direct_main_waters", "wells", "boreholes", "springs", "other"])).nullable().optional(), water_supply_other: z.string().nullable().optional(), electricity_supply: z.array(z.enum(["national_grid", "wind_turbine", "solar_panels", "generator", "other"])).nullable().optional(), electricity_supply_other: z.string().nullable().optional(), sewerage: z.array(z.enum(["standard", "septic_tank", "sewage_treatment_plants", "cesspit", "cesspool", "other"])).nullable().optional(), sewerage_other: z.string().nullable().optional(), heating_supply: z.array(z.enum(["electric_central", "gas_central", "gas_other", "communal_heating", "lpg_central", "wood_burner", "biomass_boiler", "solar_panels", "heat_pump", "other"])).nullable().optional(), heating_supply_other: z.string().nullable().optional(), heating_system: z.string().nullable().optional(), broadband: z.enum(["adsl", "cable", "fttc", "fttp", "null"]).nullable().optional(), has_restrictions: z.boolean().nullable().optional(), has_required_access: z.boolean().nullable().optional(), public_right_of_way: z.boolean().nullable().optional(), flood_risk: z.boolean().nullable().optional(), sources_of_flooding: z.array(z.string()).nullable().optional(), sources_of_flooding_other: z.string().nullable().optional(), has_flood_defences: z.boolean().nullable().optional(), has_flooded_in_last_five_years: z.boolean().nullable().optional(), adaptations_list: z.array(z.unknown()).nullable().optional(), adaptations_other: z.string().nullable().optional()}).optional(), viewing_booking_url: z.string().nullable().optional(), last_instructed_sales_at: z.string().nullable().optional(), last_instructed_lettings_at: z.string().nullable().optional(), last_made_available_for_sale_at: z.string().nullable().optional(), last_made_available_to_let_at: z.string().nullable().optional(), last_exchanged_at: z.string().nullable().optional(), last_completed_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), custom_meta_data: z.union([z.object({}), z.array(z.unknown())]).optional(), lead_source: z.string().nullable().optional(), publish_after: z.string().nullable().optional(), archived_at: z.string().nullable().optional(), virtual_tour: z.string().nullable().optional(), property_urls: z.array(z.object({title: z.string(), type: z.enum(["image", "floor_plan", "brochure", "virtual_tour", "audio_tour", "ipack"]), url: z.string().max(2048)})).nullable().optional()}).optional(), relationships: z.object({branch: z.object({data: z.object({type: z.literal("branch"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), owner: z.object({data: z.object({type: z.literal("owner"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), media: z.object({data: z.array(z.object({type: z.literal("media").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), floorplans: z.object({data: z.array(z.object({type: z.literal("floorplan").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), rooms: z.object({data: z.array(z.object({type: z.literal("room").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), epc: z.object({data: z.object({type: z.literal("epc"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), brochure: z.object({data: z.object({type: z.literal("brochure"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), outsideSpaces: z.object({data: z.array(z.object({type: z.literal("outside_space").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), parking: z.object({data: z.array(z.object({type: z.literal("parking").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), viewings: z.object({data: z.array(z.object({type: z.literal("viewing").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), valuations: z.object({data: z.array(z.object({type: z.literal("valuation").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), notes: z.object({data: z.array(z.object({type: z.literal("note").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), negotiator: z.object({data: z.object({type: z.literal("negotiator"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), followUp: z.object({data: z.object({type: z.literal("follow_up"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), sales: z.object({data: z.array(z.object({type: z.literal("sale").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), salesListing: z.object({data: z.object({type: z.literal("sales_listing"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), lettingsListing: z.object({data: z.object({type: z.literal("lettings_listing"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), interestedApplicants: z.object({data: z.array(z.object({type: z.literal("interested_applicant").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), propertyKeys: z.object({data: z.array(z.object({type: z.literal("property_key").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional()}).optional()}); export const includedBranch = z.object({type: z.literal("branch"), id: z.string(), attributes: z.object({address: addressSimple.optional(), name: z.string().optional(), public_name: z.string().nullable().optional(), email_address: z.string().optional(), telephone: z.string().optional(), website: z.string().nullable().optional(), about_branch_copy: z.string().nullable().optional(), disclaimer: z.string().nullable().optional(), matching_links_to_website: z.boolean().nullable().optional(), matching_url_pattern: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedOwner = z.object({type: z.literal("owner"), id: z.string(), attributes: z.object({is_company: z.boolean().optional(), contact_name: z.string().optional(), contact_address: addressSimple.nullable().optional(), contact_telephone_number: z.string().nullable().optional(), contact_email_address: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({people: z.object({data: z.array(z.object({type: z.literal("person").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional(), company: z.object({data: z.object({type: z.literal("company"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional()}).nullable().optional(), meta: meta.optional()}); export const includedMedia = z.object({type: z.string(), id: z.string(), attributes: z.union([z.object({name: z.string().optional(), order: z.number().int().optional(), is_featured: z.boolean().nullable().optional(), include_in_listing: z.boolean().nullable().optional(), feature_index: z.number().int().nullable().optional(), title: z.string().nullable().optional(), collection: z.string().optional(), media_type: z.literal("image").optional(), url: z.string().optional()}), z.object({name: z.string().optional(), order: z.number().int().optional(), is_featured: z.boolean().nullable().optional(), include_in_listing: z.boolean().nullable().optional(), feature_index: z.number().int().nullable().optional(), title: z.string().nullable().optional(), collection: z.string().optional(), media_type: z.literal("pdf"), url: z.string().optional()})]).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedFloorplan = z.object({type: z.literal("floorplan"), id: z.string(), attributes: z.object({url: z.string().optional(), urls: z.array(z.string()).optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedEpc = z.object({type: z.literal("epc"), id: z.string(), attributes: z.object({energy_efficiency_rating: z.string().optional(), environmental_impact_rating: z.string().optional(), energy_efficiency_current: z.string().optional(), energy_efficiency_potential: z.string().optional(), environment_impact_current: z.string().optional(), environment_impact_potential: z.string().optional(), media: z.object({image: z.string().nullable().optional()}).nullable().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedRoom = z.object({type: z.literal("room"), id: z.string(), attributes: z.object({room_type: z.string().optional(), name: z.string().optional(), width: z.number().int().nullable().optional(), length: z.number().int().nullable().optional(), formatted_dimensions: z.string().nullable().optional(), description: z.string().nullable().optional(), order: z.number().int().optional()}).optional(), relationships: z.object({media: z.object({data: z.array(z.object({type: z.literal("media").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional()}).nullable().optional(), meta: meta.optional()}); export const includedBrochure = z.object({type: z.literal("brochure"), id: z.string(), attributes: z.object({name: z.string().optional(), url: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedParking = z.object({type: z.literal("parking_space"), id: z.string(), attributes: z.object({include_in_listing: z.boolean().nullable().optional(), parking_space_type: z.enum(["Garage", "Car Port", "Off Road", "On Road", "Permit", "Secure Gated", "Allocated Parking", "On Drive"]).optional(), capacity: z.number().nullable().optional(), description: z.string().nullable().optional()}).optional(), relationships: z.object({media: z.object({data: z.array(z.object({type: z.literal("media").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional()}).nullable().optional(), meta: meta.optional()}); export const includedOutsideSpace = z.object({type: z.literal("outside_space"), id: z.string(), attributes: z.object({space_type: z.enum(["Garden", "Front Garden", "Rear Garden", "Communal Garden", "Yard", "Roof Terrace", "Balcony"]).optional(), type: z.enum(["Garden", "Front Garden", "Rear Garden", "Communal Garden", "Yard", "Roof Terrace", "Balcony"]).optional(), description: z.string().nullable().optional(), width: z.number().int().nullable().optional(), length: z.number().int().nullable().optional(), area: z.number().int().nullable().optional(), orientation: z.enum(["N", "NE", "E", "SE", "SW", "W", "NW"]).nullable().optional()}).optional(), relationships: z.object({media: z.object({data: z.array(z.object({type: z.literal("media").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional()}).nullable().optional(), meta: meta.optional()}); export const includedViewing = z.object({type: z.literal("viewing"), id: z.string(), attributes: z.object({viewing_type: z.enum(["sales", "lettings"]).optional(), type: z.enum(["sales", "lettings"]).optional(), address: addressSimple.optional(), start: z.string().nullable().optional(), end: z.string().nullable().optional(), unaccompanied: z.boolean().optional(), agent_confirmed: z.boolean().optional(), occupant_confirmed: z.boolean().optional(), applicant_confirmed: z.boolean().optional(), provisional: z.boolean().optional(), occupant_type: z.enum(["By Tenants", "By Owner", "Vacant", "Unknown", "null"]).nullable().optional(), status: z.enum(["unconfirmed", "rejected", "confirmed", "cancelled", "completed", "missed"]).optional(), no_show: z.boolean().optional(), cancelled_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedValuation = z.object({type: z.literal("valuation"), id: z.string(), attributes: z.object({address: addressSimple.optional(), start: z.string().nullable().optional(), end: z.string().nullable().optional(), lead_source: z.string().nullable().optional(), valuation_type: z.enum(["sales", "lettings", "sales_and_lettings"]).optional(), type: z.enum(["sales", "lettings", "sales_and_lettings"]).optional(), years_owned: z.number().int().nullable().optional(), work_done: z.array(z.string()).optional(), desired_move_timeframe: z.string().nullable().optional(), move_reason: z.string().nullable().optional(), status: z.string().optional(), custom_status: z.string().nullable().optional(), custom_status_id: z.string().nullable().optional(), cancelled_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedNotes = z.object({type: z.literal("note"), id: z.string(), attributes: z.object({body: z.string().nullable().optional(), author: z.string().nullable().optional(), pinned_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedNegotiator = z.object({type: z.literal("negotiator"), id: z.string(), attributes: z.object({first_name: z.string().optional(), last_name: z.string().optional(), job_title: z.string().nullable().optional(), telephone_number: z.string().nullable().optional(), mobile_number: z.string().nullable().optional(), email_address: z.string().optional(), deactivated_at: z.string().nullable().optional(), deleted_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedFollowUp = z.object({type: z.literal("follow_up"), id: z.string(), attributes: z.object({subject_id: z.string().nullable().optional(), subject_type: z.enum(["property", "lettingsApplicant", "salesApplicant", "sale", "valuation", "viewing", "null"]).nullable().optional(), due_date: z.string().nullable().optional(), note: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedSale = z.object({type: z.literal("sale"), id: z.string(), attributes: z.object({address: addressSimple.optional(), status: z.enum(["Completed", "Fallen Through", "Offer Accepted", "Exchanged", "Under Offer"]).optional(), sale_price: z.number().optional(), dates: z.object({offer_accepted_date: z.string().nullable().optional(), expected_exchange_date: z.string().nullable().optional(), exchanged_date: z.string().nullable().optional(), expected_completion_date: z.string().nullable().optional(), completed_date: z.string().nullable().optional()}).optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedSalesListing = z.object({type: z.literal("sales_listing"), id: z.string(), attributes: z.object({brand_id: z.string().optional(), personal_interest_disclosure: z.string().nullable().optional(), price_qualifier: z.enum(["None", "In Excess of", "Prices From", "Guide Price", "Offers Over", "Offers in Region of", "Fixed Price", "Price On Application", "Part Buy, Part Rent", "null"]).nullable().optional(), archived: z.boolean().optional(), is_low_profile: z.boolean().optional(), is_not_in_property_feed_api: z.boolean().optional(), spectre_social_campaigns: z.boolean().optional(), spectre_email_campaigns: z.boolean().optional(), is_auction: z.boolean().optional(), new_home: z.boolean().optional(), retirement: z.boolean().optional(), full_description: z.string().nullable().optional(), short_description: z.string().nullable().optional(), location_summary: z.string().nullable().optional(), has_parking: z.boolean().nullable().optional(), virtual_tour: z.string().nullable().optional(), price: z.number().int().optional(), status: z.enum(["For Sale", "Sold STC", "Withdrawn", "Under Offer"]).optional(), marketing_status: z.enum(["For Sale", "Sold STC", "Withdrawn", "Under Offer"]).optional(), made_available_for_sale_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), deleted_at: z.string().nullable().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedLettingsListing = z.object({type: z.literal("lettings_listing"), id: z.string(), attributes: z.object({brand_id: z.string().optional(), price_pcm: z.number().int().optional(), deposit: z.number().int().optional(), let_type: z.string().optional(), allows_pets: z.boolean().optional(), available_from: z.string().optional(), furnished: z.boolean().optional(), is_student_rental: z.boolean().optional(), is_shared_accommodation: z.boolean().optional(), min_tenancy_period: z.string().optional(), archived: z.boolean().optional(), is_low_profile: z.boolean().optional(), is_not_in_property_feed_api: z.boolean().optional(), spectre_social_campaigns: z.boolean().optional(), spectre_email_campaigns: z.boolean().optional(), full_description: z.string().optional(), short_description: z.string().optional(), location_summary: z.string().optional(), has_parking: z.boolean().optional(), virtual_tour: z.string().optional(), status: z.string().optional(), made_available_to_let_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), deleted_at: z.string().nullable().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedSalesOffer = z.object({type: z.literal("sales_offer"), id: z.string(), attributes: z.object({address: addressSimple.optional(), offer_amount: z.number().optional(), offer_made_at: z.string().optional(), notes: z.string().nullable().optional(), status: z.enum(["Pending", "Relayed to Vendor", "Accepted", "Rejected", "Withdrawn"]).optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedLettingsOffer = z.object({type: z.literal("lettings_offer"), id: z.string(), attributes: z.object({address: addressSimple.optional(), desired_tenancy_length: z.number().int().optional(), desired_move_in_date: z.string().optional(), rent_amount: z.number().int().optional(), rent_frequency: z.enum(["Per Week", "Per 2 Weeks", "Per 4 Weeks", "Per Calendar Month", "Per Quarter", "Per 6 Months", "Per Annum"]).optional(), tenants_under_18: z.number().int().optional(), pets: z.boolean().optional(), smokers: z.boolean().optional(), status: z.enum(["Pending", "Relayed To Owner", "Rejected", "Accepted", "Withdrawn"]).optional(), deleted_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedLettingsApplication = z.object({type: z.literal("lettings_application"), id: z.string(), attributes: z.object({application_status: z.enum(["successful", "unsuccessful", "in_progress", "pending", "cancelled"]).optional(), desired_tenancy_length: z.number().int().optional(), desired_move_in_date: z.string().optional(), completed_at: z.string().nullable().optional(), agreed_move_in_date: z.string().nullable().optional(), price: z.number().int().optional(), price_frequency: z.enum(["Per Week", "Per 2 Weeks", "Per 4 Weeks", "Per Calendar Month", "Per Quarter", "Per 6 Months", "Per Annum"]).optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedSafetyCertificate = z.object({type: z.literal("safetyCertificate"), id: z.string(), attributes: z.object({media: z.object({document: z.string().optional()}).optional(), certificate_type: z.enum(["additional_licensing", "air_source_heat_pump_servicing", "alarm_service", "asbestos_check", "automated_gates", "boiler_service", "building_compliance", "building_insurance", "carbon_monoxide", "chimney_sweep", "damp_proofing", "eic", "electric", "fire_detection", "fire_door_assesment", "fire_equipment", "gas", "health", "heat_recovery_system", "hmo_license", "homecare_plan", "landlord_registration", "lead_water_testing", "legion", "lighting_safety", "oil_safety_check", "pat", "piv_servicing", "remcon_service", "rent_guarantee_insurance", "rent_smart_wales_registered", "residential_dwelling_license", "risk", "saniflow_service_and_descaler", "selective_license", "smoke_alarm", "smoke_ventilation_system_service_aov", "sprinkler_system", "sump_pump_service", "tree_management", "tv_license", "velux_window_service"]).optional(), type: z.enum(["additional_licensing", "air_source_heat_pump_servicing", "alarm_service", "asbestos_check", "automated_gates", "boiler_service", "building_compliance", "building_insurance", "carbon_monoxide", "chimney_sweep", "damp_proofing", "eic", "electric", "fire_detection", "fire_door_assesment", "fire_equipment", "gas", "health", "heat_recovery_system", "hmo_license", "homecare_plan", "landlord_registration", "lead_water_testing", "legion", "lighting_safety", "oil_safety_check", "pat", "piv_servicing", "remcon_service", "rent_guarantee_insurance", "rent_smart_wales_registered", "residential_dwelling_license", "risk", "saniflow_service_and_descaler", "selective_license", "smoke_alarm", "smoke_ventilation_system_service_aov", "sprinkler_system", "sump_pump_service", "tree_management", "tv_license", "velux_window_service"]).optional(), notes: z.string().nullable().optional(), valid_from: z.string().nullable().optional(), valid_to: z.string().optional(), reminder_at: z.string().nullable().optional(), renewed_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const applicantPreferenceChoice = z.enum(["Strong Preference", "Don't Mind", "Would Prefer", "Won't Consider", "Might Consider", "Must Have"]); export const includedApplicant = z.object({type: z.literal("applicant"), id: z.string(), attributes: z.object({applicant_type: z.enum(["sales", "lettings"]).optional(), name: z.string().optional(), financial_position: z.string().nullable().optional(), buying_position: z.string().optional(), letting_position: z.enum(["Homeowner", "Renting", "Living with Family", "Selling", "Other", "null"]).nullable().optional(), requirements: z.object({min_price: z.number().int().nullable().optional(), max_price: z.number().int().nullable().optional(), min_bedrooms: z.number().int().gte(1).nullable().optional(), preferred_bedrooms: z.number().int().gte(1).nullable().optional(), desired_move_in_date: z.string().nullable().optional(), desired_tenancy_period: z.number().int().nullable().optional(), furnished: z.boolean().nullable().optional(), pets_allowed: z.boolean().nullable().optional(), outside_space: applicantPreferenceChoice.nullable().optional(), min_land_area: z.number().int().nullable().optional(), garage: applicantPreferenceChoice.nullable().optional(), new_build: applicantPreferenceChoice.nullable().optional(), retirement_property: applicantPreferenceChoice.nullable().optional(), min_parking: z.number().int().nullable().optional(), preferred_parking: z.number().int().nullable().optional(), property_type_preference: z.record(z.string(), applicantPreferenceChoice).optional(), new_property_type_preference: z.record(z.string(), applicantPreferenceChoice).optional(), areas: z.array(z.string()).optional()}).optional(), active: z.boolean().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), lead_rating: z.enum(["hot", "warm", "cold", "null"]).nullable().optional()}).optional(), relationships: z.object({people: z.object({data: z.array(z.object({type: z.literal("person").optional(), id: z.string().optional()})).optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional()}).nullable().optional(), meta: meta.optional()}); export const includedInterestedApplicant = z.object({type: z.literal("interested_applicant"), id: z.string(), attributes: z.object({deleted_at: z.string().nullable().optional(), created_at: z.string().optional(), updated_at: z.string().optional()}).optional(), relationships: z.object({applicant: z.object({data: z.object({type: z.literal("applicant"), id: z.string()}).nullable().optional(), links: z.object({self: link.optional(), related: link.optional()}).optional()}).optional()}).nullable().optional(), meta: meta.optional()}); export const includedPropertyKey = z.object({type: z.literal("property_key"), id: z.string(), attributes: z.object({ident: z.string().optional(), description: z.string().nullable().optional(), status: z.enum(["Checked In", "Checked Out"]).optional(), created_at: z.string().optional(), updated_at: z.string().optional(), deleted_at: z.string().nullable().optional()}).optional(), relationships: z.object({}).nullable().optional(), meta: meta.optional()}); export const includedLinks = z.object({self: link.optional(), related: link.optional()}); export const jsonApi = z.object({version: z.string().optional(), meta: meta.optional()}); export const patchApiPropertiesPropertyIdResponse = z.object({data: property.optional(), included: z.array(z.union([includedBranch, includedOwner, includedMedia, includedFloorplan, includedEpc, includedRoom, includedBrochure, includedParking, includedOutsideSpace, includedViewing, includedValuation, includedNotes, includedNegotiator, includedFollowUp, includedSale, includedSalesListing, includedLettingsListing, includedSalesOffer, includedLettingsOffer, includedLettingsApplication, includedSafetyCertificate, includedApplicant, includedInterestedApplicant, includedPropertyKey])).optional(), links: includedLinks.optional(), meta: z.object({}).optional(), jsonapi: jsonApi.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Patch Property details * * PATCH /properties/{property_id} */ export const patchApiPropertiesPropertyId = async (args: PatchApiPropertiesPropertyIdArgs, options?: PatchApiPropertiesPropertyIdOptions) => { const {baseUrl = "https://street.co.uk/open-api/v1", fetch: fetchFn = fetch, yourApiToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/vnd.api+json") headers.set('accept', "application/vnd.api+json") if (yourApiToken !== undefined) headers.set('authorization', `Bearer ${yourApiToken}`) const url = `${baseUrl.replace(/\/+$/, '')}/properties/${encodeURIComponent(String(args.property_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PATCH", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(patchApiPropertiesPropertyIdResponse, await res.json()) };