Skip to content
Snippets Groups Projects
Commit ee98de85 authored by Aaron Dötsch's avatar Aaron Dötsch
Browse files

Add bulk create voucher option

parent 289d4ad9
Branches
No related tags found
No related merge requests found
......@@ -108,3 +108,28 @@ export async function editVoucher(id, code, amount, activated, expiresAt){
}
});
}
function generateRandomString(forbidden=new Set(), length=14, chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"){
let result = "";
for(let i = 0; i < length; i++){
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
if(forbidden.has(result)) return generateRandomString(length, chars, forbidden);
else return result;
}
export async function bulkCreateVouchers(amount, value, expiresAt){
const existingCodes = new Set((await db.voucher.findMany({select: {code: true}})).map(voucher => voucher.code));
const codes = [];
for(let i = 0; i < amount; i++){
const code = generateRandomString(existingCodes);
existingCodes.add(code);
codes.push(code);
}
return db.$transaction(codes.map(code => db.voucher.create({
data: {
code,
amount: value,
expiresAt
}
})));
}
import { createVoucher, editVoucher, getVouchers } from "../api/transactions"
import { bulkCreateVouchers, createVoucher, editVoucher, getVouchers } from "../api/transactions"
export const load = async ()=>{
const vouchers = await getVouchers();
......@@ -28,5 +28,16 @@ export const actions = {
if(!id || !code || !amount || Number.isNaN(amount) || amount < 0 || isNaN(expiresDate)) return { error: "Invalid form data" };
const voucher = await editVoucher(id, code, amount, active, expiresDate);
return { voucher };
},
bulk: async event => {
const data = await event.request.formData();
const amount = parseInt(data.get('amount'));
const value = parseInt(data.get('value'));
const expiresAt = data.get('expiresAt');
const expiresDate = expiresAt ? new Date(expiresAt) : null;
if(!amount || !value || Number.isNaN(amount) || Number.isNaN(value) || amount < 1 || value < 1 || isNaN(expiresDate)) return { error: "Invalid form data" };
if(expiresDate && expiresDate < Date.now()) return { error: "Expiration date must be in the future" };
const vouchers = await bulkCreateVouchers(amount, value, expiresDate);
return { vouchers };
}
};
......@@ -5,6 +5,7 @@
export let vouchers;
let edit = vouchers.map(() => false);
let lastBulkCreated = [];
</script>
<table>
......@@ -74,3 +75,34 @@
}
};
}}></form>
<h3>Bulk Create</h3>
<form method="post" action="?/bulk" use:enhance={({form, data, cancel})=>{
const expiresAt = data.get("expiresAt");
if(expiresAt){
data.set("expiresAt", new Date(expiresAt).toISOString());
}
return async ({result})=>{
if(result.data?.vouchers){
form.reset();
vouchers = [...vouchers, ...result.data.vouchers];
edit = [...edit, ...result.data.vouchers.map(() => false)];
lastBulkCreated = result.data.vouchers;
addMessage(MessageType.SUCCESS, "Gutscheine wurden erstellt");
}else{
addMessage(MessageType.ERROR, "Gutscheine konnten nicht erstellt werden");
console.error(result);
}
}
}}>
<label>Anzahl: <input name="amount" type="number" step="1" min="1" required /></label><br>
<label>Wert: <input name="value" type="number" step="1" min="1" required /></label><br>
<label>Gültig bis: <input name="expiresAt" type="datetime-local" /></label><br>
<button type="submit">Erstellen</button>
</form>
{#if lastBulkCreated.length > 0}
<button on:click={()=>{
navigator.clipboard.writeText(lastBulkCreated.map(voucher => voucher.code).join("\n"));
addMessage(MessageType.SUCCESS, "Codes wurden kopiert");
}}>Codes kopieren</button>
{/if}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment