Skip to content

Commit

Permalink
Merge pull request #411 from bcgov/feat/remove-form-of-contract-and-a…
Browse files Browse the repository at this point in the history
…dd-pricing-info

Feat/remove form of contract and add pricing info
  • Loading branch information
IanFonzie authored Jun 22, 2023
2 parents afe5cd5 + 3ac9353 commit e923d86
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 46 deletions.
23 changes: 23 additions & 0 deletions src/front-end/sass/index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -954,6 +954,29 @@ nav.navbar .nav-link:hover {
z-index: 1001; // Above nav, below modals
}

.li-paren {
counter-reset: list;
& > li {
list-style: none;
}
& > li:before {
font-weight: $font-weight-bold;
counter-increment: list;
}
&-lower-roman {
@extend .li-paren;
& > li:before {
content: counter(list, lower-roman) ") ";
}
}
&-lower-alpha {
@extend .li-paren;
& > li:before {
content: counter(list, lower-alpha) ") ";
}
}
}

// Page-specific overrides

.route-orgSWUTerms,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1473,7 +1473,7 @@ const DescriptionView: component_.base.View<Props> = ({
<Col xs="12">
<RichMarkdownEditor.view
required
label="Description"
label="Description and Contract Details"
placeholder="Describe this opportunity."
help="Provide a complete description of the opportunity. For example, you may choose to include background information, a description of what you are attempting to accomplish by offering the opportunity, etc. You can format this description with Markdown."
extraChildProps={{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import {
EMPTY_STRING,
TWU_OPPORTUNITY_SCOPE_CONTENT_ID,
TWU_QUALIFICATION_TERMS_ID
} from "front-end/config";
import { EMPTY_STRING, TWU_QUALIFICATION_TERMS_ID } from "front-end/config";
import {
makePageMetadata,
makeStartLoading,
Expand Down Expand Up @@ -49,12 +45,7 @@ import {
doesOrganizationProvideServiceArea
} from "shared/lib/resources/organization";

type InfoTab =
| "details"
| "scope"
| "competitionRules"
| "attachments"
| "addenda";
type InfoTab = "details" | "competitionRules" | "attachments" | "addenda";

type Qualification =
| "notQualified"
Expand All @@ -68,7 +59,6 @@ export interface State {
viewerUser: User | null;
activeInfoTab: InfoTab;
routePath: string;
scopeContent: string;
competitionRulesContent: string;
qualification: Qualification;
}
Expand All @@ -82,7 +72,6 @@ export type InnerMsg =
api.ResponseValidation<TWUOpportunity, string[]>,
TWUProposalSlim | null,
api.ResponseValidation<Content, string[]>,
api.ResponseValidation<Content, string[]>,
api.ResponseValidation<OrganizationSlim[], string[]>
]
>
Expand Down Expand Up @@ -113,7 +102,6 @@ const init: component_.page.Init<
existingProposal: null,
activeInfoTab: "details",
routePath,
scopeContent: "",
competitionRulesContent: "",
qualification: "notQualified"
},
Expand All @@ -123,18 +111,14 @@ const init: component_.page.Init<
null,
() => adt("noop")
),
component_.cmd.join5(
component_.cmd.join4(
api.opportunities.twu.readOne()(opportunityId, (response) => response),
viewerUser && isVendor(viewerUser)
? api.proposals.twu.readExistingProposalForOpportunity(
opportunityId,
(response) => response
)
: component_.cmd.dispatch(null),
api.content.readOne()(
TWU_OPPORTUNITY_SCOPE_CONTENT_ID,
(response) => response
),
api.content.readOne()(
TWU_QUALIFICATION_TERMS_ID,
(response) => response
Expand All @@ -143,15 +127,13 @@ const init: component_.page.Init<
(
opportunityResponse,
proposalResponse,
scopeContentResponse,
competitionRulesContentResponse,
organizationsResponse
) =>
adt("onInitResponse", [
routePath,
opportunityResponse,
proposalResponse,
scopeContentResponse,
competitionRulesContentResponse,
organizationsResponse
]) as Msg
Expand All @@ -173,7 +155,6 @@ const update: component_.page.Update<State, InnerMsg, Route> = ({
routePath,
opportunityResponse,
proposalResponse,
scopeContentResponse,
competitionRulesContentResponse,
organizationsResponse
] = msg.value;
Expand All @@ -195,9 +176,6 @@ const update: component_.page.Update<State, InnerMsg, Route> = ({
if (proposalResponse) {
state = state.set("existingProposal", proposalResponse);
}
if (scopeContentResponse && api.isValid(scopeContentResponse)) {
state = state.set("scopeContent", scopeContentResponse.value.body);
}
if (
competitionRulesContentResponse &&
api.isValid(competitionRulesContentResponse)
Expand Down Expand Up @@ -481,7 +459,10 @@ const InfoDetails: component_.base.ComponentView<State, Msg> = ({ state }) => {
) : null}
</Col>
<Col xs="12" className="mt-5">
<InfoDetailsHeading icon="info-circle-outline" text="Description" />
<InfoDetailsHeading
icon="info-circle-outline"
text="Description and Contract Details"
/>
<Markdown
source={opp.description || EMPTY_STRING}
smallerHeadings
Expand All @@ -500,19 +481,6 @@ const InfoDetails: component_.base.ComponentView<State, Msg> = ({ state }) => {
);
};

const InfoScope: component_.base.ComponentView<State, Msg> = ({ state }) => {
return (
<Row>
<Col xs="12">
<h3 className="mb-0">Form of Contract</h3>
</Col>
<Col xs="12" className="mt-4">
<Markdown source={state.scopeContent} openLinksInNewTabs />
</Col>
</Row>
);
};

const InfoCompetitionRules: component_.base.ComponentView<State, Msg> = ({
state
}) => {
Expand Down Expand Up @@ -584,10 +552,6 @@ const InfoTabs: component_.base.ComponentView<State, Msg> = ({
...getTabInfo("details"),
text: "Details"
},
{
...getTabInfo("scope"),
text: "Form of Contract"
},
{
...getTabInfo("competitionRules"),
text: "Competition Rules"
Expand Down Expand Up @@ -619,8 +583,6 @@ const Info: component_.base.ComponentView<State, Msg> = (props) => {
switch (state.activeInfoTab) {
case "details":
return <InfoDetails {...props} />;
case "scope":
return <InfoScope {...props} />;
case "competitionRules":
return <InfoCompetitionRules {...props} />;
case "attachments":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,56 @@ const PricingView: component_.base.View<Props> = ({
<div>
<Row>
<Col xs="12" className="mb-4">
<p className="font-weight-bold">
Proponents take note of the following pricing rules and
requirements:
</p>
<ol className="li-paren-lower-alpha">
<li>
Proponent pricing quoted will be taken to mean and deemed to be:
<ol className="li-paren-lower-roman">
<li>in Canadian dollars;</li>
<li>
inclusive of all costs or expenses that may be incurred with
respect to the services specified by the Competition Notice;
</li>
<li>exclusive of any applicable taxes.</li>
</ol>
</li>
<li>
In addition, the following rules apply to pricing bid by
Proponents:
<ol className="li-paren-lower-roman">
<li>
Team With Us Terms & Conditions section 1.8 regarding pricing
and its provisions are incorporated herein by this reference.
</li>
<li>
All pricing bid is required to be unconditional and
unqualified. If any pricing bid does not meet this
requirement, the Proponent’s Proposal may be rejected
resulting in the Proponent being eliminated from the
Competition Notice competition.
</li>
<li>
Failure to provide pricing where required by the Competition
Notice will result in the Proponent being unable to submit a
Proposal.
</li>
<li>
Entering the numerical figure of “$0”, “$zero”, or the like in
response to a call for a specific dollar amount will result in
the Proponent being unable to submit a Proposal.
</li>
<li>
The Contract will provide that the Contractor may request an
increase in the bid pricing for any extension term of the
Contract, limited to any increases, if any, as supported by
the Canadian Consumer Price Index or 3% whichever is lower.
</li>
</ol>
</li>
</ol>
<p>
Please provide the hourly rate you are proposing for this
opportunity.
Expand Down Expand Up @@ -712,6 +762,28 @@ const ResourceQuestionsView: component_.base.View<Props> = ({
return (
<Row>
<Col xs="12">
<p className="font-weight-bold">
General Instructions for Team with Us Proposal Response Form:
</p>
<ul>
<li>
This Proposal Response Form includes response guidelines which are
intended to assist Proponents in the development of their Proposals.
</li>
<li>
The response guidelines are not intended to be comprehensive.
Proponents should use their own judgement in determining what
information to provide to demonstrate that the Proponent meets or,
if applicable exceeds the Province’s expectations with respect to a
particular response guideline.
</li>
<li>
Proposals should not contain links to information that is not set
down directly in the Proponent’s Proposal. Should this occur, the
Province may disregard any referred to source of information that is
not contained in the Proposal being evaluated.
</li>
</ul>
<p className="mb-4">
Provide a response to each of the team questions below. Please note
that responses that exceed the word limit will receive a score of
Expand Down

0 comments on commit e923d86

Please sign in to comment.