Files
linumiq-invoice/prisma/schema.prisma
T
Gerhard Scheikl 5b2aa5d62b first version
2026-04-28 21:56:11 +02:00

180 lines
5.8 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
// Note that some adapters may set a maximum length for the String type by default, please ensure your strings are long
// enough when changing adapters.
// See https://www.prisma.io/docs/orm/reference/prisma-schema-reference#string for more information
datasource db {
provider = "sqlite"
url = "file:dev.sqlite"
}
model Session {
id String @id
shop String
state String
isOnline Boolean @default(false)
scope String?
expires DateTime?
accessToken String
userId BigInt?
firstName String?
lastName String?
email String?
accountOwner Boolean @default(false)
locale String?
collaborator Boolean? @default(false)
emailVerified Boolean? @default(false)
refreshToken String?
refreshTokenExpires DateTime?
}
// Per-shop issuer/configuration data. One row per installed shop.
model ShopSettings {
id String @id @default(cuid())
shopDomain String @unique
// Issuer / company data
companyName String @default("")
legalForm String @default("")
ownerName String @default("")
addressLine1 String @default("")
addressLine2 String @default("")
postalCode String @default("")
city String @default("")
countryCode String @default("AT")
phone String @default("")
email String @default("")
website String @default("")
// Legal identifiers (Austria)
vatId String @default("") // UID, e.g. ATU12345678
taxNumber String @default("") // Steuernummer
registrationNo String @default("") // FN (Firmenbuchnummer)
registrationCourt String @default("") // Firmenbuchgericht
// Bank
bankName String @default("")
iban String @default("")
bic String @default("")
giroCodeEnabled Boolean @default(true)
// Invoice numbering
// shopify_order_number | prefix_sequential
numberingMode String @default("shopify_order_number")
invoicePrefix String @default("RE-")
// Used only for prefix_sequential (the next number to issue minus 1)
invoiceSeed Int @default(1000)
// Defaults
defaultLanguage String @default("de")
paymentTermDays Int @default(14)
footerNote String @default("")
// Kleinunternehmer (§ 6 Abs. 1 Z 27 UStG)
kleinunternehmer Boolean @default(false)
// Logo (URL on Shopify Files or any reachable URL)
logoUrl String @default("")
// SMTP for email (used in later phase)
smtpHost String @default("")
smtpPort Int @default(587)
smtpSecure Boolean @default(false)
smtpUser String @default("")
smtpPassword String @default("")
smtpFromName String @default("")
smtpFromEmail String @default("")
smtpReplyTo String @default("")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
invoices Invoice[]
}
// Generated invoice record. One row per invoice document (versions and stornos
// each create new rows; the latest is linked on the order via metafield).
model Invoice {
id String @id @default(cuid())
shopDomain String
settings ShopSettings @relation(fields: [shopDomain], references: [shopDomain])
// Shopify order references
orderId String // gid://shopify/Order/...
orderName String // e.g. "#1004"
orderNumber Int // numeric order_number
// Invoice identity
invoiceNumber String // e.g. "RE-1004"
language String @default("de")
// invoice | storno
kind String @default("invoice")
// Increments per regeneration of the same invoiceNumber (always 1 for storno)
version Int @default(1)
// For storno rows: points to the cancelled Invoice.id
cancelsInvoiceId String?
// PDF storage
pdfFileGid String @default("") // gid://shopify/GenericFile/...
pdfUrl String @default("")
// Snapshots (JSON strings on sqlite)
totalsJson String @default("{}")
customerJson String @default("{}")
// Lifecycle
issuedAt DateTime @default(now())
sentAt DateTime?
cancelledAt DateTime?
status String @default("issued") // issued | sent | cancelled | failed
lastError String @default("")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([shopDomain, orderId])
@@index([shopDomain, invoiceNumber])
}
// Per-shop atomic counter for prefix_sequential numbering mode.
model InvoiceCounter {
id String @id @default(cuid())
shopDomain String @unique
// Last issued numeric value; allocate new = lastValue + 1 atomically.
lastValue Int @default(0)
updatedAt DateTime @updatedAt
}
// Email delivery log (used by later Flow send action; declared now so the
// generator can record manual sends as well).
model EmailLog {
id String @id @default(cuid())
shopDomain String
invoiceId String
toAddress String
subject String
status String // queued | sent | failed
error String @default("")
sentAt DateTime @default(now())
@@index([shopDomain, invoiceId])
}
// Per-shop logo bytes cache. Avoids fetching the logo from Shopify Files on
// every PDF render.
model LogoCache {
id String @id @default(cuid())
shopDomain String @unique
sourceUrl String
bytes Bytes
contentType String @default("image/png")
etag String @default("")
fetchedAt DateTime @default(now())
}