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}
<?php namespace dtos;

use DateTime;
use Exception;
use DateInterval;
use JsonSerializable;
use ServiceStack\{IReturn,IReturnVoid,IGet,IPost,IPut,IDelete,IPatch,IMeta,IHasSessionId,IHasBearerToken,IHasVersion};
use ServiceStack\{ICrud,ICreateDb,IUpdateDb,IPatchDb,IDeleteDb,ISaveDb,AuditBase,QueryDb,QueryDb2,QueryData,QueryData2,QueryResponse};
use ServiceStack\{ResponseStatus,ResponseError,EmptyResponse,IdResponse,ArrayList,KeyValuePair2,StringResponse,StringsResponse,Tuple2,Tuple3,ByteArray};
use ServiceStack\{JsonConverters,Returns,TypeContext};


class EstimateRevision implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $EstimateRevisionID=0,
        /** @var int */
        public int $RfpDocumentID=0,
        /** @var int */
        public int $RevisionNo=0,
        /** @var string|null */
        public ?string $Label=null,
        /** @var string|null */
        public ?string $Reason=null,
        /** @var string|null */
        public ?string $Trigger=null,
        /** @var float */
        public float $TotalAmount=0.0,
        /** @var int */
        public int $LineCount=0,
        /** @var string|null */
        public ?string $CreatedBy=null,
        /** @var DateTime|null */
        public ?DateTime $CreatedAt=null,
        /** @var string|null */
        public ?string $SnapshotJson=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['EstimateRevisionID'])) $this->EstimateRevisionID = $o['EstimateRevisionID'];
        if (isset($o['RfpDocumentID'])) $this->RfpDocumentID = $o['RfpDocumentID'];
        if (isset($o['RevisionNo'])) $this->RevisionNo = $o['RevisionNo'];
        if (isset($o['Label'])) $this->Label = $o['Label'];
        if (isset($o['Reason'])) $this->Reason = $o['Reason'];
        if (isset($o['Trigger'])) $this->Trigger = $o['Trigger'];
        if (isset($o['TotalAmount'])) $this->TotalAmount = $o['TotalAmount'];
        if (isset($o['LineCount'])) $this->LineCount = $o['LineCount'];
        if (isset($o['CreatedBy'])) $this->CreatedBy = $o['CreatedBy'];
        if (isset($o['CreatedAt'])) $this->CreatedAt = JsonConverters::from('DateTime', $o['CreatedAt']);
        if (isset($o['SnapshotJson'])) $this->SnapshotJson = $o['SnapshotJson'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->EstimateRevisionID)) $o['EstimateRevisionID'] = $this->EstimateRevisionID;
        if (isset($this->RfpDocumentID)) $o['RfpDocumentID'] = $this->RfpDocumentID;
        if (isset($this->RevisionNo)) $o['RevisionNo'] = $this->RevisionNo;
        if (isset($this->Label)) $o['Label'] = $this->Label;
        if (isset($this->Reason)) $o['Reason'] = $this->Reason;
        if (isset($this->Trigger)) $o['Trigger'] = $this->Trigger;
        if (isset($this->TotalAmount)) $o['TotalAmount'] = $this->TotalAmount;
        if (isset($this->LineCount)) $o['LineCount'] = $this->LineCount;
        if (isset($this->CreatedBy)) $o['CreatedBy'] = $this->CreatedBy;
        if (isset($this->CreatedAt)) $o['CreatedAt'] = JsonConverters::to('DateTime', $this->CreatedAt);
        if (isset($this->SnapshotJson)) $o['SnapshotJson'] = $this->SnapshotJson;
        return empty($o) ? new class(){} : $o;
    }
}

class ResourcedPosition implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $PositionTag=null,
        /** @var float|null */
        public ?float $Hours=null,
        /** @var float|null */
        public ?float $CrewSize=null,
        /** @var float|null */
        public ?float $Utilization=null,
        /** @var float|null */
        public ?float $FixedDays=null,
        /** @var int|null */
        public ?int $Headcount=null,
        /** @var string|null */
        public ?string $SourceReference=null,
        /** @var string|null */
        public ?string $Notes=null,
        /** @var bool|null */
        public ?bool $IsInCatalog=null,
        /** @var int|null */
        public ?int $ContactID=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['PositionTag'])) $this->PositionTag = $o['PositionTag'];
        if (isset($o['Hours'])) $this->Hours = $o['Hours'];
        if (isset($o['CrewSize'])) $this->CrewSize = $o['CrewSize'];
        if (isset($o['Utilization'])) $this->Utilization = $o['Utilization'];
        if (isset($o['FixedDays'])) $this->FixedDays = $o['FixedDays'];
        if (isset($o['Headcount'])) $this->Headcount = $o['Headcount'];
        if (isset($o['SourceReference'])) $this->SourceReference = $o['SourceReference'];
        if (isset($o['Notes'])) $this->Notes = $o['Notes'];
        if (isset($o['IsInCatalog'])) $this->IsInCatalog = $o['IsInCatalog'];
        if (isset($o['ContactID'])) $this->ContactID = $o['ContactID'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->PositionTag)) $o['PositionTag'] = $this->PositionTag;
        if (isset($this->Hours)) $o['Hours'] = $this->Hours;
        if (isset($this->CrewSize)) $o['CrewSize'] = $this->CrewSize;
        if (isset($this->Utilization)) $o['Utilization'] = $this->Utilization;
        if (isset($this->FixedDays)) $o['FixedDays'] = $this->FixedDays;
        if (isset($this->Headcount)) $o['Headcount'] = $this->Headcount;
        if (isset($this->SourceReference)) $o['SourceReference'] = $this->SourceReference;
        if (isset($this->Notes)) $o['Notes'] = $this->Notes;
        if (isset($this->IsInCatalog)) $o['IsInCatalog'] = $this->IsInCatalog;
        if (isset($this->ContactID)) $o['ContactID'] = $this->ContactID;
        return empty($o) ? new class(){} : $o;
    }
}

class ResourcedEquipment implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $EquipmentID=0,
        /** @var string|null */
        public ?string $EquipmentName=null,
        /** @var string|null */
        public ?string $MakeModel=null,
        /** @var float|null */
        public ?float $Quantity=null,
        /** @var float|null */
        public ?float $DurationDays=null,
        /** @var float|null */
        public ?float $Utilization=null,
        /** @var float|null */
        public ?float $FixedDays=null,
        /** @var string|null */
        public ?string $SourceReference=null,
        /** @var string|null */
        public ?string $Notes=null,
        /** @var bool|null */
        public ?bool $IsInCatalog=null,
        /** @var int */
        public int $SuggestedEquipmentID=0,
        /** @var string|null */
        public ?string $SuggestedEquipmentName=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['EquipmentID'])) $this->EquipmentID = $o['EquipmentID'];
        if (isset($o['EquipmentName'])) $this->EquipmentName = $o['EquipmentName'];
        if (isset($o['MakeModel'])) $this->MakeModel = $o['MakeModel'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['DurationDays'])) $this->DurationDays = $o['DurationDays'];
        if (isset($o['Utilization'])) $this->Utilization = $o['Utilization'];
        if (isset($o['FixedDays'])) $this->FixedDays = $o['FixedDays'];
        if (isset($o['SourceReference'])) $this->SourceReference = $o['SourceReference'];
        if (isset($o['Notes'])) $this->Notes = $o['Notes'];
        if (isset($o['IsInCatalog'])) $this->IsInCatalog = $o['IsInCatalog'];
        if (isset($o['SuggestedEquipmentID'])) $this->SuggestedEquipmentID = $o['SuggestedEquipmentID'];
        if (isset($o['SuggestedEquipmentName'])) $this->SuggestedEquipmentName = $o['SuggestedEquipmentName'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->EquipmentID)) $o['EquipmentID'] = $this->EquipmentID;
        if (isset($this->EquipmentName)) $o['EquipmentName'] = $this->EquipmentName;
        if (isset($this->MakeModel)) $o['MakeModel'] = $this->MakeModel;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->DurationDays)) $o['DurationDays'] = $this->DurationDays;
        if (isset($this->Utilization)) $o['Utilization'] = $this->Utilization;
        if (isset($this->FixedDays)) $o['FixedDays'] = $this->FixedDays;
        if (isset($this->SourceReference)) $o['SourceReference'] = $this->SourceReference;
        if (isset($this->Notes)) $o['Notes'] = $this->Notes;
        if (isset($this->IsInCatalog)) $o['IsInCatalog'] = $this->IsInCatalog;
        if (isset($this->SuggestedEquipmentID)) $o['SuggestedEquipmentID'] = $this->SuggestedEquipmentID;
        if (isset($this->SuggestedEquipmentName)) $o['SuggestedEquipmentName'] = $this->SuggestedEquipmentName;
        return empty($o) ? new class(){} : $o;
    }
}

class ResourcedMaterial implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $MaterialID=0,
        /** @var string|null */
        public ?string $MaterialName=null,
        /** @var string|null */
        public ?string $MakeModel=null,
        /** @var float|null */
        public ?float $Quantity=null,
        /** @var float|null */
        public ?float $QuantityPerUnit=null,
        /** @var string|null */
        public ?string $Unit=null,
        /** @var string|null */
        public ?string $SourceReference=null,
        /** @var string|null */
        public ?string $Notes=null,
        /** @var bool|null */
        public ?bool $IsInCatalog=null,
        /** @var int */
        public int $SuggestedMaterialID=0,
        /** @var string|null */
        public ?string $SuggestedMaterialName=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['MaterialID'])) $this->MaterialID = $o['MaterialID'];
        if (isset($o['MaterialName'])) $this->MaterialName = $o['MaterialName'];
        if (isset($o['MakeModel'])) $this->MakeModel = $o['MakeModel'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['QuantityPerUnit'])) $this->QuantityPerUnit = $o['QuantityPerUnit'];
        if (isset($o['Unit'])) $this->Unit = $o['Unit'];
        if (isset($o['SourceReference'])) $this->SourceReference = $o['SourceReference'];
        if (isset($o['Notes'])) $this->Notes = $o['Notes'];
        if (isset($o['IsInCatalog'])) $this->IsInCatalog = $o['IsInCatalog'];
        if (isset($o['SuggestedMaterialID'])) $this->SuggestedMaterialID = $o['SuggestedMaterialID'];
        if (isset($o['SuggestedMaterialName'])) $this->SuggestedMaterialName = $o['SuggestedMaterialName'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->MaterialID)) $o['MaterialID'] = $this->MaterialID;
        if (isset($this->MaterialName)) $o['MaterialName'] = $this->MaterialName;
        if (isset($this->MakeModel)) $o['MakeModel'] = $this->MakeModel;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->QuantityPerUnit)) $o['QuantityPerUnit'] = $this->QuantityPerUnit;
        if (isset($this->Unit)) $o['Unit'] = $this->Unit;
        if (isset($this->SourceReference)) $o['SourceReference'] = $this->SourceReference;
        if (isset($this->Notes)) $o['Notes'] = $this->Notes;
        if (isset($this->IsInCatalog)) $o['IsInCatalog'] = $this->IsInCatalog;
        if (isset($this->SuggestedMaterialID)) $o['SuggestedMaterialID'] = $this->SuggestedMaterialID;
        if (isset($this->SuggestedMaterialName)) $o['SuggestedMaterialName'] = $this->SuggestedMaterialName;
        return empty($o) ? new class(){} : $o;
    }
}

class TaskResourcing implements JsonSerializable
{
    public function __construct(
        /** @var array<ResourcedPosition>|null */
        public ?array $Positions=null,
        /** @var array<ResourcedEquipment>|null */
        public ?array $Equipment=null,
        /** @var array<ResourcedMaterial>|null */
        public ?array $Materials=null,
        /** @var float|null */
        public ?float $ResourcedForQuantity=null,
        /** @var float|null */
        public ?float $ProductionRatePerDay=null,
        /** @var float|null */
        public ?float $FixedDays=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Positions'])) $this->Positions = JsonConverters::fromArray('ResourcedPosition', $o['Positions']);
        if (isset($o['Equipment'])) $this->Equipment = JsonConverters::fromArray('ResourcedEquipment', $o['Equipment']);
        if (isset($o['Materials'])) $this->Materials = JsonConverters::fromArray('ResourcedMaterial', $o['Materials']);
        if (isset($o['ResourcedForQuantity'])) $this->ResourcedForQuantity = $o['ResourcedForQuantity'];
        if (isset($o['ProductionRatePerDay'])) $this->ProductionRatePerDay = $o['ProductionRatePerDay'];
        if (isset($o['FixedDays'])) $this->FixedDays = $o['FixedDays'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Positions)) $o['Positions'] = JsonConverters::toArray('ResourcedPosition', $this->Positions);
        if (isset($this->Equipment)) $o['Equipment'] = JsonConverters::toArray('ResourcedEquipment', $this->Equipment);
        if (isset($this->Materials)) $o['Materials'] = JsonConverters::toArray('ResourcedMaterial', $this->Materials);
        if (isset($this->ResourcedForQuantity)) $o['ResourcedForQuantity'] = $this->ResourcedForQuantity;
        if (isset($this->ProductionRatePerDay)) $o['ProductionRatePerDay'] = $this->ProductionRatePerDay;
        if (isset($this->FixedDays)) $o['FixedDays'] = $this->FixedDays;
        return empty($o) ? new class(){} : $o;
    }
}

class WorkPackageSpecRef implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Section=null,
        /** @var string|null */
        public ?string $Title=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Section'])) $this->Section = $o['Section'];
        if (isset($o['Title'])) $this->Title = $o['Title'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Section)) $o['Section'] = $this->Section;
        if (isset($this->Title)) $o['Title'] = $this->Title;
        return empty($o) ? new class(){} : $o;
    }
}

