fixes
Build And Push Image / docker (push) Failing after 1m6s
Details
Build And Push Image / docker (push) Failing after 1m6s
Details
This commit is contained in:
parent
888059a612
commit
a8022d8fb3
|
|
@ -1,16 +1,16 @@
|
||||||
<template>
|
<template>
|
||||||
<v-banner
|
<v-banner
|
||||||
v-if="showBanner"
|
v-if="showBanner"
|
||||||
color="warning"
|
:color="isOverdue ? 'error' : 'warning'"
|
||||||
icon="mdi-alert-circle"
|
:icon="isOverdue ? 'mdi-alert-octagon' : 'mdi-alert-circle'"
|
||||||
sticky
|
sticky
|
||||||
class="dues-payment-banner"
|
:class="['dues-payment-banner', { 'overdue-banner': isOverdue }]"
|
||||||
>
|
>
|
||||||
<template #text>
|
<template #text>
|
||||||
<div class="banner-content">
|
<div class="banner-content">
|
||||||
<div class="text-h6 font-weight-bold mb-2">
|
<div class="text-h6 font-weight-bold mb-2">
|
||||||
<v-icon left>mdi-credit-card-alert</v-icon>
|
<v-icon left>{{ isOverdue ? 'mdi-alert-octagon' : 'mdi-credit-card-alert' }}</v-icon>
|
||||||
Membership Dues Payment Required
|
{{ isOverdue ? '🚨 URGENT: Overdue Dues Payment' : 'Membership Dues Payment Required' }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="text-body-1 mb-3">
|
<div class="text-body-1 mb-3">
|
||||||
|
|
@ -209,8 +209,27 @@ const isPaymentOverOneYear = computed(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if dues need to be paid (either overdue or in grace period)
|
* Check if dues are coming due within 30 days
|
||||||
* Banner should show when payment is needed
|
*/
|
||||||
|
const isDueSoon = computed(() => {
|
||||||
|
if (!memberData.value?.payment_due_date) return false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const dueDate = new Date(memberData.value.payment_due_date);
|
||||||
|
const today = new Date();
|
||||||
|
const diffTime = dueDate.getTime() - today.getTime();
|
||||||
|
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
||||||
|
|
||||||
|
// Show banner if due within 30 days (including overdue)
|
||||||
|
return diffDays <= 30;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if dues need to be paid (either coming due soon or overdue)
|
||||||
|
* Banner should show when payment is needed within 30 days
|
||||||
*/
|
*/
|
||||||
const needsPayment = computed(() => {
|
const needsPayment = computed(() => {
|
||||||
if (!memberData.value) return false;
|
if (!memberData.value) return false;
|
||||||
|
|
@ -219,9 +238,9 @@ const needsPayment = computed(() => {
|
||||||
const paymentTooOld = isPaymentOverOneYear.value;
|
const paymentTooOld = isPaymentOverOneYear.value;
|
||||||
|
|
||||||
// Show banner if:
|
// Show banner if:
|
||||||
// 1. Dues are not currently paid (regardless of grace period)
|
// 1. Dues are coming due within 30 days AND not currently paid
|
||||||
// 2. OR payment is over 1 year old (even if marked as paid)
|
// 2. OR payment is over 1 year old (even if marked as paid)
|
||||||
return !duesCurrentlyPaid || paymentTooOld;
|
return (isDueSoon.value && !duesCurrentlyPaid) || paymentTooOld;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Computed properties
|
// Computed properties
|
||||||
|
|
@ -241,16 +260,23 @@ const daysRemaining = computed(() => {
|
||||||
const diffTime = dueDate.getTime() - today.getTime();
|
const diffTime = dueDate.getTime() - today.getTime();
|
||||||
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
|
||||||
|
|
||||||
return Math.max(0, diffDays);
|
return diffDays; // Allow negative values for overdue
|
||||||
|
});
|
||||||
|
|
||||||
|
const isOverdue = computed(() => {
|
||||||
|
return daysRemaining.value < 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
const paymentMessage = computed(() => {
|
const paymentMessage = computed(() => {
|
||||||
if (daysRemaining.value > 30) {
|
if (isOverdue.value) {
|
||||||
return `Your annual membership dues of €${config.value.membershipFee} are due in ${daysRemaining.value} days.`;
|
const overdueDays = Math.abs(daysRemaining.value);
|
||||||
} else if (daysRemaining.value > 0) {
|
return `Your annual membership dues of €${config.value.membershipFee} are ${overdueDays} day${overdueDays !== 1 ? 's' : ''} overdue. Immediate payment is required to avoid account suspension.`;
|
||||||
|
} else if (daysRemaining.value <= 7) {
|
||||||
|
return `Your annual membership dues of €${config.value.membershipFee} are due in ${daysRemaining.value} days. Please pay immediately to avoid late fees.`;
|
||||||
|
} else if (daysRemaining.value <= 30) {
|
||||||
return `Your annual membership dues of €${config.value.membershipFee} are due in ${daysRemaining.value} days. Please pay soon to avoid account suspension.`;
|
return `Your annual membership dues of €${config.value.membershipFee} are due in ${daysRemaining.value} days. Please pay soon to avoid account suspension.`;
|
||||||
} else {
|
} else {
|
||||||
return `Your annual membership dues of €${config.value.membershipFee} are overdue. Your account may be suspended soon.`;
|
return `Your annual membership dues of €${config.value.membershipFee} are due in ${daysRemaining.value} days.`;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -387,6 +413,17 @@ onMounted(() => {
|
||||||
border-left: 4px solid #ff9800;
|
border-left: 4px solid #ff9800;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dues-payment-banner.overdue-banner {
|
||||||
|
border-left: 4px solid #f44336;
|
||||||
|
animation: pulse-border 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse-border {
|
||||||
|
0% { border-left-color: #f44336; }
|
||||||
|
50% { border-left-color: #ff5252; }
|
||||||
|
100% { border-left-color: #f44336; }
|
||||||
|
}
|
||||||
|
|
||||||
.banner-content {
|
.banner-content {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { sendEmail } from '~/server/utils/email';
|
import { sendEmail } from '~/server/utils/email';
|
||||||
import { createNocoDBClient } from '~/server/utils/nocodb';
|
import { getMemberById } from '~/server/utils/nocodb';
|
||||||
import { calculateDaysUntilDue, calculateOverdueDays, getNextDuesDate, isPaymentOverOneYear, isDuesActuallyCurrent } from '~/utils/dues-calculations';
|
import { calculateDaysUntilDue, calculateOverdueDays, getNextDuesDate, isPaymentOverOneYear, isDuesActuallyCurrent } from '~/utils/dues-calculations';
|
||||||
import { getRegistrationConfig } from '~/server/utils/admin-config';
|
import { getRegistrationConfig } from '~/server/utils/admin-config';
|
||||||
|
|
||||||
|
|
@ -23,8 +23,7 @@ export default defineEventHandler(async (event) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get member data
|
// Get member data
|
||||||
const nocodb = createNocoDBClient();
|
const member = await getMemberById(memberId);
|
||||||
const member = await nocodb.findOne('nc_members', memberId);
|
|
||||||
|
|
||||||
if (!member) {
|
if (!member) {
|
||||||
throw createError({
|
throw createError({
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue