Skip to content

Commit

Permalink
psp-7548
Browse files Browse the repository at this point in the history
  • Loading branch information
devinleighsmith committed Jan 27, 2024
1 parent 868b19b commit 1f582ce
Show file tree
Hide file tree
Showing 17 changed files with 242 additions and 16 deletions.
180 changes: 180 additions & 0 deletions source/backend/dal/Repositories/DispositionFileRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,186 @@ public LastUpdatedByModel GetLastUpdateBy(long id)
.ToList();
lastUpdatedByAggregate.AddRange(propertiesHistoryLastUpdatedBy);

// Disposition Sales
var salesLastUpdatedBy = this.Context.PimsDispositionSales.AsNoTracking()
.Where(dp => dp.DispositionFileId == id)
.Select(dp => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dp.AppLastUpdateUserid,
AppLastUpdateUserGuid = dp.AppLastUpdateUserGuid,
AppLastUpdateTimestamp = dp.AppLastUpdateTimestamp,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(salesLastUpdatedBy);

// Disposition Deleted Sales
var salesHistoryLastUpdatedBy = Context.PimsDispositionSaleHists.AsNoTracking()
.Where(dph => dph.DispositionFileId == id)
.Select(dph => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dph.AppLastUpdateUserid, // TODO: Update this once the DB tracks the user
AppLastUpdateUserGuid = dph.AppLastUpdateUserGuid, // TODO: Update this once the DB tracks the user
AppLastUpdateTimestamp = dph.EndDateHist ?? DateTime.UnixEpoch,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(salesHistoryLastUpdatedBy);

// Disposition Offers
var offerLastUpdatedBy = this.Context.PimsDispositionOffers.AsNoTracking()
.Where(dp => dp.DispositionFileId == id)
.Select(dp => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dp.AppLastUpdateUserid,
AppLastUpdateUserGuid = dp.AppLastUpdateUserGuid,
AppLastUpdateTimestamp = dp.AppLastUpdateTimestamp,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(offerLastUpdatedBy);

// Disposition Deleted Offers
var offerHistoryLastUpdatedBy = Context.PimsDispositionOfferHists.AsNoTracking()
.Where(dph => dph.DispositionFileId == id)
.Select(dph => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dph.AppLastUpdateUserid, // TODO: Update this once the DB tracks the user
AppLastUpdateUserGuid = dph.AppLastUpdateUserGuid, // TODO: Update this once the DB tracks the user
AppLastUpdateTimestamp = dph.EndDateHist ?? DateTime.UnixEpoch,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(offerHistoryLastUpdatedBy);

// Disposition Values
var valueLastUpdatedBy = this.Context.PimsDispositionAppraisals.AsNoTracking()
.Where(dp => dp.DispositionFileId == id)
.Select(dp => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dp.AppLastUpdateUserid,
AppLastUpdateUserGuid = dp.AppLastUpdateUserGuid,
AppLastUpdateTimestamp = dp.AppLastUpdateTimestamp,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(valueLastUpdatedBy);

// Disposition Deleted Values
var valueHistoryLastUpdatedBy = Context.PimsDispositionAppraisalHists.AsNoTracking()
.Where(dph => dph.DispositionFileId == id)
.Select(dph => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dph.AppLastUpdateUserid, // TODO: Update this once the DB tracks the user
AppLastUpdateUserGuid = dph.AppLastUpdateUserGuid, // TODO: Update this once the DB tracks the user
AppLastUpdateTimestamp = dph.EndDateHist ?? DateTime.UnixEpoch,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(valueHistoryLastUpdatedBy);

// Disposition Checklist
var checklistLastUpdatedBy = this.Context.PimsDispositionChecklistItems.AsNoTracking()
.Where(dp => dp.DispositionFileId == id)
.Select(dp => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dp.AppLastUpdateUserid,
AppLastUpdateUserGuid = dp.AppLastUpdateUserGuid,
AppLastUpdateTimestamp = dp.AppLastUpdateTimestamp,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(checklistLastUpdatedBy);

// Disposition Deleted Checklists
var checklistHistoryLastUpdatedBy = Context.PimsDispositionChecklistItemHists.AsNoTracking()
.Where(dph => dph.DispositionFileId == id)
.Select(dph => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dph.AppLastUpdateUserid, // TODO: Update this once the DB tracks the user
AppLastUpdateUserGuid = dph.AppLastUpdateUserGuid, // TODO: Update this once the DB tracks the user
AppLastUpdateTimestamp = dph.EndDateHist ?? DateTime.UnixEpoch,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(checklistHistoryLastUpdatedBy);

// Disposition Document
var documentLastUpdatedBy = this.Context.PimsDispositionFileDocuments.AsNoTracking()
.Where(dp => dp.DispositionFileId == id)
.Select(dp => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dp.AppLastUpdateUserid,
AppLastUpdateUserGuid = dp.AppLastUpdateUserGuid,
AppLastUpdateTimestamp = dp.AppLastUpdateTimestamp,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(documentLastUpdatedBy);

// Disposition Deleted Documents
var documentHistoryLastUpdatedBy = Context.PimsDispositionFileDocumentHists.AsNoTracking()
.Where(dph => dph.DispositionFileId == id)
.Select(dph => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dph.AppLastUpdateUserid, // TODO: Update this once the DB tracks the user
AppLastUpdateUserGuid = dph.AppLastUpdateUserGuid, // TODO: Update this once the DB tracks the user
AppLastUpdateTimestamp = dph.EndDateHist ?? DateTime.UnixEpoch,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(documentHistoryLastUpdatedBy);

// Disposition Notes
var notesLastUpdatedBy = this.Context.PimsDispositionFileNotes.AsNoTracking()
.Where(dp => dp.DispositionFileId == id)
.Select(dp => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dp.AppLastUpdateUserid,
AppLastUpdateUserGuid = dp.AppLastUpdateUserGuid,
AppLastUpdateTimestamp = dp.AppLastUpdateTimestamp,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(notesLastUpdatedBy);

// Disposition Deleted Notes
var notesHistoryLastUpdatedBy = Context.PimsDispositionFileNoteHists.AsNoTracking()
.Where(dph => dph.DispositionFileId == id)
.Select(dph => new LastUpdatedByModel()
{
ParentId = id,
AppLastUpdateUserid = dph.AppLastUpdateUserid, // TODO: Update this once the DB tracks the user
AppLastUpdateUserGuid = dph.AppLastUpdateUserGuid, // TODO: Update this once the DB tracks the user
AppLastUpdateTimestamp = dph.EndDateHist ?? DateTime.UnixEpoch,
})
.OrderByDescending(lu => lu.AppLastUpdateTimestamp)
.Take(1)
.ToList();
lastUpdatedByAggregate.AddRange(notesHistoryLastUpdatedBy);

return lastUpdatedByAggregate.OrderByDescending(x => x.AppLastUpdateTimestamp).FirstOrDefault();
}

Expand Down
9 changes: 9 additions & 0 deletions source/frontend/src/constants/dispositionFileStatus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export enum DispositionFileStatus {
Active = 'ACTIVE',
Archived = 'ARCHIVED',
Cancelled = 'CANCELLED',
Closed = 'CLOSED',
Complete = 'COMPLETE',
Draft = 'DRAFT',
Hold = 'HOLD',
}
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ describe('DispositionContainer component', () => {
const spinner = getByTestId('filter-backdrop-loading');
await waitForElementToBeRemoved(spinner);

await act(async () => viewProps.onSuccess());
await act(async () => viewProps.onSuccess(true, true));

expect(mockAxios.history.get.filter(x => x.url === '/dispositionfiles/1')).toHaveLength(2);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,12 @@ export const DispositionContainer: React.FunctionComponent<IDispositionContainer
setIsEditing(false);
};

const onSuccess = (refreshProperties?: boolean) => {
fetchDispositionFile();
const onSuccess = (refreshProperties?: boolean, refreshFile?: boolean) => {
setIsEditing(false);
fetchLastUpdatedBy();
if (refreshFile) {
fetchDispositionFile();
}
if (refreshProperties) {
mapMachine.refreshMapProperties();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export interface IDispositionViewProps {
onCancel: () => void;
onMenuChange: (selectedIndex: number) => void;
onShowPropertySelector: () => void;
onSuccess: (updateProperties?: boolean) => void;
onSuccess: (updateProperties?: boolean, updateFile?: boolean) => void;
onUpdateProperties: (file: Api_File) => Promise<Api_File | undefined>;
canRemove: (propertyId: number) => Promise<boolean>;
isEditing: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export interface IDispositionRouterProps {
setIsEditing: (value: boolean) => void;
defaultFileTab: FileTabType;
defaultPropertyTab: InventoryTabNames;
onSuccess: (updateProperties?: boolean) => void;
onSuccess: (updateProperties?: boolean, updateFile?: boolean) => void;
}

export const DispositionRouter: React.FC<IDispositionRouterProps> = props => {
Expand Down Expand Up @@ -84,6 +84,7 @@ export const DispositionRouter: React.FC<IDispositionRouterProps> = props => {
<UpdateDispositionAppraisalContainer
dispositionFileId={props.dispositionFile?.id ?? 0}
View={DispositionAppraisalForm}
onSuccess={props.onSuccess}
></UpdateDispositionAppraisalContainer>
)}
claim={Claims.DISPOSITION_EDIT}
Expand All @@ -97,6 +98,7 @@ export const DispositionRouter: React.FC<IDispositionRouterProps> = props => {
<AddDispositionOfferContainer
dispositionFileId={props.dispositionFile?.id ?? 0}
View={DispositionOfferForm}
onSuccess={props.onSuccess}
></AddDispositionOfferContainer>
)}
claim={Claims.DISPOSITION_EDIT}
Expand All @@ -111,6 +113,7 @@ export const DispositionRouter: React.FC<IDispositionRouterProps> = props => {
dispositionFileId={props.dispositionFile?.id ?? 0}
dispositionOfferId={match.params.offerId}
View={DispositionOfferForm}
onSuccess={props.onSuccess}
></UpdateDispositionOfferContainer>
)}
claim={Claims.DISPOSITION_EDIT}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export const DispositionFileTabs: React.FC<IDispositionFileTabsProps> = ({
<OffersAndSaleContainer
dispositionFile={dispositionFile}
View={OffersAndSaleContainerView}
onSuccess={onChildSuccess}
></OffersAndSaleContainer>
),
key: FileTabType.OFFERS_AND_SALE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { FormikHelpers, FormikProps } from 'formik';
import React from 'react';

import { ModalSize } from '@/components/common/GenericModal';
import { DispositionFileStatus } from '@/constants/dispositionFileStatus';
import { useDispositionProvider } from '@/hooks/repositories/useDispositionProvider';
import useApiUserOverride from '@/hooks/useApiUserOverride';
import { useModalContext } from '@/hooks/useModalContext';
Expand All @@ -15,7 +16,7 @@ import { IUpdateDispositionFormProps } from './UpdateDispositionForm';

export interface IUpdateDispositionContainerProps {
dispositionFile: Api_DispositionFile;
onSuccess: () => void;
onSuccess: (updateProperties?: boolean, updateFile?: boolean) => void;
View: React.FC<IUpdateDispositionFormProps>;
}

Expand Down Expand Up @@ -50,7 +51,17 @@ export const UpdateDispositionContainer = React.forwardRef<

if (!!response?.id) {
formikHelpers?.resetForm();
onSuccess();
const activeTypeCodes = [
DispositionFileStatus.Active.toString(),
DispositionFileStatus.Draft.toString(),
DispositionFileStatus.Hold.toString(),
];
//refresh the map properties if this disposition file was set to a final state.
onSuccess(
!!dispositionFile.fileStatusTypeCode?.id &&
!activeTypeCodes.includes(dispositionFile.fileStatusTypeCode.id),
true,
);
}
}
} finally {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const mockDeleteDispositionFileOfferApi = {
loading: false,
};

const onSuccess = jest.fn();
const mockGetDispositionFileApi = mockDispositionFileResponse(1);

jest.mock('@/hooks/repositories/useDispositionProvider', () => ({
Expand Down Expand Up @@ -69,6 +70,7 @@ describe('OffersAndSale Container component', () => {
<OffersAndSaleContainer
dispositionFile={renderOptions?.props?.dispositionFile ?? mockGetDispositionFileApi}
View={TestView}
onSuccess={onSuccess}
/>,
{
history,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ import { IOffersAndSaleContainerViewProps } from './OffersAndSaleContainerView';
export interface IOffersAndSaleContainerProps {
dispositionFile?: Api_DispositionFile;
View: React.FC<IOffersAndSaleContainerViewProps>;
onSuccess: () => void;
}

const OffersAndSaleContainer: React.FunctionComponent<IOffersAndSaleContainerProps> = ({
dispositionFile,
View,
onSuccess,
}) => {
const {
getDispositionFileOffers: { execute: getDispositionFileOffers, loading: loadingOffers },
Expand Down Expand Up @@ -67,6 +69,7 @@ const OffersAndSaleContainer: React.FunctionComponent<IOffersAndSaleContainerPro
if (updatedOffers) {
setDispositionOffers(updatedOffers);
}
onSuccess();

Check warning on line 72 in source/frontend/src/features/mapSideBar/disposition/tabs/offersAndSale/OffersAndSaleContainer.tsx

View check run for this annotation

Codecov / codecov/patch

source/frontend/src/features/mapSideBar/disposition/tabs/offersAndSale/OffersAndSaleContainer.tsx#L72

Added line #L72 was not covered by tests
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ const mockPostAppraisalApi = {
loading: false,
};

const onSuccess = jest.fn();

jest.mock('@/hooks/repositories/useDispositionProvider', () => ({
useDispositionProvider: () => {
return {
Expand All @@ -62,7 +64,11 @@ describe('Update Disposition Appraisal Container component', () => {
} = {},
) => {
const component = render(
<UpdateDispositionAppraisalContainer dispositionFileId={1} View={TestView} />,
<UpdateDispositionAppraisalContainer
dispositionFileId={1}
View={TestView}
onSuccess={onSuccess}
/>,
{
history,
store: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@ import { IDispositionAppraisalFormProps } from '../form/DispositionAppraisalForm
export interface IUpdateDispositionAppraisalContainerProps {
dispositionFileId: number;
View: React.FC<IDispositionAppraisalFormProps>;
onSuccess: () => void;
}

const UpdateDispositionAppraisalContainer: React.FunctionComponent<
React.PropsWithChildren<IUpdateDispositionAppraisalContainerProps>
> = ({ dispositionFileId, View }) => {
> = ({ dispositionFileId, View, onSuccess }) => {
const history = useHistory();
const location = useLocation();
const backUrl = location.pathname.split(`/appraisal`)[0];
Expand Down Expand Up @@ -51,7 +52,8 @@ const UpdateDispositionAppraisalContainer: React.FunctionComponent<
}
};

const handleSucces = async () => {
const handleSuccess = async () => {
onSuccess();

Check warning on line 56 in source/frontend/src/features/mapSideBar/disposition/tabs/offersAndSale/dispositionAppraisal/update/UpdateDispositionAppraisalContainer.tsx

View check run for this annotation

Codecov / codecov/patch

source/frontend/src/features/mapSideBar/disposition/tabs/offersAndSale/dispositionAppraisal/update/UpdateDispositionAppraisalContainer.tsx#L56

Added line #L56 was not covered by tests
history.push(backUrl);
};

Expand All @@ -73,7 +75,7 @@ const UpdateDispositionAppraisalContainer: React.FunctionComponent<
initialValues={dispositionAppraisal}
loading={loadingAppraisal || creatingAppraisal || updatingAppraisal}
onSave={handleSave}
onSuccess={handleSucces}
onSuccess={handleSuccess}
onCancel={() => history.push(backUrl)}
onError={onError}
></View>
Expand Down
Loading

0 comments on commit 1f582ce

Please sign in to comment.