Trendsic Platform Service

<back to all web services

ApplyStartRequest

Requires Authentication
Requires any of the roles:Agent, Administrator
The following routes are available for this service:
POST,OPTIONS/v1/Rfp/{RfpDocumentUID}/ApplyStart
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 EstimateSettingsView:
    rfp_estimate_i_d: int = 0
    start_date: Optional[datetime.datetime] = None
    deadline_date: Optional[datetime.datetime] = None
    workdays_per_week: int = 0
    hours_per_day: Decimal = decimal.Decimal(0)
    weather_pct: Decimal = decimal.Decimal(0)
    ohp_pct: Decimal = decimal.Decimal(0)
    contingency_pct: Decimal = decimal.Decimal(0)
    bond_pct: Decimal = decimal.Decimal(0)
    holidays: List[datetime.datetime] = field(default_factory=list)
    applied_start_date: Optional[datetime.datetime] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class SpecRefView:
    section: Optional[str] = None
    title: Optional[str] = None
    url: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class DodItemView:
    key: Optional[str] = None
    text: Optional[str] = None
    checked: bool = False
    source: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class WorkPackageView:
    has_package: bool = False
    scope: Optional[str] = None
    limits_of_work: Optional[str] = None
    spec_refs: List[SpecRefView] = field(default_factory=list)
    constraints: List[str] = field(default_factory=list)
    hold_points: List[str] = field(default_factory=list)
    dod: List[DodItemView] = field(default_factory=list)
    safety_note: Optional[str] = None
    provenance: Optional[str] = None
    spec_book: Optional[str] = None
    user_edited: bool = False
    redraft_note: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateCrewLineView:
    role: Optional[str] = None
    hours: Decimal = decimal.Decimal(0)
    st_hours: Decimal = decimal.Decimal(0)
    ot_hours: Decimal = decimal.Decimal(0)
    has_ot: bool = False
    premium_applied: bool = False
    needs_rate: bool = False
    rate_key: Optional[str] = None
    chip: Optional[str] = None
    rrop: Optional[Decimal] = None
    st_cost: Optional[Decimal] = None
    ot_cost: Optional[Decimal] = None
    cost: Optional[Decimal] = None
    fringe_cost: Optional[Decimal] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateEquipmentLineView:
    name: Optional[str] = None
    quantity: Decimal = decimal.Decimal(0)
    rate: Optional[Decimal] = None
    needs_rate: bool = False
    mob_cost: Decimal = decimal.Decimal(0)
    cost: Decimal = decimal.Decimal(0)
    is_availability_tracked: bool = False
    is_owned: bool = False
    availability_label: Optional[str] = None
    freed_from_project: Optional[str] = None
    available_from: Optional[datetime.datetime] = None
    rate_key: Optional[str] = None
    chip: Optional[str] = None
    rental_explain: Optional[str] = None
    usage_days: Decimal = decimal.Decimal(0)
    billed_days: Decimal = decimal.Decimal(0)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateMaterialLineView:
    name: Optional[str] = None
    quantity: Decimal = decimal.Decimal(0)
    unit: Optional[str] = None
    rate: Optional[Decimal] = None
    needs_rate: bool = False
    cost: Decimal = decimal.Decimal(0)
    rate_key: Optional[str] = None
    chip: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateSubcontractView:
    estimate_subcontract_i_d: int = 0
    task_seq: int = 0
    vendor: Optional[str] = None
    amount: Decimal = decimal.Decimal(0)
    scope: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateJobView:
    seq: int = 0
    work_package: Optional[WorkPackageView] = None
    item_no: Optional[str] = None
    name: Optional[str] = None
    category: Optional[str] = None
    source_ref: Optional[str] = None
    unit: Optional[str] = None
    quantity: Decimal = decimal.Decimal(0)
    pattern_code: Optional[str] = None
    workdays: int = 0
    hours_per_day: Decimal = decimal.Decimal(0)
    is_night: bool = False
    weekly_hours: Decimal = decimal.Decimal(0)
    ot_fraction: Decimal = decimal.Decimal(0)
    days: Decimal = decimal.Decimal(0)
    effective_prod_per_day: Optional[Decimal] = None
    crew_premium_applied: bool = False
    crew_cost: Decimal = decimal.Decimal(0)
    fringe_cost: Decimal = decimal.Decimal(0)
    equipment_cost: Decimal = decimal.Decimal(0)
    material_cost: Decimal = decimal.Decimal(0)
    subcontract_cost: Decimal = decimal.Decimal(0)
    direct: Decimal = decimal.Decimal(0)
    pricing_basis: Optional[str] = None
    benchmark_unit_price: Optional[Decimal] = None
    crew: List[EstimateCrewLineView] = field(default_factory=list)
    equipment: List[EstimateEquipmentLineView] = field(default_factory=list)
    materials: List[EstimateMaterialLineView] = field(default_factory=list)
    subcontracts: List[EstimateSubcontractView] = field(default_factory=list)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class BidScheduleLine:
    item_no: Optional[str] = None
    description: Optional[str] = None
    unit: Optional[str] = None
    quantity: Decimal = decimal.Decimal(0)
    unit_price: Decimal = decimal.Decimal(0)
    extension: Decimal = decimal.Decimal(0)
    pricing_basis: Optional[str] = None
    benchmark_delta_pct: Optional[Decimal] = None
    benchmark_flagged: bool = False


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateVarianceLine:
    seq: int = 0
    item_no: Optional[str] = None
    name: Optional[str] = None
    unit: Optional[str] = None
    quantity: Decimal = decimal.Decimal(0)
    our_unit_price: Decimal = decimal.Decimal(0)
    our_total: Decimal = decimal.Decimal(0)
    benchmark_unit_price: Decimal = decimal.Decimal(0)
    market_total: Decimal = decimal.Decimal(0)
    delta_pct: Decimal = decimal.Decimal(0)
    rate_min: Optional[Decimal] = None
    rate_max: Optional[Decimal] = None
    sample_size: Optional[int] = None
    outside_range: Optional[bool] = None
    is_floor: bool = False
    severity: Optional[str] = None
    note: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateVarianceView:
    lines: List[EstimateVarianceLine] = field(default_factory=list)
    items_total: int = 0
    items_benchmarked: int = 0
    coverage_value_pct: Decimal = decimal.Decimal(0)
    ours_total: Decimal = decimal.Decimal(0)
    market_total: Decimal = decimal.Decimal(0)
    aggregate_delta_pct: Optional[Decimal] = None
    floored_count: int = 0
    watch_count: int = 0
    outlier_count: int = 0
    critical_count: int = 0
    note: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class IndicativeLine:
    seq: int = 0
    item_no: Optional[str] = None
    name: Optional[str] = None
    unit: Optional[str] = None
    quantity: Decimal = decimal.Decimal(0)
    source: Optional[str] = None
    unit_price: Decimal = decimal.Decimal(0)
    line_total: Decimal = decimal.Decimal(0)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class IndicativeBidView:
    lines: List[IndicativeLine] = field(default_factory=list)
    bottom_up_count: int = 0
    bottom_up_total: Decimal = decimal.Decimal(0)
    benchmark_count: int = 0
    benchmark_total: Decimal = decimal.Decimal(0)
    uncovered_count: int = 0
    uncovered_floor_total: Decimal = decimal.Decimal(0)
    indicative_total: Decimal = decimal.Decimal(0)
    floor_total: Decimal = decimal.Decimal(0)
    note: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateSummaryView:
    direct: Decimal = decimal.Decimal(0)
    ohp_pct: Decimal = decimal.Decimal(0)
    ohp_amount: Decimal = decimal.Decimal(0)
    bond_pct: Decimal = decimal.Decimal(0)
    bond_amount: Decimal = decimal.Decimal(0)
    contingency_pct: Decimal = decimal.Decimal(0)
    contingency_amount: Decimal = decimal.Decimal(0)
    bid_total: Decimal = decimal.Decimal(0)
    load_factor: Decimal = decimal.Decimal(0)
    margin_pct: Decimal = decimal.Decimal(0)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateTimingView:
    total_workdays: Decimal = decimal.Decimal(0)
    calendar_days: int = 0
    finish: datetime.datetime = datetime.datetime(1, 1, 1)
    feasible: bool = False
    deadline: Optional[datetime.datetime] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateReviewItemView:
    task_seq: int = 0
    task_name: Optional[str] = None
    reason: Optional[str] = None
    status: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimatingView:
    rfp_document_i_d: int = 0
    project_name: Optional[str] = None
    client_name: Optional[str] = None
    bid_due_date: Optional[str] = None
    project_type: Optional[str] = None
    settings: Optional[EstimateSettingsView] = None
    jobs: List[EstimateJobView] = field(default_factory=list)
    schedule: List[BidScheduleLine] = field(default_factory=list)
    schedule_total: Decimal = decimal.Decimal(0)
    variance: Optional[EstimateVarianceView] = None
    indicative: Optional[IndicativeBidView] = None
    summary: Optional[EstimateSummaryView] = None
    timing: Optional[EstimateTimingView] = None
    needs_rate_count: int = 0
    needs_rate_keys: List[str] = field(default_factory=list)
    review_items: List[EstimateReviewItemView] = field(default_factory=list)
    needs_review_count: int = 0
    can_approve: bool = False
    can_see_pay: bool = False


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class EstimateResponse:
    response_status: Optional[ResponseStatus] = None
    view: Optional[EstimatingView] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ApplyStartRequest:
    rfp_document_u_i_d: Optional[str] = None
    start_date: datetime.datetime = datetime.datetime(1, 1, 1)