class TaskWorkPackage implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Scope=null,
        /** @var string|null */
        public ?string $LimitsOfWork=null,
        /** @var array<WorkPackageSpecRef>|null */
        public ?array $SpecRefs=null,
        /** @var array<string>|null */
        public ?array $Constraints=null,
        /** @var array<string>|null */
        public ?array $HoldPoints=null,
        /** @var array<string>|null */
        public ?array $DefinitionOfDone=null,
        /** @var string|null */
        public ?string $SafetyNote=null,
        /** @var string|null */
        public ?string $RfpRef=null,
        /** @var int|null */
        public ?int $Confidence=null,
        /** @var string|null */
        public ?string $SpecBook=null,
        /** @var string|null */
        public ?string $UserScope=null,
        /** @var array<int>|null */
        public ?array $DodRemoved=null,
        /** @var array<string>|null */
        public ?array $DodExtra=null,
        /** @var bool|null */
        public ?bool $UserEdited=null,
        /** @var array<string>|null */
        public ?array $DodChecked=null,
        /** @var string|null */
        public ?string $RedraftNote=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Scope'])) $this->Scope = $o['Scope'];
        if (isset($o['LimitsOfWork'])) $this->LimitsOfWork = $o['LimitsOfWork'];
        if (isset($o['SpecRefs'])) $this->SpecRefs = JsonConverters::fromArray('WorkPackageSpecRef', $o['SpecRefs']);
        if (isset($o['Constraints'])) $this->Constraints = JsonConverters::fromArray('string', $o['Constraints']);
        if (isset($o['HoldPoints'])) $this->HoldPoints = JsonConverters::fromArray('string', $o['HoldPoints']);
        if (isset($o['DefinitionOfDone'])) $this->DefinitionOfDone = JsonConverters::fromArray('string', $o['DefinitionOfDone']);
        if (isset($o['SafetyNote'])) $this->SafetyNote = $o['SafetyNote'];
        if (isset($o['RfpRef'])) $this->RfpRef = $o['RfpRef'];
        if (isset($o['Confidence'])) $this->Confidence = $o['Confidence'];
        if (isset($o['SpecBook'])) $this->SpecBook = $o['SpecBook'];
        if (isset($o['UserScope'])) $this->UserScope = $o['UserScope'];
        if (isset($o['DodRemoved'])) $this->DodRemoved = JsonConverters::fromArray('int', $o['DodRemoved']);
        if (isset($o['DodExtra'])) $this->DodExtra = JsonConverters::fromArray('string', $o['DodExtra']);
        if (isset($o['UserEdited'])) $this->UserEdited = $o['UserEdited'];
        if (isset($o['DodChecked'])) $this->DodChecked = JsonConverters::fromArray('string', $o['DodChecked']);
        if (isset($o['RedraftNote'])) $this->RedraftNote = $o['RedraftNote'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Scope)) $o['Scope'] = $this->Scope;
        if (isset($this->LimitsOfWork)) $o['LimitsOfWork'] = $this->LimitsOfWork;
        if (isset($this->SpecRefs)) $o['SpecRefs'] = JsonConverters::toArray('WorkPackageSpecRef', $this->SpecRefs);
        if (isset($this->Constraints)) $o['Constraints'] = JsonConverters::toArray('string', $this->Constraints);
        if (isset($this->HoldPoints)) $o['HoldPoints'] = JsonConverters::toArray('string', $this->HoldPoints);
        if (isset($this->DefinitionOfDone)) $o['DefinitionOfDone'] = JsonConverters::toArray('string', $this->DefinitionOfDone);
        if (isset($this->SafetyNote)) $o['SafetyNote'] = $this->SafetyNote;
        if (isset($this->RfpRef)) $o['RfpRef'] = $this->RfpRef;
        if (isset($this->Confidence)) $o['Confidence'] = $this->Confidence;
        if (isset($this->SpecBook)) $o['SpecBook'] = $this->SpecBook;
        if (isset($this->UserScope)) $o['UserScope'] = $this->UserScope;
        if (isset($this->DodRemoved)) $o['DodRemoved'] = JsonConverters::toArray('int', $this->DodRemoved);
        if (isset($this->DodExtra)) $o['DodExtra'] = JsonConverters::toArray('string', $this->DodExtra);
        if (isset($this->UserEdited)) $o['UserEdited'] = $this->UserEdited;
        if (isset($this->DodChecked)) $o['DodChecked'] = JsonConverters::toArray('string', $this->DodChecked);
        if (isset($this->RedraftNote)) $o['RedraftNote'] = $this->RedraftNote;
        return empty($o) ? new class(){} : $o;
    }
}

class ProposedTask implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Seq=0,
        /** @var string|null */
        public ?string $Name=null,
        /** @var string|null */
        public ?string $Category=null,
        /** @var float|null */
        public ?float $Quantity=null,
        /** @var string|null */
        public ?string $Unit=null,
        /** @var string|null */
        public ?string $SourceItemNumber=null,
        /** @var string|null */
        public ?string $SourceReference=null,
        /** @var string|null */
        public ?string $Notes=null,
        /** @var TaskResourcing|null */
        public ?TaskResourcing $Resourcing=null,
        /** @var float|null */
        public ?float $DurationDays=null,
        /** @var array<int>|null */
        public ?array $DependsOn=null,
        /** @var DateTime|null */
        public ?DateTime $EstimatedStartDate=null,
        /** @var DateTime|null */
        public ?DateTime $EstimatedEndDate=null,
        /** @var TaskWorkPackage|null */
        public ?TaskWorkPackage $WorkPackage=null,
        /** @var int|null */
        public ?int $CreatedJobID=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Seq'])) $this->Seq = $o['Seq'];
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Category'])) $this->Category = $o['Category'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['Unit'])) $this->Unit = $o['Unit'];
        if (isset($o['SourceItemNumber'])) $this->SourceItemNumber = $o['SourceItemNumber'];
        if (isset($o['SourceReference'])) $this->SourceReference = $o['SourceReference'];
        if (isset($o['Notes'])) $this->Notes = $o['Notes'];
        if (isset($o['Resourcing'])) $this->Resourcing = JsonConverters::from('TaskResourcing', $o['Resourcing']);
        if (isset($o['DurationDays'])) $this->DurationDays = $o['DurationDays'];
        if (isset($o['DependsOn'])) $this->DependsOn = JsonConverters::fromArray('int', $o['DependsOn']);
        if (isset($o['EstimatedStartDate'])) $this->EstimatedStartDate = JsonConverters::from('DateTime', $o['EstimatedStartDate']);
        if (isset($o['EstimatedEndDate'])) $this->EstimatedEndDate = JsonConverters::from('DateTime', $o['EstimatedEndDate']);
        if (isset($o['WorkPackage'])) $this->WorkPackage = JsonConverters::from('TaskWorkPackage', $o['WorkPackage']);
        if (isset($o['CreatedJobID'])) $this->CreatedJobID = $o['CreatedJobID'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Seq)) $o['Seq'] = $this->Seq;
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Category)) $o['Category'] = $this->Category;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->Unit)) $o['Unit'] = $this->Unit;
        if (isset($this->SourceItemNumber)) $o['SourceItemNumber'] = $this->SourceItemNumber;
        if (isset($this->SourceReference)) $o['SourceReference'] = $this->SourceReference;
        if (isset($this->Notes)) $o['Notes'] = $this->Notes;
        if (isset($this->Resourcing)) $o['Resourcing'] = JsonConverters::to('TaskResourcing', $this->Resourcing);
        if (isset($this->DurationDays)) $o['DurationDays'] = $this->DurationDays;
        if (isset($this->DependsOn)) $o['DependsOn'] = JsonConverters::toArray('int', $this->DependsOn);
        if (isset($this->EstimatedStartDate)) $o['EstimatedStartDate'] = JsonConverters::to('DateTime', $this->EstimatedStartDate);
        if (isset($this->EstimatedEndDate)) $o['EstimatedEndDate'] = JsonConverters::to('DateTime', $this->EstimatedEndDate);
        if (isset($this->WorkPackage)) $o['WorkPackage'] = JsonConverters::to('TaskWorkPackage', $this->WorkPackage);
        if (isset($this->CreatedJobID)) $o['CreatedJobID'] = $this->CreatedJobID;
        return empty($o) ? new class(){} : $o;
    }
}

class AddendaChange implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $ChangeId=null,
        /** @var string|null */
        public ?string $ChangeType=null,
        /** @var int|null */
        public ?int $TargetSeq=null,
        /** @var string|null */
        public ?string $ItemNumber=null,
        /** @var string|null */
        public ?string $ItemName=null,
        /** @var string|null */
        public ?string $Field=null,
        /** @var string|null */
        public ?string $OldValue=null,
        /** @var string|null */
        public ?string $NewValue=null,
        /** @var string|null */
        public ?string $Description=null,
        /** @var string|null */
        public ?string $Status=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['ChangeId'])) $this->ChangeId = $o['ChangeId'];
        if (isset($o['ChangeType'])) $this->ChangeType = $o['ChangeType'];
        if (isset($o['TargetSeq'])) $this->TargetSeq = $o['TargetSeq'];
        if (isset($o['ItemNumber'])) $this->ItemNumber = $o['ItemNumber'];
        if (isset($o['ItemName'])) $this->ItemName = $o['ItemName'];
        if (isset($o['Field'])) $this->Field = $o['Field'];
        if (isset($o['OldValue'])) $this->OldValue = $o['OldValue'];
        if (isset($o['NewValue'])) $this->NewValue = $o['NewValue'];
        if (isset($o['Description'])) $this->Description = $o['Description'];
        if (isset($o['Status'])) $this->Status = $o['Status'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->ChangeId)) $o['ChangeId'] = $this->ChangeId;
        if (isset($this->ChangeType)) $o['ChangeType'] = $this->ChangeType;
        if (isset($this->TargetSeq)) $o['TargetSeq'] = $this->TargetSeq;
        if (isset($this->ItemNumber)) $o['ItemNumber'] = $this->ItemNumber;
        if (isset($this->ItemName)) $o['ItemName'] = $this->ItemName;
        if (isset($this->Field)) $o['Field'] = $this->Field;
        if (isset($this->OldValue)) $o['OldValue'] = $this->OldValue;
        if (isset($this->NewValue)) $o['NewValue'] = $this->NewValue;
        if (isset($this->Description)) $o['Description'] = $this->Description;
        if (isset($this->Status)) $o['Status'] = $this->Status;
        return empty($o) ? new class(){} : $o;
    }
}

class AddendaChangeSet implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $ChangeSetId=null,
        /** @var int */
        public int $SourceRfpDocumentID=0,
        /** @var string|null */
        public ?string $SourceFileName=null,
        /** @var string|null */
        public ?string $DocumentType=null,
        /** @var DateTime|null */
        public ?DateTime $ExtractedAtUtc=null,
        /** @var string|null */
        public ?string $Summary=null,
        /** @var array<AddendaChange>|null */
        public ?array $Changes=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['ChangeSetId'])) $this->ChangeSetId = $o['ChangeSetId'];
        if (isset($o['SourceRfpDocumentID'])) $this->SourceRfpDocumentID = $o['SourceRfpDocumentID'];
        if (isset($o['SourceFileName'])) $this->SourceFileName = $o['SourceFileName'];
        if (isset($o['DocumentType'])) $this->DocumentType = $o['DocumentType'];
        if (isset($o['ExtractedAtUtc'])) $this->ExtractedAtUtc = JsonConverters::from('DateTime', $o['ExtractedAtUtc']);
        if (isset($o['Summary'])) $this->Summary = $o['Summary'];
        if (isset($o['Changes'])) $this->Changes = JsonConverters::fromArray('AddendaChange', $o['Changes']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->ChangeSetId)) $o['ChangeSetId'] = $this->ChangeSetId;
        if (isset($this->SourceRfpDocumentID)) $o['SourceRfpDocumentID'] = $this->SourceRfpDocumentID;
        if (isset($this->SourceFileName)) $o['SourceFileName'] = $this->SourceFileName;
        if (isset($this->DocumentType)) $o['DocumentType'] = $this->DocumentType;
        if (isset($this->ExtractedAtUtc)) $o['ExtractedAtUtc'] = JsonConverters::to('DateTime', $this->ExtractedAtUtc);
        if (isset($this->Summary)) $o['Summary'] = $this->Summary;
        if (isset($this->Changes)) $o['Changes'] = JsonConverters::toArray('AddendaChange', $this->Changes);
        return empty($o) ? new class(){} : $o;
    }
}

class WageClassification implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Title=null,
        /** @var float|null */
        public ?float $BaseRate=null,
        /** @var float|null */
        public ?float $FringeRate=null,
        /** @var string|null */
        public ?string $ParishNote=null,
        /** @var string|null */
        public ?string $SourceLine=null,
        /** @var float|null */
        public ?float $BenchmarkFringeRate=null,
        /** @var string|null */
        public ?string $FringeCompareNote=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Title'])) $this->Title = $o['Title'];
        if (isset($o['BaseRate'])) $this->BaseRate = $o['BaseRate'];
        if (isset($o['FringeRate'])) $this->FringeRate = $o['FringeRate'];
        if (isset($o['ParishNote'])) $this->ParishNote = $o['ParishNote'];
        if (isset($o['SourceLine'])) $this->SourceLine = $o['SourceLine'];
        if (isset($o['BenchmarkFringeRate'])) $this->BenchmarkFringeRate = $o['BenchmarkFringeRate'];
        if (isset($o['FringeCompareNote'])) $this->FringeCompareNote = $o['FringeCompareNote'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Title)) $o['Title'] = $this->Title;
        if (isset($this->BaseRate)) $o['BaseRate'] = $this->BaseRate;
        if (isset($this->FringeRate)) $o['FringeRate'] = $this->FringeRate;
        if (isset($this->ParishNote)) $o['ParishNote'] = $this->ParishNote;
        if (isset($this->SourceLine)) $o['SourceLine'] = $this->SourceLine;
        if (isset($this->BenchmarkFringeRate)) $o['BenchmarkFringeRate'] = $this->BenchmarkFringeRate;
        if (isset($this->FringeCompareNote)) $o['FringeCompareNote'] = $this->FringeCompareNote;
        return empty($o) ? new class(){} : $o;
    }
}

class WageDeterminationResult implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $SourceRfpDocumentID=0,
        /** @var string|null */
        public ?string $SourceFileName=null,
        /** @var string|null */
        public ?string $WdNumber=null,
        /** @var DateTime|null */
        public ?DateTime $ExtractedAtUtc=null,
        /** @var array<WageClassification>|null */
        public ?array $Classifications=null,
        /** @var string|null */
        public ?string $Source=null,
        /** @var bool|null */
        public ?bool $IsTrustworthy=null,
        /** @var float|null */
        public ?float $ExecutiveOrderFloor=null,
        /** @var string|null */
        public ?string $PublishedDate=null,
        /** @var string|null */
        public ?string $ProjectParish=null,
        /** @var array<string>|null */
        public ?array $Warnings=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['SourceRfpDocumentID'])) $this->SourceRfpDocumentID = $o['SourceRfpDocumentID'];
        if (isset($o['SourceFileName'])) $this->SourceFileName = $o['SourceFileName'];
        if (isset($o['WdNumber'])) $this->WdNumber = $o['WdNumber'];
        if (isset($o['ExtractedAtUtc'])) $this->ExtractedAtUtc = JsonConverters::from('DateTime', $o['ExtractedAtUtc']);
        if (isset($o['Classifications'])) $this->Classifications = JsonConverters::fromArray('WageClassification', $o['Classifications']);
        if (isset($o['Source'])) $this->Source = $o['Source'];
        if (isset($o['IsTrustworthy'])) $this->IsTrustworthy = $o['IsTrustworthy'];
        if (isset($o['ExecutiveOrderFloor'])) $this->ExecutiveOrderFloor = $o['ExecutiveOrderFloor'];
        if (isset($o['PublishedDate'])) $this->PublishedDate = $o['PublishedDate'];
        if (isset($o['ProjectParish'])) $this->ProjectParish = $o['ProjectParish'];
        if (isset($o['Warnings'])) $this->Warnings = JsonConverters::fromArray('string', $o['Warnings']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->SourceRfpDocumentID)) $o['SourceRfpDocumentID'] = $this->SourceRfpDocumentID;
        if (isset($this->SourceFileName)) $o['SourceFileName'] = $this->SourceFileName;
        if (isset($this->WdNumber)) $o['WdNumber'] = $this->WdNumber;
        if (isset($this->ExtractedAtUtc)) $o['ExtractedAtUtc'] = JsonConverters::to('DateTime', $this->ExtractedAtUtc);
        if (isset($this->Classifications)) $o['Classifications'] = JsonConverters::toArray('WageClassification', $this->Classifications);
        if (isset($this->Source)) $o['Source'] = $this->Source;
        if (isset($this->IsTrustworthy)) $o['IsTrustworthy'] = $this->IsTrustworthy;
        if (isset($this->ExecutiveOrderFloor)) $o['ExecutiveOrderFloor'] = $this->ExecutiveOrderFloor;
        if (isset($this->PublishedDate)) $o['PublishedDate'] = $this->PublishedDate;
        if (isset($this->ProjectParish)) $o['ProjectParish'] = $this->ProjectParish;
        if (isset($this->Warnings)) $o['Warnings'] = JsonConverters::toArray('string', $this->Warnings);
        return empty($o) ? new class(){} : $o;
    }
}

class ProjectProposal implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $RfpDocumentID=0,
        /** @var string|null */
        public ?string $Mode=null,
        /** @var int|null */
        public ?int $ProjectID=null,
        /** @var int|null */
        public ?int $ChangeOrderID=null,
        /** @var string|null */
        public ?string $ProjectName=null,
        /** @var string|null */
        public ?string $ClientName=null,
        /** @var string|null */
        public ?string $ProjectType=null,
        /** @var string|null */
        public ?string $ProjectLocation=null,
        /** @var string|null */
        public ?string $Scope=null,
        /** @var string|null */
        public ?string $ProjectDescription=null,
        /** @var int|null */
        public ?int $ContractDurationDays=null,
        /** @var string|null */
        public ?string $BidDueDate=null,
        /** @var DateTime|null */
        public ?DateTime $EstimatedStartDate=null,
        /** @var DateTime|null */
        public ?DateTime $EstimatedEndDate=null,
        /** @var array<ProposedTask>|null */
        public ?array $Tasks=null,
        /** @var array<AddendaChangeSet>|null */
        public ?array $PendingAddendaDiffs=null,
        /** @var array<WageDeterminationResult>|null */
        public ?array $WageDeterminations=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['RfpDocumentID'])) $this->RfpDocumentID = $o['RfpDocumentID'];
        if (isset($o['Mode'])) $this->Mode = $o['Mode'];
        if (isset($o['ProjectID'])) $this->ProjectID = $o['ProjectID'];
        if (isset($o['ChangeOrderID'])) $this->ChangeOrderID = $o['ChangeOrderID'];
        if (isset($o['ProjectName'])) $this->ProjectName = $o['ProjectName'];
        if (isset($o['ClientName'])) $this->ClientName = $o['ClientName'];
        if (isset($o['ProjectType'])) $this->ProjectType = $o['ProjectType'];
        if (isset($o['ProjectLocation'])) $this->ProjectLocation = $o['ProjectLocation'];
        if (isset($o['Scope'])) $this->Scope = $o['Scope'];
        if (isset($o['ProjectDescription'])) $this->ProjectDescription = $o['ProjectDescription'];
        if (isset($o['ContractDurationDays'])) $this->ContractDurationDays = $o['ContractDurationDays'];
        if (isset($o['BidDueDate'])) $this->BidDueDate = $o['BidDueDate'];
        if (isset($o['EstimatedStartDate'])) $this->EstimatedStartDate = JsonConverters::from('DateTime', $o['EstimatedStartDate']);
        if (isset($o['EstimatedEndDate'])) $this->EstimatedEndDate = JsonConverters::from('DateTime', $o['EstimatedEndDate']);
        if (isset($o['Tasks'])) $this->Tasks = JsonConverters::fromArray('ProposedTask', $o['Tasks']);
        if (isset($o['PendingAddendaDiffs'])) $this->PendingAddendaDiffs = JsonConverters::fromArray('AddendaChangeSet', $o['PendingAddendaDiffs']);
        if (isset($o['WageDeterminations'])) $this->WageDeterminations = JsonConverters::fromArray('WageDeterminationResult', $o['WageDeterminations']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->RfpDocumentID)) $o['RfpDocumentID'] = $this->RfpDocumentID;
        if (isset($this->Mode)) $o['Mode'] = $this->Mode;
        if (isset($this->ProjectID)) $o['ProjectID'] = $this->ProjectID;
        if (isset($this->ChangeOrderID)) $o['ChangeOrderID'] = $this->ChangeOrderID;
        if (isset($this->ProjectName)) $o['ProjectName'] = $this->ProjectName;
        if (isset($this->ClientName)) $o['ClientName'] = $this->ClientName;
        if (isset($this->ProjectType)) $o['ProjectType'] = $this->ProjectType;
        if (isset($this->ProjectLocation)) $o['ProjectLocation'] = $this->ProjectLocation;
        if (isset($this->Scope)) $o['Scope'] = $this->Scope;
        if (isset($this->ProjectDescription)) $o['ProjectDescription'] = $this->ProjectDescription;
        if (isset($this->ContractDurationDays)) $o['ContractDurationDays'] = $this->ContractDurationDays;
        if (isset($this->BidDueDate)) $o['BidDueDate'] = $this->BidDueDate;
        if (isset($this->EstimatedStartDate)) $o['EstimatedStartDate'] = JsonConverters::to('DateTime', $this->EstimatedStartDate);
        if (isset($this->EstimatedEndDate)) $o['EstimatedEndDate'] = JsonConverters::to('DateTime', $this->EstimatedEndDate);
        if (isset($this->Tasks)) $o['Tasks'] = JsonConverters::toArray('ProposedTask', $this->Tasks);
        if (isset($this->PendingAddendaDiffs)) $o['PendingAddendaDiffs'] = JsonConverters::toArray('AddendaChangeSet', $this->PendingAddendaDiffs);
        if (isset($this->WageDeterminations)) $o['WageDeterminations'] = JsonConverters::toArray('WageDeterminationResult', $this->WageDeterminations);
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateSettingsView implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $RfpEstimateID=0,
        /** @var DateTime|null */
        public ?DateTime $StartDate=null,
        /** @var DateTime|null */
        public ?DateTime $DeadlineDate=null,
        /** @var int */
        public int $WorkdaysPerWeek=0,
        /** @var float */
        public float $HoursPerDay=0.0,
        /** @var float */
        public float $WeatherPct=0.0,
        /** @var float */
        public float $OhpPct=0.0,
        /** @var float */
        public float $ContingencyPct=0.0,
        /** @var float */
        public float $BondPct=0.0,
        /** @var array<DateTime>|null */
        public ?array $Holidays=null,
        /** @var DateTime|null */
        public ?DateTime $AppliedStartDate=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['RfpEstimateID'])) $this->RfpEstimateID = $o['RfpEstimateID'];
        if (isset($o['StartDate'])) $this->StartDate = JsonConverters::from('DateTime', $o['StartDate']);
        if (isset($o['DeadlineDate'])) $this->DeadlineDate = JsonConverters::from('DateTime', $o['DeadlineDate']);
        if (isset($o['WorkdaysPerWeek'])) $this->WorkdaysPerWeek = $o['WorkdaysPerWeek'];
        if (isset($o['HoursPerDay'])) $this->HoursPerDay = $o['HoursPerDay'];
        if (isset($o['WeatherPct'])) $this->WeatherPct = $o['WeatherPct'];
        if (isset($o['OhpPct'])) $this->OhpPct = $o['OhpPct'];
        if (isset($o['ContingencyPct'])) $this->ContingencyPct = $o['ContingencyPct'];
        if (isset($o['BondPct'])) $this->BondPct = $o['BondPct'];
        if (isset($o['Holidays'])) $this->Holidays = JsonConverters::fromArray('DateTime', $o['Holidays']);
        if (isset($o['AppliedStartDate'])) $this->AppliedStartDate = JsonConverters::from('DateTime', $o['AppliedStartDate']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->RfpEstimateID)) $o['RfpEstimateID'] = $this->RfpEstimateID;
        if (isset($this->StartDate)) $o['StartDate'] = JsonConverters::to('DateTime', $this->StartDate);
        if (isset($this->DeadlineDate)) $o['DeadlineDate'] = JsonConverters::to('DateTime', $this->DeadlineDate);
        if (isset($this->WorkdaysPerWeek)) $o['WorkdaysPerWeek'] = $this->WorkdaysPerWeek;
        if (isset($this->HoursPerDay)) $o['HoursPerDay'] = $this->HoursPerDay;
        if (isset($this->WeatherPct)) $o['WeatherPct'] = $this->WeatherPct;
        if (isset($this->OhpPct)) $o['OhpPct'] = $this->OhpPct;
        if (isset($this->ContingencyPct)) $o['ContingencyPct'] = $this->ContingencyPct;
        if (isset($this->BondPct)) $o['BondPct'] = $this->BondPct;
        if (isset($this->Holidays)) $o['Holidays'] = JsonConverters::toArray('DateTime', $this->Holidays);
        if (isset($this->AppliedStartDate)) $o['AppliedStartDate'] = JsonConverters::to('DateTime', $this->AppliedStartDate);
        return empty($o) ? new class(){} : $o;
    }
}

class SpecRefView implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Section=null,
        /** @var string|null */
        public ?string $Title=null,
        /** @var string|null */
        public ?string $Url=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Section'])) $this->Section = $o['Section'];
        if (isset($o['Title'])) $this->Title = $o['Title'];
        if (isset($o['Url'])) $this->Url = $o['Url'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Section)) $o['Section'] = $this->Section;
        if (isset($this->Title)) $o['Title'] = $this->Title;
        if (isset($this->Url)) $o['Url'] = $this->Url;
        return empty($o) ? new class(){} : $o;
    }
}

class DodItemView implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Key=null,
        /** @var string|null */
        public ?string $Text=null,
        /** @var bool|null */
        public ?bool $Checked=null,
        /** @var string|null */
        public ?string $Source=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Key'])) $this->Key = $o['Key'];
        if (isset($o['Text'])) $this->Text = $o['Text'];
        if (isset($o['Checked'])) $this->Checked = $o['Checked'];
        if (isset($o['Source'])) $this->Source = $o['Source'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Key)) $o['Key'] = $this->Key;
        if (isset($this->Text)) $o['Text'] = $this->Text;
        if (isset($this->Checked)) $o['Checked'] = $this->Checked;
        if (isset($this->Source)) $o['Source'] = $this->Source;
        return empty($o) ? new class(){} : $o;
    }
}

