Platform Subscription API

<back to all web services

SaveContact

Inserts or Updates a contact and its details and roles.

Requires Authentication
import 'package:servicestack/servicestack.dart';
import 'dart:typed_data';

class RuleValidationResult implements IConvertible
{
    String? RuleCode;
    String? Message;
    String? Key;
    String? Tag;
    String? ErrorCode;

    RuleValidationResult({this.RuleCode,this.Message,this.Key,this.Tag,this.ErrorCode});
    RuleValidationResult.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        RuleCode = json['RuleCode'];
        Message = json['Message'];
        Key = json['Key'];
        Tag = json['Tag'];
        ErrorCode = json['ErrorCode'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'RuleCode': RuleCode,
        'Message': Message,
        'Key': Key,
        'Tag': Tag,
        'ErrorCode': ErrorCode
    };

    getTypeName() => "RuleValidationResult";
    TypeContext? context = _ctx;
}

class ValidationErrorList implements IConvertible
{
    List<RuleValidationResult>? ValidationErrors;

    ValidationErrorList({this.ValidationErrors});
    ValidationErrorList.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ValidationErrors = JsonConverters.fromJson(json['ValidationErrors'],'List<RuleValidationResult>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ValidationErrors': JsonConverters.toJson(ValidationErrors,'List<RuleValidationResult>',context!)
    };

    getTypeName() => "ValidationErrorList";
    TypeContext? context = _ctx;
}

class ContactRole implements IConvertible
{
    /**
    * Guid of the Role List Item object within Eros.
    */
    // @ApiMember(DataType="Guid", Description="Guid of the Role List Item object within Eros.", IsRequired=true, Name="RoleId", ParameterType="query")
    String? RoleId;

    /**
    * The unique key that represents the role type on the external system.
    */
    // @ApiMember(DataType="string", Description="The unique key that represents the role type on the external system.", Name="AlternateKey", ParameterType="query")
    String? AlternateKey;

    ContactRole({this.RoleId,this.AlternateKey});
    ContactRole.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        RoleId = json['RoleId'];
        AlternateKey = json['AlternateKey'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'RoleId': RoleId,
        'AlternateKey': AlternateKey
    };

    getTypeName() => "ContactRole";
    TypeContext? context = _ctx;
}

class LocationCoordinatesModel implements IConvertible
{
    /**
    * The latitude of an address - geographic coordinates specifying the north-south position of a point on the Earth's surface.
    */
    // @ApiMember(DataType="Double?", Description="The latitude of an address - geographic coordinates specifying the north-south position of a point on the Earth's surface.", IsRequired=true, Name="Latitude", ParameterType="query")
    double? Latitude;

    /**
    * The longitude of an address - geographic coordinates specifying the east-west position of a point on the Earth's surface.
    */
    // @ApiMember(DataType="Double?", Description="The longitude of an address - geographic coordinates specifying the east-west position of a point on the Earth's surface.", IsRequired=true, Name="Longitude", ParameterType="query")
    double? Longitude;

    /**
    * The altitude of an address - the altitude above sea level.
    */
    // @ApiMember(DataType="Double?", Description="The altitude of an address - the altitude above sea level.", Name="Altitude", ParameterType="query")
    double? Altitude;

    /**
    * Accuracy of the latitude and longitude.
    */
    // @ApiMember(DataType="Double?", Description="Accuracy of the latitude and longitude.", Name="Accuracy", ParameterType="query")
    double? Accuracy;

    /**
    * Accurancy of the Altitude.
    */
    // @ApiMember(DataType="Double?", Description="Accurancy of the Altitude.", Name="AltitudeAccuracy", ParameterType="query")
    double? AltitudeAccuracy;

    /**
    * Direction you are heading.
    */
    // @ApiMember(DataType="Double?", Description="Direction you are heading.", Name="Heading", ParameterType="query")
    double? Heading;

    /**
    * Speed you are going.
    */
    // @ApiMember(DataType="Double?", Description="Speed you are going.", Name="Speed", ParameterType="query")
    double? Speed;

    /**
    * Speed your altitude is ascending/descending at.
    */
    // @ApiMember(DataType="Double?", Description="Speed your altitude is ascending/descending at.", Name="VerticalSpeed", ParameterType="query")
    double? VerticalSpeed;

