Trendsic Platform Service

<back to all web services

EstimateCalendarPutRequest

Requires Authentication
Requires any of the roles:Agent, Administrator
The following routes are available for this service:
PUT,OPTIONS/v1/Rfp/{RfpDocumentUID}/Estimate/Calendar
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 EstimateCalendarPutRequest:
    rfp_document_u_i_d: Optional[str] = None
    start_date: Optional[datetime.datetime] = None
    deadline_date: Optional[datetime.datetime] = None
    workdays_per_week: Optional[int] = None
    hours_per_day: Optional[Decimal] = None
    weather_pct: Optional[Decimal] = None
    holidays: List[datetime.datetime] = field(default_factory=list)

Python EstimateCalendarPutRequest 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.

PUT /v1/Rfp/{RfpDocumentUID}/Estimate/Calendar HTTP/1.1 
Host: api.dev.dynamics.trendsic.com 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	RfpDocumentUID: 00000000000000000000000000000000,
	StartDate: 0001-01-01,
	DeadlineDate: 0001-01-01,
	WorkdaysPerWeek: 0,
	HoursPerDay: 0,
	WeatherPct: 0,
	Holidays: 
	[
		0001-01-01
	]
}
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
		}
	},
	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,
				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-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,
				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-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
	}
}