class WorkPackageView implements JsonSerializable
{
    public function __construct(
        /** @var bool|null */
        public ?bool $HasPackage=null,
        /** @var string|null */
        public ?string $Scope=null,
        /** @var string|null */
        public ?string $LimitsOfWork=null,
        /** @var array<SpecRefView>|null */
        public ?array $SpecRefs=null,
        /** @var array<string>|null */
        public ?array $Constraints=null,
        /** @var array<string>|null */
        public ?array $HoldPoints=null,
        /** @var array<DodItemView>|null */
        public ?array $Dod=null,
        /** @var string|null */
        public ?string $SafetyNote=null,
        /** @var string|null */
        public ?string $Provenance=null,
        /** @var string|null */
        public ?string $SpecBook=null,
        /** @var bool|null */
        public ?bool $UserEdited=null,
        /** @var string|null */
        public ?string $RedraftNote=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['HasPackage'])) $this->HasPackage = $o['HasPackage'];
        if (isset($o['Scope'])) $this->Scope = $o['Scope'];
        if (isset($o['LimitsOfWork'])) $this->LimitsOfWork = $o['LimitsOfWork'];
        if (isset($o['SpecRefs'])) $this->SpecRefs = JsonConverters::fromArray('SpecRefView', $o['SpecRefs']);
        if (isset($o['Constraints'])) $this->Constraints = JsonConverters::fromArray('string', $o['Constraints']);
        if (isset($o['HoldPoints'])) $this->HoldPoints = JsonConverters::fromArray('string', $o['HoldPoints']);
        if (isset($o['Dod'])) $this->Dod = JsonConverters::fromArray('DodItemView', $o['Dod']);
        if (isset($o['SafetyNote'])) $this->SafetyNote = $o['SafetyNote'];
        if (isset($o['Provenance'])) $this->Provenance = $o['Provenance'];
        if (isset($o['SpecBook'])) $this->SpecBook = $o['SpecBook'];
        if (isset($o['UserEdited'])) $this->UserEdited = $o['UserEdited'];
        if (isset($o['RedraftNote'])) $this->RedraftNote = $o['RedraftNote'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->HasPackage)) $o['HasPackage'] = $this->HasPackage;
        if (isset($this->Scope)) $o['Scope'] = $this->Scope;
        if (isset($this->LimitsOfWork)) $o['LimitsOfWork'] = $this->LimitsOfWork;
        if (isset($this->SpecRefs)) $o['SpecRefs'] = JsonConverters::toArray('SpecRefView', $this->SpecRefs);
        if (isset($this->Constraints)) $o['Constraints'] = JsonConverters::toArray('string', $this->Constraints);
        if (isset($this->HoldPoints)) $o['HoldPoints'] = JsonConverters::toArray('string', $this->HoldPoints);
        if (isset($this->Dod)) $o['Dod'] = JsonConverters::toArray('DodItemView', $this->Dod);
        if (isset($this->SafetyNote)) $o['SafetyNote'] = $this->SafetyNote;
        if (isset($this->Provenance)) $o['Provenance'] = $this->Provenance;
        if (isset($this->SpecBook)) $o['SpecBook'] = $this->SpecBook;
        if (isset($this->UserEdited)) $o['UserEdited'] = $this->UserEdited;
        if (isset($this->RedraftNote)) $o['RedraftNote'] = $this->RedraftNote;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateCrewLineView implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Role=null,
        /** @var float */
        public float $Hours=0.0,
        /** @var float */
        public float $StHours=0.0,
        /** @var float */
        public float $OtHours=0.0,
        /** @var bool|null */
        public ?bool $HasOt=null,
        /** @var bool|null */
        public ?bool $PremiumApplied=null,
        /** @var bool|null */
        public ?bool $NeedsRate=null,
        /** @var string|null */
        public ?string $RateKey=null,
        /** @var string|null */
        public ?string $Chip=null,
        /** @var float|null */
        public ?float $Rrop=null,
        /** @var float|null */
        public ?float $StCost=null,
        /** @var float|null */
        public ?float $OtCost=null,
        /** @var float|null */
        public ?float $Cost=null,
        /** @var float|null */
        public ?float $FringeCost=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Role'])) $this->Role = $o['Role'];
        if (isset($o['Hours'])) $this->Hours = $o['Hours'];
        if (isset($o['StHours'])) $this->StHours = $o['StHours'];
        if (isset($o['OtHours'])) $this->OtHours = $o['OtHours'];
        if (isset($o['HasOt'])) $this->HasOt = $o['HasOt'];
        if (isset($o['PremiumApplied'])) $this->PremiumApplied = $o['PremiumApplied'];
        if (isset($o['NeedsRate'])) $this->NeedsRate = $o['NeedsRate'];
        if (isset($o['RateKey'])) $this->RateKey = $o['RateKey'];
        if (isset($o['Chip'])) $this->Chip = $o['Chip'];
        if (isset($o['Rrop'])) $this->Rrop = $o['Rrop'];
        if (isset($o['StCost'])) $this->StCost = $o['StCost'];
        if (isset($o['OtCost'])) $this->OtCost = $o['OtCost'];
        if (isset($o['Cost'])) $this->Cost = $o['Cost'];
        if (isset($o['FringeCost'])) $this->FringeCost = $o['FringeCost'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Role)) $o['Role'] = $this->Role;
        if (isset($this->Hours)) $o['Hours'] = $this->Hours;
        if (isset($this->StHours)) $o['StHours'] = $this->StHours;
        if (isset($this->OtHours)) $o['OtHours'] = $this->OtHours;
        if (isset($this->HasOt)) $o['HasOt'] = $this->HasOt;
        if (isset($this->PremiumApplied)) $o['PremiumApplied'] = $this->PremiumApplied;
        if (isset($this->NeedsRate)) $o['NeedsRate'] = $this->NeedsRate;
        if (isset($this->RateKey)) $o['RateKey'] = $this->RateKey;
        if (isset($this->Chip)) $o['Chip'] = $this->Chip;
        if (isset($this->Rrop)) $o['Rrop'] = $this->Rrop;
        if (isset($this->StCost)) $o['StCost'] = $this->StCost;
        if (isset($this->OtCost)) $o['OtCost'] = $this->OtCost;
        if (isset($this->Cost)) $o['Cost'] = $this->Cost;
        if (isset($this->FringeCost)) $o['FringeCost'] = $this->FringeCost;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateEquipmentLineView implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Name=null,
        /** @var float */
        public float $Quantity=0.0,
        /** @var float|null */
        public ?float $Rate=null,
        /** @var bool|null */
        public ?bool $NeedsRate=null,
        /** @var float */
        public float $MobCost=0.0,
        /** @var float */
        public float $Cost=0.0,
        /** @var bool|null */
        public ?bool $IsAvailabilityTracked=null,
        /** @var bool|null */
        public ?bool $IsOwned=null,
        /** @var string|null */
        public ?string $AvailabilityLabel=null,
        /** @var string|null */
        public ?string $FreedFromProject=null,
        /** @var DateTime|null */
        public ?DateTime $AvailableFrom=null,
        /** @var string|null */
        public ?string $RateKey=null,
        /** @var string|null */
        public ?string $Chip=null,
        /** @var string|null */
        public ?string $RentalExplain=null,
        /** @var float */
        public float $UsageDays=0.0,
        /** @var float */
        public float $BilledDays=0.0
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['Rate'])) $this->Rate = $o['Rate'];
        if (isset($o['NeedsRate'])) $this->NeedsRate = $o['NeedsRate'];
        if (isset($o['MobCost'])) $this->MobCost = $o['MobCost'];
        if (isset($o['Cost'])) $this->Cost = $o['Cost'];
        if (isset($o['IsAvailabilityTracked'])) $this->IsAvailabilityTracked = $o['IsAvailabilityTracked'];
        if (isset($o['IsOwned'])) $this->IsOwned = $o['IsOwned'];
        if (isset($o['AvailabilityLabel'])) $this->AvailabilityLabel = $o['AvailabilityLabel'];
        if (isset($o['FreedFromProject'])) $this->FreedFromProject = $o['FreedFromProject'];
        if (isset($o['AvailableFrom'])) $this->AvailableFrom = JsonConverters::from('DateTime', $o['AvailableFrom']);
        if (isset($o['RateKey'])) $this->RateKey = $o['RateKey'];
        if (isset($o['Chip'])) $this->Chip = $o['Chip'];
        if (isset($o['RentalExplain'])) $this->RentalExplain = $o['RentalExplain'];
        if (isset($o['UsageDays'])) $this->UsageDays = $o['UsageDays'];
        if (isset($o['BilledDays'])) $this->BilledDays = $o['BilledDays'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->Rate)) $o['Rate'] = $this->Rate;
        if (isset($this->NeedsRate)) $o['NeedsRate'] = $this->NeedsRate;
        if (isset($this->MobCost)) $o['MobCost'] = $this->MobCost;
        if (isset($this->Cost)) $o['Cost'] = $this->Cost;
        if (isset($this->IsAvailabilityTracked)) $o['IsAvailabilityTracked'] = $this->IsAvailabilityTracked;
        if (isset($this->IsOwned)) $o['IsOwned'] = $this->IsOwned;
        if (isset($this->AvailabilityLabel)) $o['AvailabilityLabel'] = $this->AvailabilityLabel;
        if (isset($this->FreedFromProject)) $o['FreedFromProject'] = $this->FreedFromProject;
        if (isset($this->AvailableFrom)) $o['AvailableFrom'] = JsonConverters::to('DateTime', $this->AvailableFrom);
        if (isset($this->RateKey)) $o['RateKey'] = $this->RateKey;
        if (isset($this->Chip)) $o['Chip'] = $this->Chip;
        if (isset($this->RentalExplain)) $o['RentalExplain'] = $this->RentalExplain;
        if (isset($this->UsageDays)) $o['UsageDays'] = $this->UsageDays;
        if (isset($this->BilledDays)) $o['BilledDays'] = $this->BilledDays;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateMaterialLineView implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $Name=null,
        /** @var float */
        public float $Quantity=0.0,
        /** @var string|null */
        public ?string $Unit=null,
        /** @var float|null */
        public ?float $Rate=null,
        /** @var bool|null */
        public ?bool $NeedsRate=null,
        /** @var float */
        public float $Cost=0.0,
        /** @var string|null */
        public ?string $RateKey=null,
        /** @var string|null */
        public ?string $Chip=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['Unit'])) $this->Unit = $o['Unit'];
        if (isset($o['Rate'])) $this->Rate = $o['Rate'];
        if (isset($o['NeedsRate'])) $this->NeedsRate = $o['NeedsRate'];
        if (isset($o['Cost'])) $this->Cost = $o['Cost'];
        if (isset($o['RateKey'])) $this->RateKey = $o['RateKey'];
        if (isset($o['Chip'])) $this->Chip = $o['Chip'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->Unit)) $o['Unit'] = $this->Unit;
        if (isset($this->Rate)) $o['Rate'] = $this->Rate;
        if (isset($this->NeedsRate)) $o['NeedsRate'] = $this->NeedsRate;
        if (isset($this->Cost)) $o['Cost'] = $this->Cost;
        if (isset($this->RateKey)) $o['RateKey'] = $this->RateKey;
        if (isset($this->Chip)) $o['Chip'] = $this->Chip;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateSubcontractView implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $EstimateSubcontractID=0,
        /** @var int */
        public int $TaskSeq=0,
        /** @var string|null */
        public ?string $Vendor=null,
        /** @var float */
        public float $Amount=0.0,
        /** @var string|null */
        public ?string $Scope=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['EstimateSubcontractID'])) $this->EstimateSubcontractID = $o['EstimateSubcontractID'];
        if (isset($o['TaskSeq'])) $this->TaskSeq = $o['TaskSeq'];
        if (isset($o['Vendor'])) $this->Vendor = $o['Vendor'];
        if (isset($o['Amount'])) $this->Amount = $o['Amount'];
        if (isset($o['Scope'])) $this->Scope = $o['Scope'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->EstimateSubcontractID)) $o['EstimateSubcontractID'] = $this->EstimateSubcontractID;
        if (isset($this->TaskSeq)) $o['TaskSeq'] = $this->TaskSeq;
        if (isset($this->Vendor)) $o['Vendor'] = $this->Vendor;
        if (isset($this->Amount)) $o['Amount'] = $this->Amount;
        if (isset($this->Scope)) $o['Scope'] = $this->Scope;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateJobView implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Seq=0,
        /** @var WorkPackageView|null */
        public ?WorkPackageView $WorkPackage=null,
        /** @var string|null */
        public ?string $ItemNo=null,
        /** @var string|null */
        public ?string $Name=null,
        /** @var string|null */
        public ?string $Category=null,
        /** @var string|null */
        public ?string $SourceRef=null,
        /** @var string|null */
        public ?string $Unit=null,
        /** @var float */
        public float $Quantity=0.0,
        /** @var string|null */
        public ?string $PatternCode=null,
        /** @var int */
        public int $Workdays=0,
        /** @var float */
        public float $HoursPerDay=0.0,
        /** @var bool|null */
        public ?bool $IsNight=null,
        /** @var float */
        public float $WeeklyHours=0.0,
        /** @var float */
        public float $OtFraction=0.0,
        /** @var float */
        public float $Days=0.0,
        /** @var float|null */
        public ?float $EffectiveProdPerDay=null,
        /** @var bool|null */
        public ?bool $CrewPremiumApplied=null,
        /** @var float */
        public float $CrewCost=0.0,
        /** @var float */
        public float $FringeCost=0.0,
        /** @var float */
        public float $EquipmentCost=0.0,
        /** @var float */
        public float $MaterialCost=0.0,
        /** @var float */
        public float $SubcontractCost=0.0,
        /** @var float */
        public float $Direct=0.0,
        /** @var string|null */
        public ?string $PricingBasis=null,
        /** @var string|null */
        public ?string $PricingRuleId=null,
        /** @var float|null */
        public ?float $PricingBandP25=null,
        /** @var float|null */
        public ?float $PricingBandP75=null,
        /** @var int|null */
        public ?int $PricingBandN=null,
        /** @var string|null */
        public ?string $PricingBandLabel=null,
        /** @var float|null */
        public ?float $BenchmarkUnitPrice=null,
        /** @var float|null */
        public ?float $ReferencePrice=null,
        /** @var float|null */
        public ?float $ReferenceRangeMin=null,
        /** @var float|null */
        public ?float $ReferenceRangeMax=null,
        /** @var int|null */
        public ?int $ReferenceN=null,
        /** @var DateTime|null */
        public ?DateTime $ReferenceDate=null,
        /** @var string|null */
        public ?string $ReferenceBasis=null,
        /** @var string|null */
        public ?string $ReferenceUrl=null,
        /** @var array<EstimateCrewLineView>|null */
        public ?array $Crew=null,
        /** @var array<EstimateEquipmentLineView>|null */
        public ?array $Equipment=null,
        /** @var array<EstimateMaterialLineView>|null */
        public ?array $Materials=null,
        /** @var array<EstimateSubcontractView>|null */
        public ?array $Subcontracts=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Seq'])) $this->Seq = $o['Seq'];
        if (isset($o['WorkPackage'])) $this->WorkPackage = JsonConverters::from('WorkPackageView', $o['WorkPackage']);
        if (isset($o['ItemNo'])) $this->ItemNo = $o['ItemNo'];
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Category'])) $this->Category = $o['Category'];
        if (isset($o['SourceRef'])) $this->SourceRef = $o['SourceRef'];
        if (isset($o['Unit'])) $this->Unit = $o['Unit'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['PatternCode'])) $this->PatternCode = $o['PatternCode'];
        if (isset($o['Workdays'])) $this->Workdays = $o['Workdays'];
        if (isset($o['HoursPerDay'])) $this->HoursPerDay = $o['HoursPerDay'];
        if (isset($o['IsNight'])) $this->IsNight = $o['IsNight'];
        if (isset($o['WeeklyHours'])) $this->WeeklyHours = $o['WeeklyHours'];
        if (isset($o['OtFraction'])) $this->OtFraction = $o['OtFraction'];
        if (isset($o['Days'])) $this->Days = $o['Days'];
        if (isset($o['EffectiveProdPerDay'])) $this->EffectiveProdPerDay = $o['EffectiveProdPerDay'];
        if (isset($o['CrewPremiumApplied'])) $this->CrewPremiumApplied = $o['CrewPremiumApplied'];
        if (isset($o['CrewCost'])) $this->CrewCost = $o['CrewCost'];
        if (isset($o['FringeCost'])) $this->FringeCost = $o['FringeCost'];
        if (isset($o['EquipmentCost'])) $this->EquipmentCost = $o['EquipmentCost'];
        if (isset($o['MaterialCost'])) $this->MaterialCost = $o['MaterialCost'];
        if (isset($o['SubcontractCost'])) $this->SubcontractCost = $o['SubcontractCost'];
        if (isset($o['Direct'])) $this->Direct = $o['Direct'];
        if (isset($o['PricingBasis'])) $this->PricingBasis = $o['PricingBasis'];
        if (isset($o['PricingRuleId'])) $this->PricingRuleId = $o['PricingRuleId'];
        if (isset($o['PricingBandP25'])) $this->PricingBandP25 = $o['PricingBandP25'];
        if (isset($o['PricingBandP75'])) $this->PricingBandP75 = $o['PricingBandP75'];
        if (isset($o['PricingBandN'])) $this->PricingBandN = $o['PricingBandN'];
        if (isset($o['PricingBandLabel'])) $this->PricingBandLabel = $o['PricingBandLabel'];
        if (isset($o['BenchmarkUnitPrice'])) $this->BenchmarkUnitPrice = $o['BenchmarkUnitPrice'];
        if (isset($o['ReferencePrice'])) $this->ReferencePrice = $o['ReferencePrice'];
        if (isset($o['ReferenceRangeMin'])) $this->ReferenceRangeMin = $o['ReferenceRangeMin'];
        if (isset($o['ReferenceRangeMax'])) $this->ReferenceRangeMax = $o['ReferenceRangeMax'];
        if (isset($o['ReferenceN'])) $this->ReferenceN = $o['ReferenceN'];
        if (isset($o['ReferenceDate'])) $this->ReferenceDate = JsonConverters::from('DateTime', $o['ReferenceDate']);
        if (isset($o['ReferenceBasis'])) $this->ReferenceBasis = $o['ReferenceBasis'];
        if (isset($o['ReferenceUrl'])) $this->ReferenceUrl = $o['ReferenceUrl'];
        if (isset($o['Crew'])) $this->Crew = JsonConverters::fromArray('EstimateCrewLineView', $o['Crew']);
        if (isset($o['Equipment'])) $this->Equipment = JsonConverters::fromArray('EstimateEquipmentLineView', $o['Equipment']);
        if (isset($o['Materials'])) $this->Materials = JsonConverters::fromArray('EstimateMaterialLineView', $o['Materials']);
        if (isset($o['Subcontracts'])) $this->Subcontracts = JsonConverters::fromArray('EstimateSubcontractView', $o['Subcontracts']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Seq)) $o['Seq'] = $this->Seq;
        if (isset($this->WorkPackage)) $o['WorkPackage'] = JsonConverters::to('WorkPackageView', $this->WorkPackage);
        if (isset($this->ItemNo)) $o['ItemNo'] = $this->ItemNo;
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Category)) $o['Category'] = $this->Category;
        if (isset($this->SourceRef)) $o['SourceRef'] = $this->SourceRef;
        if (isset($this->Unit)) $o['Unit'] = $this->Unit;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->PatternCode)) $o['PatternCode'] = $this->PatternCode;
        if (isset($this->Workdays)) $o['Workdays'] = $this->Workdays;
        if (isset($this->HoursPerDay)) $o['HoursPerDay'] = $this->HoursPerDay;
        if (isset($this->IsNight)) $o['IsNight'] = $this->IsNight;
        if (isset($this->WeeklyHours)) $o['WeeklyHours'] = $this->WeeklyHours;
        if (isset($this->OtFraction)) $o['OtFraction'] = $this->OtFraction;
        if (isset($this->Days)) $o['Days'] = $this->Days;
        if (isset($this->EffectiveProdPerDay)) $o['EffectiveProdPerDay'] = $this->EffectiveProdPerDay;
        if (isset($this->CrewPremiumApplied)) $o['CrewPremiumApplied'] = $this->CrewPremiumApplied;
        if (isset($this->CrewCost)) $o['CrewCost'] = $this->CrewCost;
        if (isset($this->FringeCost)) $o['FringeCost'] = $this->FringeCost;
        if (isset($this->EquipmentCost)) $o['EquipmentCost'] = $this->EquipmentCost;
        if (isset($this->MaterialCost)) $o['MaterialCost'] = $this->MaterialCost;
        if (isset($this->SubcontractCost)) $o['SubcontractCost'] = $this->SubcontractCost;
        if (isset($this->Direct)) $o['Direct'] = $this->Direct;
        if (isset($this->PricingBasis)) $o['PricingBasis'] = $this->PricingBasis;
        if (isset($this->PricingRuleId)) $o['PricingRuleId'] = $this->PricingRuleId;
        if (isset($this->PricingBandP25)) $o['PricingBandP25'] = $this->PricingBandP25;
        if (isset($this->PricingBandP75)) $o['PricingBandP75'] = $this->PricingBandP75;
        if (isset($this->PricingBandN)) $o['PricingBandN'] = $this->PricingBandN;
        if (isset($this->PricingBandLabel)) $o['PricingBandLabel'] = $this->PricingBandLabel;
        if (isset($this->BenchmarkUnitPrice)) $o['BenchmarkUnitPrice'] = $this->BenchmarkUnitPrice;
        if (isset($this->ReferencePrice)) $o['ReferencePrice'] = $this->ReferencePrice;
        if (isset($this->ReferenceRangeMin)) $o['ReferenceRangeMin'] = $this->ReferenceRangeMin;
        if (isset($this->ReferenceRangeMax)) $o['ReferenceRangeMax'] = $this->ReferenceRangeMax;
        if (isset($this->ReferenceN)) $o['ReferenceN'] = $this->ReferenceN;
        if (isset($this->ReferenceDate)) $o['ReferenceDate'] = JsonConverters::to('DateTime', $this->ReferenceDate);
        if (isset($this->ReferenceBasis)) $o['ReferenceBasis'] = $this->ReferenceBasis;
        if (isset($this->ReferenceUrl)) $o['ReferenceUrl'] = $this->ReferenceUrl;
        if (isset($this->Crew)) $o['Crew'] = JsonConverters::toArray('EstimateCrewLineView', $this->Crew);
        if (isset($this->Equipment)) $o['Equipment'] = JsonConverters::toArray('EstimateEquipmentLineView', $this->Equipment);
        if (isset($this->Materials)) $o['Materials'] = JsonConverters::toArray('EstimateMaterialLineView', $this->Materials);
        if (isset($this->Subcontracts)) $o['Subcontracts'] = JsonConverters::toArray('EstimateSubcontractView', $this->Subcontracts);
        return empty($o) ? new class(){} : $o;
    }
}