    LocationCoordinatesModel({this.Latitude,this.Longitude,this.Altitude,this.Accuracy,this.AltitudeAccuracy,this.Heading,this.Speed,this.VerticalSpeed});
    LocationCoordinatesModel.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Latitude = JsonConverters.toDouble(json['Latitude']);
        Longitude = JsonConverters.toDouble(json['Longitude']);
        Altitude = JsonConverters.toDouble(json['Altitude']);
        Accuracy = JsonConverters.toDouble(json['Accuracy']);
        AltitudeAccuracy = JsonConverters.toDouble(json['AltitudeAccuracy']);
        Heading = JsonConverters.toDouble(json['Heading']);
        Speed = JsonConverters.toDouble(json['Speed']);
        VerticalSpeed = JsonConverters.toDouble(json['VerticalSpeed']);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Latitude': Latitude,
        'Longitude': Longitude,
        'Altitude': Altitude,
        'Accuracy': Accuracy,
        'AltitudeAccuracy': AltitudeAccuracy,
        'Heading': Heading,
        'Speed': Speed,
        'VerticalSpeed': VerticalSpeed
    };

    getTypeName() => "LocationCoordinatesModel";
    TypeContext? context = _ctx;
}

class AddressModel implements IConvertible
{
    /**
    * The distance between this project and another specified set of gps coordinates.
    */
    // @ApiMember(DataType="double", Description="The distance between this project and another specified set of gps coordinates.", Name="DistanceAway", ParameterType="query")
    double? DistanceAway;

    /**
    * The latitude of an address - geographic coordinates specifying the north-south position of a point on the Earth's surface.
    */
    // @ApiMember(DataType="Double?", Description="The latitude of an address - geographic coordinates specifying the north-south position of a point on the Earth's surface.", IsRequired=true, Name="Latitude", ParameterType="query")
    double? Latitude;

    /**
    * The longitude of an address - geographic coordinates specifying the east-west position of a point on the Earth's surface.
    */
    // @ApiMember(DataType="Double?", Description="The longitude of an address - geographic coordinates specifying the east-west position of a point on the Earth's surface.", IsRequired=true, Name="Longitude", ParameterType="query")
    double? Longitude;

    /**
    * Address Format Id Guid - this will be determined by the service.
    */
    // @ApiMember(DataType="Guid", Description="Address Format Id Guid - this will be determined by the service.", Name="AddressFormatId", ParameterType="query")
    String? AddressFormatId;

    /**
    * Suburb Id Guid - this will attempt to be determined by the SuburbName, StateShortName and Postcode entered.
    */
    // @ApiMember(DataType="Guid", Description="Suburb Id Guid - this will attempt to be determined by the SuburbName, StateShortName and Postcode entered.", Name="SuburbId", ParameterType="query")
    String? SuburbId;

    /**
    * The suburb name.
    */
    // @ApiMember(DataType="string", Description="The suburb name.", Name="SuburbName", ParameterType="query")
    String? SuburbName;

    /**
    * The shortened State Name e.g Vic for Victoria.
    */
    // @ApiMember(DataType="string", Description="The shortened State Name e.g Vic for Victoria.", Name="StateShortName", ParameterType="query")
    String? StateShortName;

    /**
    * The suburb postcode.
    */
    // @ApiMember(DataType="string", Description="The suburb postcode.", Name="PostCode", ParameterType="query")
    String? PostCode;

    /**
    * Country Id Guid - this will be determined by the CountrName or ISOCountryCode entered.
    */
    // @ApiMember(DataType="Guid", Description="Country Id Guid - this will be determined by the CountrName or ISOCountryCode entered.", Name="CountryId", ParameterType="query")
    String? CountryId;

    /**
    * the name of the country the address is within.
    */
    // @ApiMember(DataType="string", Description="the name of the country the address is within.", Name="CountryName", ParameterType="query")
    String? CountryName;

    /**
    * A 2 digit ISO Country Code representing the country.
    */
    // @ApiMember(DataType="string", Description="A 2 digit ISO Country Code representing the country.", Name="ISOCountryCode", ParameterType="query")
    String? ISOCountryCode;

    /**
    * The address Lot number.
    */
    // @ApiMember(DataType="string", Description="The address Lot number.", Name="LotNumber", ParameterType="query")
    String? LotNumber;

    /**
    * The address Sub Unit number.
    */
    // @ApiMember(DataType="string", Description="The address Sub Unit number.", Name="SubUnit", ParameterType="query")
    String? SubUnit;

    /**
    * The address building number.
    */
    // @ApiMember(DataType="string", Description="The address building number.", Name="BuildingNumber", ParameterType="query")
    String? BuildingNumber;

    /**
    * The address street number.
    */
    // @ApiMember(DataType="string", Description="The address street number.", Name="StreetNumber", ParameterType="query")
    String? StreetNumber;

    /**
    * The address street name including street type.
    */
    // @ApiMember(DataType="string", Description="The address street name including street type.", Name="StreetName", ParameterType="query")
    String? StreetName;

    /**
    * A formatted address Line 1.
    */
    // @ApiMember(DataType="string", Description="A formatted address Line 1.", Name="AddressLineOne", ParameterType="query")
    String? AddressLineOne;

    /**
    * A formatted address Line 2.
    */
    // @ApiMember(DataType="string", Description="A formatted address Line 2.", Name="AddressLineTwo", ParameterType="query")
    String? AddressLineTwo;

    /**
    * The full address string.
    */
    // @ApiMember(DataType="string", Description="The full address string.", Name="AddressFull", ParameterType="query")
    String? AddressFull;

    /**
    * True if the address is a physical location.
    */
    // @ApiMember(DataType="bool?", Description="True if the address is a physical location.", Name="IsPhysical", ParameterType="query")
    bool? IsPhysical;

    /**
    * Notes about the address.
    */
    // @ApiMember(DataType="string", Description="Notes about the address.", Name="Notes", ParameterType="query")
    String? Notes;

    /**
    * If true, the address is eligible for having its coordinates calculated/updated.
    */
    // @ApiMember(DataType="bool?", Description="If true, the address is eligible for having its coordinates calculated/updated.", Name="AutoMapCoordinates", ParameterType="query")
    bool? AutoMapCoordinates;

    /**
    * Location Coordinates for the address.
    */
    // @ApiMember(DataType="LocationCoordinates", Description="Location Coordinates for the address.", Name="LocationCoordinates", ParameterType="query")
    LocationCoordinatesModel? LocationCoordinates;

    AddressModel({this.DistanceAway,this.Latitude,this.Longitude,this.AddressFormatId,this.SuburbId,this.SuburbName,this.StateShortName,this.PostCode,this.CountryId,this.CountryName,this.ISOCountryCode,this.LotNumber,this.SubUnit,this.BuildingNumber,this.StreetNumber,this.StreetName,this.AddressLineOne,this.AddressLineTwo,this.AddressFull,this.IsPhysical,this.Notes,this.AutoMapCoordinates,this.LocationCoordinates});
    AddressModel.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        DistanceAway = JsonConverters.toDouble(json['DistanceAway']);
        Latitude = JsonConverters.toDouble(json['Latitude']);
        Longitude = JsonConverters.toDouble(json['Longitude']);
        AddressFormatId = json['AddressFormatId'];
        SuburbId = json['SuburbId'];
        SuburbName = json['SuburbName'];
        StateShortName = json['StateShortName'];
        PostCode = json['PostCode'];
        CountryId = json['CountryId'];
        CountryName = json['CountryName'];
        ISOCountryCode = json['ISOCountryCode'];
        LotNumber = json['LotNumber'];
        SubUnit = json['SubUnit'];
        BuildingNumber = json['BuildingNumber'];
        StreetNumber = json['StreetNumber'];
        StreetName = json['StreetName'];
        AddressLineOne = json['AddressLineOne'];
        AddressLineTwo = json['AddressLineTwo'];
        AddressFull = json['AddressFull'];
        IsPhysical = json['IsPhysical'];
        Notes = json['Notes'];
        AutoMapCoordinates = json['AutoMapCoordinates'];
        LocationCoordinates = JsonConverters.fromJson(json['LocationCoordinates'],'LocationCoordinatesModel',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'DistanceAway': DistanceAway,
        'Latitude': Latitude,
        'Longitude': Longitude,
        'AddressFormatId': AddressFormatId,
        'SuburbId': SuburbId,
        'SuburbName': SuburbName,
        'StateShortName': StateShortName,
        'PostCode': PostCode,
        'CountryId': CountryId,
        'CountryName': CountryName,
        'ISOCountryCode': ISOCountryCode,
        'LotNumber': LotNumber,
        'SubUnit': SubUnit,
        'BuildingNumber': BuildingNumber,
        'StreetNumber': StreetNumber,
        'StreetName': StreetName,
        'AddressLineOne': AddressLineOne,
        'AddressLineTwo': AddressLineTwo,
        'AddressFull': AddressFull,
        'IsPhysical': IsPhysical,
        'Notes': Notes,
        'AutoMapCoordinates': AutoMapCoordinates,
        'LocationCoordinates': JsonConverters.toJson(LocationCoordinates,'LocationCoordinatesModel',context!)
    };

