diff --git a/src/assets/images/fakers/food-beverage-1.jpg b/src/assets/images/fakers/food-beverage-1.jpg deleted file mode 100755 index 547586c..0000000 Binary files a/src/assets/images/fakers/food-beverage-1.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-10.jpg b/src/assets/images/fakers/food-beverage-10.jpg deleted file mode 100755 index b860fcc..0000000 Binary files a/src/assets/images/fakers/food-beverage-10.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-11.jpg b/src/assets/images/fakers/food-beverage-11.jpg deleted file mode 100755 index 8136d3b..0000000 Binary files a/src/assets/images/fakers/food-beverage-11.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-12.jpg b/src/assets/images/fakers/food-beverage-12.jpg deleted file mode 100755 index dc18308..0000000 Binary files a/src/assets/images/fakers/food-beverage-12.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-13.jpg b/src/assets/images/fakers/food-beverage-13.jpg deleted file mode 100755 index 2daf94d..0000000 Binary files a/src/assets/images/fakers/food-beverage-13.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-14.jpg b/src/assets/images/fakers/food-beverage-14.jpg deleted file mode 100755 index 53ab2f9..0000000 Binary files a/src/assets/images/fakers/food-beverage-14.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-15.jpg b/src/assets/images/fakers/food-beverage-15.jpg deleted file mode 100755 index a78064a..0000000 Binary files a/src/assets/images/fakers/food-beverage-15.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-16.jpg b/src/assets/images/fakers/food-beverage-16.jpg deleted file mode 100755 index 39282a9..0000000 Binary files a/src/assets/images/fakers/food-beverage-16.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-17.jpg b/src/assets/images/fakers/food-beverage-17.jpg deleted file mode 100755 index 8ad5e92..0000000 Binary files a/src/assets/images/fakers/food-beverage-17.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-18.jpg b/src/assets/images/fakers/food-beverage-18.jpg deleted file mode 100755 index 70f6ba7..0000000 Binary files a/src/assets/images/fakers/food-beverage-18.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-19.jpg b/src/assets/images/fakers/food-beverage-19.jpg deleted file mode 100755 index b76b335..0000000 Binary files a/src/assets/images/fakers/food-beverage-19.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-2.jpg b/src/assets/images/fakers/food-beverage-2.jpg deleted file mode 100755 index c49f8d1..0000000 Binary files a/src/assets/images/fakers/food-beverage-2.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-3.jpg b/src/assets/images/fakers/food-beverage-3.jpg deleted file mode 100755 index 9d027e1..0000000 Binary files a/src/assets/images/fakers/food-beverage-3.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-4.jpg b/src/assets/images/fakers/food-beverage-4.jpg deleted file mode 100755 index 94579c6..0000000 Binary files a/src/assets/images/fakers/food-beverage-4.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-5.jpg b/src/assets/images/fakers/food-beverage-5.jpg deleted file mode 100755 index ddf354f..0000000 Binary files a/src/assets/images/fakers/food-beverage-5.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-6.jpg b/src/assets/images/fakers/food-beverage-6.jpg deleted file mode 100755 index efe41d6..0000000 Binary files a/src/assets/images/fakers/food-beverage-6.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-7.jpg b/src/assets/images/fakers/food-beverage-7.jpg deleted file mode 100755 index 7ce9373..0000000 Binary files a/src/assets/images/fakers/food-beverage-7.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-8.jpg b/src/assets/images/fakers/food-beverage-8.jpg deleted file mode 100755 index 70ce8da..0000000 Binary files a/src/assets/images/fakers/food-beverage-8.jpg and /dev/null differ diff --git a/src/assets/images/fakers/food-beverage-9.jpg b/src/assets/images/fakers/food-beverage-9.jpg deleted file mode 100755 index ff4e94b..0000000 Binary files a/src/assets/images/fakers/food-beverage-9.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-1.jpg b/src/assets/images/fakers/preview-1.jpg deleted file mode 100755 index e303cc2..0000000 Binary files a/src/assets/images/fakers/preview-1.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-10.jpg b/src/assets/images/fakers/preview-10.jpg deleted file mode 100755 index c0b6e3f..0000000 Binary files a/src/assets/images/fakers/preview-10.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-11.jpg b/src/assets/images/fakers/preview-11.jpg deleted file mode 100755 index 3f2ef43..0000000 Binary files a/src/assets/images/fakers/preview-11.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-12.jpg b/src/assets/images/fakers/preview-12.jpg deleted file mode 100755 index e88dcf2..0000000 Binary files a/src/assets/images/fakers/preview-12.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-13.jpg b/src/assets/images/fakers/preview-13.jpg deleted file mode 100755 index 348cbfe..0000000 Binary files a/src/assets/images/fakers/preview-13.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-14.jpg b/src/assets/images/fakers/preview-14.jpg deleted file mode 100755 index da2cf26..0000000 Binary files a/src/assets/images/fakers/preview-14.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-15.jpg b/src/assets/images/fakers/preview-15.jpg deleted file mode 100755 index 61008f8..0000000 Binary files a/src/assets/images/fakers/preview-15.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-2.jpg b/src/assets/images/fakers/preview-2.jpg deleted file mode 100755 index b709fe7..0000000 Binary files a/src/assets/images/fakers/preview-2.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-3.jpg b/src/assets/images/fakers/preview-3.jpg deleted file mode 100755 index 3c7c5fa..0000000 Binary files a/src/assets/images/fakers/preview-3.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-4.jpg b/src/assets/images/fakers/preview-4.jpg deleted file mode 100755 index ddd80c8..0000000 Binary files a/src/assets/images/fakers/preview-4.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-5.jpg b/src/assets/images/fakers/preview-5.jpg deleted file mode 100755 index 736a6bd..0000000 Binary files a/src/assets/images/fakers/preview-5.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-6.jpg b/src/assets/images/fakers/preview-6.jpg deleted file mode 100755 index d696a88..0000000 Binary files a/src/assets/images/fakers/preview-6.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-7.jpg b/src/assets/images/fakers/preview-7.jpg deleted file mode 100755 index d43746a..0000000 Binary files a/src/assets/images/fakers/preview-7.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-8.jpg b/src/assets/images/fakers/preview-8.jpg deleted file mode 100755 index 9bd6b3a..0000000 Binary files a/src/assets/images/fakers/preview-8.jpg and /dev/null differ diff --git a/src/assets/images/fakers/preview-9.jpg b/src/assets/images/fakers/preview-9.jpg deleted file mode 100755 index 2df7b9c..0000000 Binary files a/src/assets/images/fakers/preview-9.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-1.jpg b/src/assets/images/fakers/profile-1.jpg deleted file mode 100755 index 766ead5..0000000 Binary files a/src/assets/images/fakers/profile-1.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-10.jpg b/src/assets/images/fakers/profile-10.jpg deleted file mode 100755 index c8cfd39..0000000 Binary files a/src/assets/images/fakers/profile-10.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-11.jpg b/src/assets/images/fakers/profile-11.jpg deleted file mode 100755 index 345e72e..0000000 Binary files a/src/assets/images/fakers/profile-11.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-12.jpg b/src/assets/images/fakers/profile-12.jpg deleted file mode 100755 index 0f1549e..0000000 Binary files a/src/assets/images/fakers/profile-12.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-13.jpg b/src/assets/images/fakers/profile-13.jpg deleted file mode 100755 index 825cfc2..0000000 Binary files a/src/assets/images/fakers/profile-13.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-14.jpg b/src/assets/images/fakers/profile-14.jpg deleted file mode 100755 index c398c6a..0000000 Binary files a/src/assets/images/fakers/profile-14.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-15.jpg b/src/assets/images/fakers/profile-15.jpg deleted file mode 100755 index 0a8a04e..0000000 Binary files a/src/assets/images/fakers/profile-15.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-2.jpg b/src/assets/images/fakers/profile-2.jpg deleted file mode 100755 index 262fdd3..0000000 Binary files a/src/assets/images/fakers/profile-2.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-3.jpg b/src/assets/images/fakers/profile-3.jpg deleted file mode 100755 index bc46fce..0000000 Binary files a/src/assets/images/fakers/profile-3.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-4.jpg b/src/assets/images/fakers/profile-4.jpg deleted file mode 100755 index ffa5e24..0000000 Binary files a/src/assets/images/fakers/profile-4.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-5.jpg b/src/assets/images/fakers/profile-5.jpg deleted file mode 100755 index 953420d..0000000 Binary files a/src/assets/images/fakers/profile-5.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-6.jpg b/src/assets/images/fakers/profile-6.jpg deleted file mode 100755 index ebf71d9..0000000 Binary files a/src/assets/images/fakers/profile-6.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-7.jpg b/src/assets/images/fakers/profile-7.jpg deleted file mode 100755 index b7f8cea..0000000 Binary files a/src/assets/images/fakers/profile-7.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-8.jpg b/src/assets/images/fakers/profile-8.jpg deleted file mode 100755 index 6caf684..0000000 Binary files a/src/assets/images/fakers/profile-8.jpg and /dev/null differ diff --git a/src/assets/images/fakers/profile-9.jpg b/src/assets/images/fakers/profile-9.jpg deleted file mode 100755 index c5104d3..0000000 Binary files a/src/assets/images/fakers/profile-9.jpg and /dev/null differ diff --git a/src/assets/images/logo-original.svg b/src/assets/images/logo-original.svg new file mode 100644 index 0000000..9fa3c6a --- /dev/null +++ b/src/assets/images/logo-original.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + KOPERASI PERMODALAN KELANTAN BERHAD + + + diff --git a/src/modules/external-system/data/dummy-external-systems.ts b/src/modules/external-system/data/dummy-external-systems.ts index 380a3fb..f9ae832 100644 --- a/src/modules/external-system/data/dummy-external-systems.ts +++ b/src/modules/external-system/data/dummy-external-systems.ts @@ -3,7 +3,7 @@ import type { ExternalSystem } from '../types/external-system.types' export const dummyExternalSystems: ExternalSystem[] = [ { id: 'ext-001', - code: 'KOPKB-PORTAL', + code: 'portal-mykopkb', name: 'Portal Ahli KOPKB', description: 'Sistem utama keahlian Koperasi Permodalan Kelantan Berhad untuk semakan dividen, penyata dan maklumat ahli.', @@ -13,15 +13,15 @@ export const dummyExternalSystems: ExternalSystem[] = [ starts_at: '2026-01-01T00:00:00+08:00', ends_at: null, opens_in_new_tab: true, - contact_email: 'sokongan@koppkb.com', + contact_email: 'dev_kopkb@gmail.com', notes: 'Log masuk menggunakan e-mel berdaftar ahli KOPKB.', created_at: '2026-01-15T09:00:00+08:00', updated_at: '2026-06-01T14:30:00+08:00', }, { id: 'ext-002', - code: 'AGM-VOTE', - name: 'Sistem Pengundian AGM', + code: 'e-vote', + name: 'Sistem Pengundian AGM KOPKB', description: 'Platform pengundian dalam talian untuk Mesyuarat Agung Tahunan. Hanya tersedia semasa tempoh pengundian.', url: 'https://e-vote.erahn.com.my/login', @@ -30,7 +30,7 @@ export const dummyExternalSystems: ExternalSystem[] = [ starts_at: '2026-05-01T08:00:00+08:00', ends_at: null, opens_in_new_tab: true, - contact_email: 'agm@koppkb.com', + contact_email: 'dev_kopkb@gmail.com', notes: 'Sila lengkapkan profil sebelum mengundi.', created_at: '2026-05-20T10:00:00+08:00', updated_at: '2026-06-28T11:15:00+08:00', diff --git a/src/modules/membership-application/pages/MembershipApplicationDetail.vue b/src/modules/membership-application/pages/MembershipApplicationDetail.vue index 58651fa..9dd5694 100644 --- a/src/modules/membership-application/pages/MembershipApplicationDetail.vue +++ b/src/modules/membership-application/pages/MembershipApplicationDetail.vue @@ -93,6 +93,8 @@ const previewUrl = ref(null) const previewDocument = ref(null) const boardMeetingReference = ref('') const boardMeetingReferenceError = ref(null) +const boardMeetingDate = ref(dayjs().format('YYYY-MM-DD')) +const boardMeetingDateError = ref(null) const deleteConfirmDialogOpen = ref(false) const pendingDeleteDocument = ref(null) @@ -372,6 +374,8 @@ function openConfirmAction( if (action.type === 'complete') { boardMeetingReference.value = '' boardMeetingReferenceError.value = null + boardMeetingDate.value = dayjs().format('YYYY-MM-DD') + boardMeetingDateError.value = null } pendingAction.value = action @@ -383,6 +387,8 @@ function closeConfirmDialog() { pendingAction.value = null boardMeetingReference.value = '' boardMeetingReferenceError.value = null + boardMeetingDate.value = dayjs().format('YYYY-MM-DD') + boardMeetingDateError.value = null } async function confirmPendingAction() { @@ -391,6 +397,7 @@ async function confirmPendingAction() { error.value = null successMessage.value = null boardMeetingReferenceError.value = null + boardMeetingDateError.value = null if (pendingAction.value.type === 'complete') { const reference = boardMeetingReference.value.trim() @@ -398,6 +405,10 @@ async function confirmPendingAction() { boardMeetingReferenceError.value = 'Rujukan mesyuarat lembaga diperlukan.' return } + if (!boardMeetingDate.value) { + boardMeetingDateError.value = 'Tarikh mesyuarat lembaga diperlukan.' + return + } completeSubmitting.value = true } else { reviewSubmitting.value = true @@ -421,6 +432,7 @@ async function confirmPendingAction() { } else { response = await completeMembershipApplication(applicationId.value, { board_meeting_reference: boardMeetingReference.value.trim(), + board_meeting_date: boardMeetingDate.value, }) } @@ -436,6 +448,9 @@ async function confirmPendingAction() { if (validationErrors?.board_meeting_reference?.[0]) { boardMeetingReferenceError.value = validationErrors.board_meeting_reference[0] } + if (validationErrors?.board_meeting_date?.[0]) { + boardMeetingDateError.value = validationErrors.board_meeting_date[0] + } } finally { reviewSubmitting.value = false completeSubmitting.value = false @@ -1003,6 +1018,12 @@ onUnmounted(() => { @input="boardMeetingReferenceError = null" /> {{ boardMeetingReferenceError }} + + Tarikh Mesyuarat Lembaga + + {{ boardMeetingDateError }} +
diff --git a/src/modules/membership-application/pages/MembershipApplicationList.vue b/src/modules/membership-application/pages/MembershipApplicationList.vue index 84b4f46..ba8da7b 100644 --- a/src/modules/membership-application/pages/MembershipApplicationList.vue +++ b/src/modules/membership-application/pages/MembershipApplicationList.vue @@ -110,6 +110,8 @@ const batchSuccessMessage = ref(null) const batchFailedItems = ref([]) const boardMeetingReference = ref('') const boardMeetingReferenceError = ref(null) +const boardMeetingDate = ref(dayjs().format('YYYY-MM-DD')) +const boardMeetingDateError = ref(null) const downloadingResultLetterId = ref(null) const selectableApplications = computed(() => @@ -162,6 +164,8 @@ function openBatchConfirm() { if (!selectedIds.value.length) return boardMeetingReference.value = '' boardMeetingReferenceError.value = null + boardMeetingDate.value = dayjs().format('YYYY-MM-DD') + boardMeetingDateError.value = null batchConfirmOpen.value = true } @@ -173,15 +177,23 @@ async function confirmBatchComplete() { boardMeetingReferenceError.value = 'Rujukan mesyuarat lembaga diperlukan.' return } + if (!boardMeetingDate.value) { + boardMeetingDateError.value = 'Tarikh mesyuarat lembaga diperlukan.' + return + } batchSubmitting.value = true batchSuccessMessage.value = null batchFailedItems.value = [] boardMeetingReferenceError.value = null + boardMeetingDateError.value = null error.value = null try { - const response = await batchCompleteMembershipApplications(selectedIds.value, reference) + const response = await batchCompleteMembershipApplications(selectedIds.value, { + board_meeting_reference: reference, + board_meeting_date: boardMeetingDate.value, + }) if (response.success) { batchSuccessMessage.value = response.message @@ -200,6 +212,7 @@ async function confirmBatchComplete() { error.value = responseData.message ?? getApiErrorMessage(err, 'Gagal menyelesaikan permohonan.') const validationErrors = getApiValidationErrors(err) boardMeetingReferenceError.value = validationErrors?.board_meeting_reference?.[0] ?? null + boardMeetingDateError.value = validationErrors?.board_meeting_date?.[0] ?? null } else { error.value = getApiErrorMessage(err, 'Gagal menyelesaikan permohonan.') } @@ -245,30 +258,6 @@ function goToApplicationEdit(id: string) { router.push({ name: 'edit-membership-application', params: { id } }) } -function canDownloadLetter(item: MembershipApplicationListItem): boolean { - return !!item.has_result_letter && !!item.result_letter_document -} - -async function handleDownloadResultLetter(item: MembershipApplicationListItem) { - const document = item.result_letter_document - if (!document) return - - downloadingResultLetterId.value = item.id - - try { - await downloadMembershipApplicationDocument( - item.id, - document.id, - document.name, - document.mime_type, - ) - } catch (err) { - error.value = getApiErrorMessage(err, 'Gagal memuat turun surat keputusan.') - } finally { - downloadingResultLetterId.value = null - } -} - const headers = computed(() => { const base: TableHeader[] = [ { title: 'Bil.', key: '#', sortable: false }, @@ -450,12 +439,6 @@ const headers = computed(() => { @click="goToApplicationEdit((item as MembershipApplicationListItem).id)">
@@ -475,6 +458,12 @@ const headers = computed(() => { @input="boardMeetingReferenceError = null" /> {{ boardMeetingReferenceError }} + + Tarikh Mesyuarat Lembaga + + {{ boardMeetingDateError }} +
diff --git a/src/modules/membership-application/services/membership-application.service.ts b/src/modules/membership-application/services/membership-application.service.ts index 40a685e..be08142 100644 --- a/src/modules/membership-application/services/membership-application.service.ts +++ b/src/modules/membership-application/services/membership-application.service.ts @@ -225,13 +225,13 @@ export async function completeMembershipApplication( export async function batchCompleteMembershipApplications( applicationIds: string[], - boardMeetingReference: string, + payload: GenerateResultLetterPayload, ): Promise { const { data } = await api.post( '/v1/membership-applications/batch-complete', { application_ids: applicationIds, - board_meeting_reference: boardMeetingReference, + ...payload, }, ) diff --git a/src/modules/membership-application/types/membership-application.types.ts b/src/modules/membership-application/types/membership-application.types.ts index fd3b416..db8981b 100644 --- a/src/modules/membership-application/types/membership-application.types.ts +++ b/src/modules/membership-application/types/membership-application.types.ts @@ -245,6 +245,7 @@ export type BatchCompleteResponse = { export interface GenerateResultLetterPayload { board_meeting_reference: string + board_meeting_date: string } export type GenerateResultLetterResponse = { diff --git a/src/modules/profile/components/MemberDigitalCardBack.vue b/src/modules/profile/components/MemberDigitalCardBack.vue index bc49c86..c8fbd35 100644 --- a/src/modules/profile/components/MemberDigitalCardBack.vue +++ b/src/modules/profile/components/MemberDigitalCardBack.vue @@ -1,7 +1,7 @@