Feature: Add third price option for plain/blank products

- Added plainPrice field to Product model in Prisma schema
- Updated database to include new plainPrice column
- Added Plain price input field to product creation form (new/page.tsx)
- Added Plain price input field to product edit form ([id]/edit/page.tsx)
- Updated createProduct server action to handle plainPrice
- Updated updateProduct server action to handle plainPrice

Now supports three price tiers:
- basePrice: for ready-made items
- plainPrice: for plain/blank items (new)
- personalisedPrice: for made-to-order items

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Andymick
2026-07-20 18:00:06 +01:00
co-authored by Claude Haiku 4.5
parent efa0bfa03e
commit e5fb22aab1
5 changed files with 78 additions and 35 deletions
+5
View File
@@ -67,6 +67,7 @@ export async function createProduct(formData: FormData) {
const category = String(formData.get('category') ?? '');
const description = String(formData.get('description') ?? '').trim();
const priceDollars = Number(formData.get('price') ?? 0);
const plainPriceDollars = String(formData.get('plainPrice') ?? '').trim();
const personalisedPriceDollars = String(formData.get('personalisedPrice') ?? '').trim();
const mockup = String(formData.get('mockup') ?? 'tshirt');
const colorsInput = String(formData.get('colors') ?? '');
@@ -135,6 +136,7 @@ export async function createProduct(formData: FormData) {
category,
description: description || `${name} — personalize it your way.`,
basePrice: Math.round(priceDollars * 100),
plainPrice: plainPriceDollars ? Math.round(Number(plainPriceDollars) * 100) : null,
personalisedPrice: personalisedPriceDollars ? Math.round(Number(personalisedPriceDollars) * 100) : null,
weightGrams,
...saleFields,
@@ -163,6 +165,7 @@ export async function updateProduct(formData: FormData) {
const category = String(formData.get('category') ?? '');
const description = String(formData.get('description') ?? '').trim();
const priceDollars = Number(formData.get('price') ?? 0);
const plainPriceDollars = String(formData.get('plainPrice') ?? '').trim();
const personalisedPriceDollars = String(formData.get('personalisedPrice') ?? '').trim();
const mockup = String(formData.get('mockup') ?? 'tshirt');
const colorsInput = String(formData.get('colors') ?? '');
@@ -252,6 +255,7 @@ export async function updateProduct(formData: FormData) {
category: string;
description: string;
basePrice: number;
plainPrice: number | null;
personalisedPrice: number | null;
salePrice: number | null;
saleStartsAt: Date | null;
@@ -276,6 +280,7 @@ export async function updateProduct(formData: FormData) {
category,
description: description || `${name} — personalize it your way.`,
basePrice: Math.round(priceDollars * 100),
plainPrice: plainPriceDollars ? Math.round(Number(plainPriceDollars) * 100) : null,
personalisedPrice: personalisedPriceDollars ? Math.round(Number(personalisedPriceDollars) * 100) : null,
...parseSaleFields(formData),
colors: JSON.stringify(colors),