Skip to content

Commit

Permalink
Merge pull request #944 from MTES-MCT/fix-display-owner-ban-address
Browse files Browse the repository at this point in the history
Fix owner BAN address in campaign view
  • Loading branch information
Falinor authored Oct 8, 2024
2 parents 9b23b14 + 1e9b9cb commit 30222d7
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 68 deletions.
1 change: 1 addition & 0 deletions .talismanrc
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ scopeconfig:
- scope: node
allowed_patterns:
- keyof
- key=
version: "1.0"
41 changes: 24 additions & 17 deletions frontend/src/components/Campaign/CampaignRecipients.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,18 @@ import Typography from '@mui/material/Typography';
import Grid from '@mui/material/Unstable_Grid2';
import { ReactNode, useState } from 'react';

import {
formatAddress as formatAddressDTO,
Pagination
} from '@zerologementvacant/models';
import { Campaign } from '../../models/Campaign';
import { useHousingList } from '../../hooks/useHousingList';
import { Address, addressToString, isBanEligible } from '../../models/Address';
import { Address, isBanEligible } from '../../models/Address';
import OwnerEditionSideMenu from '../OwnerEditionSideMenu/OwnerEditionSideMenu';
import AppLink from '../_app/AppLink/AppLink';
import { Housing } from '../../models/Housing';
import { useRemoveCampaignHousingMutation } from '../../services/campaign.service';
import ConfirmationModal from '../modals/ConfirmationModal/ConfirmationModal';
import { Pagination } from '@zerologementvacant/models';
import { DefaultPagination } from '../../store/reducers/housingReducer';
import { usePagination } from '../../hooks/usePagination';
import Button from '@codegouvfr/react-dsfr/Button';
Expand All @@ -27,36 +30,38 @@ interface Props {
function CampaignRecipients(props: Props) {
const [pagination, setPagination] = useState<Pagination>(DefaultPagination);
const filters = {
campaignIds: [props.campaign.id],
campaignIds: [props.campaign.id]
};
const { housingList } = useHousingList({
filters,
pagination,
pagination
});

const { data: count } = useCountHousingQuery(filters);
const filteredCount = count?.housing ?? 0;

const { pageCount, hasPagination, changePerPage, changePage} = usePagination({
pagination,
setPagination,
count: filteredCount,
});
const { pageCount, hasPagination, changePerPage, changePage } = usePagination(
{
pagination,
setPagination,
count: filteredCount
}
);

const [removeCampaignHousing] = useRemoveCampaignHousingMutation();
async function removeHousing(housing: Housing): Promise<void> {
await removeCampaignHousing({
campaignId: props.campaign.id,
all: false,
ids: [housing.id],
filters: {},
filters: {}
}).unwrap();
}

function formatAddress(address: Address): ReactNode[] {
return (addressToString(address) as string)
.split('\n')
.map((line) => <Typography key={line}>{line}</Typography>);
return formatAddressDTO(address).map((line) => (
<Typography key={line}>{line}</Typography>
));
}

const headers: ReactNode[] = [
Expand All @@ -65,7 +70,7 @@ function CampaignRecipients(props: Props) {
'Propriétaire principal',
'Adresse BAN du propriétaire',
'Complément d’adresse',
null,
null
];
const data: ReactNode[][] = (housingList ?? []).map((housing, i) => [
`# ${i + 1 + (pagination.page - 1) * pagination.perPage}`,
Expand Down Expand Up @@ -107,7 +112,7 @@ function CampaignRecipients(props: Props) {
iconId: 'fr-icon-close-line',
priority: 'tertiary',
size: 'small',
title: 'Supprimer le propriétaire',
title: 'Supprimer le propriétaire'
}}
title="Suppression d’un propriétaire"
onSubmit={() => removeHousing(housing)}
Expand All @@ -116,7 +121,7 @@ function CampaignRecipients(props: Props) {
Vous êtes sur le point de supprimer ce destinataire de la campagne.
</Typography>
</ConfirmationModal>
</Grid>,
</Grid>
]);

return (
Expand All @@ -125,7 +130,9 @@ function CampaignRecipients(props: Props) {
severity="info"
closable
title="Vos propriétaires destinataires"
description={'Vérifiez les adresses des propriétaires, notamment dans les cas où l\'adresse BAN diffère de l\'adresse issue des Fichiers Fonciers (cas signalés par la mention "Adresse améliorable"). Une fois la liste des destinataires vérifiée, cliquez sur "Valider et passer au téléchargement" pour télécharger les destinataires au format XLSX.'}
description={
'Vérifiez les adresses des propriétaires, notamment dans les cas où l\'adresse BAN diffère de l\'adresse issue des Fichiers Fonciers (cas signalés par la mention "Adresse améliorable"). Une fois la liste des destinataires vérifiée, cliquez sur "Valider et passer au téléchargement" pour télécharger les destinataires au format XLSX.'
}
className="fr-mt-2w"
/>
<Table data={data} headers={headers} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import styles from './events-history.module.scss';
import { hasValues } from '../../models/Diff';
import { Owner } from '../../models/Owner';
import { birthdate } from '../../utils/dateUtils';
import { addressToString } from '../../models/Address';
import { formatAddress } from '@zerologementvacant/models';
import Typography from '@mui/material/Typography';

interface Props {
partialOwner: Partial<Owner>;
Expand Down Expand Up @@ -49,7 +50,9 @@ const EventPartialOwnerContent = ({
partialOwner.banAddress !== null && (
<>
<span className="color-grey-625">Adresse postale</span>
{addressToString(partialOwner.banAddress)}
{formatAddress(partialOwner.banAddress).map((line) => (
<Typography key={line}>{line}</Typography>
))}
</>
)}
{partialOwner.additionalAddress !== undefined &&
Expand Down
20 changes: 0 additions & 20 deletions frontend/src/models/Address.tsx
Original file line number Diff line number Diff line change
@@ -1,30 +1,10 @@
import { reduceStringArray } from '../utils/stringUtils';
import config from '../utils/config';
import { AddressDTO, AddressKinds } from '@zerologementvacant/models';
import { Owner } from './Owner';
import fp from 'lodash/fp';

export type Address = Omit<AddressDTO, 'refId' | 'addressKind'>;

/**
* @deprecated
* @param address
* @param breakLine
*/
export const addressToString = (address?: Address, breakLine = true) => {
if (address) {
return reduceStringArray(
[
address.street?.startsWith(address.houseNumber ?? '')
? address.street
: [address.houseNumber, address.street].join(' '),
[address.postalCode, address.city].join(' ')
],
breakLine
);
}
};

export const isBanEligible = (address?: Pick<Address, 'score'>) => {
return (
address?.score !== undefined && address.score >= config.banEligibleScore
Expand Down
32 changes: 3 additions & 29 deletions frontend/src/models/test/Address.test.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,8 @@
import { addressToString, isBanEligible } from '../Address';
import { isBanEligible } from '../Address';
import { genAddress } from '../../../test/fixtures.test';
import config from '../../utils/config';

describe('Address', () => {
describe('addressToString', () => {
const address = genAddress();

it('should return undefined when the address is undefined', () => {
const actual = addressToString(undefined);
expect(actual).toBeUndefined();
});

it('should return a string with the address', () => {
const actual = addressToString(address);
expect(actual).toBe(
`${address.houseNumber} ${address.street}\n${address.postalCode} ${address.city}`
);
});

it('should return a string with the address when street also contains houseNumber', () => {
const actual = addressToString({
...address,
street: `${address.houseNumber} ${address.street}`,
});
expect(actual).toBe(
`${address.houseNumber} ${address.street}\n${address.postalCode} ${address.city}`
);
});
});

describe('isBanEligible', () => {
const address = genAddress();
it('should return false when the score is undefined', () => {
Expand All @@ -39,15 +13,15 @@ describe('Address', () => {
it('should return false when the address is not eligible', () => {
const actual = isBanEligible({
...address,
score: config.banEligibleScore - 0.1,
score: config.banEligibleScore - 0.1
});
expect(actual).toBe(false);
});

it('should return true when the address is eligible', () => {
const actual = isBanEligible({
...address,
score: config.banEligibleScore + 0.1,
score: config.banEligibleScore + 0.1
});
expect(actual).toBe(true);
});
Expand Down

0 comments on commit 30222d7

Please sign in to comment.