    getTypeName() => "AddressModel";
    TypeContext? context = _ctx;
}

class ContactAddressModel implements IConvertible
{
    AddressModel? Address;
    bool? IsPostal;
    bool? IsPrimaryLocation;
    bool? IsRegisteredLocation;
    String? SuburbName;
    String? StateName;
    String? CountryName;

    ContactAddressModel({this.Address,this.IsPostal,this.IsPrimaryLocation,this.IsRegisteredLocation,this.SuburbName,this.StateName,this.CountryName});
    ContactAddressModel.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Address = JsonConverters.fromJson(json['Address'],'AddressModel',context!);
        IsPostal = json['IsPostal'];
        IsPrimaryLocation = json['IsPrimaryLocation'];
        IsRegisteredLocation = json['IsRegisteredLocation'];
        SuburbName = json['SuburbName'];
        StateName = json['StateName'];
        CountryName = json['CountryName'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Address': JsonConverters.toJson(Address,'AddressModel',context!),
        'IsPostal': IsPostal,
        'IsPrimaryLocation': IsPrimaryLocation,
        'IsRegisteredLocation': IsRegisteredLocation,
        'SuburbName': SuburbName,
        'StateName': StateName,
        'CountryName': CountryName
    };

    getTypeName() => "ContactAddressModel";
    TypeContext? context = _ctx;
}

class PhoneModel implements IConvertible
{
    String? CountryCode;
    String? AreaCode;
    String? LocalNumber;

    PhoneModel({this.CountryCode,this.AreaCode,this.LocalNumber});
    PhoneModel.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        CountryCode = json['CountryCode'];
        AreaCode = json['AreaCode'];
        LocalNumber = json['LocalNumber'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'CountryCode': CountryCode,
        'AreaCode': AreaCode,
        'LocalNumber': LocalNumber
    };

    getTypeName() => "PhoneModel";
    TypeContext? context = _ctx;
}

class ContactDetailModel implements IConvertible
{
    String? ContactMethodId;
    String? ContactMethodName;
    ContactAddressModel? ContactAddress;
    PhoneModel? ContactPhone;
    String? CountryId;
    String? ContactDetails;
    String? Notes;
    String? ContactDetailsCode;
    int? OrderContactMethod;
    bool? IsPrimaryContactMethod;
    bool? IsAddress;

    ContactDetailModel({this.ContactMethodId,this.ContactMethodName,this.ContactAddress,this.ContactPhone,this.CountryId,this.ContactDetails,this.Notes,this.ContactDetailsCode,this.OrderContactMethod,this.IsPrimaryContactMethod,this.IsAddress});
    ContactDetailModel.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ContactMethodId = json['ContactMethodId'];
        ContactMethodName = json['ContactMethodName'];
        ContactAddress = JsonConverters.fromJson(json['ContactAddress'],'ContactAddressModel',context!);
        ContactPhone = JsonConverters.fromJson(json['ContactPhone'],'PhoneModel',context!);
        CountryId = json['CountryId'];
        ContactDetails = json['ContactDetails'];
        Notes = json['Notes'];
        ContactDetailsCode = json['ContactDetailsCode'];
        OrderContactMethod = json['OrderContactMethod'];
        IsPrimaryContactMethod = json['IsPrimaryContactMethod'];
        IsAddress = json['IsAddress'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ContactMethodId': ContactMethodId,
        'ContactMethodName': ContactMethodName,
        'ContactAddress': JsonConverters.toJson(ContactAddress,'ContactAddressModel',context!),
        'ContactPhone': JsonConverters.toJson(ContactPhone,'PhoneModel',context!),
        'CountryId': CountryId,
        'ContactDetails': ContactDetails,
        'Notes': Notes,
        'ContactDetailsCode': ContactDetailsCode,
        'OrderContactMethod': OrderContactMethod,
        'IsPrimaryContactMethod': IsPrimaryContactMethod,
        'IsAddress': IsAddress
    };

    getTypeName() => "ContactDetailModel";
    TypeContext? context = _ctx;
}

class SubscriptionContactModel implements IConvertible
{
    /**
    * Guid of the contact object within Eros.
    */
    // @ApiMember(DataType="Guid", Description="Guid of the contact object within Eros.", Name="ContactId", ParameterType="query")
    String? ContactId;

    /**
    * Guid of the Contact Type List Item object within Eros.
    */
    // @ApiMember(DataType="Guid", Description="Guid of the Contact Type List Item object within Eros.", IsRequired=true, Name="ContactType", ParameterType="query")
    String? ContactType;

    /**
    * Guid of the Marital Status List Item object within Eros.
    */
    // @ApiMember(DataType="Guid?", Description="Guid of the Marital Status List Item object within Eros.", Name="MaritalStatus", ParameterType="query")
    String? MaritalStatus;

    /**
    * Guid of the Gender List Item object within Eros.
    */
    // @ApiMember(DataType="Guid?", Description="Guid of the Gender List Item object within Eros.", Name="Gender", ParameterType="query")
    String? Gender;

    /**
    * The first given name for the contact.  Applies to a person contact type.
    */
    // @ApiMember(DataType="string", Description="The first given name for the contact.  Applies to a person contact type.", Name="FirstName", ParameterType="query")
    String? FirstName;

    /**
    * The middle name(s) for the contact.  Applies to a person contact type.
    */
    // @ApiMember(DataType="string", Description="The middle name(s) for the contact.  Applies to a person contact type.", Name="MiddleName", ParameterType="query")
    String? MiddleName;

    /**
    * The surname for the contact.  Applies to a person contact type.
    */
    // @ApiMember(DataType="string", Description="The surname for the contact.  Applies to a person contact type.", Name="Surname", ParameterType="query")
    String? Surname;

    /**
    * The full name for the contact.
    */
    // @ApiMember(DataType="string", Description="The full name for the contact.", Name="FullName", ParameterType="query")
    String? FullName;

    /**
    * A short name for the contact.
    */
    // @ApiMember(DataType="string", Description="A short name for the contact.", Name="ShortName", ParameterType="query")
    String? ShortName;

    /**
    * The birth date for the contact.  Applies to a person contact type.
    */
    // @ApiMember(DataType="DateTime?", Description="The birth date for the contact.  Applies to a person contact type.", Name="BirthDate", ParameterType="query")
    DateTime? BirthDate;

    /**
    * The title for the contact.  Applies to a person contact type.
    */
    // @ApiMember(DataType="string", Description="The title for the contact.  Applies to a person contact type.", Name="Title", ParameterType="query")
    String? Title;

    /**
    * A salutation for the contact.
    */
    // @ApiMember(DataType="string", Description="A salutation for the contact.", Name="Salutation", ParameterType="query")
    String? Salutation;

    /**
    * The A.B.N for the contact.
    */
    // @ApiMember(DataType="string", Description="The A.B.N for the contact.", Name="Abn", ParameterType="query")
    String? Abn;

    /**
    * The A.C.N for the contact.
    */
    // @ApiMember(DataType="string", Description="The A.C.N for the contact.", Name="Acn", ParameterType="query")
    String? Acn;

    /**
    * The A.R.B.N for the contact.
    */
    // @ApiMember(DataType="string", Description="The A.R.B.N for the contact.", Name="Arbn", ParameterType="query")
    String? Arbn;

    /**
    * A trading name for the contact.
    */
    // @ApiMember(DataType="string", Description="A trading name for the contact.", Name="TradingName", ParameterType="query")
    String? TradingName;

    /**
    * A legal name for the contact.
    */
    // @ApiMember(DataType="string", Description="A legal name for the contact.", Name="LegalName", ParameterType="query")
    String? LegalName;

    /**
    * Any notes/description for the contact.
    */
    // @ApiMember(DataType="string", Description="Any notes/description for the contact.", Name="Notes", ParameterType="query")
    String? Notes;

    /**
    * Contact Employment Industry.
    */
    // @ApiMember(DataType="string", Description="Contact Employment Industry.", Name="EmploymentIndustry", ParameterType="query")
    String? EmploymentIndustry;

    /**
    * Contact Employment Role.
    */
    // @ApiMember(DataType="string", Description="Contact Employment Role.", Name="EmploymentRole", ParameterType="query")
    String? EmploymentRole;

    /**
    * Contact Employment Geographic Area.
    */
    // @ApiMember(DataType="string", Description="Contact Employment Geographic Area.", Name="EmploymentGeographicArea", ParameterType="query")
    String? EmploymentGeographicArea;

    /**
    * The Contacts Drivers Licence Number
    */
    // @ApiMember(DataType="string", Description="The Contacts Drivers Licence Number", Name="DriversLicence", ParameterType="query")
    String? DriversLicence;

    /**
    * Indicates if the Contact is registered for GST
    */
    // @ApiMember(DataType="bool", Description="Indicates if the Contact is registered for GST", Name="GstRegistered", ParameterType="query")
    bool? GstRegistered;

