Skip to content

Commit 5bb8a1e

Browse files
authored
feat: create and update legal entity (#71)
1 parent 1e0c982 commit 5bb8a1e

20 files changed

Lines changed: 273 additions & 111 deletions

File tree

apps/web-app/app/components/Header.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
<div class="flex items-center shrink-0 gap-3">
1212
<slot />
13+
14+
<UsersOnline />
1315
</div>
1416
</div>
1517

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
<template>
2-
<UCard
3-
v-if="entity"
4-
class="h-full"
5-
>
6-
<div class="flex flex-col gap-2.5">
7-
<UIcon name="i-lucide-scale" class="size-14 text-primary" />
2+
<UCard class="h-full">
3+
<div class="flex flex-col gap-3 group/list">
4+
<div class="flex flex-row justify-between">
5+
<div class="flex flex-row items-start gap-2.5">
6+
<UIcon name="i-lucide-scale" class="size-14 text-primary" />
7+
</div>
8+
9+
<UTooltip :text="`Редактировать «${entity.name`">
10+
<UButton
11+
variant="outline"
12+
color="neutral"
13+
size="md"
14+
icon="i-lucide-pencil"
15+
class="size-10 justify-center opacity-0 group-hover/list:opacity-100"
16+
@click="modalUpdatePartnerLegalEntity.open({ entityId: entity.id })"
17+
/>
18+
</UTooltip>
19+
</div>
820

921
<h3 class="text-xl md:text-xl/6 font-semibold">
1022
{{ entity.name }}
@@ -22,20 +34,14 @@
2234
</p>
2335
</div>
2436
</UCard>
25-
<CreateCard
26-
v-else
27-
label="Добавить юридическое лицо"
28-
icon="i-lucide-scale"
29-
@click="modalCreatePartnerLegalEntity.open({ partnerId })"
30-
/>
3137
</template>
3238

3339
<script setup lang="ts">
3440
import type { PartnerLegalEntity } from '@roll-stack/database'
35-
import { ModalCreatePartnerLegalEntity } from '#components'
41+
import { ModalUpdatePartnerLegalEntity } from '#components'
3642
37-
defineProps<{ partnerId: string, entity: PartnerLegalEntity | null | undefined }>()
43+
defineProps<{ entity: PartnerLegalEntity }>()
3844
3945
const overlay = useOverlay()
40-
const modalCreatePartnerLegalEntity = overlay.create(ModalCreatePartnerLegalEntity)
46+
const modalUpdatePartnerLegalEntity = overlay.create(ModalUpdatePartnerLegalEntity)
4147
</script>

apps/web-app/app/components/form/CreatePartnerAgreement.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ import type { FormSubmitEvent } from '@nuxt/ui'
139139
import { createPartnerAgreementSchema } from '#shared/services/partner'
140140
import { DateFormatter, getLocalTimeZone } from '@internationalized/date'
141141
142-
const { partnerId, legalEntityId } = defineProps<{ partnerId: string, legalEntityId?: string }>()
142+
const { legalEntityId } = defineProps<{ legalEntityId?: string }>()
143143
const emit = defineEmits(['success', 'submitted'])
144144
145145
const { t } = useI18n()
@@ -200,7 +200,7 @@ async function onSubmit(event: FormSubmitEvent<CreatePartnerAgreement>) {
200200
emit('submitted')
201201
202202
try {
203-
await $fetch(`/api/partner/id/${partnerId}/agreement`, {
203+
await $fetch('/api/partner/agreement', {
204204
method: 'POST',
205205
body: event.data,
206206
})

apps/web-app/app/components/form/CreatePartnerLegalEntity.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ import type { CreatePartnerLegalEntity } from '#shared/services/partner'
6464
import type { FormSubmitEvent } from '@nuxt/ui'
6565
import { createPartnerLegalEntitySchema } from '#shared/services/partner'
6666
67-
const { partnerId } = defineProps<{ partnerId: string }>()
6867
const emit = defineEmits(['success', 'submitted'])
6968
7069
const { t } = useI18n()
@@ -84,7 +83,7 @@ async function onSubmit(event: FormSubmitEvent<CreatePartnerLegalEntity>) {
8483
emit('submitted')
8584
8685
try {
87-
await $fetch(`/api/partner/id/${partnerId}/legal`, {
86+
await $fetch('/api/partner/legal', {
8887
method: 'POST',
8988
body: event.data,
9089
})
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<template>
2+
<UForm
3+
:validate="createValidator(updatePartnerLegalEntitySchema)"
4+
:state="state"
5+
class="flex flex-col gap-3"
6+
@submit="onSubmit"
7+
>
8+
<UFormField
9+
:label="$t('common.title')"
10+
name="name"
11+
required
12+
>
13+
<UInput
14+
v-model="state.name"
15+
size="xl"
16+
placeholder="ИП ИВАНОВ ИВАН ИВАНОВИЧ"
17+
class="w-full items-center justify-center"
18+
/>
19+
</UFormField>
20+
21+
<UFormField
22+
label="ИНН"
23+
name="inn"
24+
required
25+
>
26+
<UInput
27+
v-model="state.inn"
28+
size="xl"
29+
class="w-full items-center justify-center"
30+
/>
31+
</UFormField>
32+
33+
<UFormField label="ОГРНИП" name="ogrnip">
34+
<UInput
35+
v-model="state.ogrnip"
36+
size="xl"
37+
class="w-full items-center justify-center"
38+
/>
39+
</UFormField>
40+
41+
<UFormField :label="$t('common.comment')" name="comment">
42+
<UInput
43+
v-model="state.comment"
44+
size="xl"
45+
placeholder="Для внутреннего использования"
46+
class="w-full items-center justify-center"
47+
/>
48+
</UFormField>
49+
50+
<UButton
51+
type="submit"
52+
variant="solid"
53+
color="secondary"
54+
size="xl"
55+
block
56+
class="mt-3"
57+
:label="$t('common.update')"
58+
/>
59+
</UForm>
60+
</template>
61+
62+
<script setup lang="ts">
63+
import type { UpdatePartnerLegalEntity } from '#shared/services/partner'
64+
import type { FormSubmitEvent } from '@nuxt/ui'
65+
import { updatePartnerLegalEntitySchema } from '#shared/services/partner'
66+
67+
const { entityId } = defineProps<{
68+
entityId: string
69+
}>()
70+
71+
const emit = defineEmits(['success', 'submitted'])
72+
73+
const { t } = useI18n()
74+
const actionToast = useActionToast()
75+
76+
const partnerStore = usePartnerStore()
77+
const entity = computed(() => partnerStore.legalEntities.find((legalEntity) => legalEntity.id === entityId))
78+
79+
const state = ref<Partial<UpdatePartnerLegalEntity>>({
80+
name: entity.value?.name,
81+
inn: entity.value?.inn,
82+
ogrnip: entity.value?.ogrnip ?? undefined,
83+
comment: entity.value?.comment ?? undefined,
84+
})
85+
86+
async function onSubmit(event: FormSubmitEvent<UpdatePartnerLegalEntity>) {
87+
const toastId = actionToast.start()
88+
emit('submitted')
89+
90+
try {
91+
await $fetch(`/api/partner/legal/id/${entityId}`, {
92+
method: 'PATCH',
93+
body: event.data,
94+
})
95+
96+
await partnerStore.update()
97+
98+
actionToast.success(toastId, t('toast.partner-legal-entity-updated'))
99+
emit('success')
100+
} catch (error) {
101+
console.error(error)
102+
actionToast.error(toastId)
103+
}
104+
}
105+
</script>

apps/web-app/app/components/modal/CreatePartnerAgreement.vue

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
<UModal title="Создание договора">
33
<template #body>
44
<FormCreatePartnerAgreement
5-
:partner-id="partnerId ?? ''"
65
:legal-entity-id="legalEntityId ?? ''"
76
@submitted="overlay.closeAll"
87
@success="overlay.closeAll"
@@ -13,7 +12,6 @@
1312

1413
<script setup lang="ts">
1514
defineProps<{
16-
partnerId?: string
1715
legalEntityId?: string
1816
}>()
1917

apps/web-app/app/components/modal/CreatePartnerLegalEntity.vue

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
<UModal title="Создание юридического лица">
33
<template #body>
44
<FormCreatePartnerLegalEntity
5-
:partner-id="partnerId ?? ''"
65
@submitted="overlay.closeAll"
76
@success="overlay.closeAll"
87
/>
@@ -11,9 +10,5 @@
1110
</template>
1211

1312
<script setup lang="ts">
14-
defineProps<{
15-
partnerId?: string
16-
}>()
17-
1813
const overlay = useOverlay()
1914
</script>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<template>
2+
<UModal title="Обновление юридического лица">
3+
<template #body>
4+
<FormUpdatePartnerLegalEntity
5+
:entity-id="entityId"
6+
@submitted="overlay.closeAll"
7+
@success="overlay.closeAll"
8+
/>
9+
</template>
10+
</UModal>
11+
</template>
12+
13+
<script setup lang="ts">
14+
defineProps<{
15+
entityId: string
16+
}>()
17+
18+
const overlay = useOverlay()
19+
</script>

apps/web-app/app/pages/agreement/index.vue

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
11
<template>
2-
<Header :title="t('app.menu.agreements')">
3-
<UButton
4-
size="lg"
5-
variant="solid"
6-
color="secondary"
7-
class="w-full md:w-fit"
8-
icon="i-lucide-circle-plus"
9-
:label="t('app.create.agreement.button')"
10-
@click="modalCreatePartnerAgreement.open()"
11-
/>
12-
</Header>
2+
<Header :title="t('app.menu.agreements')" />
133

144
<Content>
155
<div class="flex flex-wrap items-center justify-between gap-1.5">
16-
<div class="flex flex-row gap-2.5">
17-
<UInput
18-
v-model="filterValue"
19-
placeholder="По номеру"
20-
class="max-w-sm"
21-
icon="i-lucide-search"
22-
/>
23-
</div>
6+
<UInput
7+
v-model="filterValue"
8+
placeholder="По номеру"
9+
class="max-w-sm"
10+
icon="i-lucide-search"
11+
/>
2412

2513
<div class="flex flex-wrap items-center gap-1.5">
2614
<UDropdownMenu
@@ -46,9 +34,29 @@
4634
:label="$t('common.columns')"
4735
color="neutral"
4836
variant="outline"
49-
trailing-icon="i-lucide-settings-2"
37+
icon="i-lucide-settings-2"
5038
/>
5139
</UDropdownMenu>
40+
41+
<UButton
42+
size="md"
43+
variant="solid"
44+
color="secondary"
45+
class="w-full md:w-fit"
46+
icon="i-lucide-circle-plus"
47+
:label="t('app.create.partner-legal-entity.button')"
48+
@click="modalCreatePartnerLegalEntity.open()"
49+
/>
50+
51+
<UButton
52+
size="md"
53+
variant="solid"
54+
color="secondary"
55+
class="w-full md:w-fit"
56+
icon="i-lucide-circle-plus"
57+
:label="t('app.create.agreement.button')"
58+
@click="modalCreatePartnerAgreement.open()"
59+
/>
5260
</div>
5361
</div>
5462

@@ -178,7 +186,7 @@
178186
import type { DropdownMenuItem, TableColumn } from '@nuxt/ui'
179187
import type { PartnerAgreement } from '@roll-stack/database'
180188
import type { PartnerAgreementWithAllData } from '~/stores/partner'
181-
import { ModalCreatePartnerAgreement, ModalUpdatePartnerAgreement } from '#components'
189+
import { ModalCreatePartnerAgreement, ModalCreatePartnerLegalEntity, ModalUpdatePartnerAgreement } from '#components'
182190
import { getPaginationRowModel } from '@tanstack/table-core'
183191
import { format } from 'date-fns'
184192
import { ru } from 'date-fns/locale/ru'
@@ -193,6 +201,7 @@ const filterValue = ref('')
193201
const overlay = useOverlay()
194202
const modalCreatePartnerAgreement = overlay.create(ModalCreatePartnerAgreement)
195203
const modalUpdatePartnerAgreement = overlay.create(ModalUpdatePartnerAgreement)
204+
const modalCreatePartnerLegalEntity = overlay.create(ModalCreatePartnerLegalEntity)
196205
197206
const partnerStore = usePartnerStore()
198207

apps/web-app/app/pages/index.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<template>
2-
<Header :title="$t('app.menu.my-space')">
3-
<UsersOnline />
4-
</Header>
2+
<Header :title="$t('app.menu.my-space')" />
53

64
<Content>
75
<template v-if="userStore.id">

0 commit comments

Comments
 (0)