| Requires any of the roles: | Agent, Administrator |
| GET,OPTIONS | /v1/Rfp/{RfpDocumentUID}/Estimate/Revisions/{RevisionA}/Compare/{RevisionB} |
|---|
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class RevisionLineDelta:
item_no: Optional[str] = None
description: Optional[str] = None
unit: Optional[str] = None
change: Optional[str] = None
quantity_a: Optional[Decimal] = None
quantity_b: Optional[Decimal] = None
unit_price_a: Optional[Decimal] = None
unit_price_b: Optional[Decimal] = None
extension_a: Decimal = decimal.Decimal(0)
extension_b: Decimal = decimal.Decimal(0)
quantity_delta: Decimal = decimal.Decimal(0)
unit_price_delta: Decimal = decimal.Decimal(0)
extension_delta: Decimal = decimal.Decimal(0)
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class TaskDiff:
task_name: Optional[str] = None
positions_added: List[str] = field(default_factory=list)
positions_removed: List[str] = field(default_factory=list)
positions_staffed: List[str] = field(default_factory=list)
equipment_added: List[int] = field(default_factory=list)
equipment_removed: List[int] = field(default_factory=list)
materials_added: List[int] = field(default_factory=list)
materials_removed: List[int] = field(default_factory=list)
has_changes: bool = False
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ProposalDiff:
tasks_added: List[str] = field(default_factory=list)
tasks_removed: List[str] = field(default_factory=list)
tasks: List[TaskDiff] = field(default_factory=list)
has_changes: bool = False
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateRevisionCompareResult:
revision_a: int = 0
revision_b: int = 0
label_a: Optional[str] = None
label_b: Optional[str] = None
total_a: Decimal = decimal.Decimal(0)
total_b: Decimal = decimal.Decimal(0)
total_delta: Decimal = decimal.Decimal(0)
bid_total_a: Decimal = decimal.Decimal(0)
bid_total_b: Decimal = decimal.Decimal(0)
added: int = 0
removed: int = 0
changed: int = 0
unchanged: int = 0
lines: List[RevisionLineDelta] = field(default_factory=list)
scope: Optional[ProposalDiff] = None
summary: Optional[str] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateRevisionCompareResponse:
response_status: Optional[ResponseStatus] = None
compare: Optional[EstimateRevisionCompareResult] = None
@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateRevisionCompareRequest:
rfp_document_u_i_d: Optional[str] = None
revision_a: int = 0
revision_b: int = 0
Python EstimateRevisionCompareRequest DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .other suffix or ?format=other
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
GET /v1/Rfp/{RfpDocumentUID}/Estimate/Revisions/{RevisionA}/Compare/{RevisionB} HTTP/1.1
Host: api.dev.dynamics.trendsic.com
Accept: text/jsonl
HTTP/1.1 200 OK
Content-Type: text/jsonl
Content-Length: length
{"ResponseStatus":{"ErrorCode":"String","Message":"String","StackTrace":"String","Errors":[{"ErrorCode":"String","FieldName":"String","Message":"String","Meta":{"String":"String"}}],"Meta":{"String":"String"}},"Compare":{"RevisionA":0,"RevisionB":0,"LabelA":"String","LabelB":"String","TotalA":0,"TotalB":0,"TotalDelta":0,"BidTotalA":0,"BidTotalB":0,"Added":0,"Removed":0,"Changed":0,"Unchanged":0,"Lines":[{"ItemNo":"String","Description":"String","Unit":"String","Change":"String","QuantityA":0,"QuantityB":0,"UnitPriceA":0,"UnitPriceB":0,"ExtensionA":0,"ExtensionB":0,"QuantityDelta":0,"UnitPriceDelta":0,"ExtensionDelta":0}],"Scope":{"TasksAdded":["String"],"TasksRemoved":["String"],"Tasks":[{"TaskName":"String","PositionsAdded":["String"],"PositionsRemoved":["String"],"PositionsStaffed":["String"],"EquipmentAdded":[0],"EquipmentRemoved":[0],"MaterialsAdded":[0],"MaterialsRemoved":[0],"HasChanges":true}],"HasChanges":true},"Summary":"String"}}