(squash) init

feat: filters, settings, backups

fix: ts compile errors

feat: new dashboard, webp previews and settings

feat: use webp for pdfs

feat: use webp

fix: analyze resets old data

fix: switch to corsproxy

fix: switch to free cors

fix: max upload limit

fix: currency conversion

feat: transaction export

fix: currency conversion

feat: refactor settings actions

feat: new loader

feat: README + LICENSE

doc: update readme

doc: update readme

doc: update readme

doc: update screenshots

ci: bump prisma
This commit is contained in:
Vasily Zubarev
2025-03-13 00:30:47 +01:00
commit 0b98a2c307
153 changed files with 17271 additions and 0 deletions

49
forms/transactions.ts Normal file
View File

@@ -0,0 +1,49 @@
import { z } from "zod"
export const transactionFormSchema = z
.object({
name: z.string().max(128).optional(),
merchant: z.string().max(128).optional(),
description: z.string().max(256).optional(),
type: z.string().optional(),
total: z
.string()
.transform((val) => {
const num = parseFloat(val)
if (isNaN(num)) {
throw new z.ZodError([{ message: "Invalid total", path: ["total"], code: z.ZodIssueCode.custom }])
}
return Math.round(num * 100) // convert to cents
})
.optional(),
currencyCode: z.string().max(5).optional(),
convertedTotal: z
.string()
.transform((val) => {
const num = parseFloat(val)
if (isNaN(num)) {
throw new z.ZodError([
{ message: "Invalid coverted total", path: ["convertedTotal"], code: z.ZodIssueCode.custom },
])
}
return Math.round(num * 100) // convert to cents
})
.optional(),
convertedCurrencyCode: z.string().max(5).optional(),
categoryCode: z.string().optional(),
projectCode: z.string().optional(),
issuedAt: z
.union([
z.date(),
z
.string()
.refine((val) => !isNaN(Date.parse(val)), {
message: "Invalid date format",
})
.transform((val) => new Date(val)),
])
.optional(),
text: z.string().optional(),
note: z.string().optional(),
})
.catchall(z.string())