class BidScheduleLine implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $ItemNo=null,
        /** @var string|null */
        public ?string $Description=null,
        /** @var string|null */
        public ?string $Unit=null,
        /** @var float */
        public float $Quantity=0.0,
        /** @var float */
        public float $UnitPrice=0.0,
        /** @var float */
        public float $Extension=0.0,
        /** @var string|null */
        public ?string $PricingBasis=null,
        /** @var string|null */
        public ?string $PricingRuleId=null,
        /** @var float|null */
        public ?float $PricingBandP25=null,
        /** @var float|null */
        public ?float $PricingBandP75=null,
        /** @var int|null */
        public ?int $PricingBandN=null,
        /** @var string|null */
        public ?string $PricingBandLabel=null,
        /** @var float|null */
        public ?float $BenchmarkDeltaPct=null,
        /** @var bool|null */
        public ?bool $BenchmarkFlagged=null,
        /** @var string|null */
        public ?string $BenchmarkBasis=null,
        /** @var string|null */
        public ?string $Provenance=null,
        /** @var string|null */
        public ?string $ProvenanceNote=null,
        /** @var int */
        public int $UnpricedResources=0,
        /** @var int */
        public int $TotalResources=0
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['ItemNo'])) $this->ItemNo = $o['ItemNo'];
        if (isset($o['Description'])) $this->Description = $o['Description'];
        if (isset($o['Unit'])) $this->Unit = $o['Unit'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['UnitPrice'])) $this->UnitPrice = $o['UnitPrice'];
        if (isset($o['Extension'])) $this->Extension = $o['Extension'];
        if (isset($o['PricingBasis'])) $this->PricingBasis = $o['PricingBasis'];
        if (isset($o['PricingRuleId'])) $this->PricingRuleId = $o['PricingRuleId'];
        if (isset($o['PricingBandP25'])) $this->PricingBandP25 = $o['PricingBandP25'];
        if (isset($o['PricingBandP75'])) $this->PricingBandP75 = $o['PricingBandP75'];
        if (isset($o['PricingBandN'])) $this->PricingBandN = $o['PricingBandN'];
        if (isset($o['PricingBandLabel'])) $this->PricingBandLabel = $o['PricingBandLabel'];
        if (isset($o['BenchmarkDeltaPct'])) $this->BenchmarkDeltaPct = $o['BenchmarkDeltaPct'];
        if (isset($o['BenchmarkFlagged'])) $this->BenchmarkFlagged = $o['BenchmarkFlagged'];
        if (isset($o['BenchmarkBasis'])) $this->BenchmarkBasis = $o['BenchmarkBasis'];
        if (isset($o['Provenance'])) $this->Provenance = $o['Provenance'];
        if (isset($o['ProvenanceNote'])) $this->ProvenanceNote = $o['ProvenanceNote'];
        if (isset($o['UnpricedResources'])) $this->UnpricedResources = $o['UnpricedResources'];
        if (isset($o['TotalResources'])) $this->TotalResources = $o['TotalResources'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->ItemNo)) $o['ItemNo'] = $this->ItemNo;
        if (isset($this->Description)) $o['Description'] = $this->Description;
        if (isset($this->Unit)) $o['Unit'] = $this->Unit;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->UnitPrice)) $o['UnitPrice'] = $this->UnitPrice;
        if (isset($this->Extension)) $o['Extension'] = $this->Extension;
        if (isset($this->PricingBasis)) $o['PricingBasis'] = $this->PricingBasis;
        if (isset($this->PricingRuleId)) $o['PricingRuleId'] = $this->PricingRuleId;
        if (isset($this->PricingBandP25)) $o['PricingBandP25'] = $this->PricingBandP25;
        if (isset($this->PricingBandP75)) $o['PricingBandP75'] = $this->PricingBandP75;
        if (isset($this->PricingBandN)) $o['PricingBandN'] = $this->PricingBandN;
        if (isset($this->PricingBandLabel)) $o['PricingBandLabel'] = $this->PricingBandLabel;
        if (isset($this->BenchmarkDeltaPct)) $o['BenchmarkDeltaPct'] = $this->BenchmarkDeltaPct;
        if (isset($this->BenchmarkFlagged)) $o['BenchmarkFlagged'] = $this->BenchmarkFlagged;
        if (isset($this->BenchmarkBasis)) $o['BenchmarkBasis'] = $this->BenchmarkBasis;
        if (isset($this->Provenance)) $o['Provenance'] = $this->Provenance;
        if (isset($this->ProvenanceNote)) $o['ProvenanceNote'] = $this->ProvenanceNote;
        if (isset($this->UnpricedResources)) $o['UnpricedResources'] = $this->UnpricedResources;
        if (isset($this->TotalResources)) $o['TotalResources'] = $this->TotalResources;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateVarianceLine implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Seq=0,
        /** @var string|null */
        public ?string $ItemNo=null,
        /** @var string|null */
        public ?string $Name=null,
        /** @var string|null */
        public ?string $Unit=null,
        /** @var float */
        public float $Quantity=0.0,
        /** @var float */
        public float $OurUnitPrice=0.0,
        /** @var float */
        public float $OurTotal=0.0,
        /** @var float */
        public float $BenchmarkUnitPrice=0.0,
        /** @var float */
        public float $MarketTotal=0.0,
        /** @var float */
        public float $DeltaPct=0.0,
        /** @var float|null */
        public ?float $RateMin=null,
        /** @var float|null */
        public ?float $RateMax=null,
        /** @var int|null */
        public ?int $SampleSize=null,
        /** @var bool|null */
        public ?bool $OutsideRange=null,
        /** @var bool|null */
        public ?bool $IsFloor=null,
        /** @var bool|null */
        public ?bool $IsLump=null,
        /** @var string|null */
        public ?string $Severity=null,
        /** @var bool|null */
        public ?bool $Adopted=null,
        /** @var string|null */
        public ?string $Note=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Seq'])) $this->Seq = $o['Seq'];
        if (isset($o['ItemNo'])) $this->ItemNo = $o['ItemNo'];
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Unit'])) $this->Unit = $o['Unit'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['OurUnitPrice'])) $this->OurUnitPrice = $o['OurUnitPrice'];
        if (isset($o['OurTotal'])) $this->OurTotal = $o['OurTotal'];
        if (isset($o['BenchmarkUnitPrice'])) $this->BenchmarkUnitPrice = $o['BenchmarkUnitPrice'];
        if (isset($o['MarketTotal'])) $this->MarketTotal = $o['MarketTotal'];
        if (isset($o['DeltaPct'])) $this->DeltaPct = $o['DeltaPct'];
        if (isset($o['RateMin'])) $this->RateMin = $o['RateMin'];
        if (isset($o['RateMax'])) $this->RateMax = $o['RateMax'];
        if (isset($o['SampleSize'])) $this->SampleSize = $o['SampleSize'];
        if (isset($o['OutsideRange'])) $this->OutsideRange = $o['OutsideRange'];
        if (isset($o['IsFloor'])) $this->IsFloor = $o['IsFloor'];
        if (isset($o['IsLump'])) $this->IsLump = $o['IsLump'];
        if (isset($o['Severity'])) $this->Severity = $o['Severity'];
        if (isset($o['Adopted'])) $this->Adopted = $o['Adopted'];
        if (isset($o['Note'])) $this->Note = $o['Note'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Seq)) $o['Seq'] = $this->Seq;
        if (isset($this->ItemNo)) $o['ItemNo'] = $this->ItemNo;
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Unit)) $o['Unit'] = $this->Unit;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->OurUnitPrice)) $o['OurUnitPrice'] = $this->OurUnitPrice;
        if (isset($this->OurTotal)) $o['OurTotal'] = $this->OurTotal;
        if (isset($this->BenchmarkUnitPrice)) $o['BenchmarkUnitPrice'] = $this->BenchmarkUnitPrice;
        if (isset($this->MarketTotal)) $o['MarketTotal'] = $this->MarketTotal;
        if (isset($this->DeltaPct)) $o['DeltaPct'] = $this->DeltaPct;
        if (isset($this->RateMin)) $o['RateMin'] = $this->RateMin;
        if (isset($this->RateMax)) $o['RateMax'] = $this->RateMax;
        if (isset($this->SampleSize)) $o['SampleSize'] = $this->SampleSize;
        if (isset($this->OutsideRange)) $o['OutsideRange'] = $this->OutsideRange;
        if (isset($this->IsFloor)) $o['IsFloor'] = $this->IsFloor;
        if (isset($this->IsLump)) $o['IsLump'] = $this->IsLump;
        if (isset($this->Severity)) $o['Severity'] = $this->Severity;
        if (isset($this->Adopted)) $o['Adopted'] = $this->Adopted;
        if (isset($this->Note)) $o['Note'] = $this->Note;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateVarianceView implements JsonSerializable
{
    public function __construct(
        /** @var array<EstimateVarianceLine>|null */
        public ?array $Lines=null,
        /** @var int */
        public int $ItemsTotal=0,
        /** @var int */
        public int $ItemsBenchmarked=0,
        /** @var float */
        public float $CoverageValuePct=0.0,
        /** @var float */
        public float $OursTotal=0.0,
        /** @var float */
        public float $MarketTotal=0.0,
        /** @var float|null */
        public ?float $AggregateDeltaPct=null,
        /** @var int */
        public int $FlooredCount=0,
        /** @var int */
        public int $LumpCount=0,
        /** @var int */
        public int $WatchCount=0,
        /** @var int */
        public int $OutlierCount=0,
        /** @var int */
        public int $CriticalCount=0,
        /** @var string|null */
        public ?string $Note=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Lines'])) $this->Lines = JsonConverters::fromArray('EstimateVarianceLine', $o['Lines']);
        if (isset($o['ItemsTotal'])) $this->ItemsTotal = $o['ItemsTotal'];
        if (isset($o['ItemsBenchmarked'])) $this->ItemsBenchmarked = $o['ItemsBenchmarked'];
        if (isset($o['CoverageValuePct'])) $this->CoverageValuePct = $o['CoverageValuePct'];
        if (isset($o['OursTotal'])) $this->OursTotal = $o['OursTotal'];
        if (isset($o['MarketTotal'])) $this->MarketTotal = $o['MarketTotal'];
        if (isset($o['AggregateDeltaPct'])) $this->AggregateDeltaPct = $o['AggregateDeltaPct'];
        if (isset($o['FlooredCount'])) $this->FlooredCount = $o['FlooredCount'];
        if (isset($o['LumpCount'])) $this->LumpCount = $o['LumpCount'];
        if (isset($o['WatchCount'])) $this->WatchCount = $o['WatchCount'];
        if (isset($o['OutlierCount'])) $this->OutlierCount = $o['OutlierCount'];
        if (isset($o['CriticalCount'])) $this->CriticalCount = $o['CriticalCount'];
        if (isset($o['Note'])) $this->Note = $o['Note'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Lines)) $o['Lines'] = JsonConverters::toArray('EstimateVarianceLine', $this->Lines);
        if (isset($this->ItemsTotal)) $o['ItemsTotal'] = $this->ItemsTotal;
        if (isset($this->ItemsBenchmarked)) $o['ItemsBenchmarked'] = $this->ItemsBenchmarked;
        if (isset($this->CoverageValuePct)) $o['CoverageValuePct'] = $this->CoverageValuePct;
        if (isset($this->OursTotal)) $o['OursTotal'] = $this->OursTotal;
        if (isset($this->MarketTotal)) $o['MarketTotal'] = $this->MarketTotal;
        if (isset($this->AggregateDeltaPct)) $o['AggregateDeltaPct'] = $this->AggregateDeltaPct;
        if (isset($this->FlooredCount)) $o['FlooredCount'] = $this->FlooredCount;
        if (isset($this->LumpCount)) $o['LumpCount'] = $this->LumpCount;
        if (isset($this->WatchCount)) $o['WatchCount'] = $this->WatchCount;
        if (isset($this->OutlierCount)) $o['OutlierCount'] = $this->OutlierCount;
        if (isset($this->CriticalCount)) $o['CriticalCount'] = $this->CriticalCount;
        if (isset($this->Note)) $o['Note'] = $this->Note;
        return empty($o) ? new class(){} : $o;
    }
}

class IndicativeLine implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $Seq=0,
        /** @var string|null */
        public ?string $ItemNo=null,
        /** @var string|null */
        public ?string $Name=null,
        /** @var string|null */
        public ?string $Unit=null,
        /** @var float */
        public float $Quantity=0.0,
        /** @var string|null */
        public ?string $Source=null,
        /** @var float */
        public float $UnitPrice=0.0,
        /** @var float */
        public float $LineTotal=0.0,
        /** @var string|null */
        public ?string $PricePoint=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Seq'])) $this->Seq = $o['Seq'];
        if (isset($o['ItemNo'])) $this->ItemNo = $o['ItemNo'];
        if (isset($o['Name'])) $this->Name = $o['Name'];
        if (isset($o['Unit'])) $this->Unit = $o['Unit'];
        if (isset($o['Quantity'])) $this->Quantity = $o['Quantity'];
        if (isset($o['Source'])) $this->Source = $o['Source'];
        if (isset($o['UnitPrice'])) $this->UnitPrice = $o['UnitPrice'];
        if (isset($o['LineTotal'])) $this->LineTotal = $o['LineTotal'];
        if (isset($o['PricePoint'])) $this->PricePoint = $o['PricePoint'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Seq)) $o['Seq'] = $this->Seq;
        if (isset($this->ItemNo)) $o['ItemNo'] = $this->ItemNo;
        if (isset($this->Name)) $o['Name'] = $this->Name;
        if (isset($this->Unit)) $o['Unit'] = $this->Unit;
        if (isset($this->Quantity)) $o['Quantity'] = $this->Quantity;
        if (isset($this->Source)) $o['Source'] = $this->Source;
        if (isset($this->UnitPrice)) $o['UnitPrice'] = $this->UnitPrice;
        if (isset($this->LineTotal)) $o['LineTotal'] = $this->LineTotal;
        if (isset($this->PricePoint)) $o['PricePoint'] = $this->PricePoint;
        return empty($o) ? new class(){} : $o;
    }
}

class IndicativeBidView implements JsonSerializable
{
    public function __construct(
        /** @var array<IndicativeLine>|null */
        public ?array $Lines=null,
        /** @var int */
        public int $BottomUpCount=0,
        /** @var float */
        public float $BottomUpTotal=0.0,
        /** @var int */
        public int $BenchmarkCount=0,
        /** @var float */
        public float $BenchmarkTotal=0.0,
        /** @var int */
        public int $UncoveredCount=0,
        /** @var float */
        public float $UncoveredFloorTotal=0.0,
        /** @var float */
        public float $IndicativeTotal=0.0,
        /** @var float */
        public float $FloorTotal=0.0,
        /** @var string|null */
        public ?string $Note=null,
        /** @var string|null */
        public ?string $Posture=null,
        /** @var float */
        public float $AggressiveTotal=0.0,
        /** @var float */
        public float $MarketTotal=0.0,
        /** @var float */
        public float $PremiumTotal=0.0,
        /** @var int */
        public int $NoDistributionCount=0
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Lines'])) $this->Lines = JsonConverters::fromArray('IndicativeLine', $o['Lines']);
        if (isset($o['BottomUpCount'])) $this->BottomUpCount = $o['BottomUpCount'];
        if (isset($o['BottomUpTotal'])) $this->BottomUpTotal = $o['BottomUpTotal'];
        if (isset($o['BenchmarkCount'])) $this->BenchmarkCount = $o['BenchmarkCount'];
        if (isset($o['BenchmarkTotal'])) $this->BenchmarkTotal = $o['BenchmarkTotal'];
        if (isset($o['UncoveredCount'])) $this->UncoveredCount = $o['UncoveredCount'];
        if (isset($o['UncoveredFloorTotal'])) $this->UncoveredFloorTotal = $o['UncoveredFloorTotal'];
        if (isset($o['IndicativeTotal'])) $this->IndicativeTotal = $o['IndicativeTotal'];
        if (isset($o['FloorTotal'])) $this->FloorTotal = $o['FloorTotal'];
        if (isset($o['Note'])) $this->Note = $o['Note'];
        if (isset($o['Posture'])) $this->Posture = $o['Posture'];
        if (isset($o['AggressiveTotal'])) $this->AggressiveTotal = $o['AggressiveTotal'];
        if (isset($o['MarketTotal'])) $this->MarketTotal = $o['MarketTotal'];
        if (isset($o['PremiumTotal'])) $this->PremiumTotal = $o['PremiumTotal'];
        if (isset($o['NoDistributionCount'])) $this->NoDistributionCount = $o['NoDistributionCount'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Lines)) $o['Lines'] = JsonConverters::toArray('IndicativeLine', $this->Lines);
        if (isset($this->BottomUpCount)) $o['BottomUpCount'] = $this->BottomUpCount;
        if (isset($this->BottomUpTotal)) $o['BottomUpTotal'] = $this->BottomUpTotal;
        if (isset($this->BenchmarkCount)) $o['BenchmarkCount'] = $this->BenchmarkCount;
        if (isset($this->BenchmarkTotal)) $o['BenchmarkTotal'] = $this->BenchmarkTotal;
        if (isset($this->UncoveredCount)) $o['UncoveredCount'] = $this->UncoveredCount;
        if (isset($this->UncoveredFloorTotal)) $o['UncoveredFloorTotal'] = $this->UncoveredFloorTotal;
        if (isset($this->IndicativeTotal)) $o['IndicativeTotal'] = $this->IndicativeTotal;
        if (isset($this->FloorTotal)) $o['FloorTotal'] = $this->FloorTotal;
        if (isset($this->Note)) $o['Note'] = $this->Note;
        if (isset($this->Posture)) $o['Posture'] = $this->Posture;
        if (isset($this->AggressiveTotal)) $o['AggressiveTotal'] = $this->AggressiveTotal;
        if (isset($this->MarketTotal)) $o['MarketTotal'] = $this->MarketTotal;
        if (isset($this->PremiumTotal)) $o['PremiumTotal'] = $this->PremiumTotal;
        if (isset($this->NoDistributionCount)) $o['NoDistributionCount'] = $this->NoDistributionCount;
        return empty($o) ? new class(){} : $o;
    }
}

class BidExposureLine implements JsonSerializable
{
    public function __construct(
        /** @var string|null */
        public ?string $ItemNo=null,
        /** @var string|null */
        public ?string $Description=null,
        /** @var string|null */
        public ?string $Provenance=null,
        /** @var float */
        public float $Extension=0.0,
        /** @var float */
        public float $CumulativePct=0.0,
        /** @var string|null */
        public ?string $Note=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['ItemNo'])) $this->ItemNo = $o['ItemNo'];
        if (isset($o['Description'])) $this->Description = $o['Description'];
        if (isset($o['Provenance'])) $this->Provenance = $o['Provenance'];
        if (isset($o['Extension'])) $this->Extension = $o['Extension'];
        if (isset($o['CumulativePct'])) $this->CumulativePct = $o['CumulativePct'];
        if (isset($o['Note'])) $this->Note = $o['Note'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->ItemNo)) $o['ItemNo'] = $this->ItemNo;
        if (isset($this->Description)) $o['Description'] = $this->Description;
        if (isset($this->Provenance)) $o['Provenance'] = $this->Provenance;
        if (isset($this->Extension)) $o['Extension'] = $this->Extension;
        if (isset($this->CumulativePct)) $o['CumulativePct'] = $this->CumulativePct;
        if (isset($this->Note)) $o['Note'] = $this->Note;
        return empty($o) ? new class(){} : $o;
    }
}

