fixes
Build And Push Image / docker (push) Failing after 1m6s Details

This commit is contained in:
Matt 2025-08-15 14:48:19 +02:00
parent 888059a612
commit a8022d8fb3
2 changed files with 53 additions and 17 deletions

View File

@ -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%;
} }

View File

@ -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({