Trendsic Platform Service

<back to all web services

RfpProposalRequest

Requires Authentication
Requires any of the roles:Agent, Administrator
The following routes are available for this service:
GET,OPTIONS/v1/Rfp/{RfpDocumentUID}/Proposal
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 ResourcedPosition:
    position_tag: Optional[str] = None
    hours: Optional[float] = None
    crew_size: Optional[float] = None
    utilization: Optional[float] = None
    fixed_days: Optional[float] = None
    headcount: Optional[int] = None
    source_reference: Optional[str] = None
    notes: Optional[str] = None
    is_in_catalog: bool = False
    contact_i_d: Optional[int] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ResourcedEquipment:
    equipment_i_d: int = 0
    equipment_name: Optional[str] = None
    make_model: Optional[str] = None
    quantity: Optional[float] = None
    duration_days: Optional[float] = None
    utilization: Optional[float] = None
    fixed_days: Optional[float] = None
    source_reference: Optional[str] = None
    notes: Optional[str] = None
    is_in_catalog: bool = False
    suggested_equipment_i_d: int = 0
    suggested_equipment_name: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ResourcedMaterial:
    material_i_d: int = 0
    material_name: Optional[str] = None
    make_model: Optional[str] = None
    quantity: Optional[float] = None
    quantity_per_unit: Optional[float] = None
    unit: Optional[str] = None
    source_reference: Optional[str] = None
    notes: Optional[str] = None
    is_in_catalog: bool = False
    suggested_material_i_d: int = 0
    suggested_material_name: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class TaskResourcing:
    positions: List[ResourcedPosition] = field(default_factory=list)
    equipment: List[ResourcedEquipment] = field(default_factory=list)
    materials: List[ResourcedMaterial] = field(default_factory=list)
    resourced_for_quantity: Optional[float] = None
    production_rate_per_day: Optional[float] = None
    fixed_days: Optional[float] = None


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


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class TaskWorkPackage:
    scope: Optional[str] = None
    limits_of_work: Optional[str] = None
    spec_refs: List[WorkPackageSpecRef] = field(default_factory=list)
    constraints: List[str] = field(default_factory=list)
    hold_points: List[str] = field(default_factory=list)
    definition_of_done: List[str] = field(default_factory=list)
    safety_note: Optional[str] = None
    rfp_ref: Optional[str] = None
    confidence: Optional[int] = None
    spec_book: Optional[str] = None
    user_scope: Optional[str] = None
    dod_removed: List[int] = field(default_factory=list)
    dod_extra: List[str] = field(default_factory=list)
    user_edited: bool = False
    dod_checked: List[str] = field(default_factory=list)
    redraft_note: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ProposedTask:
    seq: int = 0
    name: Optional[str] = None
    category: Optional[str] = None
    quantity: Optional[float] = None
    unit: Optional[str] = None
    source_item_number: Optional[str] = None
    source_reference: Optional[str] = None
    notes: Optional[str] = None
    resourcing: Optional[TaskResourcing] = None
    duration_days: Optional[float] = None
    depends_on: List[int] = field(default_factory=list)
    estimated_start_date: Optional[datetime.datetime] = None
    estimated_end_date: Optional[datetime.datetime] = None
    work_package: Optional[TaskWorkPackage] = None
    created_job_i_d: Optional[int] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AddendaChange:
    change_id: Optional[str] = None
    change_type: Optional[str] = None
    target_seq: Optional[int] = None
    item_number: Optional[str] = None
    item_name: Optional[str] = None
    field: Optional[str] = None
    old_value: Optional[str] = None
    new_value: Optional[str] = None
    description: Optional[str] = None
    status: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AddendaChangeSet:
    change_set_id: Optional[str] = None
    source_rfp_document_i_d: int = 0
    source_file_name: Optional[str] = None
    document_type: Optional[str] = None
    extracted_at_utc: Optional[datetime.datetime] = None
    summary: Optional[str] = None
    changes: List[AddendaChange] = field(default_factory=list)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class WageClassification:
    title: Optional[str] = None
    base_rate: Optional[Decimal] = None
    fringe_rate: Optional[Decimal] = None
    parish_note: Optional[str] = None
    source_line: Optional[str] = None
    benchmark_fringe_rate: Optional[Decimal] = None
    fringe_compare_note: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class WageDeterminationResult:
    source_rfp_document_i_d: int = 0
    source_file_name: Optional[str] = None
    wd_number: Optional[str] = None
    extracted_at_utc: Optional[datetime.datetime] = None
    classifications: List[WageClassification] = field(default_factory=list)
    source: Optional[str] = None
    is_trustworthy: bool = False
    executive_order_floor: Optional[Decimal] = None
    published_date: Optional[str] = None
    project_parish: Optional[str] = None
    warnings: List[str] = field(default_factory=list)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ProjectProposal:
    rfp_document_i_d: int = 0
    mode: Optional[str] = None
    project_i_d: Optional[int] = None
    change_order_i_d: Optional[int] = None
    project_name: Optional[str] = None
    client_name: Optional[str] = None
    project_type: Optional[str] = None
    project_location: Optional[str] = None
    scope: Optional[str] = None
    project_description: Optional[str] = None
    contract_duration_days: Optional[int] = None
    bid_due_date: Optional[str] = None
    estimated_start_date: Optional[datetime.datetime] = None
    estimated_end_date: Optional[datetime.datetime] = None
    tasks: List[ProposedTask] = field(default_factory=list)
    pending_addenda_diffs: List[AddendaChangeSet] = field(default_factory=list)
    wage_determinations: List[WageDeterminationResult] = field(default_factory=list)


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class CrewPlanLine:
    position_tag: Optional[str] = None
    needed: int = 0
    naive_total: int = 0
    task_assignments: int = 0


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class RfpProposalResponse:
    response_status: Optional[ResponseStatus] = None
    rfp_document_i_d: int = 0
    proposal: Optional[ProjectProposal] = None
    crew_plan: List[CrewPlanLine] = field(default_factory=list)


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

Python RfpProposalRequest 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}/Proposal 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
		}
	},
	RfpDocumentID: 0,
	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
				]
			}
		]
	},
	CrewPlan: 
	[
		{
			PositionTag: String,
			Needed: 0,
			NaiveTotal: 0,
			TaskAssignments: 0
		}
	]
}