diff --git a/prisma/migrations/20240225042831_create_recurring_transactions/migration.sql b/prisma/migrations/20240225042831_create_recurring_transactions/migration.sql new file mode 100644 index 00000000..ab57954c --- /dev/null +++ b/prisma/migrations/20240225042831_create_recurring_transactions/migration.sql @@ -0,0 +1,16 @@ +-- CreateTable +CREATE TABLE "RecurringTransactions" ( + "groupId" VARCHAR(255) NOT NULL, + "expenseId" VARCHAR(255) NOT NULL, + "createNextAt" INT NOT NULL, + "lockId" VARCHAR(255) DEFAULT NULL, + + CONSTRAINT "RecurringTransactions_pkey" PRIMARY KEY ("groupId", "expenseId") +); + +CREATE INDEX "idx_recurring_transactions_group_expense_next_create" ON "RecurringTransactions" ("groupId", "expenseId", "createNextAt" DESC); +CREATE UNIQUE INDEX "idx_unq_recurring_transactions_lock_id" ON "RecurringTransactions" ("lockId"); + +-- AlterTable +ALTER TABLE "Expense" ADD COLUMN "recurringDays" TEXT NOT NULL DEFAULT 0, + ADD COLUMN "isArchive" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f7389472..d71504b8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -53,6 +53,8 @@ model Expense { createdAt DateTime @default(now()) documents ExpenseDocument[] notes String? + recurringDays Int @default(0) + isArchive Boolean @default(false) } model ExpenseDocument { @@ -80,3 +82,13 @@ model ExpensePaidFor { @@id([expenseId, participantId]) } + +model RecurringTransactions { + groupId String + expenseId String + createNextAt Int + lockId String? @unique + + @@id([groupId, expenseId]) + @@index([groupId, expenseId, createNextAt(sort: Desc)]) +} \ No newline at end of file diff --git a/src/components/expense-form.tsx b/src/components/expense-form.tsx index df5563da..e8a0725b 100644 --- a/src/components/expense-form.tsx +++ b/src/components/expense-form.tsx @@ -164,6 +164,10 @@ export function ExpenseForm({ return field?.value } const defaultSplittingOptions = getDefaultSplittingOptions(group) + + const getRecurringField = (field?: { value: string }) => { + return field?.value + } const form = useForm({ resolver: zodResolver(expenseFormSchema), defaultValues: expense @@ -182,6 +186,8 @@ export function ExpenseForm({ isReimbursement: expense.isReimbursement, documents: expense.documents, notes: expense.notes ?? '', + recurringDays: String(expense.recurringDays), + isArchive: expense.isArchive, } : searchParams.get('reimbursement') ? { @@ -205,6 +211,8 @@ export function ExpenseForm({ saveDefaultSplittingOptions: false, documents: [], notes: '', + recurringDays: "0", + isArchive: false, } : { title: searchParams.get('title') ?? '', @@ -232,7 +240,10 @@ export function ExpenseForm({ ] : [], notes: '', + recurringDays: "0", + isArchive: false, }, + }) const [isCategoryLoading, setCategoryLoading] = useState(false) @@ -241,6 +252,7 @@ export function ExpenseForm({ return onSubmit(values) } + const recurringDays = [{ "key": "Never","value": "0"}, { "key":"weekly", "value": "7"}, {"key": "fortnightly", "value": "14"}, {"key": "monthly", "value": "30"}, {"key": "bimonthly", "value": "60"}] return (
@@ -413,6 +425,34 @@ export function ExpenseForm({