diff --git a/atst/models/clin.py b/atst/models/clin.py
index 2f5c3f1c..da2d1d02 100644
--- a/atst/models/clin.py
+++ b/atst/models/clin.py
@@ -35,6 +35,10 @@ class CLIN(Base, mixins.TimestampsMixin):
JEDICLINType.JEDI_CLIN_3,
]
+ @property
+ def type(self):
+ return "Base" if self.number[0] == "0" else "Option"
+
@property
def is_completed(self):
return all(
diff --git a/atst/models/task_order.py b/atst/models/task_order.py
index 8d2f03fc..bd592bea 100644
--- a/atst/models/task_order.py
+++ b/atst/models/task_order.py
@@ -47,6 +47,10 @@ class TaskOrder(Base, mixins.TimestampsMixin):
"CLIN", back_populates="task_order", cascade="all, delete-orphan"
)
+ @property
+ def sorted_clins(self):
+ return sorted(self.clins, key=lambda clin: (clin.number[1:], clin.number[0]))
+
@hybrid_property
def pdf(self):
return self._pdf
diff --git a/styles/sections/_task_order.scss b/styles/sections/_task_order.scss
index 5ab6c814..ca2e4be2 100644
--- a/styles/sections/_task_order.scss
+++ b/styles/sections/_task_order.scss
@@ -24,29 +24,21 @@
margin-top: $gap * 4;
width: 900px;
+ &__amount {
+ text-align: right;
+ }
+
hr {
border: 0;
- border-bottom: 1px solid $color-gray-lighter;
margin-top: $gap * 4;
margin-bottom: $gap * 4;
}
table {
margin-top: 1rem;
- table-layout: fixed;
th {
white-space: nowrap;
- word-wrap: normal;
- padding: 0.8rem;
-
- &.task-order__clin-amount {
- width: 25%;
- }
- }
-
- td {
- padding: 0.8rem;
}
}
@@ -80,12 +72,8 @@
}
.totals-box {
- padding: $gap * 4;
- padding-top: $gap * 2;
flex-grow: unset;
- margin-left: $gap * 6;
display: table;
- background-color: $color-gray-lightest;
min-width: 350px;
}
}
diff --git a/templates/components/totals_box.html b/templates/components/totals_box.html
index 5ad39166..cb354fb8 100644
--- a/templates/components/totals_box.html
+++ b/templates/components/totals_box.html
@@ -9,9 +9,9 @@
{{ 'components.totals_box.obligated_funds' | translate }}
{{ obligated_funds | dollars }}
{{ 'components.totals_box.obligated_text' | translate }}
-
-
-
+
+
+
{{ 'components.totals_box.total_amount' | translate }}
{{ contract_amount | dollars }}
{{ 'components.totals_box.total_text' | translate }}
diff --git a/templates/fragments/task_order_review.html b/templates/fragments/task_order_review.html
index 9e926783..bf76ba41 100644
--- a/templates/fragments/task_order_review.html
+++ b/templates/fragments/task_order_review.html
@@ -7,7 +7,10 @@
-
- {{ TotalsBox(task_order=task_order) }}
-
diff --git a/tests/models/test_task_order.py b/tests/models/test_task_order.py
index 88dd8aa5..19a2a6af 100644
--- a/tests/models/test_task_order.py
+++ b/tests/models/test_task_order.py
@@ -52,6 +52,25 @@ def test_task_order_clins_are_completed():
assert not TaskOrderFactory.create(clins=[]).clins_are_completed
+def test_clin_sorting():
+ task_order = TaskOrderFactory.create(
+ clins=[
+ CLINFactory.create(number="0002"),
+ CLINFactory.create(number="0001"),
+ CLINFactory.create(number="1001"),
+ CLINFactory.create(number="1002"),
+ CLINFactory.create(number="2001"),
+ ]
+ )
+ assert [clin.number for clin in task_order.sorted_clins] == [
+ "0001",
+ "1001",
+ "2001",
+ "0002",
+ "1002",
+ ]
+
+
class TestTaskOrderStatus:
@patch("atst.models.TaskOrder.is_completed", new_callable=PropertyMock)
@patch("atst.models.TaskOrder.is_signed", new_callable=PropertyMock)
diff --git a/translations.yaml b/translations.yaml
index 9ce44e2e..b626d107 100644
--- a/translations.yaml
+++ b/translations.yaml
@@ -73,10 +73,10 @@ components:
destructive_message: You will no longer be able to access this {resource}
destructive_title: Warning! This action is permanent
totals_box:
- obligated_funds: Funds obligated for cloud
- obligated_text: This is the funding allocated to cloud services. It may be 100% or a portion of the total task order budget.
- total_amount: Total contract amount
- total_text: This is the value of all funds obligated for this contract, including -- but not limited to -- funds obligated for the cloud.
+ obligated_funds: Total Obligated Funds
+ obligated_text: This amount strictly calculates Base CLINs, and may represent 100% of your total task order budget, or just a portion if you also have Optional Base or Optional CLINs.
+ total_amount: Total Possible Task Order Funds
+ total_text: This amount represents the total value of all Base and Option CLINs, including any extensions listed within your task order.
usa_header:
flag_image_alt: U.S. Flag
official_message: An official website of the United States government
@@ -348,17 +348,19 @@ portfolios:
task_orders:
review:
pdf_title: Approved Task Order
- review_your_task_order: Review your task order
- funding_summary: Task Order Summary
+ review_your_funding: Review your funding
+ funding_summary: CLIN Summary
task_order_number: Task Order Number
check_paragraph: Check to make sure the information you entered is correct. After submission, you will confirm this task order was signed by a contracting officer. Thereafter, you will be informed as soon as CCPO completes their review.
supporting_document:
title: Supporting document
clins:
- amount: Amount
- obligated: Obligated
- pop_start: PoP Start
- pop_end: PoP End
+ number: TO CLIN
+ type: CLIN Type
+ idiq_clin_description: Description (IDIQ CLIN)
+ pop: PoP
+ amount: CLIN Value
+ obligated: Amount Obligated
form:
add_clin: Add another CLIN
add_to_header: Add your task order
@@ -391,7 +393,7 @@ task_orders:
description: Finally, plase confirm that your uploaded document representing the information you've entered contains the required signature from your Contracting Officer. You will be informed as soon as CCPO completes their review.
alert_message: All task orders require a Contracting Officer signature.
next_button: 'Confirm & Submit'
- sticky_header_text: 'Add Funding ({step} of 5)'
+ sticky_header_text: 'Add Task Order (step {step} of 5)'
new:
form_help_text: Before you can begin work in the cloud, you'll need to complete the information below and upload your approved task order for reference by the CCPO.
app_info:
@@ -401,10 +403,10 @@ task_orders:
sign:
digital_signature_description: I acknowledge that the uploaded task order contains the required KO signature.
JEDICLINType:
- JEDI_CLIN_1: 'Base CLIN 0001: Unclassified IaaS and PaaS'
- JEDI_CLIN_2: 'CLIN 2: Classified Cloud Services - 0002'
- JEDI_CLIN_3: 'CLIN 3:'
- JEDI_CLIN_4: 'CLIN 4:'
+ JEDI_CLIN_1: 'Unclassified IaaS and PaaS (IDIQ CLIN 0001)'
+ JEDI_CLIN_2: 'Classified IaaS and PaaS (IDIQ CLIN 0002)'
+ JEDI_CLIN_3: 'Unclassified Cloud Support Package (IDIQ CLIN 0003)'
+ JEDI_CLIN_4: 'Classified Cloud Support Package (IDIQ CLIN 0004)'
testing:
example_string: Hello World
example_with_variables: 'Hello, {name}!'