Python ApplyStartRequest DTOs

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

To embed the response in a jsonp callback, append ?callback=myCallback

HTTP + JSON

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

POST /v1/Rfp/{RfpDocumentUID}/ApplyStart HTTP/1.1 
Host: api.dev.dynamics.trendsic.com 
Accept: application/json
Content-Type: application/json
Content-Length: length

{"RfpDocumentUID":"00000000000000000000000000000000","StartDate":"0001-01-01T00:00:00.0000000"}
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: length

{"ResponseStatus":{"ErrorCode":"String","Message":"String","StackTrace":"String","Errors":[{"ErrorCode":"String","FieldName":"String","Message":"String","Meta":{"String":"String"}}],"Meta":{"String":"String"}},"View":{"RfpDocumentID":0,"ProjectName":"String","ClientName":"String","BidDueDate":"String","ProjectType":"String","Settings":{"RfpEstimateID":0,"StartDate":"0001-01-01T00:00:00.0000000","DeadlineDate":"0001-01-01T00:00:00.0000000","WorkdaysPerWeek":0,"HoursPerDay":0,"WeatherPct":0,"OhpPct":0,"ContingencyPct":0,"BondPct":0,"Holidays":["0001-01-01T00:00:00.0000000"],"AppliedStartDate":"0001-01-01T00:00:00.0000000"},"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","BenchmarkUnitPrice":0,"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-01T00:00:00.0000000","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","BenchmarkDeltaPct":0,"BenchmarkFlagged":false}],"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,"Severity":"String","Note":"String"}],"ItemsTotal":0,"ItemsBenchmarked":0,"CoverageValuePct":0,"OursTotal":0,"MarketTotal":0,"AggregateDeltaPct":0,"FlooredCount":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}],"BottomUpCount":0,"BottomUpTotal":0,"BenchmarkCount":0,"BenchmarkTotal":0,"UncoveredCount":0,"UncoveredFloorTotal":0,"IndicativeTotal":0,"FloorTotal":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-01T00:00:00.0000000","Feasible":false,"Deadline":"0001-01-01T00:00:00.0000000"},"NeedsRateCount":0,"NeedsRateKeys":["String"],"ReviewItems":[{"TaskSeq":0,"TaskName":"String","Reason":"String","Status":"String"}],"NeedsReviewCount":0,"CanApprove":false,"CanSeePay":false}}