|
1 | 1 | <template> |
2 | 2 | <Content> |
3 | | - <div class="grid grid-cols-1 gap-4 md:gap-6 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"> |
4 | | - <div class="flex flex-col gap-2.5"> |
5 | | - <img |
6 | | - :src="partner?.avatarUrl ?? undefined" |
7 | | - alt="" |
8 | | - class="w-full rounded-lg" |
9 | | - > |
10 | | - </div> |
11 | | - |
12 | | - <div class="flex flex-col gap-2.5"> |
13 | | - <div class="flex flex-row items-center gap-1.5"> |
14 | | - <PartnerPrestigeBadge |
15 | | - :prestige="partner?.prestige ?? 0" |
16 | | - size="lg" |
17 | | - class="group-hover:scale-125 duration-200" |
18 | | - /> |
19 | | - <h3 class="text-xl md:text-2xl font-semibold"> |
20 | | - Престиж |
| 3 | + <div class="grid grid-cols-1 gap-4 md:gap-6 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5"> |
| 4 | + <UCard variant="subtle" class="col-span-1"> |
| 5 | + <div class="flex flex-col gap-2.5"> |
| 6 | + <div class="flex flex-col items-start gap-2"> |
| 7 | + <div class="flex flex-row items-center gap-3.5"> |
| 8 | + <img |
| 9 | + :src="partner?.avatarUrl ?? undefined" |
| 10 | + alt="" |
| 11 | + class="aspect-square size-20 rounded-lg" |
| 12 | + > |
| 13 | + <h2 class="text-xl md:text-2xl/7 font-semibold"> |
| 14 | + {{ partner?.name }} {{ partner?.surname }} |
| 15 | + </h2> |
| 16 | + </div> |
| 17 | + |
| 18 | + <p class="text-base"> |
| 19 | + {{ partner?.priceLevel }} уровень цен |
| 20 | + </p> |
| 21 | + |
| 22 | + <p class="text-base"> |
| 23 | + {{ partner?.city }} |
| 24 | + </p> |
| 25 | + </div> |
| 26 | + </div> |
| 27 | + </UCard> |
| 28 | + |
| 29 | + <UCard class="col-span-1"> |
| 30 | + <div class="flex flex-col gap-2.5"> |
| 31 | + <div class="flex flex-row items-center gap-1.5"> |
| 32 | + <PartnerPrestigeBadge |
| 33 | + :prestige="partner?.prestige ?? 0" |
| 34 | + size="lg" |
| 35 | + class="group-hover:scale-125 duration-200" |
| 36 | + /> |
| 37 | + <h3 class="text-xl md:text-2xl font-semibold"> |
| 38 | + Престиж |
| 39 | + </h3> |
| 40 | + </div> |
| 41 | + <p class="text-muted leading-5"> |
| 42 | + Престиж не является статичным - он может как укрепляться, так и утрачиваться в зависимости от действий Партнера, его достижений и общественного восприятия. |
| 43 | + </p> |
| 44 | + </div> |
| 45 | + </UCard> |
| 46 | + |
| 47 | + <UCard v-if="partner?.legalEntity" class="col-span-2"> |
| 48 | + <div class="flex flex-col gap-2.5"> |
| 49 | + <UIcon name="i-lucide-scale" class="size-16 text-muted/25" /> |
| 50 | + |
| 51 | + <h3 class="text-xl md:text-xl/6 font-semibold"> |
| 52 | + {{ partner.legalEntity.name }} |
21 | 53 | </h3> |
| 54 | + |
| 55 | + <div> |
| 56 | + <p>ИНН {{ partner.legalEntity.inn }}</p> |
| 57 | + <p>ОГРНИП {{ partner.legalEntity.ogrnip }}</p> |
| 58 | + </div> |
| 59 | + |
| 60 | + <p class="text-muted"> |
| 61 | + {{ partner.legalEntity.comment }} |
| 62 | + </p> |
22 | 63 | </div> |
23 | | - <p class="text-muted leading-5"> |
24 | | - Престиж не является статичным - он может как укрепляться, так и утрачиваться в зависимости от действий Партнера, его достижений и общественного восприятия. |
25 | | - </p> |
26 | | - </div> |
27 | | - </div> |
| 64 | + </UCard> |
28 | 65 |
|
29 | | - <div class="flex flex-col items-start gap-2"> |
30 | | - <h2 class="text-xl md:text-3xl font-bold"> |
31 | | - {{ partner?.name }} {{ partner?.surname }} |
32 | | - </h2> |
| 66 | + <UCard |
| 67 | + v-if="partner?.activeAgreement" |
| 68 | + variant="subtle" |
| 69 | + class="col-span-2" |
| 70 | + > |
| 71 | + <div class="flex flex-col gap-3"> |
| 72 | + <div class="flex flex-row items-start gap-3.5"> |
| 73 | + <UIcon name="i-lucide-scroll-text" class="shrink-0 size-16 text-secondary" /> |
33 | 74 |
|
34 | | - <p class="text-lg"> |
35 | | - {{ partner?.legal }} |
36 | | - </p> |
| 75 | + <UProgress |
| 76 | + v-model="agreementProgress" |
| 77 | + size="lg" |
| 78 | + color="secondary" |
| 79 | + status |
| 80 | + /> |
| 81 | + </div> |
37 | 82 |
|
38 | | - <p class="text-base"> |
39 | | - {{ partner?.priceLevel }} уровень цен |
40 | | - </p> |
| 83 | + <h3 class="text-xl md:text-xl/6 font-semibold"> |
| 84 | + Договор №{{ partner.activeAgreement.internalId }} |
| 85 | + </h3> |
| 86 | + |
| 87 | + <div> |
| 88 | + <p v-if="partner.activeAgreement.willEndAt"> |
| 89 | + Заключен до {{ format(new Date(partner.activeAgreement.willEndAt), 'd MMMM yyyy', { locale: ru }) }} |
| 90 | + </p> |
| 91 | + <p>Роялти: {{ partner.activeAgreement.royalty }}%</p> |
| 92 | + <p>Мин. роялти: {{ partner.activeAgreement.minRoyaltyPerMonth }} ₽ / месяц</p> |
| 93 | + |
| 94 | + <p v-if="partner.activeAgreement.marketingFee"> |
| 95 | + Маркетинговый сбор: {{ partner.activeAgreement.marketingFee }}% |
| 96 | + </p> |
| 97 | + <p v-if="partner.activeAgreement.minMarketingFeePerMonth"> |
| 98 | + Мин. маркетинговый сбор: {{ partner.activeAgreement.minMarketingFeePerMonth }} ₽ / месяц |
| 99 | + </p> |
41 | 100 |
|
42 | | - <p class="text-base"> |
43 | | - {{ partner?.city }} |
44 | | - </p> |
| 101 | + <p>Паушальный взнос: {{ partner.activeAgreement.lumpSumPayment }} ₽</p> |
| 102 | + </div> |
| 103 | + |
| 104 | + <p class="text-muted"> |
| 105 | + {{ partner.activeAgreement.comment }} |
| 106 | + </p> |
| 107 | + </div> |
| 108 | + </UCard> |
45 | 109 | </div> |
46 | 110 | </Content> |
47 | 111 | </template> |
48 | 112 |
|
49 | 113 | <script setup lang="ts"> |
| 114 | +import { format } from 'date-fns' |
| 115 | +import { ru } from 'date-fns/locale/ru' |
| 116 | +
|
50 | 117 | const { t } = useI18n() |
51 | 118 | const { params } = useRoute('partner-id') |
52 | 119 |
|
53 | 120 | const partnerStore = usePartnerStore() |
54 | 121 | const partner = computed(() => partnerStore.partners.find((partner) => partner.id === params.id)) |
55 | 122 |
|
| 123 | +const agreementProgress = computed(() => { |
| 124 | + if (!partner.value?.activeAgreement?.willEndAt || !partner.value?.activeAgreement?.concludedAt) { |
| 125 | + return 0 |
| 126 | + } |
| 127 | +
|
| 128 | + const now = new Date() |
| 129 | + const concludedAt = new Date(partner.value.activeAgreement.concludedAt) |
| 130 | + const willEndAt = new Date(partner.value.activeAgreement.willEndAt) |
| 131 | +
|
| 132 | + return Math.floor(100 - ((now.getTime() - concludedAt.getTime()) / (willEndAt.getTime() - concludedAt.getTime())) * 100) |
| 133 | +}) |
| 134 | +
|
56 | 135 | useHead({ |
57 | 136 | title: t('common.partner'), |
58 | 137 | }) |
|
0 commit comments