Trendsic Platform Service

<back to all web services

EstimateRevisionGetRequest

Requires Authentication
Requires any of the roles:Agent, Administrator
The following routes are available for this service:
GET,OPTIONS/v1/Rfp/{RfpDocumentUID}/Estimate/Revisions/{RevisionNo}
import 'package:servicestack/servicestack.dart';
import 'dart:typed_data';

class EstimateRevision implements IConvertible
{
    int? EstimateRevisionID;
    int? RfpDocumentID;
    int? RevisionNo;
    String? Label;
    String? Reason;
    String? Trigger;
    double? TotalAmount;
    int? LineCount;
    String? CreatedBy;
    DateTime? CreatedAt;
    String? SnapshotJson;

    EstimateRevision({this.EstimateRevisionID,this.RfpDocumentID,this.RevisionNo,this.Label,this.Reason,this.Trigger,this.TotalAmount,this.LineCount,this.CreatedBy,this.CreatedAt,this.SnapshotJson});
    EstimateRevision.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        EstimateRevisionID = json['EstimateRevisionID'];
        RfpDocumentID = json['RfpDocumentID'];
        RevisionNo = json['RevisionNo'];
        Label = json['Label'];
        Reason = json['Reason'];
        Trigger = json['Trigger'];
        TotalAmount = JsonConverters.toDouble(json['TotalAmount']);
        LineCount = json['LineCount'];
        CreatedBy = json['CreatedBy'];
        CreatedAt = JsonConverters.fromJson(json['CreatedAt'],'DateTime',context!);
        SnapshotJson = json['SnapshotJson'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'EstimateRevisionID': EstimateRevisionID,
        'RfpDocumentID': RfpDocumentID,
        'RevisionNo': RevisionNo,
        'Label': Label,
        'Reason': Reason,
        'Trigger': Trigger,
        'TotalAmount': TotalAmount,
        'LineCount': LineCount,
        'CreatedBy': CreatedBy,
        'CreatedAt': JsonConverters.toJson(CreatedAt,'DateTime',context!),
        'SnapshotJson': SnapshotJson
    };

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

class ResourcedPosition implements IConvertible
{
    String? PositionTag;
    double? Hours;
    double? CrewSize;
    double? Utilization;
    double? FixedDays;
    int? Headcount;
    String? SourceReference;
    String? Notes;
    bool? IsInCatalog;
    int? ContactID;

    ResourcedPosition({this.PositionTag,this.Hours,this.CrewSize,this.Utilization,this.FixedDays,this.Headcount,this.SourceReference,this.Notes,this.IsInCatalog,this.ContactID});
    ResourcedPosition.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        PositionTag = json['PositionTag'];
        Hours = JsonConverters.toDouble(json['Hours']);
        CrewSize = JsonConverters.toDouble(json['CrewSize']);
        Utilization = JsonConverters.toDouble(json['Utilization']);
        FixedDays = JsonConverters.toDouble(json['FixedDays']);
        Headcount = json['Headcount'];
        SourceReference = json['SourceReference'];
        Notes = json['Notes'];
        IsInCatalog = json['IsInCatalog'];
        ContactID = json['ContactID'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'PositionTag': PositionTag,
        'Hours': Hours,
        'CrewSize': CrewSize,
        'Utilization': Utilization,
        'FixedDays': FixedDays,
        'Headcount': Headcount,
        'SourceReference': SourceReference,
        'Notes': Notes,
        'IsInCatalog': IsInCatalog,
        'ContactID': ContactID
    };

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

class ResourcedEquipment implements IConvertible
{
    int? EquipmentID;
    String? EquipmentName;
    String? MakeModel;
    double? Quantity;
    double? DurationDays;
    double? Utilization;
    double? FixedDays;
    String? SourceReference;
    String? Notes;
    bool? IsInCatalog;
    int? SuggestedEquipmentID;
    String? SuggestedEquipmentName;