    /**
    * The status of the contact in EROS
    */
    // @ApiMember(DataType="string", Description="The status of the contact in EROS", Name="RecordStatus", ParameterType="query")
    String? RecordStatus;

    /**
    * A list of roles this contact has.
    */
    // @ApiMember(DataType="List<ContactRole>", Description="A list of roles this contact has.", IsRequired=true, Name="ContactRoles", ParameterType="query")
    List<ContactRole>? ContactRoles = [];

    /**
    * A list of the contact details for the contact.
    */
    // @ApiMember(DataType="List<ContactDetailModel>", Description="A list of the contact details for the contact.", IsRequired=true, Name="ContactDetails", ParameterType="query")
    List<ContactDetailModel>? ContactDetails = [];

    /**
    * Custom Content XML for the contact.
    */
    // @ApiMember(DataType="string", Description="Custom Content XML for the contact.", Name="CustomContentXML", ParameterType="query")
    String? CustomContentXML;

    String? BlobImageURLPrimary;
    String? BlobImageURLPrimaryThumbnail;
    /**
    * The primary mobile for the contact.
    */
    // @ApiMember(DataType="string", Description="The primary mobile for the contact.", Name="PrimaryMobile", ParameterType="query")
    String? PrimaryMobile;

    /**
    * The primary email for the contact.
    */
    // @ApiMember(DataType="string", Description="The primary email for the contact.", Name="PrimaryEmail", ParameterType="query")
    String? PrimaryEmail;

    SubscriptionContactModel({this.ContactId,this.ContactType,this.MaritalStatus,this.Gender,this.FirstName,this.MiddleName,this.Surname,this.FullName,this.ShortName,this.BirthDate,this.Title,this.Salutation,this.Abn,this.Acn,this.Arbn,this.TradingName,this.LegalName,this.Notes,this.EmploymentIndustry,this.EmploymentRole,this.EmploymentGeographicArea,this.DriversLicence,this.GstRegistered,this.RecordStatus,this.ContactRoles,this.ContactDetails,this.CustomContentXML,this.BlobImageURLPrimary,this.BlobImageURLPrimaryThumbnail,this.PrimaryMobile,this.PrimaryEmail});
    SubscriptionContactModel.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ContactId = json['ContactId'];
        ContactType = json['ContactType'];
        MaritalStatus = json['MaritalStatus'];
        Gender = json['Gender'];
        FirstName = json['FirstName'];
        MiddleName = json['MiddleName'];
        Surname = json['Surname'];
        FullName = json['FullName'];
        ShortName = json['ShortName'];
        BirthDate = JsonConverters.fromJson(json['BirthDate'],'DateTime',context!);
        Title = json['Title'];
        Salutation = json['Salutation'];
        Abn = json['Abn'];
        Acn = json['Acn'];
        Arbn = json['Arbn'];
        TradingName = json['TradingName'];
        LegalName = json['LegalName'];
        Notes = json['Notes'];
        EmploymentIndustry = json['EmploymentIndustry'];
        EmploymentRole = json['EmploymentRole'];
        EmploymentGeographicArea = json['EmploymentGeographicArea'];
        DriversLicence = json['DriversLicence'];
        GstRegistered = json['GstRegistered'];
        RecordStatus = json['RecordStatus'];
        ContactRoles = JsonConverters.fromJson(json['ContactRoles'],'List<ContactRole>',context!);
        ContactDetails = JsonConverters.fromJson(json['ContactDetails'],'List<ContactDetailModel>',context!);
        CustomContentXML = json['CustomContentXML'];
        BlobImageURLPrimary = json['BlobImageURLPrimary'];
        BlobImageURLPrimaryThumbnail = json['BlobImageURLPrimaryThumbnail'];
        PrimaryMobile = json['PrimaryMobile'];
        PrimaryEmail = json['PrimaryEmail'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ContactId': ContactId,
        'ContactType': ContactType,
        'MaritalStatus': MaritalStatus,
        'Gender': Gender,
        'FirstName': FirstName,
        'MiddleName': MiddleName,
        'Surname': Surname,
        'FullName': FullName,
        'ShortName': ShortName,
        'BirthDate': JsonConverters.toJson(BirthDate,'DateTime',context!),
        'Title': Title,
        'Salutation': Salutation,
        'Abn': Abn,
        'Acn': Acn,
        'Arbn': Arbn,
        'TradingName': TradingName,
        'LegalName': LegalName,
        'Notes': Notes,
        'EmploymentIndustry': EmploymentIndustry,
        'EmploymentRole': EmploymentRole,
        'EmploymentGeographicArea': EmploymentGeographicArea,
        'DriversLicence': DriversLicence,
        'GstRegistered': GstRegistered,
        'RecordStatus': RecordStatus,
        'ContactRoles': JsonConverters.toJson(ContactRoles,'List<ContactRole>',context!),
        'ContactDetails': JsonConverters.toJson(ContactDetails,'List<ContactDetailModel>',context!),
        'CustomContentXML': CustomContentXML,
        'BlobImageURLPrimary': BlobImageURLPrimary,
        'BlobImageURLPrimaryThumbnail': BlobImageURLPrimaryThumbnail,
        'PrimaryMobile': PrimaryMobile,
        'PrimaryEmail': PrimaryEmail
    };

