Skip to content

Commit 86ce935

Browse files
committed
fix: added bank validation to volunteer allowance
1 parent 090b08d commit 86ce935

2 files changed

Lines changed: 28 additions & 11 deletions

File tree

app/(public)/ehrenamtspauschale/[id]/page.tsx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@ import { useParams } from "next/navigation";
1515
import { useState } from "react";
1616
import toast from "react-hot-toast";
1717

18+
const IBAN_REGEX = /^[A-Z]{2}[0-9]{2}[A-Z0-9]{4}[0-9]{7}([A-Z0-9]?){0,16}$/;
19+
const BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/;
20+
21+
const formatIban = (iban: string) =>
22+
iban
23+
.replace(/\s/g, "")
24+
.replace(/(.{4})/g, "$1 ")
25+
.trim();
26+
1827
export default function ExternalEhrenamtspauschalePage() {
1928
const { id } = useParams<{ id: Id<"volunteerAllowance"> }>();
2029

@@ -86,8 +95,10 @@ export default function ExternalEhrenamtspauschalePage() {
8695
if (amount > 840) return toast.error("Maximal 840€ erlaubt");
8796
if (!form.accountHolder)
8897
return toast.error("Bitte den Kontoinhaber eingeben");
89-
if (!form.iban) return toast.error("Bitte die IBAN eingeben");
90-
if (!form.bic) return toast.error("Bitte die BIC eingeben");
98+
const iban = form.iban.replace(/\s/g, "").toUpperCase();
99+
const bic = form.bic.replace(/\s/g, "").toUpperCase();
100+
if (!IBAN_REGEX.test(iban)) return toast.error("Ungültige IBAN");
101+
if (!BIC_REGEX.test(bic)) return toast.error("Ungültige BIC");
91102
if (!form.confirmation)
92103
return toast.error("Bitte die Bestätigung ankreuzen");
93104
if (!signatureStorageId) return toast.error("Bitte unterschreiben");
@@ -97,8 +108,8 @@ export default function ExternalEhrenamtspauschalePage() {
97108
await submitExternal({
98109
id,
99110
amount,
100-
iban: form.iban,
101-
bic: form.bic,
111+
iban,
112+
bic,
102113
accountHolder: form.accountHolder,
103114
activityDescription: form.activityDescription,
104115
startDate: form.startDate,
@@ -277,19 +288,25 @@ export default function ExternalEhrenamtspauschalePage() {
277288
<div>
278289
<Label>IBAN *</Label>
279290
<Input
280-
value={form.iban}
281-
onChange={(event) => updateField("iban", event.target.value)}
291+
value={formatIban(form.iban)}
292+
onChange={(event) =>
293+
updateField("iban", event.target.value.replace(/\s/g, ""))
294+
}
282295
placeholder="DE89 3704 0044 0532 0130 00"
283296
className="font-mono"
297+
maxLength={27}
284298
/>
285299
</div>
286300
<div>
287301
<Label>BIC *</Label>
288302
<Input
289-
value={form.bic}
290-
onChange={(event) => updateField("bic", event.target.value)}
303+
value={form.bic.toUpperCase()}
304+
onChange={(event) =>
305+
updateField("bic", event.target.value.toUpperCase())
306+
}
291307
placeholder="COBADEFFXXX"
292308
className="font-mono"
309+
maxLength={11}
293310
/>
294311
</div>
295312
</div>

app/components/Reimbursements/SignatureCanvas.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ export function SignatureCanvas({
2424
const [uploading, setUploading] = useState(false);
2525

2626
const defaultUploadUrl = useMutation(
27-
api.reimbursements.functions.generateUploadUrl,
27+
api.reimbursements.functions.generateUploadUrl
2828
);
2929
const generateUploadUrl = customUploadUrl || defaultUploadUrl;
3030
const previewUrl = useQuery(
3131
api.reimbursements.queries.getFileUrl,
32-
storageId ? { storageId } : "skip",
32+
storageId ? { storageId } : "skip"
3333
);
3434

3535
const handleSave = async () => {
@@ -80,7 +80,7 @@ export function SignatureCanvas({
8080
<SignaturePad
8181
ref={padRef}
8282
minWidth={2}
83-
maxWidth={4}
83+
maxWidth={3}
8484
canvasProps={{ className: "w-full h-32" }}
8585
/>
8686
</div>

0 commit comments

Comments
 (0)