class BidOwnershipView implements JsonSerializable
{
    public function __construct(
        /** @var float */
        public float $OwnTotal=0.0,
        /** @var float */
        public float $BorrowedTotal=0.0,
        /** @var float */
        public float $UnknownFloorTotal=0.0,
        /** @var float */
        public float $ScheduleTotal=0.0,
        /** @var int */
        public int $OwnCount=0,
        /** @var int */
        public int $BorrowedCount=0,
        /** @var int */
        public int $UnknownCount=0,
        /** @var float */
        public float $OwnPct=0.0,
        /** @var array<BidExposureLine>|null */
        public ?array $TopExposure=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['OwnTotal'])) $this->OwnTotal = $o['OwnTotal'];
        if (isset($o['BorrowedTotal'])) $this->BorrowedTotal = $o['BorrowedTotal'];
        if (isset($o['UnknownFloorTotal'])) $this->UnknownFloorTotal = $o['UnknownFloorTotal'];
        if (isset($o['ScheduleTotal'])) $this->ScheduleTotal = $o['ScheduleTotal'];
        if (isset($o['OwnCount'])) $this->OwnCount = $o['OwnCount'];
        if (isset($o['BorrowedCount'])) $this->BorrowedCount = $o['BorrowedCount'];
        if (isset($o['UnknownCount'])) $this->UnknownCount = $o['UnknownCount'];
        if (isset($o['OwnPct'])) $this->OwnPct = $o['OwnPct'];
        if (isset($o['TopExposure'])) $this->TopExposure = JsonConverters::fromArray('BidExposureLine', $o['TopExposure']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->OwnTotal)) $o['OwnTotal'] = $this->OwnTotal;
        if (isset($this->BorrowedTotal)) $o['BorrowedTotal'] = $this->BorrowedTotal;
        if (isset($this->UnknownFloorTotal)) $o['UnknownFloorTotal'] = $this->UnknownFloorTotal;
        if (isset($this->ScheduleTotal)) $o['ScheduleTotal'] = $this->ScheduleTotal;
        if (isset($this->OwnCount)) $o['OwnCount'] = $this->OwnCount;
        if (isset($this->BorrowedCount)) $o['BorrowedCount'] = $this->BorrowedCount;
        if (isset($this->UnknownCount)) $o['UnknownCount'] = $this->UnknownCount;
        if (isset($this->OwnPct)) $o['OwnPct'] = $this->OwnPct;
        if (isset($this->TopExposure)) $o['TopExposure'] = JsonConverters::toArray('BidExposureLine', $this->TopExposure);
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateSummaryView implements JsonSerializable
{
    public function __construct(
        /** @var float */
        public float $Direct=0.0,
        /** @var float */
        public float $OhpPct=0.0,
        /** @var float */
        public float $OhpAmount=0.0,
        /** @var float */
        public float $BondPct=0.0,
        /** @var float */
        public float $BondAmount=0.0,
        /** @var float */
        public float $ContingencyPct=0.0,
        /** @var float */
        public float $ContingencyAmount=0.0,
        /** @var float */
        public float $BidTotal=0.0,
        /** @var float */
        public float $LoadFactor=0.0,
        /** @var float */
        public float $MarginPct=0.0
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['Direct'])) $this->Direct = $o['Direct'];
        if (isset($o['OhpPct'])) $this->OhpPct = $o['OhpPct'];
        if (isset($o['OhpAmount'])) $this->OhpAmount = $o['OhpAmount'];
        if (isset($o['BondPct'])) $this->BondPct = $o['BondPct'];
        if (isset($o['BondAmount'])) $this->BondAmount = $o['BondAmount'];
        if (isset($o['ContingencyPct'])) $this->ContingencyPct = $o['ContingencyPct'];
        if (isset($o['ContingencyAmount'])) $this->ContingencyAmount = $o['ContingencyAmount'];
        if (isset($o['BidTotal'])) $this->BidTotal = $o['BidTotal'];
        if (isset($o['LoadFactor'])) $this->LoadFactor = $o['LoadFactor'];
        if (isset($o['MarginPct'])) $this->MarginPct = $o['MarginPct'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->Direct)) $o['Direct'] = $this->Direct;
        if (isset($this->OhpPct)) $o['OhpPct'] = $this->OhpPct;
        if (isset($this->OhpAmount)) $o['OhpAmount'] = $this->OhpAmount;
        if (isset($this->BondPct)) $o['BondPct'] = $this->BondPct;
        if (isset($this->BondAmount)) $o['BondAmount'] = $this->BondAmount;
        if (isset($this->ContingencyPct)) $o['ContingencyPct'] = $this->ContingencyPct;
        if (isset($this->ContingencyAmount)) $o['ContingencyAmount'] = $this->ContingencyAmount;
        if (isset($this->BidTotal)) $o['BidTotal'] = $this->BidTotal;
        if (isset($this->LoadFactor)) $o['LoadFactor'] = $this->LoadFactor;
        if (isset($this->MarginPct)) $o['MarginPct'] = $this->MarginPct;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateTimingView implements JsonSerializable
{
    public function __construct(
        /** @var float */
        public float $TotalWorkdays=0.0,
        /** @var int */
        public int $CalendarDays=0,
        /** @var DateTime */
        public DateTime $Finish=new DateTime(),
        /** @var bool|null */
        public ?bool $Feasible=null,
        /** @var DateTime|null */
        public ?DateTime $Deadline=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['TotalWorkdays'])) $this->TotalWorkdays = $o['TotalWorkdays'];
        if (isset($o['CalendarDays'])) $this->CalendarDays = $o['CalendarDays'];
        if (isset($o['Finish'])) $this->Finish = JsonConverters::from('DateTime', $o['Finish']);
        if (isset($o['Feasible'])) $this->Feasible = $o['Feasible'];
        if (isset($o['Deadline'])) $this->Deadline = JsonConverters::from('DateTime', $o['Deadline']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->TotalWorkdays)) $o['TotalWorkdays'] = $this->TotalWorkdays;
        if (isset($this->CalendarDays)) $o['CalendarDays'] = $this->CalendarDays;
        if (isset($this->Finish)) $o['Finish'] = JsonConverters::to('DateTime', $this->Finish);
        if (isset($this->Feasible)) $o['Feasible'] = $this->Feasible;
        if (isset($this->Deadline)) $o['Deadline'] = JsonConverters::to('DateTime', $this->Deadline);
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateReviewItemView implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $TaskSeq=0,
        /** @var string|null */
        public ?string $TaskName=null,
        /** @var string|null */
        public ?string $Reason=null,
        /** @var string|null */
        public ?string $Status=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['TaskSeq'])) $this->TaskSeq = $o['TaskSeq'];
        if (isset($o['TaskName'])) $this->TaskName = $o['TaskName'];
        if (isset($o['Reason'])) $this->Reason = $o['Reason'];
        if (isset($o['Status'])) $this->Status = $o['Status'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->TaskSeq)) $o['TaskSeq'] = $this->TaskSeq;
        if (isset($this->TaskName)) $o['TaskName'] = $this->TaskName;
        if (isset($this->Reason)) $o['Reason'] = $this->Reason;
        if (isset($this->Status)) $o['Status'] = $this->Status;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimatingView implements JsonSerializable
{
    public function __construct(
        /** @var int */
        public int $RfpDocumentID=0,
        /** @var string|null */
        public ?string $ProjectName=null,
        /** @var string|null */
        public ?string $ClientName=null,
        /** @var string|null */
        public ?string $BidDueDate=null,
        /** @var string|null */
        public ?string $ProjectType=null,
        /** @var EstimateSettingsView|null */
        public ?EstimateSettingsView $Settings=null,
        /** @var array<EstimateJobView>|null */
        public ?array $Jobs=null,
        /** @var array<BidScheduleLine>|null */
        public ?array $Schedule=null,
        /** @var float */
        public float $ScheduleTotal=0.0,
        /** @var EstimateVarianceView|null */
        public ?EstimateVarianceView $Variance=null,
        /** @var IndicativeBidView|null */
        public ?IndicativeBidView $Indicative=null,
        /** @var BidOwnershipView|null */
        public ?BidOwnershipView $Ownership=null,
        /** @var EstimateSummaryView|null */
        public ?EstimateSummaryView $Summary=null,
        /** @var EstimateTimingView|null */
        public ?EstimateTimingView $Timing=null,
        /** @var int */
        public int $NeedsRateCount=0,
        /** @var array<string>|null */
        public ?array $NeedsRateKeys=null,
        /** @var array<EstimateReviewItemView>|null */
        public ?array $ReviewItems=null,
        /** @var int */
        public int $NeedsReviewCount=0,
        /** @var bool|null */
        public ?bool $CanApprove=null,
        /** @var bool|null */
        public ?bool $CanSeePay=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['RfpDocumentID'])) $this->RfpDocumentID = $o['RfpDocumentID'];
        if (isset($o['ProjectName'])) $this->ProjectName = $o['ProjectName'];
        if (isset($o['ClientName'])) $this->ClientName = $o['ClientName'];
        if (isset($o['BidDueDate'])) $this->BidDueDate = $o['BidDueDate'];
        if (isset($o['ProjectType'])) $this->ProjectType = $o['ProjectType'];
        if (isset($o['Settings'])) $this->Settings = JsonConverters::from('EstimateSettingsView', $o['Settings']);
        if (isset($o['Jobs'])) $this->Jobs = JsonConverters::fromArray('EstimateJobView', $o['Jobs']);
        if (isset($o['Schedule'])) $this->Schedule = JsonConverters::fromArray('BidScheduleLine', $o['Schedule']);
        if (isset($o['ScheduleTotal'])) $this->ScheduleTotal = $o['ScheduleTotal'];
        if (isset($o['Variance'])) $this->Variance = JsonConverters::from('EstimateVarianceView', $o['Variance']);
        if (isset($o['Indicative'])) $this->Indicative = JsonConverters::from('IndicativeBidView', $o['Indicative']);
        if (isset($o['Ownership'])) $this->Ownership = JsonConverters::from('BidOwnershipView', $o['Ownership']);
        if (isset($o['Summary'])) $this->Summary = JsonConverters::from('EstimateSummaryView', $o['Summary']);
        if (isset($o['Timing'])) $this->Timing = JsonConverters::from('EstimateTimingView', $o['Timing']);
        if (isset($o['NeedsRateCount'])) $this->NeedsRateCount = $o['NeedsRateCount'];
        if (isset($o['NeedsRateKeys'])) $this->NeedsRateKeys = JsonConverters::fromArray('string', $o['NeedsRateKeys']);
        if (isset($o['ReviewItems'])) $this->ReviewItems = JsonConverters::fromArray('EstimateReviewItemView', $o['ReviewItems']);
        if (isset($o['NeedsReviewCount'])) $this->NeedsReviewCount = $o['NeedsReviewCount'];
        if (isset($o['CanApprove'])) $this->CanApprove = $o['CanApprove'];
        if (isset($o['CanSeePay'])) $this->CanSeePay = $o['CanSeePay'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->RfpDocumentID)) $o['RfpDocumentID'] = $this->RfpDocumentID;
        if (isset($this->ProjectName)) $o['ProjectName'] = $this->ProjectName;
        if (isset($this->ClientName)) $o['ClientName'] = $this->ClientName;
        if (isset($this->BidDueDate)) $o['BidDueDate'] = $this->BidDueDate;
        if (isset($this->ProjectType)) $o['ProjectType'] = $this->ProjectType;
        if (isset($this->Settings)) $o['Settings'] = JsonConverters::to('EstimateSettingsView', $this->Settings);
        if (isset($this->Jobs)) $o['Jobs'] = JsonConverters::toArray('EstimateJobView', $this->Jobs);
        if (isset($this->Schedule)) $o['Schedule'] = JsonConverters::toArray('BidScheduleLine', $this->Schedule);
        if (isset($this->ScheduleTotal)) $o['ScheduleTotal'] = $this->ScheduleTotal;
        if (isset($this->Variance)) $o['Variance'] = JsonConverters::to('EstimateVarianceView', $this->Variance);
        if (isset($this->Indicative)) $o['Indicative'] = JsonConverters::to('IndicativeBidView', $this->Indicative);
        if (isset($this->Ownership)) $o['Ownership'] = JsonConverters::to('BidOwnershipView', $this->Ownership);
        if (isset($this->Summary)) $o['Summary'] = JsonConverters::to('EstimateSummaryView', $this->Summary);
        if (isset($this->Timing)) $o['Timing'] = JsonConverters::to('EstimateTimingView', $this->Timing);
        if (isset($this->NeedsRateCount)) $o['NeedsRateCount'] = $this->NeedsRateCount;
        if (isset($this->NeedsRateKeys)) $o['NeedsRateKeys'] = JsonConverters::toArray('string', $this->NeedsRateKeys);
        if (isset($this->ReviewItems)) $o['ReviewItems'] = JsonConverters::toArray('EstimateReviewItemView', $this->ReviewItems);
        if (isset($this->NeedsReviewCount)) $o['NeedsReviewCount'] = $this->NeedsReviewCount;
        if (isset($this->CanApprove)) $o['CanApprove'] = $this->CanApprove;
        if (isset($this->CanSeePay)) $o['CanSeePay'] = $this->CanSeePay;
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateSnapshot implements JsonSerializable
{
    public function __construct(
        /** @var DateTime */
        public DateTime $TakenAtUtc=new DateTime(),
        /** @var ProjectProposal|null */
        public ?ProjectProposal $Proposal=null,
        /** @var EstimatingView|null */
        public ?EstimatingView $View=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['TakenAtUtc'])) $this->TakenAtUtc = JsonConverters::from('DateTime', $o['TakenAtUtc']);
        if (isset($o['Proposal'])) $this->Proposal = JsonConverters::from('ProjectProposal', $o['Proposal']);
        if (isset($o['View'])) $this->View = JsonConverters::from('EstimatingView', $o['View']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->TakenAtUtc)) $o['TakenAtUtc'] = JsonConverters::to('DateTime', $this->TakenAtUtc);
        if (isset($this->Proposal)) $o['Proposal'] = JsonConverters::to('ProjectProposal', $this->Proposal);
        if (isset($this->View)) $o['View'] = JsonConverters::to('EstimatingView', $this->View);
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateRevisionGetResponse implements JsonSerializable
{
    public function __construct(
        /** @var ResponseStatus|null */
        public ?ResponseStatus $ResponseStatus=null,
        /** @var EstimateRevision|null */
        public ?EstimateRevision $Revision=null,
        /** @var EstimateSnapshot|null */
        public ?EstimateSnapshot $Snapshot=null
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['ResponseStatus'])) $this->ResponseStatus = JsonConverters::from('ResponseStatus', $o['ResponseStatus']);
        if (isset($o['Revision'])) $this->Revision = JsonConverters::from('EstimateRevision', $o['Revision']);
        if (isset($o['Snapshot'])) $this->Snapshot = JsonConverters::from('EstimateSnapshot', $o['Snapshot']);
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->ResponseStatus)) $o['ResponseStatus'] = JsonConverters::to('ResponseStatus', $this->ResponseStatus);
        if (isset($this->Revision)) $o['Revision'] = JsonConverters::to('EstimateRevision', $this->Revision);
        if (isset($this->Snapshot)) $o['Snapshot'] = JsonConverters::to('EstimateSnapshot', $this->Snapshot);
        return empty($o) ? new class(){} : $o;
    }
}

class EstimateRevisionGetRequest implements JsonSerializable
{
    public function __construct(
        /** @var string */
        public string $RfpDocumentUID='',
        /** @var int */
        public int $RevisionNo=0
    ) {
    }

    /** @throws Exception */
    public function fromMap($o): void {
        if (isset($o['RfpDocumentUID'])) $this->RfpDocumentUID = $o['RfpDocumentUID'];
        if (isset($o['RevisionNo'])) $this->RevisionNo = $o['RevisionNo'];
    }
    
    /** @throws Exception */
    public function jsonSerialize(): mixed
    {
        $o = [];
        if (isset($this->RfpDocumentUID)) $o['RfpDocumentUID'] = $this->RfpDocumentUID;
        if (isset($this->RevisionNo)) $o['RevisionNo'] = $this->RevisionNo;
        return empty($o) ? new class(){} : $o;
    }
}

PHP EstimateRevisionGetRequest DTOs

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

HTTP + XML

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: application/xml
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: length

<EstimateRevisionGetResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CRM.AgencyPlatform.API.Internal">
  <ResponseStatus xmlns:d2p1="http://schemas.servicestack.net/types">
    <d2p1:ErrorCode>String</d2p1:ErrorCode>
    <d2p1:Message>String</d2p1:Message>
    <d2p1:StackTrace>String</d2p1:StackTrace>
    <d2p1:Errors>
      <d2p1:ResponseError>
        <d2p1:ErrorCode>String</d2p1:ErrorCode>
        <d2p1:FieldName>String</d2p1:FieldName>
        <d2p1:Message>String</d2p1:Message>
        <d2p1:Meta xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
          <d5p1:KeyValueOfstringstring>
            <d5p1:Key>String</d5p1:Key>
            <d5p1:Value>String</d5p1:Value>
          </d5p1:KeyValueOfstringstring>
        </d2p1:Meta>
      </d2p1:ResponseError>
    </d2p1:Errors>
    <d2p1:Meta xmlns:d3p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
      <d3p1:KeyValueOfstringstring>
        <d3p1:Key>String</d3p1:Key>
        <d3p1:Value>String</d3p1:Value>
      </d3p1:KeyValueOfstringstring>
    </d2p1:Meta>
  </ResponseStatus>
  <Revision>
    <CreatedAt>0001-01-01T00:00:00</CreatedAt>
    <CreatedBy>String</CreatedBy>
    <EstimateRevisionID>0</EstimateRevisionID>
    <Label>String</Label>
    <LineCount>0</LineCount>
    <Reason>String</Reason>
    <RevisionNo>0</RevisionNo>
    <RfpDocumentID>0</RfpDocumentID>
    <SnapshotJson>String</SnapshotJson>
    <TotalAmount>0</TotalAmount>
    <Trigger>String</Trigger>
  </Revision>
  <Snapshot>
    <Proposal>
      <BidDueDate>String</BidDueDate>
      <ChangeOrderID>0</ChangeOrderID>
      <ClientName>String</ClientName>
      <ContractDurationDays>0</ContractDurationDays>
      <EstimatedEndDate>0001-01-01T00:00:00</EstimatedEndDate>
      <EstimatedStartDate>0001-01-01T00:00:00</EstimatedStartDate>
      <Mode>String</Mode>
      <PendingAddendaDiffs>
        <AddendaChangeSet>
          <ChangeSetId>String</ChangeSetId>
          <Changes>
            <AddendaChange>
              <ChangeId>String</ChangeId>
              <ChangeType>String</ChangeType>
              <Description>String</Description>
              <Field>String</Field>
              <ItemName>String</ItemName>
              <ItemNumber>String</ItemNumber>
              <NewValue>String</NewValue>
              <OldValue>String</OldValue>
              <Status>String</Status>
              <TargetSeq>0</TargetSeq>
            </AddendaChange>
          </Changes>
          <DocumentType>String</DocumentType>
          <ExtractedAtUtc>0001-01-01T00:00:00</ExtractedAtUtc>
          <SourceFileName>String</SourceFileName>
          <SourceRfpDocumentID>0</SourceRfpDocumentID>
          <Summary>String</Summary>
        </AddendaChangeSet>
      </PendingAddendaDiffs>
      <ProjectDescription>String</ProjectDescription>
      <ProjectID>0</ProjectID>
      <ProjectLocation>String</ProjectLocation>
      <ProjectName>String</ProjectName>
      <ProjectType>String</ProjectType>
      <RfpDocumentID>0</RfpDocumentID>
      <Scope>String</Scope>
      <Tasks>
        <ProposedTask>
          <Category>String</Category>
          <CreatedJobID>0</CreatedJobID>
          <DependsOn xmlns:d6p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            <d6p1:int>0</d6p1:int>
          </DependsOn>
          <DurationDays>0</DurationDays>
          <EstimatedEndDate>0001-01-01T00:00:00</EstimatedEndDate>
          <EstimatedStartDate>0001-01-01T00:00:00</EstimatedStartDate>
          <Name>String</Name>
          <Notes>String</Notes>
          <Quantity>0</Quantity>
          <Resourcing>
            <Equipment>
              <ResourcedEquipment>
                <DurationDays>0</DurationDays>
                <EquipmentID>0</EquipmentID>
                <EquipmentName>String</EquipmentName>
                <FixedDays>0</FixedDays>
                <IsInCatalog>false</IsInCatalog>
                <MakeModel>String</MakeModel>
                <Notes>String</Notes>
                <Quantity>0</Quantity>
                <SourceReference>String</SourceReference>
                <SuggestedEquipmentID>0</SuggestedEquipmentID>
                <SuggestedEquipmentName>String</SuggestedEquipmentName>
                <Utilization>0</Utilization>
              </ResourcedEquipment>
            </Equipment>
            <FixedDays>0</FixedDays>
            <Materials>
              <ResourcedMaterial>
                <IsInCatalog>false</IsInCatalog>
                <MakeModel>String</MakeModel>
                <MaterialID>0</MaterialID>
                <MaterialName>String</MaterialName>
                <Notes>String</Notes>
                <Quantity>0</Quantity>
                <QuantityPerUnit>0</QuantityPerUnit>
                <SourceReference>String</SourceReference>
                <SuggestedMaterialID>0</SuggestedMaterialID>
                <SuggestedMaterialName>String</SuggestedMaterialName>
                <Unit>String</Unit>
              </ResourcedMaterial>
            </Materials>
            <Positions>
              <ResourcedPosition>
                <ContactID>0</ContactID>
                <CrewSize>0</CrewSize>
                <FixedDays>0</FixedDays>
                <Headcount>0</Headcount>
                <Hours>0</Hours>
                <IsInCatalog>false</IsInCatalog>
                <Notes>String</Notes>
                <PositionTag>String</PositionTag>
                <SourceReference>String</SourceReference>
                <Utilization>0</Utilization>
              </ResourcedPosition>
            </Positions>
            <ProductionRatePerDay>0</ProductionRatePerDay>
            <ResourcedForQuantity>0</ResourcedForQuantity>
          </Resourcing>
          <Seq>0</Seq>
          <SourceItemNumber>String</SourceItemNumber>
          <SourceReference>String</SourceReference>
          <Unit>String</Unit>
          <WorkPackage>
            <Confidence>0</Confidence>
            <Constraints xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </Constraints>
            <DefinitionOfDone xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </DefinitionOfDone>
            <DodChecked xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </DodChecked>
            <DodExtra xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </DodExtra>
            <DodRemoved xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:int>0</d7p1:int>
            </DodRemoved>
            <HoldPoints xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </HoldPoints>
            <LimitsOfWork>String</LimitsOfWork>
            <RedraftNote>String</RedraftNote>
            <RfpRef>String</RfpRef>
            <SafetyNote>String</SafetyNote>
            <Scope>String</Scope>
            <SpecBook>String</SpecBook>
            <SpecRefs>
              <WorkPackageSpecRef>
                <Section>String</Section>
                <Title>String</Title>
              </WorkPackageSpecRef>
            </SpecRefs>
            <UserEdited>false</UserEdited>
            <UserScope>String</UserScope>
          </WorkPackage>
        </ProposedTask>
      </Tasks>
      <WageDeterminations>
        <WageDeterminationResult>
          <Classifications>
            <WageClassification>
              <BaseRate>0</BaseRate>
              <BenchmarkFringeRate>0</BenchmarkFringeRate>
              <FringeCompareNote>String</FringeCompareNote>
              <FringeRate>0</FringeRate>
              <ParishNote>String</ParishNote>
              <SourceLine>String</SourceLine>
              <Title>String</Title>
            </WageClassification>
          </Classifications>
          <ExecutiveOrderFloor>0</ExecutiveOrderFloor>
          <ExtractedAtUtc>0001-01-01T00:00:00</ExtractedAtUtc>
          <IsTrustworthy>false</IsTrustworthy>
          <ProjectParish>String</ProjectParish>
          <PublishedDate>String</PublishedDate>
          <Source>String</Source>
          <SourceFileName>String</SourceFileName>
          <SourceRfpDocumentID>0</SourceRfpDocumentID>
          <Warnings xmlns:d6p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            <d6p1:string>String</d6p1:string>
          </Warnings>
          <WdNumber>String</WdNumber>
        </WageDeterminationResult>
      </WageDeterminations>
    </Proposal>
    <TakenAtUtc>0001-01-01T00:00:00</TakenAtUtc>
    <View>
      <BidDueDate>String</BidDueDate>
      <CanApprove>false</CanApprove>
      <CanSeePay>false</CanSeePay>
      <ClientName>String</ClientName>
      <Indicative>
        <AggressiveTotal>0</AggressiveTotal>
        <BenchmarkCount>0</BenchmarkCount>
        <BenchmarkTotal>0</BenchmarkTotal>
        <BottomUpCount>0</BottomUpCount>
        <BottomUpTotal>0</BottomUpTotal>
        <FloorTotal>0</FloorTotal>
        <IndicativeTotal>0</IndicativeTotal>
        <Lines>
          <IndicativeLine>
            <ItemNo>String</ItemNo>
            <LineTotal>0</LineTotal>
            <Name>String</Name>
            <PricePoint>String</PricePoint>
            <Quantity>0</Quantity>
            <Seq>0</Seq>
            <Source>String</Source>
            <Unit>String</Unit>
            <UnitPrice>0</UnitPrice>
          </IndicativeLine>
        </Lines>
        <MarketTotal>0</MarketTotal>
        <NoDistributionCount>0</NoDistributionCount>
        <Note>String</Note>
        <Posture>String</Posture>
        <PremiumTotal>0</PremiumTotal>
        <UncoveredCount>0</UncoveredCount>
        <UncoveredFloorTotal>0</UncoveredFloorTotal>
      </Indicative>
      <Jobs>
        <EstimateJobView>
          <BenchmarkUnitPrice>0</BenchmarkUnitPrice>
          <Category>String</Category>
          <Crew>
            <EstimateCrewLineView>
              <Chip>String</Chip>
              <Cost>0</Cost>
              <FringeCost>0</FringeCost>
              <HasOt>false</HasOt>
              <Hours>0</Hours>
              <NeedsRate>false</NeedsRate>
              <OtCost>0</OtCost>
              <OtHours>0</OtHours>
              <PremiumApplied>false</PremiumApplied>
              <RateKey>String</RateKey>
              <Role>String</Role>
              <Rrop>0</Rrop>
              <StCost>0</StCost>
              <StHours>0</StHours>
            </EstimateCrewLineView>
          </Crew>
          <CrewCost>0</CrewCost>
          <CrewPremiumApplied>false</CrewPremiumApplied>
          <Days>0</Days>
          <Direct>0</Direct>
          <EffectiveProdPerDay>0</EffectiveProdPerDay>
          <Equipment>
            <EstimateEquipmentLineView>
              <AvailabilityLabel>String</AvailabilityLabel>
              <AvailableFrom>0001-01-01T00:00:00</AvailableFrom>
              <BilledDays>0</BilledDays>
              <Chip>String</Chip>
              <Cost>0</Cost>
              <FreedFromProject>String</FreedFromProject>
              <IsAvailabilityTracked>false</IsAvailabilityTracked>
              <IsOwned>false</IsOwned>
              <MobCost>0</MobCost>
              <Name>String</Name>
              <NeedsRate>false</NeedsRate>
              <Quantity>0</Quantity>
              <Rate>0</Rate>
              <RateKey>String</RateKey>
              <RentalExplain>String</RentalExplain>
              <UsageDays>0</UsageDays>
            </EstimateEquipmentLineView>
          </Equipment>
          <EquipmentCost>0</EquipmentCost>
          <FringeCost>0</FringeCost>
          <HoursPerDay>0</HoursPerDay>
          <IsNight>false</IsNight>
          <ItemNo>String</ItemNo>
          <MaterialCost>0</MaterialCost>
          <Materials>
            <EstimateMaterialLineView>
              <Chip>String</Chip>
              <Cost>0</Cost>
              <Name>String</Name>
              <NeedsRate>false</NeedsRate>
              <Quantity>0</Quantity>
              <Rate>0</Rate>
              <RateKey>String</RateKey>
              <Unit>String</Unit>
            </EstimateMaterialLineView>
          </Materials>
          <Name>String</Name>
          <OtFraction>0</OtFraction>
          <PatternCode>String</PatternCode>
          <PricingBandLabel>String</PricingBandLabel>
          <PricingBandN>0</PricingBandN>
          <PricingBandP25>0</PricingBandP25>
          <PricingBandP75>0</PricingBandP75>
          <PricingBasis>String</PricingBasis>
          <PricingRuleId>String</PricingRuleId>
          <Quantity>0</Quantity>
          <ReferenceBasis>String</ReferenceBasis>
          <ReferenceDate>0001-01-01T00:00:00</ReferenceDate>
          <ReferenceN>0</ReferenceN>
          <ReferencePrice>0</ReferencePrice>
          <ReferenceRangeMax>0</ReferenceRangeMax>
          <ReferenceRangeMin>0</ReferenceRangeMin>
          <ReferenceUrl>String</ReferenceUrl>
          <Seq>0</Seq>
          <SourceRef>String</SourceRef>
          <SubcontractCost>0</SubcontractCost>
          <Subcontracts>
            <EstimateSubcontractView>
              <Amount>0</Amount>
              <EstimateSubcontractID>0</EstimateSubcontractID>
              <Scope>String</Scope>
              <TaskSeq>0</TaskSeq>
              <Vendor>String</Vendor>
            </EstimateSubcontractView>
          </Subcontracts>
          <Unit>String</Unit>
          <WeeklyHours>0</WeeklyHours>
          <WorkPackage>
            <Constraints xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </Constraints>
            <Dod>
              <RfpWorkPackageService.DodItemView>
                <Checked>false</Checked>
                <Key>String</Key>
                <Source>String</Source>
                <Text>String</Text>
              </RfpWorkPackageService.DodItemView>
            </Dod>
            <HasPackage>false</HasPackage>
            <HoldPoints xmlns:d7p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
              <d7p1:string>String</d7p1:string>
            </HoldPoints>
            <LimitsOfWork>String</LimitsOfWork>
            <Provenance>String</Provenance>
            <RedraftNote>String</RedraftNote>
            <SafetyNote>String</SafetyNote>
            <Scope>String</Scope>
            <SpecBook>String</SpecBook>
            <SpecRefs>
              <RfpWorkPackageService.SpecRefView>
                <Section>String</Section>
                <Title>String</Title>
                <Url>String</Url>
              </RfpWorkPackageService.SpecRefView>
            </SpecRefs>
            <UserEdited>false</UserEdited>
          </WorkPackage>
          <Workdays>0</Workdays>
        </EstimateJobView>
      </Jobs>
      <NeedsRateCount>0</NeedsRateCount>
      <NeedsRateKeys xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
        <d4p1:string>String</d4p1:string>
      </NeedsRateKeys>
      <NeedsReviewCount>0</NeedsReviewCount>
      <Ownership>
        <BorrowedCount>0</BorrowedCount>
        <BorrowedTotal>0</BorrowedTotal>
        <OwnCount>0</OwnCount>
        <OwnPct>0</OwnPct>
        <OwnTotal>0</OwnTotal>
        <ScheduleTotal>0</ScheduleTotal>
        <TopExposure>
          <BidExposureLine>
            <CumulativePct>0</CumulativePct>
            <Description>String</Description>
            <Extension>0</Extension>
            <ItemNo>String</ItemNo>
            <Note>String</Note>
            <Provenance>String</Provenance>
          </BidExposureLine>
        </TopExposure>
        <UnknownCount>0</UnknownCount>
        <UnknownFloorTotal>0</UnknownFloorTotal>
      </Ownership>
      <ProjectName>String</ProjectName>
      <ProjectType>String</ProjectType>
      <ReviewItems>
        <EstimateReviewItemView>
          <Reason>String</Reason>
          <Status>String</Status>
          <TaskName>String</TaskName>
          <TaskSeq>0</TaskSeq>
        </EstimateReviewItemView>
      </ReviewItems>
      <RfpDocumentID>0</RfpDocumentID>
      <Schedule>
        <BidScheduleLine>
          <BenchmarkBasis>String</BenchmarkBasis>
          <BenchmarkDeltaPct>0</BenchmarkDeltaPct>
          <BenchmarkFlagged>false</BenchmarkFlagged>
          <Description>String</Description>
          <Extension>0</Extension>
          <ItemNo>String</ItemNo>
          <PricingBandLabel>String</PricingBandLabel>
          <PricingBandN>0</PricingBandN>
          <PricingBandP25>0</PricingBandP25>
          <PricingBandP75>0</PricingBandP75>
          <PricingBasis>String</PricingBasis>
          <PricingRuleId>String</PricingRuleId>
          <Provenance>String</Provenance>
          <ProvenanceNote>String</ProvenanceNote>
          <Quantity>0</Quantity>
          <TotalResources>0</TotalResources>
          <Unit>String</Unit>
          <UnitPrice>0</UnitPrice>
          <UnpricedResources>0</UnpricedResources>
        </BidScheduleLine>
      </Schedule>
      <ScheduleTotal>0</ScheduleTotal>
      <Settings>
        <AppliedStartDate>0001-01-01T00:00:00</AppliedStartDate>
        <BondPct>0</BondPct>
        <ContingencyPct>0</ContingencyPct>
        <DeadlineDate>0001-01-01T00:00:00</DeadlineDate>
        <Holidays xmlns:d5p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
          <d5p1:dateTime>0001-01-01T00:00:00</d5p1:dateTime>
        </Holidays>
        <HoursPerDay>0</HoursPerDay>
        <OhpPct>0</OhpPct>
        <RfpEstimateID>0</RfpEstimateID>
        <StartDate>0001-01-01T00:00:00</StartDate>
        <WeatherPct>0</WeatherPct>
        <WorkdaysPerWeek>0</WorkdaysPerWeek>
      </Settings>
      <Summary>
        <BidTotal>0</BidTotal>
        <BondAmount>0</BondAmount>
        <BondPct>0</BondPct>
        <ContingencyAmount>0</ContingencyAmount>
        <ContingencyPct>0</ContingencyPct>
        <Direct>0</Direct>
        <LoadFactor>0</LoadFactor>
        <MarginPct>0</MarginPct>
        <OhpAmount>0</OhpAmount>
        <OhpPct>0</OhpPct>
      </Summary>
      <Timing>
        <CalendarDays>0</CalendarDays>
        <Deadline>0001-01-01T00:00:00</Deadline>
        <Feasible>false</Feasible>
        <Finish>0001-01-01T00:00:00</Finish>
        <TotalWorkdays>0</TotalWorkdays>
      </Timing>
      <Variance>
        <AggregateDeltaPct>0</AggregateDeltaPct>
        <CoverageValuePct>0</CoverageValuePct>
        <CriticalCount>0</CriticalCount>
        <FlooredCount>0</FlooredCount>
        <ItemsBenchmarked>0</ItemsBenchmarked>
        <ItemsTotal>0</ItemsTotal>
        <Lines>
          <EstimateVarianceLine>
            <Adopted>false</Adopted>
            <BenchmarkUnitPrice>0</BenchmarkUnitPrice>
            <DeltaPct>0</DeltaPct>
            <IsFloor>false</IsFloor>
            <IsLump>false</IsLump>
            <ItemNo>String</ItemNo>
            <MarketTotal>0</MarketTotal>
            <Name>String</Name>
            <Note>String</Note>
            <OurTotal>0</OurTotal>
            <OurUnitPrice>0</OurUnitPrice>
            <OutsideRange>false</OutsideRange>
            <Quantity>0</Quantity>
            <RateMax>0</RateMax>
            <RateMin>0</RateMin>
            <SampleSize>0</SampleSize>
            <Seq>0</Seq>
            <Severity>String</Severity>
            <Unit>String</Unit>
          </EstimateVarianceLine>
        </Lines>
        <LumpCount>0</LumpCount>
        <MarketTotal>0</MarketTotal>
        <Note>String</Note>
        <OursTotal>0</OursTotal>
        <OutlierCount>0</OutlierCount>
        <WatchCount>0</WatchCount>
      </Variance>
    </View>
  </Snapshot>
</EstimateRevisionGetResponse>