@@ -35,7 +35,7 @@ def render_approval(request, form=None, internal_comment_form=None):
|
|||||||
"requests/approval.html",
|
"requests/approval.html",
|
||||||
data=data,
|
data=data,
|
||||||
reviews=list(reversed(request.reviews)),
|
reviews=list(reversed(request.reviews)),
|
||||||
request=request,
|
jedi_request=request,
|
||||||
current_status=request.status.value,
|
current_status=request.status.value,
|
||||||
review_form=form or CCPOReviewForm(),
|
review_form=form or CCPOReviewForm(),
|
||||||
internal_comment_form=internal_comment_form,
|
internal_comment_form=internal_comment_form,
|
||||||
|
@@ -71,9 +71,7 @@ def update_financial_verification(request_id):
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return redirect(
|
return redirect(
|
||||||
url_for(
|
url_for("requests.requests_index", modal="pendingCCPOApproval")
|
||||||
"requests.requests_index", modal="pendingFinancialVerification"
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
@@ -121,7 +121,7 @@ def requests_submit(request_id=None):
|
|||||||
if request.status == RequestStatus.PENDING_FINANCIAL_VERIFICATION:
|
if request.status == RequestStatus.PENDING_FINANCIAL_VERIFICATION:
|
||||||
modal = "pendingFinancialVerification"
|
modal = "pendingFinancialVerification"
|
||||||
else:
|
else:
|
||||||
modal = "pendingCCPOApproval"
|
modal = "pendingCCPOAcceptance"
|
||||||
|
|
||||||
return redirect(url_for("requests.requests_index", modal=modal))
|
return redirect(url_for("requests.requests_index", modal=modal))
|
||||||
|
|
||||||
@@ -141,6 +141,6 @@ def view_request_details(request_id=None):
|
|||||||
return render_template(
|
return render_template(
|
||||||
"requests/details.html",
|
"requests/details.html",
|
||||||
data=data,
|
data=data,
|
||||||
request=request,
|
jedi_request=request,
|
||||||
requires_fv_action=requires_fv_action,
|
requires_fv_action=requires_fv_action,
|
||||||
)
|
)
|
||||||
|
@@ -9,10 +9,14 @@ export default {
|
|||||||
LocalDatetime
|
LocalDatetime
|
||||||
},
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
initialState: String
|
||||||
|
},
|
||||||
|
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
approving: false,
|
approving: this.initialState === 'approving',
|
||||||
denying: false
|
denying: this.initialState === 'denying'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -18,7 +18,10 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
default: () => ''
|
default: () => ''
|
||||||
},
|
},
|
||||||
initialErrors: Array,
|
initialErrors: {
|
||||||
|
type: Array,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
paragraph: String,
|
paragraph: String,
|
||||||
noMaxWidth: String
|
noMaxWidth: String
|
||||||
},
|
},
|
||||||
@@ -30,7 +33,7 @@ export default {
|
|||||||
mask: inputValidations[this.validation].mask,
|
mask: inputValidations[this.validation].mask,
|
||||||
pipe: inputValidations[this.validation].pipe || undefined,
|
pipe: inputValidations[this.validation].pipe || undefined,
|
||||||
keepCharPositions: inputValidations[this.validation].keepCharPositions || false,
|
keepCharPositions: inputValidations[this.validation].keepCharPositions || false,
|
||||||
validationError: inputValidations[this.validation].validationError || '',
|
validationError: this.initialErrors.join(' ') || inputValidations[this.validation].validationError,
|
||||||
value: this.initialValue,
|
value: this.initialValue,
|
||||||
modified: false
|
modified: false
|
||||||
}
|
}
|
||||||
@@ -82,6 +85,10 @@ export default {
|
|||||||
valid = false
|
valid = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.modified) {
|
||||||
|
this.validationError = inputValidations[this.validation].validationError
|
||||||
|
}
|
||||||
|
|
||||||
// Show error messages or not
|
// Show error messages or not
|
||||||
if (valid) {
|
if (valid) {
|
||||||
this.showError = false
|
this.showError = false
|
||||||
|
@@ -29,7 +29,7 @@ export default {
|
|||||||
},
|
},
|
||||||
email: {
|
email: {
|
||||||
mask: emailMask,
|
mask: emailMask,
|
||||||
match: /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/,
|
match: /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/i,
|
||||||
unmask: [],
|
unmask: [],
|
||||||
validationError: 'Please enter a valid e-mail address'
|
validationError: 'Please enter a valid e-mail address'
|
||||||
},
|
},
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
{% from "components/icon.html" import Icon %}
|
{% from "components/icon.html" import Icon %}
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
We will review and respond to your request in 3 business days. You’ll be notified via email or phone.
|
The CCPO will review and respond to your request in 3 business days. You’ll be notified via email or phone. Please note if your request is for over $1M of JEDI cloud resources it will require a manual review by the CCPO.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
While your request is being reviewed, your next step is to create a Task Order associated with JEDI Cloud. Please contact a Contracting Officer (KO), Contracting Officer Representative (COR), or a Financial Manager to help with this step.
|
While your request is being reviewed, your next step is to create a Task Order (TO) associated with the JEDI Cloud. Please contact a Contracting Officer (KO), Contracting Officer Representative (COR), or a Financial Manager to help with this step.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class='alert__actions'>
|
<div class='alert__actions'>
|
||||||
|
@@ -1,40 +1,8 @@
|
|||||||
{% from "components/icon.html" import Icon %}
|
|
||||||
|
|
||||||
<h1>
|
|
||||||
Request submitted. Approval pending.
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
We will review and respond to your request in 3 business days. You’ll be notified via email or phone.
|
The CCPO will review and respond to your Financial Verification submission in 3 business days. You will be notified via email or phone.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
|
||||||
Your request is being reviewed because:
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
Your request includes over $1 million for cloud resources
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
We may need more information about your request
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h2>
|
|
||||||
Next Steps
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
While your request is being reviewed, your next step is to create a Task Order associated with JEDI Cloud. Please contact a Contracting Officer (KO), Contracting Officer Representative (COR), or a Financial Manager to help with this step.
|
Once the financial verification is approved you will be invited to create your JEDI Workspace and set-up your projects. Click here for more details.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
|
||||||
Once the Task Order has been created, you will be asked to provide details about the task order in the Financial Verification step.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class='alert__actions'>
|
|
||||||
<a href='/help' class='icon-link'>
|
|
||||||
{{ Icon('help') }}
|
|
||||||
Learn more about the JEDI Cloud Task Order and the Financial Verification process.
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
@@ -134,7 +134,7 @@
|
|||||||
{{ DefinitionReviewField("DoD ID", "primary_poc", "dodid_poc") }}
|
{{ DefinitionReviewField("DoD ID", "primary_poc", "dodid_poc") }}
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
{% if request.has_financial_data %}
|
{% if jedi_request.has_financial_data %}
|
||||||
<hr>
|
<hr>
|
||||||
<h2>
|
<h2>
|
||||||
Financial Verification
|
Financial Verification
|
||||||
|
@@ -17,14 +17,14 @@
|
|||||||
|
|
||||||
<section class='panel'>
|
<section class='panel'>
|
||||||
<header class='panel__heading panel__heading--divider request-approval__heading'>
|
<header class='panel__heading panel__heading--divider request-approval__heading'>
|
||||||
<h1 class='h2'>Request: {{ request.displayname }}
|
<h1 class='h2'>Request: {{ jedi_request.displayname }}
|
||||||
</h1>
|
</h1>
|
||||||
<span class='label label--info'>{{ current_status }}</span>
|
<span class='label label--info'>{{ current_status }}</span>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class='panel__content'>
|
<div class='panel__content'>
|
||||||
|
|
||||||
{% with data=data, request_id=request.id %}
|
{% with data=data, request_id=jedi_request.id %}
|
||||||
{% include "requests/_review.html" %}
|
{% include "requests/_review.html" %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class='internal-notes' id='ccpo-notes'>
|
<section class='internal-notes' id='ccpo-notes'>
|
||||||
<form method="POST" action="{{ url_for('requests.create_internal_comment', request_id=request.id) }}">
|
<form method="POST" action="{{ url_for('requests.create_internal_comment', request_id=jedi_request.id) }}">
|
||||||
<div class='panel'>
|
<div class='panel'>
|
||||||
<div class='panel__heading panel__heading--divider'>
|
<div class='panel__heading panel__heading--divider'>
|
||||||
<h2>CCPO Internal Comments</h2>
|
<h2>CCPO Internal Comments</h2>
|
||||||
@@ -82,10 +82,11 @@
|
|||||||
|
|
||||||
|
|
||||||
<section class='request-approval__review'>
|
<section class='request-approval__review'>
|
||||||
<form method="POST" action="{{ url_for("requests.submit_approval", request_id=request.id) }}" autocomplete="off">
|
<form method="POST" action="{{ url_for("requests.submit_approval", request_id=jedi_request.id) }}" autocomplete="off">
|
||||||
{{ review_form.csrf_token }}
|
{{ review_form.csrf_token }}
|
||||||
|
|
||||||
<ccpo-approval inline-template>
|
{% set initialState = 'approving' if review_form.errors else '' %}
|
||||||
|
<ccpo-approval inline-template initial-state="{{ initialState }}">
|
||||||
<div>
|
<div>
|
||||||
<div class='panel'>
|
<div class='panel'>
|
||||||
|
|
||||||
@@ -139,7 +140,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if request.is_pending_ccpo_action %}
|
{% if jedi_request.is_pending_ccpo_action %}
|
||||||
<div class='panel__heading request-approval__review__heading'>
|
<div class='panel__heading request-approval__review__heading'>
|
||||||
<h3 class='h3'>Review this Request</h2>
|
<h3 class='h3'>Review this Request</h2>
|
||||||
</div>
|
</div>
|
||||||
@@ -148,7 +149,7 @@
|
|||||||
|
|
||||||
<div class='usa-input'>
|
<div class='usa-input'>
|
||||||
<fieldset class='usa-input__choices usa-input__choices--inline'>
|
<fieldset class='usa-input__choices usa-input__choices--inline'>
|
||||||
<input v-on:change='setReview' type='radio' name='review' id='review-approving' value='approving'/>
|
<input v-on:change='setReview' type='radio' name='review' id='review-approving' value='approving' {{ 'checked' if initialState == 'approving' }}/>
|
||||||
<label for='review-approving'>Ready for approval</label>
|
<label for='review-approving'>Ready for approval</label>
|
||||||
|
|
||||||
<input v-on:change='setReview' type='radio' name='review' id='review-denying' value='denying'/>
|
<input v-on:change='setReview' type='radio' name='review' id='review-denying' value='denying'/>
|
||||||
@@ -226,7 +227,7 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if request.is_pending_ccpo_action %}
|
{% if jedi_request.is_pending_ccpo_action %}
|
||||||
<div v-if='approving || denying' class='action-group' v-cloak>
|
<div v-if='approving || denying' class='action-group' v-cloak>
|
||||||
<button v-if='approving' type="submit" name="approved" class='usa-button usa-button-big'>Approve Request</button>
|
<button v-if='approving' type="submit" name="approved" class='usa-button usa-button-big'>Approve Request</button>
|
||||||
<button v-if='denying' type="submit" name="denied" class='usa-button usa-button-big'>Request Revisions</button>
|
<button v-if='denying' type="submit" name="denied" class='usa-button usa-button-big'>Request Revisions</button>
|
||||||
|
@@ -5,26 +5,19 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="col">
|
<div class="col">
|
||||||
|
|
||||||
{% if request.is_pending_ccpo_acceptance %}
|
{% if jedi_request.is_pending_ccpo_acceptance %}
|
||||||
{{ Alert('Request submitted. Approval pending.', fragment="fragments/pending_ccpo_acceptance_alert.html") }}
|
{{ Alert('Request submitted. Approval pending.', fragment="fragments/pending_ccpo_acceptance_alert.html") }}
|
||||||
{% elif request.is_pending_ccpo_approval %}
|
{% elif jedi_request.is_pending_ccpo_approval %}
|
||||||
|
{{ Alert('Request submitted. Approval pending.', fragment="fragments/pending_ccpo_approval_modal.html") }}
|
||||||
{% call Alert('Pending CCPO Approval') %}
|
|
||||||
<p>The CCPO will review and respond to your Financial Verification submission in 3 business days. You will be notified via email or phone.</p>
|
|
||||||
<p>Once the financial verification is approved you will be invited to create your JEDI Workspace and set-up your projects. Click here for more details.</p>
|
|
||||||
{% endcall %}
|
|
||||||
|
|
||||||
{% elif requires_fv_action %}
|
{% elif requires_fv_action %}
|
||||||
|
|
||||||
{% include 'requests/review_menu.html' %}
|
{% include 'requests/review_menu.html' %}
|
||||||
{{ Alert('Pending Financial Verification', fragment="fragments/pending_financial_verification.html") }}
|
{{ Alert('Pending Financial Verification', fragment="fragments/pending_financial_verification.html") }}
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel__heading">
|
<div class="panel__heading">
|
||||||
<h1>Request Details</h1>
|
<h1>Request Details</h1>
|
||||||
<div class="subtitle"><h2>Request: {{ request.displayname }}</h2><span class="label label--info">{{ request.status_displayname }}</span></div>
|
<div class="subtitle"><h2>Request: {{ jedi_request.displayname }}</h2><span class="label label--info">{{ jedi_request.status_displayname }}</span></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="panel__content">
|
<div class="panel__content">
|
||||||
|
@@ -19,7 +19,7 @@ def test_can_show_financial_data(client, user_session):
|
|||||||
)
|
)
|
||||||
|
|
||||||
body = response.data.decode()
|
body = response.data.decode()
|
||||||
assert re.search(">\s+Financial Verification\s+<", body)
|
assert re.search(r">\s+Financial Verification\s+<", body)
|
||||||
|
|
||||||
|
|
||||||
def test_can_not_show_financial_data(client, user_session):
|
def test_can_not_show_financial_data(client, user_session):
|
||||||
@@ -34,4 +34,4 @@ def test_can_not_show_financial_data(client, user_session):
|
|||||||
)
|
)
|
||||||
|
|
||||||
body = response.data.decode()
|
body = response.data.decode()
|
||||||
assert not re.search(">\s+Financial Verification\s+<", body)
|
assert not re.search(r">\s+Financial Verification\s+<", body)
|
||||||
|
@@ -21,7 +21,7 @@ def test_submit_reviewed_request(monkeypatch, client, user_session):
|
|||||||
follow_redirects=False,
|
follow_redirects=False,
|
||||||
)
|
)
|
||||||
assert "/requests" in response.headers["Location"]
|
assert "/requests" in response.headers["Location"]
|
||||||
assert "modal=pendingCCPOApproval" in response.headers["Location"]
|
assert "modal=pendingCCPOAcceptance" in response.headers["Location"]
|
||||||
|
|
||||||
|
|
||||||
def test_submit_autoapproved_reviewed_request(monkeypatch, client, user_session):
|
def test_submit_autoapproved_reviewed_request(monkeypatch, client, user_session):
|
||||||
|
Reference in New Issue
Block a user