Initial commit: SecourIT Gestion

This commit is contained in:
2026-08-23 09:06:18 +00:00
commit cab93c7f7c
85 changed files with 15801 additions and 0 deletions
+253
View File
@@ -0,0 +1,253 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
name String?
passwordHash String?
role String @default("admin")
infomaniakId String? @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
sessions Session[]
quotes Quote[]
contracts Contract[]
clients Client[]
sales Sale[]
todos TodoItem[]
}
model Session {
id String @id @default(cuid())
userId String
token String @unique
expiresAt DateTime
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
@@index([token])
}
model Client {
id String @id @default(cuid())
name String
email String?
phone String?
address String?
siret String?
type ClientType @default(PROSPECT)
isProfessional Boolean? @default(true)
notes String?
userId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
quotes Quote[]
contracts Contract[]
sales Sale[]
@@index([userId])
@@index([type])
}
enum ClientType {
PROSPECT
CLIENT
}
model Quote {
id String @id @default(cuid())
clientId String
userId String
name String
quoteNumber String?
status QuoteStatus @default(DRAFT)
setupTotal Float @default(0)
monthlyTotal Float @default(0)
costTotal Float @default(0)
marginTotal Float @default(0)
discount Float @default(0)
travelKm Int @default(0)
travelCost Float @default(0)
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
items QuoteItem[]
contract Contract?
@@index([clientId])
@@index([userId])
@@index([status])
}
enum QuoteStatus {
DRAFT
PROPOSAL
SENT
ACCEPTED
REJECTED
EXPIRED
}
model QuoteItem {
id String @id @default(cuid())
quoteId String
type QuoteItemType
label String
description String?
unitPrice Float
costPrice Float
quantity Int @default(1)
isRecurring Boolean @default(false)
setupPrice Float @default(0)
setupCost Float @default(0)
monthlyPrice Float @default(0)
monthlyCost Float @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
quote Quote @relation(fields: [quoteId], references: [id], onDelete: Cascade)
@@index([quoteId])
}
enum QuoteItemType {
MAINTENANCE_POSTE
MAINTENANCE_SERVER
KS_SUITE_STANDARD
KS_SUITE_BUSINESS
KS_SUITE_ENTREPRISE
HOURLY_INTERVENTION
TRAVEL
CUSTOM
}
model Contract {
id String @id @default(cuid())
clientId String
userId String
quoteId String? @unique
name String
startDate DateTime
endDate DateTime?
setupPrice Float @default(0)
setupCost Float @default(0)
monthlyPrice Float @default(0)
monthlyCost Float @default(0)
status ContractStatus @default(ACTIVE)
billingDay Int @default(1)
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
quote Quote? @relation(fields: [quoteId], references: [id], onDelete: SetNull)
invoices Invoice[]
@@index([clientId])
@@index([userId])
@@index([status])
}
enum ContractStatus {
PROPOSAL
ACTIVE
PAUSED
CANCELLED
EXPIRED
}
model Invoice {
id String @id @default(cuid())
contractId String
month DateTime
amount Float
invoiceNumber String?
emitted Boolean @default(false)
emittedAt DateTime?
paidAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)
@@index([contractId])
@@unique([contractId, month])
}
model TodoItem {
id String @id @default(cuid())
userId String
text String
position Int
done Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@index([userId])
}
model Sale {
id String @id @default(cuid())
clientId String
userId String
date DateTime @default(now())
totalAmount Float @default(0)
totalCost Float @default(0)
paid Boolean @default(false)
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
items SaleItem[]
@@index([clientId])
@@index([userId])
}
model SaleItem {
id String @id @default(cuid())
saleId String
label String
description String?
quantity Int @default(1)
unitPrice Float @default(0)
costPrice Float @default(0)
createdAt DateTime @default(now())
sale Sale @relation(fields: [saleId], references: [id], onDelete: Cascade)
@@index([saleId])
}
model ProductCost {
id String @id @default(cuid())
key String @unique
label String
costPrice Float
sellPrice Float
unit String
category String
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}