    ResourcedEquipment({this.EquipmentID,this.EquipmentName,this.MakeModel,this.Quantity,this.DurationDays,this.Utilization,this.FixedDays,this.SourceReference,this.Notes,this.IsInCatalog,this.SuggestedEquipmentID,this.SuggestedEquipmentName});
    ResourcedEquipment.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        EquipmentID = json['EquipmentID'];
        EquipmentName = json['EquipmentName'];
        MakeModel = json['MakeModel'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        DurationDays = JsonConverters.toDouble(json['DurationDays']);
        Utilization = JsonConverters.toDouble(json['Utilization']);
        FixedDays = JsonConverters.toDouble(json['FixedDays']);
        SourceReference = json['SourceReference'];
        Notes = json['Notes'];
        IsInCatalog = json['IsInCatalog'];
        SuggestedEquipmentID = json['SuggestedEquipmentID'];
        SuggestedEquipmentName = json['SuggestedEquipmentName'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'EquipmentID': EquipmentID,
        'EquipmentName': EquipmentName,
        'MakeModel': MakeModel,
        'Quantity': Quantity,
        'DurationDays': DurationDays,
        'Utilization': Utilization,
        'FixedDays': FixedDays,
        'SourceReference': SourceReference,
        'Notes': Notes,
        'IsInCatalog': IsInCatalog,
        'SuggestedEquipmentID': SuggestedEquipmentID,
        'SuggestedEquipmentName': SuggestedEquipmentName
    };

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

class ResourcedMaterial implements IConvertible
{
    int? MaterialID;
    String? MaterialName;
    String? MakeModel;
    double? Quantity;
    double? QuantityPerUnit;
    String? Unit;
    String? SourceReference;
    String? Notes;
    bool? IsInCatalog;
    int? SuggestedMaterialID;
    String? SuggestedMaterialName;

    ResourcedMaterial({this.MaterialID,this.MaterialName,this.MakeModel,this.Quantity,this.QuantityPerUnit,this.Unit,this.SourceReference,this.Notes,this.IsInCatalog,this.SuggestedMaterialID,this.SuggestedMaterialName});
    ResourcedMaterial.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        MaterialID = json['MaterialID'];
        MaterialName = json['MaterialName'];
        MakeModel = json['MakeModel'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        QuantityPerUnit = JsonConverters.toDouble(json['QuantityPerUnit']);
        Unit = json['Unit'];
        SourceReference = json['SourceReference'];
        Notes = json['Notes'];
        IsInCatalog = json['IsInCatalog'];
        SuggestedMaterialID = json['SuggestedMaterialID'];
        SuggestedMaterialName = json['SuggestedMaterialName'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'MaterialID': MaterialID,
        'MaterialName': MaterialName,
        'MakeModel': MakeModel,
        'Quantity': Quantity,
        'QuantityPerUnit': QuantityPerUnit,
        'Unit': Unit,
        'SourceReference': SourceReference,
        'Notes': Notes,
        'IsInCatalog': IsInCatalog,
        'SuggestedMaterialID': SuggestedMaterialID,
        'SuggestedMaterialName': SuggestedMaterialName
    };

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

class TaskResourcing implements IConvertible
{
    List<ResourcedPosition>? Positions = [];
    List<ResourcedEquipment>? Equipment = [];
    List<ResourcedMaterial>? Materials = [];
    double? ResourcedForQuantity;
    double? ProductionRatePerDay;
    double? FixedDays;

    TaskResourcing({this.Positions,this.Equipment,this.Materials,this.ResourcedForQuantity,this.ProductionRatePerDay,this.FixedDays});
    TaskResourcing.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Positions = JsonConverters.fromJson(json['Positions'],'List<ResourcedPosition>',context!);
        Equipment = JsonConverters.fromJson(json['Equipment'],'List<ResourcedEquipment>',context!);
        Materials = JsonConverters.fromJson(json['Materials'],'List<ResourcedMaterial>',context!);
        ResourcedForQuantity = JsonConverters.toDouble(json['ResourcedForQuantity']);
        ProductionRatePerDay = JsonConverters.toDouble(json['ProductionRatePerDay']);
        FixedDays = JsonConverters.toDouble(json['FixedDays']);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Positions': JsonConverters.toJson(Positions,'List<ResourcedPosition>',context!),
        'Equipment': JsonConverters.toJson(Equipment,'List<ResourcedEquipment>',context!),
        'Materials': JsonConverters.toJson(Materials,'List<ResourcedMaterial>',context!),
        'ResourcedForQuantity': ResourcedForQuantity,
        'ProductionRatePerDay': ProductionRatePerDay,
        'FixedDays': FixedDays
    };

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

class WorkPackageSpecRef implements IConvertible
{
    String? Section;
    String? Title;

    WorkPackageSpecRef({this.Section,this.Title});
    WorkPackageSpecRef.fromJson(Map<String, dynamic> json) { fromMap(json); }

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

    Map<String, dynamic> toJson() => {
        'Section': Section,
        'Title': Title
    };

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

class TaskWorkPackage implements IConvertible
{
    String? Scope;
    String? LimitsOfWork;
    List<WorkPackageSpecRef>? SpecRefs = [];
    List<String>? Constraints = [];
    List<String>? HoldPoints = [];
    List<String>? DefinitionOfDone = [];
    String? SafetyNote;
    String? RfpRef;
    int? Confidence;
    String? SpecBook;
    String? UserScope;
    List<int>? DodRemoved = [];
    List<String>? DodExtra = [];
    bool? UserEdited;
    List<String>? DodChecked = [];
    String? RedraftNote;

    TaskWorkPackage({this.Scope,this.LimitsOfWork,this.SpecRefs,this.Constraints,this.HoldPoints,this.DefinitionOfDone,this.SafetyNote,this.RfpRef,this.Confidence,this.SpecBook,this.UserScope,this.DodRemoved,this.DodExtra,this.UserEdited,this.DodChecked,this.RedraftNote});
    TaskWorkPackage.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Scope = json['Scope'];
        LimitsOfWork = json['LimitsOfWork'];
        SpecRefs = JsonConverters.fromJson(json['SpecRefs'],'List<WorkPackageSpecRef>',context!);
        Constraints = JsonConverters.fromJson(json['Constraints'],'List<String>',context!);
        HoldPoints = JsonConverters.fromJson(json['HoldPoints'],'List<String>',context!);
        DefinitionOfDone = JsonConverters.fromJson(json['DefinitionOfDone'],'List<String>',context!);
        SafetyNote = json['SafetyNote'];
        RfpRef = json['RfpRef'];
        Confidence = json['Confidence'];
        SpecBook = json['SpecBook'];
        UserScope = json['UserScope'];
        DodRemoved = JsonConverters.fromJson(json['DodRemoved'],'List<int>',context!);
        DodExtra = JsonConverters.fromJson(json['DodExtra'],'List<String>',context!);
        UserEdited = json['UserEdited'];
        DodChecked = JsonConverters.fromJson(json['DodChecked'],'List<String>',context!);
        RedraftNote = json['RedraftNote'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Scope': Scope,
        'LimitsOfWork': LimitsOfWork,
        'SpecRefs': JsonConverters.toJson(SpecRefs,'List<WorkPackageSpecRef>',context!),
        'Constraints': JsonConverters.toJson(Constraints,'List<String>',context!),
        'HoldPoints': JsonConverters.toJson(HoldPoints,'List<String>',context!),
        'DefinitionOfDone': JsonConverters.toJson(DefinitionOfDone,'List<String>',context!),
        'SafetyNote': SafetyNote,
        'RfpRef': RfpRef,
        'Confidence': Confidence,
        'SpecBook': SpecBook,
        'UserScope': UserScope,
        'DodRemoved': JsonConverters.toJson(DodRemoved,'List<int>',context!),
        'DodExtra': JsonConverters.toJson(DodExtra,'List<String>',context!),
        'UserEdited': UserEdited,
        'DodChecked': JsonConverters.toJson(DodChecked,'List<String>',context!),
        'RedraftNote': RedraftNote
    };

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

class ProposedTask implements IConvertible
{
    int? Seq;
    String? Name;
    String? Category;
    double? Quantity;
    String? Unit;
    String? SourceItemNumber;
    String? SourceReference;
    String? Notes;
    TaskResourcing? Resourcing;
    double? DurationDays;
    List<int>? DependsOn = [];
    DateTime? EstimatedStartDate;
    DateTime? EstimatedEndDate;
    TaskWorkPackage? WorkPackage;
    int? CreatedJobID;

    ProposedTask({this.Seq,this.Name,this.Category,this.Quantity,this.Unit,this.SourceItemNumber,this.SourceReference,this.Notes,this.Resourcing,this.DurationDays,this.DependsOn,this.EstimatedStartDate,this.EstimatedEndDate,this.WorkPackage,this.CreatedJobID});
    ProposedTask.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Seq = json['Seq'];
        Name = json['Name'];
        Category = json['Category'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        Unit = json['Unit'];
        SourceItemNumber = json['SourceItemNumber'];
        SourceReference = json['SourceReference'];
        Notes = json['Notes'];
        Resourcing = JsonConverters.fromJson(json['Resourcing'],'TaskResourcing',context!);
        DurationDays = JsonConverters.toDouble(json['DurationDays']);
        DependsOn = JsonConverters.fromJson(json['DependsOn'],'List<int>',context!);
        EstimatedStartDate = JsonConverters.fromJson(json['EstimatedStartDate'],'DateTime',context!);
        EstimatedEndDate = JsonConverters.fromJson(json['EstimatedEndDate'],'DateTime',context!);
        WorkPackage = JsonConverters.fromJson(json['WorkPackage'],'TaskWorkPackage',context!);
        CreatedJobID = json['CreatedJobID'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Seq': Seq,
        'Name': Name,
        'Category': Category,
        'Quantity': Quantity,
        'Unit': Unit,
        'SourceItemNumber': SourceItemNumber,
        'SourceReference': SourceReference,
        'Notes': Notes,
        'Resourcing': JsonConverters.toJson(Resourcing,'TaskResourcing',context!),
        'DurationDays': DurationDays,
        'DependsOn': JsonConverters.toJson(DependsOn,'List<int>',context!),
        'EstimatedStartDate': JsonConverters.toJson(EstimatedStartDate,'DateTime',context!),
        'EstimatedEndDate': JsonConverters.toJson(EstimatedEndDate,'DateTime',context!),
        'WorkPackage': JsonConverters.toJson(WorkPackage,'TaskWorkPackage',context!),
        'CreatedJobID': CreatedJobID
    };

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

class AddendaChange implements IConvertible
{
    String? ChangeId;
    String? ChangeType;
    int? TargetSeq;
    String? ItemNumber;
    String? ItemName;
    String? Field;
    String? OldValue;
    String? NewValue;
    String? Description;
    String? Status;

    AddendaChange({this.ChangeId,this.ChangeType,this.TargetSeq,this.ItemNumber,this.ItemName,this.Field,this.OldValue,this.NewValue,this.Description,this.Status});
    AddendaChange.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ChangeId = json['ChangeId'];
        ChangeType = json['ChangeType'];
        TargetSeq = json['TargetSeq'];
        ItemNumber = json['ItemNumber'];
        ItemName = json['ItemName'];
        Field = json['Field'];
        OldValue = json['OldValue'];
        NewValue = json['NewValue'];
        Description = json['Description'];
        Status = json['Status'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ChangeId': ChangeId,
        'ChangeType': ChangeType,
        'TargetSeq': TargetSeq,
        'ItemNumber': ItemNumber,
        'ItemName': ItemName,
        'Field': Field,
        'OldValue': OldValue,
        'NewValue': NewValue,
        'Description': Description,
        'Status': Status
    };

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

class AddendaChangeSet implements IConvertible
{
    String? ChangeSetId;
    int? SourceRfpDocumentID;
    String? SourceFileName;
    String? DocumentType;
    DateTime? ExtractedAtUtc;
    String? Summary;
    List<AddendaChange>? Changes = [];

    AddendaChangeSet({this.ChangeSetId,this.SourceRfpDocumentID,this.SourceFileName,this.DocumentType,this.ExtractedAtUtc,this.Summary,this.Changes});
    AddendaChangeSet.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ChangeSetId = json['ChangeSetId'];
        SourceRfpDocumentID = json['SourceRfpDocumentID'];
        SourceFileName = json['SourceFileName'];
        DocumentType = json['DocumentType'];
        ExtractedAtUtc = JsonConverters.fromJson(json['ExtractedAtUtc'],'DateTime',context!);
        Summary = json['Summary'];
        Changes = JsonConverters.fromJson(json['Changes'],'List<AddendaChange>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ChangeSetId': ChangeSetId,
        'SourceRfpDocumentID': SourceRfpDocumentID,
        'SourceFileName': SourceFileName,
        'DocumentType': DocumentType,
        'ExtractedAtUtc': JsonConverters.toJson(ExtractedAtUtc,'DateTime',context!),
        'Summary': Summary,
        'Changes': JsonConverters.toJson(Changes,'List<AddendaChange>',context!)
    };

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

class WageClassification implements IConvertible
{
    String? Title;
    double? BaseRate;
    double? FringeRate;
    String? ParishNote;
    String? SourceLine;
    double? BenchmarkFringeRate;
    String? FringeCompareNote;

    WageClassification({this.Title,this.BaseRate,this.FringeRate,this.ParishNote,this.SourceLine,this.BenchmarkFringeRate,this.FringeCompareNote});
    WageClassification.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Title = json['Title'];
        BaseRate = JsonConverters.toDouble(json['BaseRate']);
        FringeRate = JsonConverters.toDouble(json['FringeRate']);
        ParishNote = json['ParishNote'];
        SourceLine = json['SourceLine'];
        BenchmarkFringeRate = JsonConverters.toDouble(json['BenchmarkFringeRate']);
        FringeCompareNote = json['FringeCompareNote'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Title': Title,
        'BaseRate': BaseRate,
        'FringeRate': FringeRate,
        'ParishNote': ParishNote,
        'SourceLine': SourceLine,
        'BenchmarkFringeRate': BenchmarkFringeRate,
        'FringeCompareNote': FringeCompareNote
    };

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

class WageDeterminationResult implements IConvertible
{
    int? SourceRfpDocumentID;
    String? SourceFileName;
    String? WdNumber;
    DateTime? ExtractedAtUtc;
    List<WageClassification>? Classifications = [];
    String? Source;
    bool? IsTrustworthy;
    double? ExecutiveOrderFloor;
    String? PublishedDate;
    String? ProjectParish;
    List<String>? Warnings = [];

    WageDeterminationResult({this.SourceRfpDocumentID,this.SourceFileName,this.WdNumber,this.ExtractedAtUtc,this.Classifications,this.Source,this.IsTrustworthy,this.ExecutiveOrderFloor,this.PublishedDate,this.ProjectParish,this.Warnings});
    WageDeterminationResult.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        SourceRfpDocumentID = json['SourceRfpDocumentID'];
        SourceFileName = json['SourceFileName'];
        WdNumber = json['WdNumber'];
        ExtractedAtUtc = JsonConverters.fromJson(json['ExtractedAtUtc'],'DateTime',context!);
        Classifications = JsonConverters.fromJson(json['Classifications'],'List<WageClassification>',context!);
        Source = json['Source'];
        IsTrustworthy = json['IsTrustworthy'];
        ExecutiveOrderFloor = JsonConverters.toDouble(json['ExecutiveOrderFloor']);
        PublishedDate = json['PublishedDate'];
        ProjectParish = json['ProjectParish'];
        Warnings = JsonConverters.fromJson(json['Warnings'],'List<String>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'SourceRfpDocumentID': SourceRfpDocumentID,
        'SourceFileName': SourceFileName,
        'WdNumber': WdNumber,
        'ExtractedAtUtc': JsonConverters.toJson(ExtractedAtUtc,'DateTime',context!),
        'Classifications': JsonConverters.toJson(Classifications,'List<WageClassification>',context!),
        'Source': Source,
        'IsTrustworthy': IsTrustworthy,
        'ExecutiveOrderFloor': ExecutiveOrderFloor,
        'PublishedDate': PublishedDate,
        'ProjectParish': ProjectParish,
        'Warnings': JsonConverters.toJson(Warnings,'List<String>',context!)
    };

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

class ProjectProposal implements IConvertible
{
    int? RfpDocumentID;
    String? Mode;
    int? ProjectID;
    int? ChangeOrderID;
    String? ProjectName;
    String? ClientName;
    String? ProjectType;
    String? ProjectLocation;
    String? Scope;
    String? ProjectDescription;
    int? ContractDurationDays;
    String? BidDueDate;
    DateTime? EstimatedStartDate;
    DateTime? EstimatedEndDate;
    List<ProposedTask>? Tasks = [];
    List<AddendaChangeSet>? PendingAddendaDiffs = [];
    List<WageDeterminationResult>? WageDeterminations = [];

    ProjectProposal({this.RfpDocumentID,this.Mode,this.ProjectID,this.ChangeOrderID,this.ProjectName,this.ClientName,this.ProjectType,this.ProjectLocation,this.Scope,this.ProjectDescription,this.ContractDurationDays,this.BidDueDate,this.EstimatedStartDate,this.EstimatedEndDate,this.Tasks,this.PendingAddendaDiffs,this.WageDeterminations});
    ProjectProposal.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        RfpDocumentID = json['RfpDocumentID'];
        Mode = json['Mode'];
        ProjectID = json['ProjectID'];
        ChangeOrderID = json['ChangeOrderID'];
        ProjectName = json['ProjectName'];
        ClientName = json['ClientName'];
        ProjectType = json['ProjectType'];
        ProjectLocation = json['ProjectLocation'];
        Scope = json['Scope'];
        ProjectDescription = json['ProjectDescription'];
        ContractDurationDays = json['ContractDurationDays'];
        BidDueDate = json['BidDueDate'];
        EstimatedStartDate = JsonConverters.fromJson(json['EstimatedStartDate'],'DateTime',context!);
        EstimatedEndDate = JsonConverters.fromJson(json['EstimatedEndDate'],'DateTime',context!);
        Tasks = JsonConverters.fromJson(json['Tasks'],'List<ProposedTask>',context!);
        PendingAddendaDiffs = JsonConverters.fromJson(json['PendingAddendaDiffs'],'List<AddendaChangeSet>',context!);
        WageDeterminations = JsonConverters.fromJson(json['WageDeterminations'],'List<WageDeterminationResult>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'RfpDocumentID': RfpDocumentID,
        'Mode': Mode,
        'ProjectID': ProjectID,
        'ChangeOrderID': ChangeOrderID,
        'ProjectName': ProjectName,
        'ClientName': ClientName,
        'ProjectType': ProjectType,
        'ProjectLocation': ProjectLocation,
        'Scope': Scope,
        'ProjectDescription': ProjectDescription,
        'ContractDurationDays': ContractDurationDays,
        'BidDueDate': BidDueDate,
        'EstimatedStartDate': JsonConverters.toJson(EstimatedStartDate,'DateTime',context!),
        'EstimatedEndDate': JsonConverters.toJson(EstimatedEndDate,'DateTime',context!),
        'Tasks': JsonConverters.toJson(Tasks,'List<ProposedTask>',context!),
        'PendingAddendaDiffs': JsonConverters.toJson(PendingAddendaDiffs,'List<AddendaChangeSet>',context!),
        'WageDeterminations': JsonConverters.toJson(WageDeterminations,'List<WageDeterminationResult>',context!)
    };

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

class EstimateSettingsView implements IConvertible
{
    int? RfpEstimateID;
    DateTime? StartDate;
    DateTime? DeadlineDate;
    int? WorkdaysPerWeek;
    double? HoursPerDay;
    double? WeatherPct;
    double? OhpPct;
    double? ContingencyPct;
    double? BondPct;
    List<DateTime>? Holidays = [];
    DateTime? AppliedStartDate;

    EstimateSettingsView({this.RfpEstimateID,this.StartDate,this.DeadlineDate,this.WorkdaysPerWeek,this.HoursPerDay,this.WeatherPct,this.OhpPct,this.ContingencyPct,this.BondPct,this.Holidays,this.AppliedStartDate});
    EstimateSettingsView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        RfpEstimateID = json['RfpEstimateID'];
        StartDate = JsonConverters.fromJson(json['StartDate'],'DateTime',context!);
        DeadlineDate = JsonConverters.fromJson(json['DeadlineDate'],'DateTime',context!);
        WorkdaysPerWeek = json['WorkdaysPerWeek'];
        HoursPerDay = JsonConverters.toDouble(json['HoursPerDay']);
        WeatherPct = JsonConverters.toDouble(json['WeatherPct']);
        OhpPct = JsonConverters.toDouble(json['OhpPct']);
        ContingencyPct = JsonConverters.toDouble(json['ContingencyPct']);
        BondPct = JsonConverters.toDouble(json['BondPct']);
        Holidays = JsonConverters.fromJson(json['Holidays'],'List<DateTime>',context!);
        AppliedStartDate = JsonConverters.fromJson(json['AppliedStartDate'],'DateTime',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'RfpEstimateID': RfpEstimateID,
        'StartDate': JsonConverters.toJson(StartDate,'DateTime',context!),
        'DeadlineDate': JsonConverters.toJson(DeadlineDate,'DateTime',context!),
        'WorkdaysPerWeek': WorkdaysPerWeek,
        'HoursPerDay': HoursPerDay,
        'WeatherPct': WeatherPct,
        'OhpPct': OhpPct,
        'ContingencyPct': ContingencyPct,
        'BondPct': BondPct,
        'Holidays': JsonConverters.toJson(Holidays,'List<DateTime>',context!),
        'AppliedStartDate': JsonConverters.toJson(AppliedStartDate,'DateTime',context!)
    };

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

class SpecRefView implements IConvertible
{
    String? Section;
    String? Title;
    String? Url;

    SpecRefView({this.Section,this.Title,this.Url});
    SpecRefView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Section = json['Section'];
        Title = json['Title'];
        Url = json['Url'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Section': Section,
        'Title': Title,
        'Url': Url
    };

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

class DodItemView implements IConvertible
{
    String? Key;
    String? Text;
    bool? Checked;
    String? Source;

    DodItemView({this.Key,this.Text,this.Checked,this.Source});
    DodItemView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Key = json['Key'];
        Text = json['Text'];
        Checked = json['Checked'];
        Source = json['Source'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Key': Key,
        'Text': Text,
        'Checked': Checked,
        'Source': Source
    };

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

class WorkPackageView implements IConvertible
{
    bool? HasPackage;
    String? Scope;
    String? LimitsOfWork;
    List<SpecRefView>? SpecRefs = [];
    List<String>? Constraints = [];
    List<String>? HoldPoints = [];
    List<DodItemView>? Dod = [];
    String? SafetyNote;
    String? Provenance;
    String? SpecBook;
    bool? UserEdited;
    String? RedraftNote;

    WorkPackageView({this.HasPackage,this.Scope,this.LimitsOfWork,this.SpecRefs,this.Constraints,this.HoldPoints,this.Dod,this.SafetyNote,this.Provenance,this.SpecBook,this.UserEdited,this.RedraftNote});
    WorkPackageView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        HasPackage = json['HasPackage'];
        Scope = json['Scope'];
        LimitsOfWork = json['LimitsOfWork'];
        SpecRefs = JsonConverters.fromJson(json['SpecRefs'],'List<SpecRefView>',context!);
        Constraints = JsonConverters.fromJson(json['Constraints'],'List<String>',context!);
        HoldPoints = JsonConverters.fromJson(json['HoldPoints'],'List<String>',context!);
        Dod = JsonConverters.fromJson(json['Dod'],'List<DodItemView>',context!);
        SafetyNote = json['SafetyNote'];
        Provenance = json['Provenance'];
        SpecBook = json['SpecBook'];
        UserEdited = json['UserEdited'];
        RedraftNote = json['RedraftNote'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'HasPackage': HasPackage,
        'Scope': Scope,
        'LimitsOfWork': LimitsOfWork,
        'SpecRefs': JsonConverters.toJson(SpecRefs,'List<SpecRefView>',context!),
        'Constraints': JsonConverters.toJson(Constraints,'List<String>',context!),
        'HoldPoints': JsonConverters.toJson(HoldPoints,'List<String>',context!),
        'Dod': JsonConverters.toJson(Dod,'List<DodItemView>',context!),
        'SafetyNote': SafetyNote,
        'Provenance': Provenance,
        'SpecBook': SpecBook,
        'UserEdited': UserEdited,
        'RedraftNote': RedraftNote
    };

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

class EstimateCrewLineView implements IConvertible
{
    String? Role;
    double? Hours;
    double? StHours;
    double? OtHours;
    bool? HasOt;
    bool? PremiumApplied;
    bool? NeedsRate;
    String? RateKey;
    String? Chip;
    double? Rrop;
    double? StCost;
    double? OtCost;
    double? Cost;
    double? FringeCost;

    EstimateCrewLineView({this.Role,this.Hours,this.StHours,this.OtHours,this.HasOt,this.PremiumApplied,this.NeedsRate,this.RateKey,this.Chip,this.Rrop,this.StCost,this.OtCost,this.Cost,this.FringeCost});
    EstimateCrewLineView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Role = json['Role'];
        Hours = JsonConverters.toDouble(json['Hours']);
        StHours = JsonConverters.toDouble(json['StHours']);
        OtHours = JsonConverters.toDouble(json['OtHours']);
        HasOt = json['HasOt'];
        PremiumApplied = json['PremiumApplied'];
        NeedsRate = json['NeedsRate'];
        RateKey = json['RateKey'];
        Chip = json['Chip'];
        Rrop = JsonConverters.toDouble(json['Rrop']);
        StCost = JsonConverters.toDouble(json['StCost']);
        OtCost = JsonConverters.toDouble(json['OtCost']);
        Cost = JsonConverters.toDouble(json['Cost']);
        FringeCost = JsonConverters.toDouble(json['FringeCost']);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Role': Role,
        'Hours': Hours,
        'StHours': StHours,
        'OtHours': OtHours,
        'HasOt': HasOt,
        'PremiumApplied': PremiumApplied,
        'NeedsRate': NeedsRate,
        'RateKey': RateKey,
        'Chip': Chip,
        'Rrop': Rrop,
        'StCost': StCost,
        'OtCost': OtCost,
        'Cost': Cost,
        'FringeCost': FringeCost
    };

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

class EstimateEquipmentLineView implements IConvertible
{
    String? Name;
    double? Quantity;
    double? Rate;
    bool? NeedsRate;
    double? MobCost;
    double? Cost;
    bool? IsAvailabilityTracked;
    bool? IsOwned;
    String? AvailabilityLabel;
    String? FreedFromProject;
    DateTime? AvailableFrom;
    String? RateKey;
    String? Chip;
    String? RentalExplain;
    double? UsageDays;
    double? BilledDays;

    EstimateEquipmentLineView({this.Name,this.Quantity,this.Rate,this.NeedsRate,this.MobCost,this.Cost,this.IsAvailabilityTracked,this.IsOwned,this.AvailabilityLabel,this.FreedFromProject,this.AvailableFrom,this.RateKey,this.Chip,this.RentalExplain,this.UsageDays,this.BilledDays});
    EstimateEquipmentLineView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Name = json['Name'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        Rate = JsonConverters.toDouble(json['Rate']);
        NeedsRate = json['NeedsRate'];
        MobCost = JsonConverters.toDouble(json['MobCost']);
        Cost = JsonConverters.toDouble(json['Cost']);
        IsAvailabilityTracked = json['IsAvailabilityTracked'];
        IsOwned = json['IsOwned'];
        AvailabilityLabel = json['AvailabilityLabel'];
        FreedFromProject = json['FreedFromProject'];
        AvailableFrom = JsonConverters.fromJson(json['AvailableFrom'],'DateTime',context!);
        RateKey = json['RateKey'];
        Chip = json['Chip'];
        RentalExplain = json['RentalExplain'];
        UsageDays = JsonConverters.toDouble(json['UsageDays']);
        BilledDays = JsonConverters.toDouble(json['BilledDays']);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Name': Name,
        'Quantity': Quantity,
        'Rate': Rate,
        'NeedsRate': NeedsRate,
        'MobCost': MobCost,
        'Cost': Cost,
        'IsAvailabilityTracked': IsAvailabilityTracked,
        'IsOwned': IsOwned,
        'AvailabilityLabel': AvailabilityLabel,
        'FreedFromProject': FreedFromProject,
        'AvailableFrom': JsonConverters.toJson(AvailableFrom,'DateTime',context!),
        'RateKey': RateKey,
        'Chip': Chip,
        'RentalExplain': RentalExplain,
        'UsageDays': UsageDays,
        'BilledDays': BilledDays
    };

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

class EstimateMaterialLineView implements IConvertible
{
    String? Name;
    double? Quantity;
    String? Unit;
    double? Rate;
    bool? NeedsRate;
    double? Cost;
    String? RateKey;
    String? Chip;

    EstimateMaterialLineView({this.Name,this.Quantity,this.Unit,this.Rate,this.NeedsRate,this.Cost,this.RateKey,this.Chip});
    EstimateMaterialLineView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Name = json['Name'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        Unit = json['Unit'];
        Rate = JsonConverters.toDouble(json['Rate']);
        NeedsRate = json['NeedsRate'];
        Cost = JsonConverters.toDouble(json['Cost']);
        RateKey = json['RateKey'];
        Chip = json['Chip'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Name': Name,
        'Quantity': Quantity,
        'Unit': Unit,
        'Rate': Rate,
        'NeedsRate': NeedsRate,
        'Cost': Cost,
        'RateKey': RateKey,
        'Chip': Chip
    };

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

class EstimateSubcontractView implements IConvertible
{
    int? EstimateSubcontractID;
    int? TaskSeq;
    String? Vendor;
    double? Amount;
    String? Scope;

    EstimateSubcontractView({this.EstimateSubcontractID,this.TaskSeq,this.Vendor,this.Amount,this.Scope});
    EstimateSubcontractView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        EstimateSubcontractID = json['EstimateSubcontractID'];
        TaskSeq = json['TaskSeq'];
        Vendor = json['Vendor'];
        Amount = JsonConverters.toDouble(json['Amount']);
        Scope = json['Scope'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'EstimateSubcontractID': EstimateSubcontractID,
        'TaskSeq': TaskSeq,
        'Vendor': Vendor,
        'Amount': Amount,
        'Scope': Scope
    };

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

class EstimateJobView implements IConvertible
{
    int? Seq;
    WorkPackageView? WorkPackage;
    String? ItemNo;
    String? Name;
    String? Category;
    String? SourceRef;
    String? Unit;
    double? Quantity;
    String? PatternCode;
    int? Workdays;
    double? HoursPerDay;
    bool? IsNight;
    double? WeeklyHours;
    double? OtFraction;
    double? Days;
    double? EffectiveProdPerDay;
    bool? CrewPremiumApplied;
    double? CrewCost;
    double? FringeCost;
    double? EquipmentCost;
    double? MaterialCost;
    double? SubcontractCost;
    double? Direct;
    String? PricingBasis;
    String? PricingRuleId;
    double? PricingBandP25;
    double? PricingBandP75;
    int? PricingBandN;
    String? PricingBandLabel;
    double? BenchmarkUnitPrice;
    double? ReferencePrice;
    double? ReferenceRangeMin;
    double? ReferenceRangeMax;
    int? ReferenceN;
    DateTime? ReferenceDate;
    String? ReferenceBasis;
    String? ReferenceUrl;
    List<EstimateCrewLineView>? Crew = [];
    List<EstimateEquipmentLineView>? Equipment = [];
    List<EstimateMaterialLineView>? Materials = [];
    List<EstimateSubcontractView>? Subcontracts = [];

    EstimateJobView({this.Seq,this.WorkPackage,this.ItemNo,this.Name,this.Category,this.SourceRef,this.Unit,this.Quantity,this.PatternCode,this.Workdays,this.HoursPerDay,this.IsNight,this.WeeklyHours,this.OtFraction,this.Days,this.EffectiveProdPerDay,this.CrewPremiumApplied,this.CrewCost,this.FringeCost,this.EquipmentCost,this.MaterialCost,this.SubcontractCost,this.Direct,this.PricingBasis,this.PricingRuleId,this.PricingBandP25,this.PricingBandP75,this.PricingBandN,this.PricingBandLabel,this.BenchmarkUnitPrice,this.ReferencePrice,this.ReferenceRangeMin,this.ReferenceRangeMax,this.ReferenceN,this.ReferenceDate,this.ReferenceBasis,this.ReferenceUrl,this.Crew,this.Equipment,this.Materials,this.Subcontracts});
    EstimateJobView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Seq = json['Seq'];
        WorkPackage = JsonConverters.fromJson(json['WorkPackage'],'WorkPackageView',context!);
        ItemNo = json['ItemNo'];
        Name = json['Name'];
        Category = json['Category'];
        SourceRef = json['SourceRef'];
        Unit = json['Unit'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        PatternCode = json['PatternCode'];
        Workdays = json['Workdays'];
        HoursPerDay = JsonConverters.toDouble(json['HoursPerDay']);
        IsNight = json['IsNight'];
        WeeklyHours = JsonConverters.toDouble(json['WeeklyHours']);
        OtFraction = JsonConverters.toDouble(json['OtFraction']);
        Days = JsonConverters.toDouble(json['Days']);
        EffectiveProdPerDay = JsonConverters.toDouble(json['EffectiveProdPerDay']);
        CrewPremiumApplied = json['CrewPremiumApplied'];
        CrewCost = JsonConverters.toDouble(json['CrewCost']);
        FringeCost = JsonConverters.toDouble(json['FringeCost']);
        EquipmentCost = JsonConverters.toDouble(json['EquipmentCost']);
        MaterialCost = JsonConverters.toDouble(json['MaterialCost']);
        SubcontractCost = JsonConverters.toDouble(json['SubcontractCost']);
        Direct = JsonConverters.toDouble(json['Direct']);
        PricingBasis = json['PricingBasis'];
        PricingRuleId = json['PricingRuleId'];
        PricingBandP25 = JsonConverters.toDouble(json['PricingBandP25']);
        PricingBandP75 = JsonConverters.toDouble(json['PricingBandP75']);
        PricingBandN = json['PricingBandN'];
        PricingBandLabel = json['PricingBandLabel'];
        BenchmarkUnitPrice = JsonConverters.toDouble(json['BenchmarkUnitPrice']);
        ReferencePrice = JsonConverters.toDouble(json['ReferencePrice']);
        ReferenceRangeMin = JsonConverters.toDouble(json['ReferenceRangeMin']);
        ReferenceRangeMax = JsonConverters.toDouble(json['ReferenceRangeMax']);
        ReferenceN = json['ReferenceN'];
        ReferenceDate = JsonConverters.fromJson(json['ReferenceDate'],'DateTime',context!);
        ReferenceBasis = json['ReferenceBasis'];
        ReferenceUrl = json['ReferenceUrl'];
        Crew = JsonConverters.fromJson(json['Crew'],'List<EstimateCrewLineView>',context!);
        Equipment = JsonConverters.fromJson(json['Equipment'],'List<EstimateEquipmentLineView>',context!);
        Materials = JsonConverters.fromJson(json['Materials'],'List<EstimateMaterialLineView>',context!);
        Subcontracts = JsonConverters.fromJson(json['Subcontracts'],'List<EstimateSubcontractView>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Seq': Seq,
        'WorkPackage': JsonConverters.toJson(WorkPackage,'WorkPackageView',context!),
        'ItemNo': ItemNo,
        'Name': Name,
        'Category': Category,
        'SourceRef': SourceRef,
        'Unit': Unit,
        'Quantity': Quantity,
        'PatternCode': PatternCode,
        'Workdays': Workdays,
        'HoursPerDay': HoursPerDay,
        'IsNight': IsNight,
        'WeeklyHours': WeeklyHours,
        'OtFraction': OtFraction,
        'Days': Days,
        'EffectiveProdPerDay': EffectiveProdPerDay,
        'CrewPremiumApplied': CrewPremiumApplied,
        'CrewCost': CrewCost,
        'FringeCost': FringeCost,
        'EquipmentCost': EquipmentCost,
        'MaterialCost': MaterialCost,
        'SubcontractCost': SubcontractCost,
        'Direct': Direct,
        'PricingBasis': PricingBasis,
        'PricingRuleId': PricingRuleId,
        'PricingBandP25': PricingBandP25,
        'PricingBandP75': PricingBandP75,
        'PricingBandN': PricingBandN,
        'PricingBandLabel': PricingBandLabel,
        'BenchmarkUnitPrice': BenchmarkUnitPrice,
        'ReferencePrice': ReferencePrice,
        'ReferenceRangeMin': ReferenceRangeMin,
        'ReferenceRangeMax': ReferenceRangeMax,
        'ReferenceN': ReferenceN,
        'ReferenceDate': JsonConverters.toJson(ReferenceDate,'DateTime',context!),
        'ReferenceBasis': ReferenceBasis,
        'ReferenceUrl': ReferenceUrl,
        'Crew': JsonConverters.toJson(Crew,'List<EstimateCrewLineView>',context!),
        'Equipment': JsonConverters.toJson(Equipment,'List<EstimateEquipmentLineView>',context!),
        'Materials': JsonConverters.toJson(Materials,'List<EstimateMaterialLineView>',context!),
        'Subcontracts': JsonConverters.toJson(Subcontracts,'List<EstimateSubcontractView>',context!)
    };

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

class BidScheduleLine implements IConvertible
{
    String? ItemNo;
    String? Description;
    String? Unit;
    double? Quantity;
    double? UnitPrice;
    double? Extension;
    String? PricingBasis;
    String? PricingRuleId;
    double? PricingBandP25;
    double? PricingBandP75;
    int? PricingBandN;
    String? PricingBandLabel;
    double? BenchmarkDeltaPct;
    bool? BenchmarkFlagged;
    String? BenchmarkBasis;
    String? Provenance;
    String? ProvenanceNote;
    int? UnpricedResources;
    int? TotalResources;

    BidScheduleLine({this.ItemNo,this.Description,this.Unit,this.Quantity,this.UnitPrice,this.Extension,this.PricingBasis,this.PricingRuleId,this.PricingBandP25,this.PricingBandP75,this.PricingBandN,this.PricingBandLabel,this.BenchmarkDeltaPct,this.BenchmarkFlagged,this.BenchmarkBasis,this.Provenance,this.ProvenanceNote,this.UnpricedResources,this.TotalResources});
    BidScheduleLine.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ItemNo = json['ItemNo'];
        Description = json['Description'];
        Unit = json['Unit'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        UnitPrice = JsonConverters.toDouble(json['UnitPrice']);
        Extension = JsonConverters.toDouble(json['Extension']);
        PricingBasis = json['PricingBasis'];
        PricingRuleId = json['PricingRuleId'];
        PricingBandP25 = JsonConverters.toDouble(json['PricingBandP25']);
        PricingBandP75 = JsonConverters.toDouble(json['PricingBandP75']);
        PricingBandN = json['PricingBandN'];
        PricingBandLabel = json['PricingBandLabel'];
        BenchmarkDeltaPct = JsonConverters.toDouble(json['BenchmarkDeltaPct']);
        BenchmarkFlagged = json['BenchmarkFlagged'];
        BenchmarkBasis = json['BenchmarkBasis'];
        Provenance = json['Provenance'];
        ProvenanceNote = json['ProvenanceNote'];
        UnpricedResources = json['UnpricedResources'];
        TotalResources = json['TotalResources'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ItemNo': ItemNo,
        'Description': Description,
        'Unit': Unit,
        'Quantity': Quantity,
        'UnitPrice': UnitPrice,
        'Extension': Extension,
        'PricingBasis': PricingBasis,
        'PricingRuleId': PricingRuleId,
        'PricingBandP25': PricingBandP25,
        'PricingBandP75': PricingBandP75,
        'PricingBandN': PricingBandN,
        'PricingBandLabel': PricingBandLabel,
        'BenchmarkDeltaPct': BenchmarkDeltaPct,
        'BenchmarkFlagged': BenchmarkFlagged,
        'BenchmarkBasis': BenchmarkBasis,
        'Provenance': Provenance,
        'ProvenanceNote': ProvenanceNote,
        'UnpricedResources': UnpricedResources,
        'TotalResources': TotalResources
    };

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

class EstimateVarianceLine implements IConvertible
{
    int? Seq;
    String? ItemNo;
    String? Name;
    String? Unit;
    double? Quantity;
    double? OurUnitPrice;
    double? OurTotal;
    double? BenchmarkUnitPrice;
    double? MarketTotal;
    double? DeltaPct;
    double? RateMin;
    double? RateMax;
    int? SampleSize;
    bool? OutsideRange;
    bool? IsFloor;
    bool? IsLump;
    String? Severity;
    bool? Adopted;
    String? Note;

    EstimateVarianceLine({this.Seq,this.ItemNo,this.Name,this.Unit,this.Quantity,this.OurUnitPrice,this.OurTotal,this.BenchmarkUnitPrice,this.MarketTotal,this.DeltaPct,this.RateMin,this.RateMax,this.SampleSize,this.OutsideRange,this.IsFloor,this.IsLump,this.Severity,this.Adopted,this.Note});
    EstimateVarianceLine.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Seq = json['Seq'];
        ItemNo = json['ItemNo'];
        Name = json['Name'];
        Unit = json['Unit'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        OurUnitPrice = JsonConverters.toDouble(json['OurUnitPrice']);
        OurTotal = JsonConverters.toDouble(json['OurTotal']);
        BenchmarkUnitPrice = JsonConverters.toDouble(json['BenchmarkUnitPrice']);
        MarketTotal = JsonConverters.toDouble(json['MarketTotal']);
        DeltaPct = JsonConverters.toDouble(json['DeltaPct']);
        RateMin = JsonConverters.toDouble(json['RateMin']);
        RateMax = JsonConverters.toDouble(json['RateMax']);
        SampleSize = json['SampleSize'];
        OutsideRange = json['OutsideRange'];
        IsFloor = json['IsFloor'];
        IsLump = json['IsLump'];
        Severity = json['Severity'];
        Adopted = json['Adopted'];
        Note = json['Note'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Seq': Seq,
        'ItemNo': ItemNo,
        'Name': Name,
        'Unit': Unit,
        'Quantity': Quantity,
        'OurUnitPrice': OurUnitPrice,
        'OurTotal': OurTotal,
        'BenchmarkUnitPrice': BenchmarkUnitPrice,
        'MarketTotal': MarketTotal,
        'DeltaPct': DeltaPct,
        'RateMin': RateMin,
        'RateMax': RateMax,
        'SampleSize': SampleSize,
        'OutsideRange': OutsideRange,
        'IsFloor': IsFloor,
        'IsLump': IsLump,
        'Severity': Severity,
        'Adopted': Adopted,
        'Note': Note
    };

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

class EstimateVarianceView implements IConvertible
{
    List<EstimateVarianceLine>? Lines = [];
    int? ItemsTotal;
    int? ItemsBenchmarked;
    double? CoverageValuePct;
    double? OursTotal;
    double? MarketTotal;
    double? AggregateDeltaPct;
    int? FlooredCount;
    int? LumpCount;
    int? WatchCount;
    int? OutlierCount;
    int? CriticalCount;
    String? Note;

    EstimateVarianceView({this.Lines,this.ItemsTotal,this.ItemsBenchmarked,this.CoverageValuePct,this.OursTotal,this.MarketTotal,this.AggregateDeltaPct,this.FlooredCount,this.LumpCount,this.WatchCount,this.OutlierCount,this.CriticalCount,this.Note});
    EstimateVarianceView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Lines = JsonConverters.fromJson(json['Lines'],'List<EstimateVarianceLine>',context!);
        ItemsTotal = json['ItemsTotal'];
        ItemsBenchmarked = json['ItemsBenchmarked'];
        CoverageValuePct = JsonConverters.toDouble(json['CoverageValuePct']);
        OursTotal = JsonConverters.toDouble(json['OursTotal']);
        MarketTotal = JsonConverters.toDouble(json['MarketTotal']);
        AggregateDeltaPct = JsonConverters.toDouble(json['AggregateDeltaPct']);
        FlooredCount = json['FlooredCount'];
        LumpCount = json['LumpCount'];
        WatchCount = json['WatchCount'];
        OutlierCount = json['OutlierCount'];
        CriticalCount = json['CriticalCount'];
        Note = json['Note'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Lines': JsonConverters.toJson(Lines,'List<EstimateVarianceLine>',context!),
        'ItemsTotal': ItemsTotal,
        'ItemsBenchmarked': ItemsBenchmarked,
        'CoverageValuePct': CoverageValuePct,
        'OursTotal': OursTotal,
        'MarketTotal': MarketTotal,
        'AggregateDeltaPct': AggregateDeltaPct,
        'FlooredCount': FlooredCount,
        'LumpCount': LumpCount,
        'WatchCount': WatchCount,
        'OutlierCount': OutlierCount,
        'CriticalCount': CriticalCount,
        'Note': Note
    };

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

class IndicativeLine implements IConvertible
{
    int? Seq;
    String? ItemNo;
    String? Name;
    String? Unit;
    double? Quantity;
    String? Source;
    double? UnitPrice;
    double? LineTotal;
    String? PricePoint;

    IndicativeLine({this.Seq,this.ItemNo,this.Name,this.Unit,this.Quantity,this.Source,this.UnitPrice,this.LineTotal,this.PricePoint});
    IndicativeLine.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Seq = json['Seq'];
        ItemNo = json['ItemNo'];
        Name = json['Name'];
        Unit = json['Unit'];
        Quantity = JsonConverters.toDouble(json['Quantity']);
        Source = json['Source'];
        UnitPrice = JsonConverters.toDouble(json['UnitPrice']);
        LineTotal = JsonConverters.toDouble(json['LineTotal']);
        PricePoint = json['PricePoint'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Seq': Seq,
        'ItemNo': ItemNo,
        'Name': Name,
        'Unit': Unit,
        'Quantity': Quantity,
        'Source': Source,
        'UnitPrice': UnitPrice,
        'LineTotal': LineTotal,
        'PricePoint': PricePoint
    };

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

class IndicativeBidView implements IConvertible
{
    List<IndicativeLine>? Lines = [];
    int? BottomUpCount;
    double? BottomUpTotal;
    int? BenchmarkCount;
    double? BenchmarkTotal;
    int? UncoveredCount;
    double? UncoveredFloorTotal;
    double? IndicativeTotal;
    double? FloorTotal;
    String? Note;
    String? Posture;
    double? AggressiveTotal;
    double? MarketTotal;
    double? PremiumTotal;
    int? NoDistributionCount;

    IndicativeBidView({this.Lines,this.BottomUpCount,this.BottomUpTotal,this.BenchmarkCount,this.BenchmarkTotal,this.UncoveredCount,this.UncoveredFloorTotal,this.IndicativeTotal,this.FloorTotal,this.Note,this.Posture,this.AggressiveTotal,this.MarketTotal,this.PremiumTotal,this.NoDistributionCount});
    IndicativeBidView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Lines = JsonConverters.fromJson(json['Lines'],'List<IndicativeLine>',context!);
        BottomUpCount = json['BottomUpCount'];
        BottomUpTotal = JsonConverters.toDouble(json['BottomUpTotal']);
        BenchmarkCount = json['BenchmarkCount'];
        BenchmarkTotal = JsonConverters.toDouble(json['BenchmarkTotal']);
        UncoveredCount = json['UncoveredCount'];
        UncoveredFloorTotal = JsonConverters.toDouble(json['UncoveredFloorTotal']);
        IndicativeTotal = JsonConverters.toDouble(json['IndicativeTotal']);
        FloorTotal = JsonConverters.toDouble(json['FloorTotal']);
        Note = json['Note'];
        Posture = json['Posture'];
        AggressiveTotal = JsonConverters.toDouble(json['AggressiveTotal']);
        MarketTotal = JsonConverters.toDouble(json['MarketTotal']);
        PremiumTotal = JsonConverters.toDouble(json['PremiumTotal']);
        NoDistributionCount = json['NoDistributionCount'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Lines': JsonConverters.toJson(Lines,'List<IndicativeLine>',context!),
        'BottomUpCount': BottomUpCount,
        'BottomUpTotal': BottomUpTotal,
        'BenchmarkCount': BenchmarkCount,
        'BenchmarkTotal': BenchmarkTotal,
        'UncoveredCount': UncoveredCount,
        'UncoveredFloorTotal': UncoveredFloorTotal,
        'IndicativeTotal': IndicativeTotal,
        'FloorTotal': FloorTotal,
        'Note': Note,
        'Posture': Posture,
        'AggressiveTotal': AggressiveTotal,
        'MarketTotal': MarketTotal,
        'PremiumTotal': PremiumTotal,
        'NoDistributionCount': NoDistributionCount
    };

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

class BidExposureLine implements IConvertible
{
    String? ItemNo;
    String? Description;
    String? Provenance;
    double? Extension;
    double? CumulativePct;
    String? Note;

    BidExposureLine({this.ItemNo,this.Description,this.Provenance,this.Extension,this.CumulativePct,this.Note});
    BidExposureLine.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ItemNo = json['ItemNo'];
        Description = json['Description'];
        Provenance = json['Provenance'];
        Extension = JsonConverters.toDouble(json['Extension']);
        CumulativePct = JsonConverters.toDouble(json['CumulativePct']);
        Note = json['Note'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ItemNo': ItemNo,
        'Description': Description,
        'Provenance': Provenance,
        'Extension': Extension,
        'CumulativePct': CumulativePct,
        'Note': Note
    };

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

class BidOwnershipView implements IConvertible
{
    double? OwnTotal;
    double? BorrowedTotal;
    double? UnknownFloorTotal;
    double? ScheduleTotal;
    int? OwnCount;
    int? BorrowedCount;
    int? UnknownCount;
    double? OwnPct;
    List<BidExposureLine>? TopExposure = [];

    BidOwnershipView({this.OwnTotal,this.BorrowedTotal,this.UnknownFloorTotal,this.ScheduleTotal,this.OwnCount,this.BorrowedCount,this.UnknownCount,this.OwnPct,this.TopExposure});
    BidOwnershipView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        OwnTotal = JsonConverters.toDouble(json['OwnTotal']);
        BorrowedTotal = JsonConverters.toDouble(json['BorrowedTotal']);
        UnknownFloorTotal = JsonConverters.toDouble(json['UnknownFloorTotal']);
        ScheduleTotal = JsonConverters.toDouble(json['ScheduleTotal']);
        OwnCount = json['OwnCount'];
        BorrowedCount = json['BorrowedCount'];
        UnknownCount = json['UnknownCount'];
        OwnPct = JsonConverters.toDouble(json['OwnPct']);
        TopExposure = JsonConverters.fromJson(json['TopExposure'],'List<BidExposureLine>',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'OwnTotal': OwnTotal,
        'BorrowedTotal': BorrowedTotal,
        'UnknownFloorTotal': UnknownFloorTotal,
        'ScheduleTotal': ScheduleTotal,
        'OwnCount': OwnCount,
        'BorrowedCount': BorrowedCount,
        'UnknownCount': UnknownCount,
        'OwnPct': OwnPct,
        'TopExposure': JsonConverters.toJson(TopExposure,'List<BidExposureLine>',context!)
    };

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

class EstimateSummaryView implements IConvertible
{
    double? Direct;
    double? OhpPct;
    double? OhpAmount;
    double? BondPct;
    double? BondAmount;
    double? ContingencyPct;
    double? ContingencyAmount;
    double? BidTotal;
    double? LoadFactor;
    double? MarginPct;

    EstimateSummaryView({this.Direct,this.OhpPct,this.OhpAmount,this.BondPct,this.BondAmount,this.ContingencyPct,this.ContingencyAmount,this.BidTotal,this.LoadFactor,this.MarginPct});
    EstimateSummaryView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        Direct = JsonConverters.toDouble(json['Direct']);
        OhpPct = JsonConverters.toDouble(json['OhpPct']);
        OhpAmount = JsonConverters.toDouble(json['OhpAmount']);
        BondPct = JsonConverters.toDouble(json['BondPct']);
        BondAmount = JsonConverters.toDouble(json['BondAmount']);
        ContingencyPct = JsonConverters.toDouble(json['ContingencyPct']);
        ContingencyAmount = JsonConverters.toDouble(json['ContingencyAmount']);
        BidTotal = JsonConverters.toDouble(json['BidTotal']);
        LoadFactor = JsonConverters.toDouble(json['LoadFactor']);
        MarginPct = JsonConverters.toDouble(json['MarginPct']);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'Direct': Direct,
        'OhpPct': OhpPct,
        'OhpAmount': OhpAmount,
        'BondPct': BondPct,
        'BondAmount': BondAmount,
        'ContingencyPct': ContingencyPct,
        'ContingencyAmount': ContingencyAmount,
        'BidTotal': BidTotal,
        'LoadFactor': LoadFactor,
        'MarginPct': MarginPct
    };

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

class EstimateTimingView implements IConvertible
{
    double? TotalWorkdays;
    int? CalendarDays;
    DateTime? Finish;
    bool? Feasible;
    DateTime? Deadline;

    EstimateTimingView({this.TotalWorkdays,this.CalendarDays,this.Finish,this.Feasible,this.Deadline});
    EstimateTimingView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        TotalWorkdays = JsonConverters.toDouble(json['TotalWorkdays']);
        CalendarDays = json['CalendarDays'];
        Finish = JsonConverters.fromJson(json['Finish'],'DateTime',context!);
        Feasible = json['Feasible'];
        Deadline = JsonConverters.fromJson(json['Deadline'],'DateTime',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'TotalWorkdays': TotalWorkdays,
        'CalendarDays': CalendarDays,
        'Finish': JsonConverters.toJson(Finish,'DateTime',context!),
        'Feasible': Feasible,
        'Deadline': JsonConverters.toJson(Deadline,'DateTime',context!)
    };

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

class EstimateReviewItemView implements IConvertible
{
    int? TaskSeq;
    String? TaskName;
    String? Reason;
    String? Status;

    EstimateReviewItemView({this.TaskSeq,this.TaskName,this.Reason,this.Status});
    EstimateReviewItemView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        TaskSeq = json['TaskSeq'];
        TaskName = json['TaskName'];
        Reason = json['Reason'];
        Status = json['Status'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'TaskSeq': TaskSeq,
        'TaskName': TaskName,
        'Reason': Reason,
        'Status': Status
    };

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

class EstimatingView implements IConvertible
{
    int? RfpDocumentID;
    String? ProjectName;
    String? ClientName;
    String? BidDueDate;
    String? ProjectType;
    EstimateSettingsView? Settings;
    List<EstimateJobView>? Jobs = [];
    List<BidScheduleLine>? Schedule = [];
    double? ScheduleTotal;
    EstimateVarianceView? Variance;
    IndicativeBidView? Indicative;
    BidOwnershipView? Ownership;
    EstimateSummaryView? Summary;
    EstimateTimingView? Timing;
    int? NeedsRateCount;
    List<String>? NeedsRateKeys = [];
    List<EstimateReviewItemView>? ReviewItems = [];
    int? NeedsReviewCount;
    bool? CanApprove;
    bool? CanSeePay;

    EstimatingView({this.RfpDocumentID,this.ProjectName,this.ClientName,this.BidDueDate,this.ProjectType,this.Settings,this.Jobs,this.Schedule,this.ScheduleTotal,this.Variance,this.Indicative,this.Ownership,this.Summary,this.Timing,this.NeedsRateCount,this.NeedsRateKeys,this.ReviewItems,this.NeedsReviewCount,this.CanApprove,this.CanSeePay});
    EstimatingView.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        RfpDocumentID = json['RfpDocumentID'];
        ProjectName = json['ProjectName'];
        ClientName = json['ClientName'];
        BidDueDate = json['BidDueDate'];
        ProjectType = json['ProjectType'];
        Settings = JsonConverters.fromJson(json['Settings'],'EstimateSettingsView',context!);
        Jobs = JsonConverters.fromJson(json['Jobs'],'List<EstimateJobView>',context!);
        Schedule = JsonConverters.fromJson(json['Schedule'],'List<BidScheduleLine>',context!);
        ScheduleTotal = JsonConverters.toDouble(json['ScheduleTotal']);
        Variance = JsonConverters.fromJson(json['Variance'],'EstimateVarianceView',context!);
        Indicative = JsonConverters.fromJson(json['Indicative'],'IndicativeBidView',context!);
        Ownership = JsonConverters.fromJson(json['Ownership'],'BidOwnershipView',context!);
        Summary = JsonConverters.fromJson(json['Summary'],'EstimateSummaryView',context!);
        Timing = JsonConverters.fromJson(json['Timing'],'EstimateTimingView',context!);
        NeedsRateCount = json['NeedsRateCount'];
        NeedsRateKeys = JsonConverters.fromJson(json['NeedsRateKeys'],'List<String>',context!);
        ReviewItems = JsonConverters.fromJson(json['ReviewItems'],'List<EstimateReviewItemView>',context!);
        NeedsReviewCount = json['NeedsReviewCount'];
        CanApprove = json['CanApprove'];
        CanSeePay = json['CanSeePay'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'RfpDocumentID': RfpDocumentID,
        'ProjectName': ProjectName,
        'ClientName': ClientName,
        'BidDueDate': BidDueDate,
        'ProjectType': ProjectType,
        'Settings': JsonConverters.toJson(Settings,'EstimateSettingsView',context!),
        'Jobs': JsonConverters.toJson(Jobs,'List<EstimateJobView>',context!),
        'Schedule': JsonConverters.toJson(Schedule,'List<BidScheduleLine>',context!),
        'ScheduleTotal': ScheduleTotal,
        'Variance': JsonConverters.toJson(Variance,'EstimateVarianceView',context!),
        'Indicative': JsonConverters.toJson(Indicative,'IndicativeBidView',context!),
        'Ownership': JsonConverters.toJson(Ownership,'BidOwnershipView',context!),
        'Summary': JsonConverters.toJson(Summary,'EstimateSummaryView',context!),
        'Timing': JsonConverters.toJson(Timing,'EstimateTimingView',context!),
        'NeedsRateCount': NeedsRateCount,
        'NeedsRateKeys': JsonConverters.toJson(NeedsRateKeys,'List<String>',context!),
        'ReviewItems': JsonConverters.toJson(ReviewItems,'List<EstimateReviewItemView>',context!),
        'NeedsReviewCount': NeedsReviewCount,
        'CanApprove': CanApprove,
        'CanSeePay': CanSeePay
    };

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

class EstimateSnapshot implements IConvertible
{
    DateTime? TakenAtUtc;
    ProjectProposal? Proposal;
    EstimatingView? View;

    EstimateSnapshot({this.TakenAtUtc,this.Proposal,this.View});
    EstimateSnapshot.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        TakenAtUtc = JsonConverters.fromJson(json['TakenAtUtc'],'DateTime',context!);
        Proposal = JsonConverters.fromJson(json['Proposal'],'ProjectProposal',context!);
        View = JsonConverters.fromJson(json['View'],'EstimatingView',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'TakenAtUtc': JsonConverters.toJson(TakenAtUtc,'DateTime',context!),
        'Proposal': JsonConverters.toJson(Proposal,'ProjectProposal',context!),
        'View': JsonConverters.toJson(View,'EstimatingView',context!)
    };

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

class EstimateRevisionGetResponse implements IConvertible
{
    ResponseStatus? ResponseStatus;
    EstimateRevision? Revision;
    EstimateSnapshot? Snapshot;

    EstimateRevisionGetResponse({this.ResponseStatus,this.Revision,this.Snapshot});
    EstimateRevisionGetResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        ResponseStatus = JsonConverters.fromJson(json['ResponseStatus'],'ResponseStatus',context!);
        Revision = JsonConverters.fromJson(json['Revision'],'EstimateRevision',context!);
        Snapshot = JsonConverters.fromJson(json['Snapshot'],'EstimateSnapshot',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'ResponseStatus': JsonConverters.toJson(ResponseStatus,'ResponseStatus',context!),
        'Revision': JsonConverters.toJson(Revision,'EstimateRevision',context!),
        'Snapshot': JsonConverters.toJson(Snapshot,'EstimateSnapshot',context!)
    };

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

class EstimateRevisionGetRequest implements IConvertible
{
    String? RfpDocumentUID;
    int? RevisionNo;

    EstimateRevisionGetRequest({this.RfpDocumentUID,this.RevisionNo});
    EstimateRevisionGetRequest.fromJson(Map<String, dynamic> json) { fromMap(json); }

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

    Map<String, dynamic> toJson() => {
        'RfpDocumentUID': RfpDocumentUID,
        'RevisionNo': RevisionNo
    };

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

TypeContext _ctx = TypeContext(library: 'api.dev.dynamics.trendsic.com', types: <String, TypeInfo> {
    'EstimateRevision': TypeInfo(TypeOf.Class, create:() => EstimateRevision()),
    'ResourcedPosition': TypeInfo(TypeOf.Class, create:() => ResourcedPosition()),
    'ResourcedEquipment': TypeInfo(TypeOf.Class, create:() => ResourcedEquipment()),
    'ResourcedMaterial': TypeInfo(TypeOf.Class, create:() => ResourcedMaterial()),
    'TaskResourcing': TypeInfo(TypeOf.Class, create:() => TaskResourcing()),
    'List<ResourcedPosition>': TypeInfo(TypeOf.Class, create:() => <ResourcedPosition>[]),
    'List<ResourcedEquipment>': TypeInfo(TypeOf.Class, create:() => <ResourcedEquipment>[]),
    'List<ResourcedMaterial>': TypeInfo(TypeOf.Class, create:() => <ResourcedMaterial>[]),
    'WorkPackageSpecRef': TypeInfo(TypeOf.Class, create:() => WorkPackageSpecRef()),
    'TaskWorkPackage': TypeInfo(TypeOf.Class, create:() => TaskWorkPackage()),
    'List<WorkPackageSpecRef>': TypeInfo(TypeOf.Class, create:() => <WorkPackageSpecRef>[]),
    'ProposedTask': TypeInfo(TypeOf.Class, create:() => ProposedTask()),
    'AddendaChange': TypeInfo(TypeOf.Class, create:() => AddendaChange()),
    'AddendaChangeSet': TypeInfo(TypeOf.Class, create:() => AddendaChangeSet()),
    'List<AddendaChange>': TypeInfo(TypeOf.Class, create:() => <AddendaChange>[]),
    'WageClassification': TypeInfo(TypeOf.Class, create:() => WageClassification()),
    'WageDeterminationResult': TypeInfo(TypeOf.Class, create:() => WageDeterminationResult()),
    'List<WageClassification>': TypeInfo(TypeOf.Class, create:() => <WageClassification>[]),
    'ProjectProposal': TypeInfo(TypeOf.Class, create:() => ProjectProposal()),
    'List<ProposedTask>': TypeInfo(TypeOf.Class, create:() => <ProposedTask>[]),
    'List<AddendaChangeSet>': TypeInfo(TypeOf.Class, create:() => <AddendaChangeSet>[]),
    'List<WageDeterminationResult>': TypeInfo(TypeOf.Class, create:() => <WageDeterminationResult>[]),
    'EstimateSettingsView': TypeInfo(TypeOf.Class, create:() => EstimateSettingsView()),
    'List<DateTime>': TypeInfo(TypeOf.Class, create:() => <DateTime>[]),
    'SpecRefView': TypeInfo(TypeOf.Class, create:() => SpecRefView()),
    'DodItemView': TypeInfo(TypeOf.Class, create:() => DodItemView()),
    'WorkPackageView': TypeInfo(TypeOf.Class, create:() => WorkPackageView()),
    'List<SpecRefView>': TypeInfo(TypeOf.Class, create:() => <SpecRefView>[]),
    'List<DodItemView>': TypeInfo(TypeOf.Class, create:() => <DodItemView>[]),
    'EstimateCrewLineView': TypeInfo(TypeOf.Class, create:() => EstimateCrewLineView()),
    'EstimateEquipmentLineView': TypeInfo(TypeOf.Class, create:() => EstimateEquipmentLineView()),
    'EstimateMaterialLineView': TypeInfo(TypeOf.Class, create:() => EstimateMaterialLineView()),
    'EstimateSubcontractView': TypeInfo(TypeOf.Class, create:() => EstimateSubcontractView()),
    'EstimateJobView': TypeInfo(TypeOf.Class, create:() => EstimateJobView()),
    'List<EstimateCrewLineView>': TypeInfo(TypeOf.Class, create:() => <EstimateCrewLineView>[]),
    'List<EstimateEquipmentLineView>': TypeInfo(TypeOf.Class, create:() => <EstimateEquipmentLineView>[]),
    'List<EstimateMaterialLineView>': TypeInfo(TypeOf.Class, create:() => <EstimateMaterialLineView>[]),
    'List<EstimateSubcontractView>': TypeInfo(TypeOf.Class, create:() => <EstimateSubcontractView>[]),
    'BidScheduleLine': TypeInfo(TypeOf.Class, create:() => BidScheduleLine()),
    'EstimateVarianceLine': TypeInfo(TypeOf.Class, create:() => EstimateVarianceLine()),
    'EstimateVarianceView': TypeInfo(TypeOf.Class, create:() => EstimateVarianceView()),
    'List<EstimateVarianceLine>': TypeInfo(TypeOf.Class, create:() => <EstimateVarianceLine>[]),
    'IndicativeLine': TypeInfo(TypeOf.Class, create:() => IndicativeLine()),
    'IndicativeBidView': TypeInfo(TypeOf.Class, create:() => IndicativeBidView()),
    'List<IndicativeLine>': TypeInfo(TypeOf.Class, create:() => <IndicativeLine>[]),
    'BidExposureLine': TypeInfo(TypeOf.Class, create:() => BidExposureLine()),
    'BidOwnershipView': TypeInfo(TypeOf.Class, create:() => BidOwnershipView()),
    'List<BidExposureLine>': TypeInfo(TypeOf.Class, create:() => <BidExposureLine>[]),
    'EstimateSummaryView': TypeInfo(TypeOf.Class, create:() => EstimateSummaryView()),
    'EstimateTimingView': TypeInfo(TypeOf.Class, create:() => EstimateTimingView()),
    'EstimateReviewItemView': TypeInfo(TypeOf.Class, create:() => EstimateReviewItemView()),
    'EstimatingView': TypeInfo(TypeOf.Class, create:() => EstimatingView()),
    'List<EstimateJobView>': TypeInfo(TypeOf.Class, create:() => <EstimateJobView>[]),
    'List<BidScheduleLine>': TypeInfo(TypeOf.Class, create:() => <BidScheduleLine>[]),
    'List<EstimateReviewItemView>': TypeInfo(TypeOf.Class, create:() => <EstimateReviewItemView>[]),
    'EstimateSnapshot': TypeInfo(TypeOf.Class, create:() => EstimateSnapshot()),
    'EstimateRevisionGetResponse': TypeInfo(TypeOf.Class, create:() => EstimateRevisionGetResponse()),
    'EstimateRevisionGetRequest': TypeInfo(TypeOf.Class, create:() => EstimateRevisionGetRequest()),
});

Dart EstimateRevisionGetRequest DTOs

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

HTTP + JSV

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

GET /v1/Rfp/{RfpDocumentUID}/Estimate/Revisions/{RevisionNo} HTTP/1.1 
Host: api.dev.dynamics.trendsic.com 
Accept: text/jsv
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	ResponseStatus: 
	{
		ErrorCode: String,
		Message: String,
		StackTrace: String,
		Errors: 
		[
			{
				ErrorCode: String,
				FieldName: String,
				Message: String,
				Meta: 
				{
					String: String
				}
			}
		],
		Meta: 
		{
			String: String
		}
	},
	Revision: 
	{
		EstimateRevisionID: 0,
		RfpDocumentID: 0,
		RevisionNo: 0,
		Label: String,
		Reason: String,
		Trigger: String,
		TotalAmount: 0,
		LineCount: 0,
		CreatedBy: String,
		CreatedAt: 0001-01-01,
		SnapshotJson: String
	},
	Snapshot: 
	{
		TakenAtUtc: 0001-01-01,
		Proposal: 
		{
			RfpDocumentID: 0,
			Mode: String,
			ProjectID: 0,
			ChangeOrderID: 0,
			ProjectName: String,
			ClientName: String,
			ProjectType: String,
			ProjectLocation: String,
			Scope: String,
			ProjectDescription: String,
			ContractDurationDays: 0,
			BidDueDate: String,
			EstimatedStartDate: 0001-01-01,
			EstimatedEndDate: 0001-01-01,
			Tasks: 
			[
				{
					Seq: 0,
					Name: String,
					Category: String,
					Quantity: 0,
					Unit: String,
					SourceItemNumber: String,
					SourceReference: String,
					Notes: String,
					Resourcing: 
					{
						Positions: 
						[
							{
								PositionTag: String,
								Hours: 0,
								CrewSize: 0,
								Utilization: 0,
								FixedDays: 0,
								Headcount: 0,
								SourceReference: String,
								Notes: String,
								IsInCatalog: False,
								ContactID: 0
							}
						],
						Equipment: 
						[
							{
								EquipmentID: 0,
								EquipmentName: String,
								MakeModel: String,
								Quantity: 0,
								DurationDays: 0,
								Utilization: 0,
								FixedDays: 0,
								SourceReference: String,
								Notes: String,
								IsInCatalog: False,
								SuggestedEquipmentID: 0,
								SuggestedEquipmentName: String
							}
						],
						Materials: 
						[
							{
								MaterialID: 0,
								MaterialName: String,
								MakeModel: String,
								Quantity: 0,
								QuantityPerUnit: 0,
								Unit: String,
								SourceReference: String,
								Notes: String,
								IsInCatalog: False,
								SuggestedMaterialID: 0,
								SuggestedMaterialName: String
							}
						],
						ResourcedForQuantity: 0,
						ProductionRatePerDay: 0,
						FixedDays: 0
					},
					DurationDays: 0,
					DependsOn: 
					[
						0
					],
					EstimatedStartDate: 0001-01-01,
					EstimatedEndDate: 0001-01-01,
					WorkPackage: 
					{
						Scope: String,
						LimitsOfWork: String,
						SpecRefs: 
						[
							{
								Section: String,
								Title: String
							}
						],
						Constraints: 
						[
							String
						],
						HoldPoints: 
						[
							String
						],
						DefinitionOfDone: 
						[
							String
						],
						SafetyNote: String,
						RfpRef: String,
						Confidence: 0,
						SpecBook: String,
						UserScope: String,
						DodRemoved: 
						[
							0
						],
						DodExtra: 
						[
							String
						],
						UserEdited: False,
						DodChecked: 
						[
							String
						],
						RedraftNote: String
					},
					CreatedJobID: 0
				}
			],
			PendingAddendaDiffs: 
			[
				{
					ChangeSetId: String,
					SourceRfpDocumentID: 0,
					SourceFileName: String,
					DocumentType: String,
					ExtractedAtUtc: 0001-01-01,
					Summary: String,
					Changes: 
					[
						{
							ChangeId: String,
							ChangeType: String,
							TargetSeq: 0,
							ItemNumber: String,
							ItemName: String,
							Field: String,
							OldValue: String,
							NewValue: String,
							Description: String,
							Status: String
						}
					]
				}
			],
			WageDeterminations: 
			[
				{
					SourceRfpDocumentID: 0,
					SourceFileName: String,
					WdNumber: String,
					ExtractedAtUtc: 0001-01-01,
					Classifications: 
					[
						{
							Title: String,
							BaseRate: 0,
							FringeRate: 0,
							ParishNote: String,
							SourceLine: String,
							BenchmarkFringeRate: 0,
							FringeCompareNote: String
						}
					],
					Source: String,
					IsTrustworthy: False,
					ExecutiveOrderFloor: 0,
					PublishedDate: String,
					ProjectParish: String,
					Warnings: 
					[
						String
					]
				}
			]
		},
		View: 
		{
			RfpDocumentID: 0,
			ProjectName: String,
			ClientName: String,
			BidDueDate: String,
			ProjectType: String,
			Settings: 
			{
				RfpEstimateID: 0,
				StartDate: 0001-01-01,
				DeadlineDate: 0001-01-01,
				WorkdaysPerWeek: 0,
				HoursPerDay: 0,
				WeatherPct: 0,
				OhpPct: 0,
				ContingencyPct: 0,
				BondPct: 0,
				Holidays: 
				[
					0001-01-01
				],
				AppliedStartDate: 0001-01-01
			},
			Jobs: 
			[
				{
					Seq: 0,
					WorkPackage: 
					{
						HasPackage: False,
						Scope: String,
						LimitsOfWork: String,
						SpecRefs: 
						[
							{
								Section: String,
								Title: String,
								Url: String
							}
						],
						Constraints: 
						[
							String
						],
						HoldPoints: 
						[
							String
						],
						Dod: 
						[
							{
								Key: String,
								Text: String,
								Checked: False,
								Source: String
							}
						],
						SafetyNote: String,
						Provenance: String,
						SpecBook: String,
						UserEdited: False,
						RedraftNote: String
					},
					ItemNo: String,
					Name: String,
					Category: String,
					SourceRef: String,
					Unit: String,
					Quantity: 0,
					PatternCode: String,
					Workdays: 0,
					HoursPerDay: 0,
					IsNight: False,
					WeeklyHours: 0,
					OtFraction: 0,
					Days: 0,
					EffectiveProdPerDay: 0,
					CrewPremiumApplied: False,
					CrewCost: 0,
					FringeCost: 0,
					EquipmentCost: 0,
					MaterialCost: 0,
					SubcontractCost: 0,
					Direct: 0,
					PricingBasis: String,
					PricingRuleId: String,
					PricingBandP25: 0,
					PricingBandP75: 0,
					PricingBandN: 0,
					PricingBandLabel: String,
					BenchmarkUnitPrice: 0,
					ReferencePrice: 0,
					ReferenceRangeMin: 0,
					ReferenceRangeMax: 0,
					ReferenceN: 0,
					ReferenceDate: 0001-01-01,
					ReferenceBasis: String,
					ReferenceUrl: String,
					Crew: 
					[
						{
							Role: String,
							Hours: 0,
							StHours: 0,
							OtHours: 0,
							HasOt: False,
							PremiumApplied: False,
							NeedsRate: False,
							RateKey: String,
							Chip: String,
							Rrop: 0,
							StCost: 0,
							OtCost: 0,
							Cost: 0,
							FringeCost: 0
						}
					],
					Equipment: 
					[
						{
							Name: String,
							Quantity: 0,
							Rate: 0,
							NeedsRate: False,
							MobCost: 0,
							Cost: 0,
							IsAvailabilityTracked: False,
							IsOwned: False,
							AvailabilityLabel: String,
							FreedFromProject: String,
							AvailableFrom: 0001-01-01,
							RateKey: String,
							Chip: String,
							RentalExplain: String,
							UsageDays: 0,
							BilledDays: 0
						}
					],
					Materials: 
					[
						{
							Name: String,
							Quantity: 0,
							Unit: String,
							Rate: 0,
							NeedsRate: False,
							Cost: 0,
							RateKey: String,
							Chip: String
						}
					],
					Subcontracts: 
					[
						{
							EstimateSubcontractID: 0,
							TaskSeq: 0,
							Vendor: String,
							Amount: 0,
							Scope: String
						}
					]
				}
			],
			Schedule: 
			[
				{
					ItemNo: String,
					Description: String,
					Unit: String,
					Quantity: 0,
					UnitPrice: 0,
					Extension: 0,
					PricingBasis: String,
					PricingRuleId: String,
					PricingBandP25: 0,
					PricingBandP75: 0,
					PricingBandN: 0,
					PricingBandLabel: String,
					BenchmarkDeltaPct: 0,
					BenchmarkFlagged: False,
					BenchmarkBasis: String,
					Provenance: String,
					ProvenanceNote: String,
					UnpricedResources: 0,
					TotalResources: 0
				}
			],
			ScheduleTotal: 0,
			Variance: 
			{
				Lines: 
				[
					{
						Seq: 0,
						ItemNo: String,
						Name: String,
						Unit: String,
						Quantity: 0,
						OurUnitPrice: 0,
						OurTotal: 0,
						BenchmarkUnitPrice: 0,
						MarketTotal: 0,
						DeltaPct: 0,
						RateMin: 0,
						RateMax: 0,
						SampleSize: 0,
						OutsideRange: False,
						IsFloor: False,
						IsLump: False,
						Severity: String,
						Adopted: False,
						Note: String
					}
				],
				ItemsTotal: 0,
				ItemsBenchmarked: 0,
				CoverageValuePct: 0,
				OursTotal: 0,
				MarketTotal: 0,
				AggregateDeltaPct: 0,
				FlooredCount: 0,
				LumpCount: 0,
				WatchCount: 0,
				OutlierCount: 0,
				CriticalCount: 0,
				Note: String
			},
			Indicative: 
			{
				Lines: 
				[
					{
						Seq: 0,
						ItemNo: String,
						Name: String,
						Unit: String,
						Quantity: 0,
						Source: String,
						UnitPrice: 0,
						LineTotal: 0,
						PricePoint: String
					}
				],
				BottomUpCount: 0,
				BottomUpTotal: 0,
				BenchmarkCount: 0,
				BenchmarkTotal: 0,
				UncoveredCount: 0,
				UncoveredFloorTotal: 0,
				IndicativeTotal: 0,
				FloorTotal: 0,
				Note: String,
				Posture: String,
				AggressiveTotal: 0,
				MarketTotal: 0,
				PremiumTotal: 0,
				NoDistributionCount: 0
			},
			Ownership: 
			{
				OwnTotal: 0,
				BorrowedTotal: 0,
				UnknownFloorTotal: 0,
				ScheduleTotal: 0,
				OwnCount: 0,
				BorrowedCount: 0,
				UnknownCount: 0,
				OwnPct: 0,
				TopExposure: 
				[
					{
						ItemNo: String,
						Description: String,
						Provenance: String,
						Extension: 0,
						CumulativePct: 0,
						Note: String
					}
				]
			},
			Summary: 
			{
				Direct: 0,
				OhpPct: 0,
				OhpAmount: 0,
				BondPct: 0,
				BondAmount: 0,
				ContingencyPct: 0,
				ContingencyAmount: 0,
				BidTotal: 0,
				LoadFactor: 0,
				MarginPct: 0
			},
			Timing: 
			{
				TotalWorkdays: 0,
				CalendarDays: 0,
				Finish: 0001-01-01,
				Feasible: False,
				Deadline: 0001-01-01
			},
			NeedsRateCount: 0,
			NeedsRateKeys: 
			[
				String
			],
			ReviewItems: 
			[
				{
					TaskSeq: 0,
					TaskName: String,
					Reason: String,
					Status: String
				}
			],
			NeedsReviewCount: 0,
			CanApprove: False,
			CanSeePay: False
		}
	}
}