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 .jsv suffix or ?format=jsv

HTTP + JSV

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

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

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