Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Al/APPEALS-45334 Individual change history table which includes Reassign Cases to CAMO events #22483

Merged
merged 14 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,12 @@ class ChangeHistoryEventSerializer
requestor: object.requestor,
decider: object.decider,
decidedAtDate: object.decided_at_date,
decisionReason: object.decision_reason
decisionReason: object.decision_reason,
previousIssueType: object.previous_issue_type,
previousIssueDescription: object.previous_issue_description,
previousDecisionDate: object.previous_decision_date,
previousModificationRequestReason: object.previous_modification_request_reason,
previousWithdrawalDate: object.previous_withdrawal_date
}
end
end
32 changes: 31 additions & 1 deletion app/services/claim_change_history/claim_history_event.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ class ClaimHistoryEvent
:event_user_css_id, :new_issue_type, :new_issue_description, :new_decision_date,
:modification_request_reason, :request_type, :decision_reason, :decided_at_date,
:issue_modification_request_withdrawal_date, :requestor,
:decider, :remove_original_issue, :issue_modification_request_status
:decider, :remove_original_issue, :issue_modification_request_status,
:previous_issue_type, :previous_issue_description, :previous_decision_date,
:previous_modification_request_reason, :previous_withdrawal_date

EVENT_TYPES = [
:completed_disposition,
Expand Down Expand Up @@ -151,12 +153,27 @@ def create_event_from_rest_of_versions(change_data, edited_versions)
"user_facility" => change_data["requestor_station_id"]
}

event_date_hash.merge!(previous_event_version(version))
event_date_hash.merge!(update_event_hash_data_from_version(version, 1))
edit_of_request_events.push(*from_change_data(event_type, change_data.merge(event_date_hash)))
end
edit_of_request_events
end

def previous_event_version(version)
version_database_field_mapping = {
"previous_issue_type" => "nonrating_issue_category",
"previous_issue_description" => "nonrating_issue_description",
"previous_decision_date" => "decision_date",
"previous_modification_request_reason" => "request_reason",
"previous_withdrawal_date" => "withdrawal_date"
}

version_database_field_mapping.each_with_object({}) do |(db_key, version_key), data|
data[db_key] = version[version_key][0] unless version[version_key].nil?
end
end

def create_last_version_events(change_data, last_version)
edited_events = []

Expand Down Expand Up @@ -734,11 +751,24 @@ def parse_request_issue_modification_attributes(change_data)
@decided_at_date = change_data["decided_at"]
@issue_modification_request_withdrawal_date = change_data["issue_modification_request_withdrawal_date"]
@remove_original_issue = change_data["remove_original_issue"]
@issue_modification_request_status = change_data["issue_modification_request_status"]
@requestor = change_data["requestor"]
@decider = change_data["decider"]
parse_previous_issue_modification_attributes(change_data)
end
end

def parse_previous_issue_modification_attributes(change_data)
@previous_issue_type = change_data["previous_issue_type"] || change_data["requested_issue_type"]
@previous_decision_date = change_data["previous_decision_date"] || change_data["requested_decision_date"]
@previous_modification_request_reason = change_data["previous_modification_request_reason"] ||
change_data["modification_request_reason"]
@previous_issue_description = change_data["previous_issue_description"] ||
change_data["requested_issue_description"]
@previous_withdrawal_date = change_data["previous_withdrawal_date"] ||
change_data["issue_modification_request_withdrawal_date"]
end

############ CSV and Serializer Helpers ############

def abbreviated_user_name(name_string)
Expand Down
249 changes: 238 additions & 11 deletions client/app/nonComp/components/IndividualClaimHistoryTable.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
import React from 'react';
/* eslint-disable max-lines */
import React, { useState } from 'react';
import QueueTable from '../../queue/QueueTable';
import BENEFIT_TYPES from 'constants/BENEFIT_TYPES';
import { formatDateStr } from 'app/util/DateUtil';
import PropTypes from 'prop-types';
import StringUtil from 'app/util/StringUtil';

almorbah marked this conversation as resolved.
Show resolved Hide resolved
const { capitalizeFirst } = StringUtil;

