Implement dues reminder system with monthly payment cycle
Some checks failed
Build And Push Image / docker (push) Failing after 1m10s

- Add API endpoint and email templates for dues reminders
- Change due date calculation from yearly to monthly billing
- Add visual status indicators for overdue and due-soon members
- Enhance member cards with status stripes and styling
This commit is contained in:
2025-08-15 14:39:22 +02:00
parent 7784fab23f
commit 888059a612
7 changed files with 523 additions and 6 deletions

View File

@@ -0,0 +1,138 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dues Payment Reminder - MonacoUSA</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
background: linear-gradient(135deg, #a31515 0%, #d32f2f 100%);
color: white;
padding: 30px;
text-align: center;
border-radius: 10px 10px 0 0;
}
.content {
background: #ffffff;
padding: 30px;
border: 1px solid #ddd;
border-radius: 0 0 10px 10px;
}
.logo {
max-width: 200px;
margin-bottom: 20px;
}
.alert-warning {
background-color: #fff3cd;
border: 1px solid #ffeaa7;
color: #856404;
padding: 15px;
border-radius: 5px;
margin: 20px 0;
}
.member-info {
background: #f8f9fa;
padding: 20px;
border-radius: 5px;
margin: 20px 0;
}
.amount-due {
font-size: 24px;
font-weight: bold;
color: #a31515;
text-align: center;
background: #f8f9fa;
padding: 20px;
border-radius: 5px;
margin: 20px 0;
}
.footer {
text-align: center;
color: #666;
font-size: 14px;
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid #ddd;
}
.btn {
display: inline-block;
background: linear-gradient(135deg, #a31515 0%, #d32f2f 100%);
color: white;
padding: 12px 30px;
text-decoration: none;
border-radius: 5px;
font-weight: bold;
margin: 10px;
}
.btn:hover {
background: linear-gradient(135deg, #8a1212 0%, #b71c1c 100%);
}
</style>
</head>
<body>
<div class="header">
<h1>🏎️ MonacoUSA</h1>
<h2>Annual Dues Payment Reminder</h2>
</div>
<div class="content">
<div class="alert-warning">
<strong>⏰ Payment Due Soon!</strong> Your annual membership dues will be due in {{daysUntilDue}} days.
</div>
<p>Dear {{memberName}},</p>
<p>This is a friendly reminder that your annual MonacoUSA membership dues will be due soon.</p>
<div class="member-info">
<h3>Member Information</h3>
<p><strong>Name:</strong> {{memberName}}</p>
<p><strong>Member ID:</strong> {{memberId}}</p>
<p><strong>Email:</strong> {{memberEmail}}</p>
<p><strong>Member Since:</strong> {{memberSince}}</p>
</div>
<div class="amount-due">
Annual Dues: {{amount}}
<br>
<small style="font-size: 16px; color: #666;">Due Date: {{dueDate}}</small>
</div>
<p>To ensure uninterrupted access to MonacoUSA benefits and avoid any service disruption, please submit your payment before the due date.</p>
<div class="member-info">
<h3>Payment Information</h3>
<p>Membership fee is {{amount}}/yr per person, paid using the IBAN below:</p>
<p><strong>IBAN Euro:</strong> {{paymentIban}}</p>
<p><strong>Account Holder:</strong> {{accountHolder}}</p>
<p><strong>Payment Reference:</strong> {{memberId}} - Annual Dues</p>
</div>
<p><strong>Important:</strong> Please include your member ID ({{memberId}}) in the payment reference to ensure proper credit to your account.</p>
<p>If you have already made your payment, please disregard this reminder. If you have any questions about your membership or payment, please contact us:</p>
<p><strong>Contact Information:</strong></p>
<p>📧 Email: info@monacousa.org</p>
<p>Thank you for your continued membership with MonacoUSA!</p>
<p>Best regards,<br>
The MonacoUSA Team</p>
</div>
<div class="footer">
<p>This is an automated message from MonacoUSA. Please do not reply to this email.</p>
<p>© {{currentYear}} MonacoUSA. All rights reserved.</p>
<p>If you no longer wish to receive these reminders, please contact us at info@monacousa.org</p>
</div>
</body>
</html>

View File

@@ -0,0 +1,160 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Overdue Dues Notice - MonacoUSA</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.header {
background: linear-gradient(135deg, #d32f2f 0%, #f44336 100%);
color: white;
padding: 30px;
text-align: center;
border-radius: 10px 10px 0 0;
}
.content {
background: #ffffff;
padding: 30px;
border: 1px solid #ddd;
border-radius: 0 0 10px 10px;
}
.logo {
max-width: 200px;
margin-bottom: 20px;
}
.alert-danger {
background-color: #f8d7da;
border: 1px solid #f5c6cb;
color: #721c24;
padding: 15px;
border-radius: 5px;
margin: 20px 0;
}
.member-info {
background: #f8f9fa;
padding: 20px;
border-radius: 5px;
margin: 20px 0;
}
.amount-due {
font-size: 24px;
font-weight: bold;
color: #d32f2f;
text-align: center;
background: #ffebee;
padding: 20px;
border-radius: 5px;
margin: 20px 0;
border: 2px solid #f5c6cb;
}
.urgency-notice {
background: #fff3cd;
border: 1px solid #ffeaa7;
color: #856404;
padding: 15px;
border-radius: 5px;
margin: 20px 0;
text-align: center;
font-weight: bold;
}
.footer {
text-align: center;
color: #666;
font-size: 14px;
margin-top: 30px;
padding-top: 20px;
border-top: 1px solid #ddd;
}
.btn {
display: inline-block;
background: linear-gradient(135deg, #d32f2f 0%, #f44336 100%);
color: white;
padding: 15px 35px;
text-decoration: none;
border-radius: 5px;
font-weight: bold;
margin: 10px;
font-size: 16px;
}
.btn:hover {
background: linear-gradient(135deg, #b71c1c 0%, #d32f2f 100%);
}
.consequences {
background: #ffebee;
border-left: 4px solid #f44336;
padding: 15px;
margin: 20px 0;
}
</style>
</head>
<body>
<div class="header">
<h1>🏎️ MonacoUSA</h1>
<h2>⚠️ Overdue Dues Notice</h2>
</div>
<div class="content">
<div class="alert-danger">
<strong>🚨 URGENT: Payment Overdue!</strong> Your annual membership dues are now {{daysOverdue}} days overdue.
</div>
<p>Dear {{memberName}},</p>
<p>This is an urgent notice that your annual MonacoUSA membership dues are now overdue and require immediate payment to avoid service interruption.</p>
<div class="member-info">
<h3>Member Information</h3>
<p><strong>Name:</strong> {{memberName}}</p>
<p><strong>Member ID:</strong> {{memberId}}</p>
<p><strong>Email:</strong> {{memberEmail}}</p>
<p><strong>Member Since:</strong> {{memberSince}}</p>
</div>
<div class="amount-due">
Overdue Amount: {{amount}}
<br>
<small style="font-size: 16px; color: #666;">Original Due Date: {{originalDueDate}}</small>
<br>
<small style="font-size: 14px; color: #d32f2f;">{{daysOverdue}} days overdue</small>
</div>
<div class="member-info">
<h3>Payment Information</h3>
<p>Membership fee is {{amount}}/yr per person, paid using the IBAN below:</p>
<p><strong>IBAN Euro:</strong> {{paymentIban}}</p>
<p><strong>Account Holder:</strong> {{accountHolder}}</p>
<p><strong>Payment Reference:</strong> {{memberId}} - Annual Dues</p>
</div>
<p><strong>Important:</strong> Please include your member ID ({{memberId}}) in the payment reference to ensure proper credit to your account.</p>
<div class="consequences">
<p><strong>Important:</strong> Failure of payment will lead to a revoking of MonacoUSA Member Privileges.</p>
</div>
<p>If you have already submitted payment, please forward your payment confirmation to info@monacousa.org to update your account status.</p>
<p><strong>Questions or Concerns?</strong> Contact us:</p>
<p>📧 Email: info@monacousa.org</p>
<p>We value your membership and hope to resolve this matter promptly.</p>
<p>Best regards,<br>
The MonacoUSA Membership Team</p>
</div>
<div class="footer">
<p>This is an automated notice from MonacoUSA. Please do not reply to this email.</p>
<p>© {{currentYear}} MonacoUSA. All rights reserved.</p>
<p>Please submit your payment to avoid membership suspension.</p>
</div>
</body>
</html>