    getTypeName() => "SubscriptionContactModel";
    TypeContext? context = _ctx;
}

/**
* Inserts or Updates a contact and its details and roles.
*/
// @Api(Description="Inserts or Updates a contact and its details and roles.")
class SaveContact extends ValidationErrorList implements ISubscription, IConvertible
{
    /**
    * Guid representing the external systems datasource information.
    */
    // @ApiMember(DataType="Guid", Description="Guid representing the external systems datasource information.", IsRequired=true, Name="SuiteDataSourceInstanceId", ParameterType="query")
    String? SuiteDataSourceInstanceId;

    /**
    * The unique key that represents the contact on the external system.
    */
    // @ApiMember(DataType="string", Description="The unique key that represents the contact on the external system.", IsRequired=true, Name="AlternateKey", ParameterType="query")
    String? AlternateKey;

    /**
    * Guid of the contact object within Eros.  If ObjectId is known, the external system may pass this instead of the alternate key.
    */
    // @ApiMember(DataType="Guid", Description="Guid of the contact object within Eros.  If ObjectId is known, the external system may pass this instead of the alternate key.", Name="ObjectId", ParameterType="query")
    String? ObjectId;

    /**
    * If set to true, the object will be updated/refreshed. If false, the hash representation of the Contact model and its data will be compared with the current Contact to determine if there are any changes to save.
    */
    // @ApiMember(DataType="bool", Description="If set to true, the object will be updated/refreshed. If false, the hash representation of the Contact model and its data will be compared with the current Contact to determine if there are any changes to save.", Name="IgnoreHash")
    bool? IgnoreHash;

    bool? IgnoreValidation;
    /**
    * Set this to be true if the contact is to be deleted
    */
    // @ApiMember(DataType="bool", Description="Set this to be true if the contact is to be deleted", Name="MarkAsDeleted", ParameterType="query")
    bool? MarkAsDeleted;

    /**
    * Object containing all details of the contact to be inserted or updated.
    */
    // @ApiMember(DataType="SubscriptionContactModel", Description="Object containing all details of the contact to be inserted or updated.", IsRequired=true, Name="Contact", ParameterType="query")
    SubscriptionContactModel? Contact;

    String? LicenseeId;
    String? SessionId;

    SaveContact({this.SuiteDataSourceInstanceId,this.AlternateKey,this.ObjectId,this.IgnoreHash,this.IgnoreValidation,this.MarkAsDeleted,this.Contact,this.LicenseeId,this.SessionId});
    SaveContact.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        super.fromMap(json);
        SuiteDataSourceInstanceId = json['SuiteDataSourceInstanceId'];
        AlternateKey = json['AlternateKey'];
        ObjectId = json['ObjectId'];
        IgnoreHash = json['IgnoreHash'];
        IgnoreValidation = json['IgnoreValidation'];
        MarkAsDeleted = json['MarkAsDeleted'];
        Contact = JsonConverters.fromJson(json['Contact'],'SubscriptionContactModel',context!);
        LicenseeId = json['LicenseeId'];
        SessionId = json['SessionId'];
        return this;
    }

    Map<String, dynamic> toJson() => super.toJson()..addAll({
        'SuiteDataSourceInstanceId': SuiteDataSourceInstanceId,
        'AlternateKey': AlternateKey,
        'ObjectId': ObjectId,
        'IgnoreHash': IgnoreHash,
        'IgnoreValidation': IgnoreValidation,
        'MarkAsDeleted': MarkAsDeleted,
        'Contact': JsonConverters.toJson(Contact,'SubscriptionContactModel',context!),
        'LicenseeId': LicenseeId,
        'SessionId': SessionId
    });

    getTypeName() => "SaveContact";
    TypeContext? context = _ctx;
}

TypeContext _ctx = TypeContext(library: 'production_eros_platform_apisubscription.azurewebsites.net', types: <String, TypeInfo> {
    'RuleValidationResult': TypeInfo(TypeOf.Class, create:() => RuleValidationResult()),
    'ValidationErrorList': TypeInfo(TypeOf.Class, create:() => ValidationErrorList()),
    'List<RuleValidationResult>': TypeInfo(TypeOf.Class, create:() => <RuleValidationResult>[]),
    'ContactRole': TypeInfo(TypeOf.Class, create:() => ContactRole()),
    'LocationCoordinatesModel': TypeInfo(TypeOf.Class, create:() => LocationCoordinatesModel()),
    'AddressModel': TypeInfo(TypeOf.Class, create:() => AddressModel()),
    'ContactAddressModel': TypeInfo(TypeOf.Class, create:() => ContactAddressModel()),
    'PhoneModel': TypeInfo(TypeOf.Class, create:() => PhoneModel()),
    'ContactDetailModel': TypeInfo(TypeOf.Class, create:() => ContactDetailModel()),
    'SubscriptionContactModel': TypeInfo(TypeOf.Class, create:() => SubscriptionContactModel()),
    'List<ContactRole>': TypeInfo(TypeOf.Class, create:() => <ContactRole>[]),
    'List<ContactDetailModel>': TypeInfo(TypeOf.Class, create:() => <ContactDetailModel>[]),
    'SaveContact': TypeInfo(TypeOf.Class, create:() => SaveContact()),
});

Dart SaveContact DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .other suffix or ?format=other

HTTP + OTHER

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /jsonl/reply/SaveContact HTTP/1.1 
Host: production-eros-platform-apisubscription.azurewebsites.net 
Accept: text/jsonl
Content-Type: text/jsonl
Content-Length: length

{"AlternateKey":"String","IgnoreHash":false,"IgnoreValidation":false,"MarkAsDeleted":false,"Contact":{"MaritalStatus":"00000000-0000-0000-0000-000000000000","Gender":"00000000-0000-0000-0000-000000000000","FirstName":"String","MiddleName":"String","Surname":"String","FullName":"String","ShortName":"String","BirthDate":"0001-01-01T00:00:00.0000000","Title":"String","Salutation":"String","Abn":"String","Acn":"String","Arbn":"String","TradingName":"String","LegalName":"String","Notes":"String","EmploymentIndustry":"String","EmploymentRole":"String","EmploymentGeographicArea":"String","DriversLicence":"String","GstRegistered":false,"RecordStatus":"String","ContactRoles":[{"AlternateKey":"String"}],"ContactDetails":[{"ContactMethodName":"String","ContactAddress":{"Address":{"DistanceAway":0,"Latitude":0,"Longitude":0,"SuburbName":"String","StateShortName":"String","PostCode":"String","CountryName":"String","ISOCountryCode":"String","LotNumber":"String","SubUnit":"String","BuildingNumber":"String","StreetNumber":"String","StreetName":"String","AddressLineOne":"String","AddressLineTwo":"String","AddressFull":"String","IsPhysical":false,"Notes":"String","AutoMapCoordinates":false,"LocationCoordinates":{"Latitude":0,"Longitude":0,"Altitude":0,"Accuracy":0,"AltitudeAccuracy":0,"Heading":0,"Speed":0,"VerticalSpeed":0}},"IsPostal":false,"IsPrimaryLocation":false,"IsRegisteredLocation":false,"SuburbName":"String","StateName":"String","CountryName":"String"},"ContactPhone":{"CountryCode":"String","AreaCode":"String","LocalNumber":"String"},"CountryId":"00000000-0000-0000-0000-000000000000","ContactDetails":"String","Notes":"String","ContactDetailsCode":"String","OrderContactMethod":0,"IsPrimaryContactMethod":false,"IsAddress":true}],"CustomContentXML":"String","BlobImageURLPrimary":"String","BlobImageURLPrimaryThumbnail":"String","PrimaryMobile":"String","PrimaryEmail":"String"},"ValidationErrors":[{"RuleCode":"String","Message":"String","Key":"String","Tag":"String","ErrorCode":"String"}]}
HTTP/1.1 200 OK
Content-Type: text/jsonl
Content-Length: length

{"ErrorCode":"String","Message":"String","StackTrace":"String","Errors":[{"ErrorCode":"String","FieldName":"String","Message":"String","Meta":{"String":"String"}}],"Meta":{"String":"String"}}