Skip to content
Merged
Show file tree
Hide file tree
Changes from 77 commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
aaabf82
feat: add pre-award approval response fields to database
josbell Mar 23, 2026
f9bf8ef
feat: add approval response fields to procurement tracker step schema
josbell Mar 23, 2026
2353942
feat: add approval response field mapping and server-controlled values
josbell Mar 23, 2026
40cdf10
feat: add validation rules for pre-award approval responses
josbell Mar 23, 2026
d095d52
feat: add notifications for pre-award approval workflow
josbell Mar 23, 2026
fdd9627
feat: add history tracking for pre-award approval events
josbell Mar 23, 2026
d3ffc38
feat: add pre-award approval review page component
josbell Mar 24, 2026
3c779f0
feat: add business logic hook for pre-award approval page
josbell Mar 24, 2026
03830a6
feat: add routing for pre-award approval review page
josbell Mar 24, 2026
cf3bc26
test: add component tests for pre-award approval page
josbell Mar 24, 2026
abba9aa
fix: update pre-award approval notification link to review page
josbell Mar 27, 2026
e44dc2d
fix: add approval response fields to procurement tracker step respons…
josbell Mar 27, 2026
695423c
fix: add approval response fields to nested step schema (ProcurementT…
josbell Mar 27, 2026
fa0375f
fix: hide pre-award approval banner after response
josbell Mar 27, 2026
34b98ae
fix: hide pre-award approval banner after response
josbell Mar 27, 2026
0cbe88c
fix: add console log for pre-award approval state in request hook
josbell Mar 27, 2026
7b64335
feat: add requester alerts for pre-award approval status
josbell Mar 30, 2026
f6c4d06
fix: hide in-review alert for requester when pre-award declined
josbell Apr 1, 2026
5e0f2fa
fix: resolve infinite render loop in pre-award approval hooks
josbell Apr 1, 2026
b17fee7
fix: correct test mocks for pre-award approval components
josbell Apr 1, 2026
5a29f1e
style: apply prettier formatting
josbell Apr 1, 2026
9e30f2f
fix: add missing approval_status to step 5 test mock data
josbell Apr 1, 2026
ddc7423
style: apply black formatting to validation rule
josbell Apr 1, 2026
60243b9
fix: remove pre-award approval fields from non-PRE_AWARD steps in to_…
josbell Apr 1, 2026
0714900
feat: add Review Executing Total section to pre-award approval
josbell Apr 1, 2026
504479b
feat: add Review Executing Total section to request pre-award approval
josbell Apr 1, 2026
35366c2
refactor: remove Review CANs and add Review Final Consensus Memo section
josbell Apr 1, 2026
f7ad0e7
refactor: update Review Final Consensus Memo to show document cards w…
josbell Apr 1, 2026
b63488b
Revert "refactor: update Review Final Consensus Memo to show document…
josbell Apr 1, 2026
21926e5
feat: replace upload UI with download cards in Review Final Consensus…
josbell Apr 1, 2026
2c226d7
fix: update document card styling to match accordion background
josbell Apr 1, 2026
6d0ebe8
fix: add border and max-width to Review Final Consensus Memo document…
josbell Apr 1, 2026
3e70214
fix: use USWDS sprite icon for document download button
josbell Apr 1, 2026
d94f187
feat: display dynamic requestor name and date in document upload meta…
josbell Apr 1, 2026
2e80292
fix: move preAwardRequestorName after step5 initialization and revert…
josbell Apr 1, 2026
1555dd8
refactor: use USWDS sprite pattern for download icon
josbell Apr 1, 2026
9dd8b90
feat: add approval confirmation checkbox to pre-award approval page
josbell Apr 1, 2026
9d0b889
style: add white space between action buttons and footer
josbell Apr 1, 2026
902e783
style: reduce spacing between Notes and approval checkbox
josbell Apr 1, 2026
17857a6
refactor: split Notes into separate Submitter's and Reviewer's sections
josbell Apr 1, 2026
6d43304
refactor: use section elements within Notes accordion
josbell Apr 1, 2026
81773c3
style: improve spacing in Notes section
josbell Apr 1, 2026
15f2bbf
style: reduce spacing between Reviewer's Notes heading and textarea
josbell Apr 1, 2026
c9acf5d
fix: restore Notes label and adjust spacing with margin-bottom-0
josbell Apr 1, 2026
7069275
style: increase Reviewer's Notes textarea width to 2/3 screen width
josbell Apr 1, 2026
17417d5
style: enable text wrapping for approval confirmation checkbox
josbell Apr 1, 2026
4074332
fix: make Reviewer's Notes textarea 2/3 screen width using textAreaStyle
josbell Apr 1, 2026
2a64b82
fix: use message prop instead of children in SimpleAlert for submit e…
josbell Apr 1, 2026
e385651
fix: add type annotations to TextArea onChange and fix test mock
josbell Apr 1, 2026
746f5b9
fix: add missing required props to AgreementBLIReviewTable and type a…
josbell Apr 1, 2026
5da4ca7
fix: add comprehensive JSDoc return type to useApprovePreAwardApprova…
josbell Apr 1, 2026
a4246dc
feat: update ApprovePreAwardApproval page title and add instructional…
josbell Apr 1, 2026
d39c9f7
fix: add JSDoc type annotations to RequestPreAwardApproval hook
josbell Apr 1, 2026
d2cc375
fix: prevent duplicate approval notifications in procurement tracker …
josbell Apr 2, 2026
9460b1f
feat: add approval status fields to procurement tracker schema and fi…
josbell Apr 3, 2026
d90f34e
fix(pre-award): show all budget line statuses in approval review
josbell Apr 6, 2026
dedc8c4
fix(pre-award): enable re-request after approval declined
josbell Apr 6, 2026
5611a15
refactor(pre-award): create shared budget lines review component
josbell Apr 6, 2026
567aac6
fix(pre-award): show all budget lines in request page
josbell Apr 6, 2026
ac2b4af
refactor(pre-award): extract shared data hook and update button labels
josbell Apr 6, 2026
5ab2c47
fix(pre-award): preserve line breaks in approval alert reviewer notes
josbell Apr 7, 2026
1d49f63
fix: remove duplicate validation rule class and fix conflict marker
josbell Apr 7, 2026
f4316d1
Merge branch 'main' into OPS-1518/pre-award-approval-approver-side
josbell Apr 7, 2026
05fad4a
style: auto-format code (web UI commit)
github-actions[bot] Apr 7, 2026
70261b0
Merge branch 'main' into OPS-1518/pre-award-approval-approver-side
josbell Apr 8, 2026
836efcc
fix(a11y): resolve heading hierarchy violations in pre-award approval…
josbell Apr 8, 2026
848fbcb
chore: regenerate Pipfile.lock files to fix CI build
josbell Apr 8, 2026
51d97e7
style: apply prettier formatting to fix linting errors
josbell Apr 8, 2026
56f93f3
Merge branch 'main' into OPS-1518/pre-award-approval-approver-side
josbell Apr 8, 2026
2b1559a
style: auto-format code (web UI commit)
github-actions[bot] Apr 8, 2026
3f79498
chore: remove story file and revert MSW dev config
josbell Apr 8, 2026
5adc1d9
fix: resolve critical Copilot PR review issues
josbell Apr 8, 2026
14395d1
refactor: address remaining Copilot code quality issues
josbell Apr 8, 2026
4f28e61
style: apply black formatting to procurement tracker steps schema
josbell Apr 8, 2026
e945e17
chore: regenerate data_tools Pipfile.lock to fix CI build
josbell Apr 8, 2026
4f46846
fix(a11y): correct heading hierarchy in AgreementChangesResponseAlert
josbell Apr 8, 2026
0a19735
fix(a11y): add h1 heading to EditAgreement error state
josbell Apr 8, 2026
cf53878
fix: address remaining Copilot PR review issues
josbell Apr 9, 2026
ea63580
fix: remove console.error statements and clarify RootState comment
josbell Apr 9, 2026
28a43c5
Merge remote-tracking branch 'origin/main' into OPS-1518/pre-award-ap…
josbell Apr 10, 2026
5d12b41
docs: update OpenAPI spec for pre-award approval response workflow
josbell Apr 10, 2026
f9ff66f
Merge remote-tracking branch 'origin/main' into OPS-1518/pre-award-ap…
josbell Apr 13, 2026
1222b91
fix: correct import of PROCUREMENT_STEP_STATUS in RequestPreAwardAppr…
josbell Apr 14, 2026
be20cfc
Merge branch 'main' into OPS-1518/pre-award-approval-approver-side
josbell Apr 14, 2026
775eb42
style: auto-format code (web UI commit)
github-actions[bot] Apr 14, 2026
efb00ae
chore: merge main into OPS-1518/pre-award-approval-approver-side
josbell Apr 14, 2026
ff338ea
chore: trigger CI cache rebuild
josbell Apr 14, 2026
4f954c0
Merge branch 'main' into OPS-1518/pre-award-approval-approver-side
josbell Apr 15, 2026
378acf9
fix: correct migration chain for reviewer approver permissions
josbell Apr 15, 2026
769bf9b
Merge branch 'main' into OPS-1518/pre-award-approval-approver-side
josbell Apr 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ yarn-error.log*
*.drawio.bkp
*.db
claude.sh
.claude

# Local .terraform directories
**/.terraform/*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""Add pre_award approval response fields to procurement tracker step

Revision ID: d6e7f8a9b0c1
Revises: c9a1b2d3e4f5
Create Date: 2026-03-23 16:00:00.000000+00:00

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'd6e7f8a9b0c1'
down_revision: Union[str, None] = 'c9a1b2d3e4f5'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('procurement_tracker_step', sa.Column('pre_award_approval_status', sa.String(length=20), nullable=True))
op.add_column('procurement_tracker_step', sa.Column('pre_award_approval_responded_by', sa.Integer(), nullable=True))
op.add_column('procurement_tracker_step', sa.Column('pre_award_approval_responded_date', sa.Date(), nullable=True))
op.add_column('procurement_tracker_step', sa.Column('pre_award_approval_reviewer_notes', sa.Text(), nullable=True))
op.create_foreign_key(
'fk_pre_award_responded_by',
'procurement_tracker_step', 'ops_user',
['pre_award_approval_responded_by'], ['id']
)
op.add_column('procurement_tracker_step_version', sa.Column('pre_award_approval_status', sa.String(length=20), autoincrement=False, nullable=True))
op.add_column('procurement_tracker_step_version', sa.Column('pre_award_approval_responded_by', sa.Integer(), autoincrement=False, nullable=True))
op.add_column('procurement_tracker_step_version', sa.Column('pre_award_approval_responded_date', sa.Date(), autoincrement=False, nullable=True))
op.add_column('procurement_tracker_step_version', sa.Column('pre_award_approval_reviewer_notes', sa.Text(), autoincrement=False, nullable=True))
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('procurement_tracker_step_version', 'pre_award_approval_reviewer_notes')
op.drop_column('procurement_tracker_step_version', 'pre_award_approval_responded_date')
op.drop_column('procurement_tracker_step_version', 'pre_award_approval_responded_by')
op.drop_column('procurement_tracker_step_version', 'pre_award_approval_status')
op.drop_constraint('fk_pre_award_responded_by', 'procurement_tracker_step', type_='foreignkey')
op.drop_column('procurement_tracker_step', 'pre_award_approval_reviewer_notes')
op.drop_column('procurement_tracker_step', 'pre_award_approval_responded_date')
op.drop_column('procurement_tracker_step', 'pre_award_approval_responded_by')
op.drop_column('procurement_tracker_step', 'pre_award_approval_status')
# ### end Alembic commands ###
115 changes: 62 additions & 53 deletions backend/data_tools/Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 42 additions & 1 deletion backend/models/agreement_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -992,9 +992,50 @@ def create_procurement_tracker_step_update_history_event(
"""A method that generates an AgreementHistory event for an updated procurement tracker step."""
procurement_tracker_step = event.event_details["procurement_tracker_step"]
updates = event.event_details["procurement_tracker_step_updates"]["changes"]
procurement_tracker = session.get(ProcurementTracker, procurement_tracker_step["procurement_tracker_id"])

# Handle approval request events
if "approval_requested" in updates and updates["approval_requested"]["new_value"] is True:
return AgreementHistory(
agreement_id=procurement_tracker.agreement_id,
agreement_id_record=procurement_tracker.agreement_id,
ops_event_id=event.id,
history_title="Pre-Award Approval Requested",
history_message=f"{event_user.full_name} requested pre-award approval for step 5 of the Procurement Tracker.",
timestamp=event.created_on.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
history_type=AgreementHistoryType.PROCUREMENT_TRACKER_STEP_UPDATED,
)

# Handle approval response events
if "approval_status" in updates:
status = updates["approval_status"]["new_value"]
if status == "APPROVED":
history_title = "Pre-Award Approval Approved"
history_message = (
f"{event_user.full_name} approved the pre-award approval request for step 5 of the Procurement Tracker."
)
elif status == "DECLINED":
history_title = "Pre-Award Approval Declined"
history_message = (
f"{event_user.full_name} declined the pre-award approval request for step 5 of the Procurement Tracker."
)
else:
history_title = None

if history_title:
return AgreementHistory(
agreement_id=procurement_tracker.agreement_id,
agreement_id_record=procurement_tracker.agreement_id,
ops_event_id=event.id,
history_title=history_title,
history_message=history_message,
timestamp=event.created_on.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
history_type=AgreementHistoryType.PROCUREMENT_TRACKER_STEP_UPDATED,
)

# Handle status change events (step completion)
if "status" not in updates:
return None # Only create history event for status changes
procurement_tracker = session.get(ProcurementTracker, procurement_tracker_step["procurement_tracker_id"])
new_value = updates["status"]["new_value"]
step_type = procurement_tracker_step["step_type"]
if new_value != str(ProcurementTrackerStepStatus.COMPLETED):
Expand Down
Loading
Loading