Skip to content

Commit

Permalink
Merge pull request #985 from solita/feature/AE-1980
Browse files Browse the repository at this point in the history
AE-1980: Allow toggling document for osapuoli in Sakkopäätös / kuulemiskirje toimenpidetype
  • Loading branch information
Juholei authored Dec 11, 2023
2 parents e95fe1f + fc6552f commit db2f2e1
Show file tree
Hide file tree
Showing 5 changed files with 208 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/pages/valvonta-kaytto/manager.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@
fine: Toimenpiteet.findFineFromToimenpiteet(
Toimenpiteet.isDecisionOrderActualDecision,
toimenpiteet
)
),
osapuolis: R.filter(Osapuolet.isOmistaja, R.concat(henkilot, yritykset))
};
} else if (
Toimenpiteet.isPenaltyDecisionActualDecision({
Expand Down
15 changes: 13 additions & 2 deletions src/pages/valvonta-kaytto/new-toimenpide-dialog.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
import Input from '@Component/Input/Input';
import { flashMessageStore } from '@/stores';
import Select from '@Component/Select/Select';
import OsapuoletTable from './toimenpide-osapuolet-table.svelte';
import OsapuoletTable from './toimenpide-osapuolet-table';
import OsapuoletTableWithDocumentSelection from './osapuolet-table-with-document-selection';
import NoticeBailiffOsapuoletTable from './notice-bailiff-osapuolet-table';
import * as Validation from '@Utility/validation';
Expand Down Expand Up @@ -272,9 +273,19 @@
{disabled}
{roolit}
{template}
{text}
{schema}
{karajaoikeudet} />
{:else if Toimenpiteet.isPenaltyDecisionHearingLetter(toimenpide)}
<OsapuoletTableWithDocumentSelection
{id}
bind:toimenpide
{henkilot}
{yritykset}
{preview}
{previewPending}
{disabled}
{roolit}
{template} />
{:else if Toimenpiteet.showNormalOsapuoliTable(toimenpide)}
<OsapuoletTable
{id}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
<script>
import * as R from 'ramda';
import * as Maybe from '@Utility/maybe-utils';
import * as Locales from '@Language/locale-utils';
import * as Osapuolet from './osapuolet';
import * as Templates from './templates';
import * as ValvontaApi from './valvonta-api';
import { _, locale } from '@Language/i18n';
import H2 from '@Component/H/H2.svelte';
import Spinner from '@Component/Spinner/Spinner.svelte';
import * as Toimenpiteet from '@Pages/valvonta-kaytto/toimenpiteet';
import Checkbox from '@Component/Checkbox/Checkbox';
export let id;
export let toimenpide;
export let henkilot;
export let yritykset;
export let preview;
export let roolit;
export let template;
export let previewPending;
export let disabled;
const types = {
yritys: {
label: yritys => yritys.nimi,
preview: ValvontaApi.previewToimenpideForYritysOsapuoli
},
henkilo: {
label: henkilo => `${henkilo.etunimi} ${henkilo.sukunimi}`,
preview: ValvontaApi.previewToimenpideForHenkiloOsapuoli
}
};
let osapuolet = R.sort(R.ascend(R.prop('toimitustapa-id')))(
R.concat(
R.map(R.assoc('type', types.henkilo), henkilot),
R.map(R.assoc('type', types.yritys), yritykset)
)
);
const i18n = $_;
const i18nRoot = 'valvonta.kaytto.toimenpide';
$: rooliLabel = R.compose(
Maybe.fold('', Locales.labelForId($locale, roolit)),
R.prop('rooli-id')
);
const osapuoliSpecificDataIndexForOsapuoli = osapuoli =>
Toimenpiteet.osapuoliSpecificDataIndexForOsapuoli(
toimenpide,
osapuoli.id,
Osapuolet.getOsapuoliType(osapuoli)
);
</script>

<div class="w-full">
<H2 text={i18n(i18nRoot + '.vastaanottajat')} />

<div class="flex flex-row my-4">
<table class="etp-table">
<thead class="etp-table--thead">
<tr class="etp-table--tr etp-table--tr__light">
<th class="etp-table--th"> {i18n(i18nRoot + '.nimi')} </th>

<th class="etp-table--th"> {i18n(i18nRoot + '.rooli')} </th>

<th class="etp-table--th">
{i18n(i18nRoot + '.toimitustapa')}
</th>

<th class="etp-table--th">
{i18n(i18nRoot + '.esikatselu')}
</th>
<th class="etp-table--th">{i18n(i18nRoot + '.create-document')}</th>
</tr>
</thead>
<tbody class="etp-table--tbody">
{#each osapuolet as osapuoli}
<tr class="etp-table-tr">
<td class="etp-table--td">
{osapuoli.type.label(osapuoli)}
</td>
<td class="etp-table--td">
{rooliLabel(osapuoli)}
{#if Osapuolet.otherRooli(osapuoli)}
- {Maybe.orSome('', osapuoli['rooli-description'])}
{/if}
</td>
<td class="etp-table--td">
{i18n('valvonta.kaytto.toimenpide.manually-sent')}
</td>
<td class="etp-table--td">
{#if Osapuolet.isOmistaja(osapuoli)}
{#if previewPending}
<div class="etp-table--td__center">
<Spinner smaller={true} />
</div>
{:else}
<div
class:text-primary={!disabled}
class:text-disabled={disabled}
class:invisible={!Toimenpiteet.documentExistsForOsapuoli(
toimenpide,
osapuoli.id,
Osapuolet.getOsapuoliType(osapuoli)
)}
class="cursor-pointer etp-table--td__center"
role="button"
on:click|stopPropagation={disabled ||
preview(
osapuoli.type.preview(id, osapuoli.id, toimenpide)
)}>
<span class="font-icon text-2xl"> visibility </span>
</div>
{/if}
{:else if Maybe.orSome(false, R.lift(Templates.sendTiedoksi)(template))}
<span class="font-icon">info</span>
{i18n(i18nRoot + '.fyi')}
{:else}
<span class="font-icon">info</span>
{i18n(i18nRoot + '.fyi-disabled')}
{/if}
</td>
<td class="etp-table--td">
<div class="etp-table--td__center">
{#if Osapuolet.isOmistaja(osapuoli)}
<Checkbox
bind:model={toimenpide}
lens={R.lensPath([
'type-specific-data',
'osapuoli-specific-data',
osapuoliSpecificDataIndexForOsapuoli(osapuoli),
'document'
])} />
{/if}
</div>
</td>
</tr>
{/each}
</tbody>
</table>
</div>
</div>
22 changes: 21 additions & 1 deletion src/pages/valvonta-kaytto/toimenpiteet.js
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ export const emptyToimenpide = (

switch (typeId) {
case R.path(['decision-order', 'hearing-letter'], type):
case R.path(['penalty-decision', 'hearing-letter'], type):
return R.assocPath(
['type-specific-data', 'fine'],
Maybe.Some(fine),
Expand Down Expand Up @@ -173,6 +172,25 @@ export const emptyToimenpide = (
toimenpide
);

case R.path(['penalty-decision', 'hearing-letter'], type):
return R.assoc(
'type-specific-data',
{
fine: Maybe.Some(fine),
'osapuoli-specific-data': R.map(
osapuoli => ({
osapuoli: {
id: R.prop('id', osapuoli),
type: Osapuolet.getOsapuoliType(osapuoli)
},
document: true
}),
osapuolis
)
},
toimenpide
);

case R.path(['penalty-decision', 'actual-decision'], type):
return R.assoc(
'type-specific-data',
Expand Down Expand Up @@ -320,12 +338,14 @@ export const hasCourtAttachment = R.anyPass([
export const hasOptionalDocument = R.anyPass([
isDecisionOrderActualDecision,
isNoticeBailiff,
isPenaltyDecisionHearingLetter,
isPenaltyDecisionActualDecision
]);

export const showNormalOsapuoliTable = R.complement(
R.anyPass([
isDecisionOrderActualDecision,
isPenaltyDecisionHearingLetter,
isPenaltyDecisionActualDecision,
isNoticeBailiff
])
Expand Down
26 changes: 24 additions & 2 deletions src/pages/valvonta-kaytto/toimenpiteet_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,15 @@ describe('Empty toimenpide', () => {
});

it('Contains correct keys for toimenpidetype 14 which includes fine under type-specific-data', () => {
const emptyToimenpide = Toimenpiteet.emptyToimenpide(14, [{}]);
const emptyToimenpide = Toimenpiteet.emptyToimenpide(14, [{}], {
osapuolis: [
{
id: 6,
etunimi: 'Janina',
sukunimi: 'Mäkiaho'
}
]
});
assert.deepEqual(Object.keys(emptyToimenpide), [
'type-id',
'publish-time',
Expand All @@ -395,8 +403,22 @@ describe('Empty toimenpide', () => {
]);

assert.deepEqual(Object.keys(emptyToimenpide['type-specific-data']), [
'fine'
'fine',
'osapuoli-specific-data'
]);

assert.deepEqual(
R.path(['type-specific-data', 'osapuoli-specific-data'], emptyToimenpide),
[
{
osapuoli: {
id: 6,
type: 'henkilo'
},
document: true
}
]
);
});

it('with a fine is recognized as having a fine', () => {
Expand Down

0 comments on commit db2f2e1

Please sign in to comment.