const IndividualClaimHistoryTable = (props) => {

Expand Down Expand Up @@ -34,25 +38,153 @@ const IndividualClaimHistoryTable = (props) => {
return <React.Fragment>Claim can be processed.</React.Fragment>;
};

const ClaimPendingFragment = () => {
return <React.Fragment>Claim cannot be processed until VHA admin reviews pending requests.</React.Fragment>;
};

const ClaimIncompleteFragment = () => {
return <React.Fragment>Claim cannot be processed until decision date is entered.</React.Fragment>;
};

const benefitType = (details) => {
return <>
<b>Benefit type: </b>{BENEFIT_TYPES[details.benefitType]}<br />
</>;
};

const ClaimClosedFragment = (details) => {
return <React.Fragment>
Claim closed.<br />
const fragment = details.eventType === 'cancelled' ? <>
Claim cancelled.
</> : <>
Claim closed.<br />
<b>Claim decision date: </b>{formatDecisionDate(details.dispositionDate)}
</React.Fragment>;
</>;

return (
<div>
{fragment}
</div>
);
};

const AddedIssueFragment = (details) => {
return <React.Fragment>
<b>Benefit type: </b>{BENEFIT_TYPES[details.benefitType]}<br />
{ benefitType(details) }
<b>Issue type: </b>{details.issueType}<br />
<b>Issue description: </b>{details.issueDescription}<br />
</React.Fragment>;
};

const RequestedIssueFragment = (details) => {
return <React.Fragment>
{ benefitType(details) }
<b>Issue type: </b>{details.newIssueType}<br />
<b>Issue description: </b>{details.newIssueDescription}<br />
<b>Decision date: </b>{formatDecisionDate(details.newDecisionDate)}<br />
<b>{capitalizeFirst(details.requestType)} request reason: </b>{details.modificationRequestReason}<br />
</React.Fragment>;
};

const WithdrawalRequestedIssueFragment = (details) => {
return <>
<RequestedIssueFragment {...details} />
<b>Withdrawal request date: </b>{formatDecisionDate(details.issueModificationRequestWithdrawalDate)}<br />
</>;
};

const formatLabel = (baseLabel, prefix) => {
if (prefix) {
return `${prefix} ${baseLabel.toLowerCase()}`;
}

return baseLabel;
};

const previousModificationFragment = (details, prefix) => {
return <React.Fragment>
<b>{formatLabel('Issue type:', prefix)} </b>{details.previousIssueType}<br />
<b>{formatLabel('Issue description:', prefix)} </b>{details.previousIssueDescription}<br />
<b>{formatLabel('Decision date:', prefix)} </b>{formatDecisionDate(details.previousDecisionDate)}<br />
<b>{capitalizeFirst(details.requestType)} request reason: </b>{details.previousModificationRequestReason}<br />
</React.Fragment>;
};

const RequestedIssueModificationFragment = (details) => {
return <React.Fragment>
{ benefitType(details) }
<b>Current issue type: </b>{details.issueType}<br />
<b>Current issue description: </b>{details.issueDescription}<br />
<b>Current decision date: </b>{formatDecisionDate(details.decisionDate)}<br />
{ previousModificationFragment(details, 'New') }
</React.Fragment>;
};

const RemoveOriginalIssueFragment = (details) => {
return <React.Fragment>
<b>Remove original issue: </b>{details.removeOriginalIssue ? 'Yes' : 'No' }<br />
</React.Fragment>;
};

const requestDecision = (details) => {
return <React.Fragment>
<b>Request decision: </b> {details.issueModificationRequestStatus === 'denied' ? 'Rejected' : 'Approved'} <br />
</React.Fragment>;
};

const RequestedIssueDecisionFragment = (details) => {
return <React.Fragment>
{requestDecision(details)}
{ details.issueModificationRequestStatus === 'approved' && details.requestType === 'modification' ?
<RemoveOriginalIssueFragment {...details} /> : null
}
{ details.issueModificationRequestStatus === 'denied' ?
<React.Fragment>
<b>Reason for rejection: </b> {details.decisionReason} <br />
</React.Fragment> : null
}
<b>Request originated by: </b>{details.requestor}<br />
</React.Fragment>;
};

const modificationRequestReason = (details) => {
return <React.Fragment>
<b>New {details.requestType} request reason: </b>{details.modificationRequestReason}<br />
</React.Fragment>;
};

const EditOfRequestIssueModification = (details) => {
let component = null;

switch (details.requestType) {
case 'modification':
case 'addition':
component = <React.Fragment>
almorbah marked this conversation as resolved.
Show resolved Hide resolved
<b>New issue type: </b>{details.newIssueType}<br />
<b>New issue description: </b>{details.newIssueDescription}<br />
<b>New decision date: </b>{formatDecisionDate(details.newDecisionDate)}<br />
{modificationRequestReason(details)}
</React.Fragment>;
break;
case 'removal':
component = <React.Fragment>
{modificationRequestReason(details)}
</React.Fragment>;
break;
case 'withdrawal':
component = <React.Fragment>
{modificationRequestReason(details)}
<b>New withdrawal request date: </b> {formatDecisionDate(details.issueModificationRequestWithdrawalDate)}<br />
</React.Fragment>;
break;
default:
return null;
}

return <React.Fragment>
{component}
</React.Fragment>;
};

const AddedIssueWithDateFragment = (details) => {
return <React.Fragment>
<AddedIssueFragment {...details} />
Expand Down Expand Up @@ -93,12 +225,74 @@ const IndividualClaimHistoryTable = (props) => {
</React.Fragment>;
};

const DetailsFragment = (row) => {
const WithdrawnRequestedIssueModificationFragment = (details) => {
return <React.Fragment>
almorbah marked this conversation as resolved.
Show resolved Hide resolved
<PreviousFragmentWithBenefitType {...details} />
<b>Withdrawal request date: </b> {formatDecisionDate(details.previousWithdrawalDate)}<br />
</React.Fragment>;
};

const PreviousFragmentWithBenefitType = (details) => {
return <React.Fragment>
{ benefitType(details) }
{ previousModificationFragment(details) }
</React.Fragment>;
};

const OriginalRequestedIssueModificationFragment = (details) => {
let component = null;

const { readableEventType, details } = row;
switch (details.requestType) {
case 'modification':
component = <RequestedIssueModificationFragment {...details} />;
break;
case 'addition':
case 'removal':
component = <PreviousFragmentWithBenefitType {...details} />;
break;
case 'withdrawal':
component = <WithdrawnRequestedIssueModificationFragment {...details} />;
break;
default:
return null;
}

return (
<div>
{component}
</div>
);
};

const OriginalDetailsFragments = (row) => {
const { details, modificationRequestDetails } = row;
const requestModificationDetails = { ...details, ...modificationRequestDetails };

const detailsExtended = { ...details, eventDate: row.eventDate };
const [isOpen, setIsOpen] = useState(false);

const toggle = () => {
setIsOpen(!isOpen);
};

return (
<div>
<div style={{ marginBottom: '15px' }}>
<a onClick={toggle} style={{ cursor: 'pointer' }}>{`${isOpen ? 'Hide' : 'View' } original request`}</a>
</div>
{isOpen &&
<div>
<OriginalRequestedIssueModificationFragment {...requestModificationDetails} />
</div>}
</div>
);
};

const DetailsFragment = (row) => {

let component = null;
const { readableEventType, details, modificationRequestDetails } = row;
const detailsExtended = { ...details, eventDate: row.eventDate, eventType: row.eventType };
const requestIssueModificationDetails = { ...modificationRequestDetails, ...detailsExtended };

switch (readableEventType) {
case 'Claim created':
Expand All @@ -110,6 +304,9 @@ const IndividualClaimHistoryTable = (props) => {
case 'Completed disposition':
component = <CompletedDispositionFragment {...detailsExtended} />;
break;
case 'Claim status - Pending':
component = <ClaimPendingFragment />;
break;
case 'Claim status - In progress':
component = <ClaimInProgressFragment />;
break;
Expand All @@ -131,13 +328,42 @@ const IndividualClaimHistoryTable = (props) => {
case 'Removed issue':
component = <RemovedIssueFragment {...detailsExtended} />;
break;
case 'Cancellation of request':
component = <OriginalRequestedIssueModificationFragment {...requestIssueModificationDetails} />;
break;
case 'Requested issue modification':
component = <RequestedIssueModificationFragment {...requestIssueModificationDetails} />;
break;
case 'Requested issue addition':
case 'Requested issue removal':
component = <RequestedIssueFragment {...requestIssueModificationDetails} />;
break;
case 'Requested issue withdrawal':
component = <WithdrawalRequestedIssueFragment {...requestIssueModificationDetails} />;
break;
case `Edit of request - issue ${requestIssueModificationDetails.requestType}`:
component = <EditOfRequestIssueModification {...requestIssueModificationDetails} />;
break;
case `Rejection of request - issue ${requestIssueModificationDetails.requestType}`:
case `Approval of request - issue ${requestIssueModificationDetails.requestType}`:
component = <RequestedIssueDecisionFragment {...requestIssueModificationDetails} />;
break;
default:
return null;
}

return <p>
{component}
</p>;
const chunk = [
'request_approved',
'request_edited',
'request_denied'
];

return (
<div>
<p>{component}</p>
{ chunk.includes(requestIssueModificationDetails.eventType) ? <OriginalDetailsFragments {...row} /> : null }
</div>
almorbah marked this conversation as resolved.
Show resolved Hide resolved
);
};

const dateSort = (row) => {
Expand Down Expand Up @@ -210,3 +436,4 @@ IndividualClaimHistoryTable.propTypes = {
};

export default IndividualClaimHistoryTable;
/* eslint-enable max-lines */
Loading
Loading