DONE: settle disable vote for voter with saham under 500, fix issue on...

This commit is contained in:
ISMAIL MASSERAN
2026-04-19 07:52:11 +00:00
parent ed369aec46
commit f5b831a857
9 changed files with 285 additions and 24 deletions
@@ -63,6 +63,15 @@
</div>
</div>
<div v-if="showSahamVoteBlockedMessage" class="row home-saham-block-row">
<div class="col-xs-12">
<div class="alert alert-warning home-saham-block-alert" role="alert">
<span class="home-saham-block-icon" aria-hidden="true"><i class="fa fa-exclamation-triangle"></i></span>
<span>{{ sahamVoteBlockedMessage }}</span>
</div>
</div>
</div>
<div class="row home-content-row">
<div class="col-xs-12 col-md-6 home-column home-column--primary">
<div class="home-section-container">
@@ -198,6 +207,26 @@ export default {
return Boolean(u.fizikal_registration_verified_at);
},
/** Saham (RM) must be at least 500 to vote — see Voter model `saham`. */
canVoteBySaham() {
const s = Number(this.data?.user?.saham);
return !Number.isNaN(s) && s >= 500;
},
showSahamVoteBlockedMessage() {
const election = this.data?.election || {};
return (
Number(election.status) === 2 &&
!this.hasVoted() &&
this.canProceedToVote &&
!this.canVoteBySaham
);
},
sahamVoteBlockedMessage() {
return "Undian tidak tersedia: jumlah saham anda mestilah sekurang-kurangnya RM 500.";
},
quickLinks() {
const user = this.data?.user || {};
const election = this.data?.election || {};
@@ -235,7 +264,8 @@ export default {
if (
Number(election.status) === 2 &&
!this.hasVoted() &&
this.canProceedToVote
this.canProceedToVote &&
this.canVoteBySaham
) {
links.push({
key: "vote",
@@ -273,8 +303,14 @@ export default {
return links;
},
/**
* Tunai: kehadiran Fizikal, dan sama ada sudah mengundi atau tidak layak mengundi
* (saham < RM500) tetapi kehadiran/tetapan mesyuarat sudah memenuhi syarat — masih boleh tuntut elaun.
*/
canGenerateClaimCode() {
return Number(this.data?.user?.kehadiran) === 1 && this.hasVoted();
if (Number(this.data?.user?.kehadiran) !== 1) return false;
if (this.hasVoted()) return true;
return this.canProceedToVote && !this.canVoteBySaham;
},
kehadiranLabel() {
@@ -602,6 +638,28 @@ export default {
padding-top: 4px;
}
.home-saham-block-row {
margin-left: 0;
margin-right: 0;
margin-bottom: 8px;
}
.home-saham-block-alert {
margin-bottom: 0;
border-radius: 14px;
display: flex;
align-items: flex-start;
gap: 12px;
font-size: 1.3rem;
line-height: 1.5;
}
.home-saham-block-icon {
flex-shrink: 0;
font-size: 1.5rem;
padding-top: 2px;
}
.home-quick-links-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));