// 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"
}

// generator erd {
//     provider = "prisma-erd-generator"
//     output   = "../ERD.png"
//     theme    = "dark"
// }

datasource db {
    provider = "mysql"
    url      = env("DATABASE_URL")
}

model category {
    id        Int       @id @default(autoincrement())
    name      String    @unique
    products  product[]
    createdAt DateTime  @default(now())
    updatedAt DateTime  @updatedAt
}

model client {
    id        Int      @id @default(autoincrement())
    name      String   @unique
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt

    notes    String @db.Text
    email    String @default("")
    phone    String @default("")
    address1 String @default("")
    address2 String @default("")
    city     String @default("")
    state    String @default("")
    postcode String @default("")
    country  String @default("Australia")

    jobs  job[]
    users user[]
}

model expenses {
    id          Int      @id @default(autoincrement())
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    amount      Float    @default(0)
    category    String   @default("")
    description String   @db.Text
    job         job      @relation(fields: [jobId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    jobId       Int
}

model design {
    id        Int      @id @default(autoincrement())
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
    name      String   @default("")

    imprints  imprint[]
    lineItems lineitem[]

    job   job @relation(fields: [jobId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    jobId Int
}

model fees {
    id          Int      @id @default(autoincrement())
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    name        String   @default("")
    amount      Float    @default(0)
    modifier    String   @default("")
    type        String   @default("")
    description String   @db.Text
    taxable     Boolean  @default(false)

    jobs jobfees[]
}

model jobfees {
    id             Int      @id @default(autoincrement())
    createdAt      DateTime @default(now())
    updatedAt      DateTime @updatedAt
    fee            fees?    @relation(fields: [feeId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    feeId          Int?
    job            job?     @relation(fields: [jobId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    jobId          Int?
    quantity       Int      @default(0)
    priceOverwrite Float    @default(0)
}

model job {
    id          Int      @id @default(autoincrement())
    title       String   @default("")
    description String   @db.Text
    published   Boolean  @default(false)
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt

    quoteKey String? @unique

    status        String   @default("")
    poNumber      String   @default("")
    invoiceDate   DateTime @default(now())
    invoiceNumber String   @default("")

    productionDate     DateTime?
    productionNotes    String?   @db.Text
    productionPriority Int       @default(99)

    shippingOption   String @default("")
    shippingName     String @default("")
    shippingAddress1 String @default("")
    shippingAddress2 String @default("")
    shippingCity     String @default("")
    shippingState    String @default("")
    shippingPostcode String @default("")
    shippingCountry  String @default("Australia")
    shippingPhone    String @default("")
    shippingEmail    String @default("")
    shippingNotes    String @db.Text

    generalNotes String @default("")

    clientId     Int
    client       client      @relation(fields: [clientId], references: [id])
    contacts     user[]
    // name relationtable
    design       design[]
    fees         jobfees[]
    milestones   milestone[]
    expenses     expenses[]
    createdById  Int
    createdBy    user        @relation("createdBy", fields: [createdById], references: [id])
    assignedToId Int?
    assignedTo   user?       @relation("assignedTo", fields: [assignedToId], references: [id])
}

model lineitem {
    id              Int      @id @default(autoincrement())
    createdAt       DateTime @default(now())
    updatedAt       DateTime @updatedAt
    sizes           size[]
    color           String   @default("")
    total           Int      @default(0)
    product         product  @relation(fields: [productId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    productId       Int
    price           Float    @default(0)
    design          design   @relation(fields: [designId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    designId        Int
    calculatedPrice Float    @default(0)
    legacyState     String   @default("")
}

model size {
    id         Int      @id @default(autoincrement())
    createdAt  DateTime @default(now())
    updatedAt  DateTime @updatedAt
    name       String   @default("")
    lineItem   lineitem @relation(fields: [lineItemId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    lineItemId Int
    amount     Int      @default(0)
}

model log {
    id        Int      @id @default(autoincrement())
    timestamp DateTime @default(now())
    level     String   @default("")
    message   String   @db.Text
    meta      Json?
    type      String   @default("")
    typeId    Int      @default(0)
}

model imprint {
    id          Int      @id @default(autoincrement())
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    type        String   @default("")
    pricingType String   @default("")

    location String           @default("")
    height   Float            @default(0)
    width    Float            @default(0)
    inks     imprintandinks[]
    design   design           @relation(fields: [designId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    designId Int

    images imprintimages[]
}

model imprintimages {
    id        Int      @id @default(autoincrement())
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
    url       String   @default("")
    imprint   imprint  @relation(fields: [imprintId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    imprintId Int
}

model imprintandinks {
    id        Int      @id @default(autoincrement())
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
    imprint   imprint  @relation(fields: [imprintId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    imprintId Int
    ink       ink      @relation(fields: [inkId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    inkId     Int
    mesh      String   @default("")
}

model ink {
    id          Int      @id @default(autoincrement())
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    name        String   @default("")
    color       String   @default("")
    storageCode String   @default("")
    library     String   @default("")
    active      Boolean  @default(true)

    imprints imprintandinks[]
}

model milestone {
    id        Int      @id @default(autoincrement())
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
    name      String   @default("")
    date      DateTime @default(now())
    status    String   @default("")
    job       job      @relation(fields: [jobId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    jobId     Int
}

model product {
    id          Int      @id @default(autoincrement())
    title       String   @unique
    description String   @db.Text
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt

    brand    String @default("")
    brandId  String @default("")
    cost     Float  @default(0)
    modifier Float  @default(1)
    price    Float  @default(0)

    category   category @relation(fields: [categoryId], references: [id])
    categoryId Int

    lineItems lineitem[]

    // sync fields
    syncId          String?       @unique @default(cuid())
    syncState       String        @default("")
    syncEnabled     Boolean       @default(false)
    syncLastUpdated DateTime?     @default(now())
    syncLastSynced  DateTime?     @default(now())
    syncProvider    syncProvider? @relation(fields: [syncProviderId], references: [id], onUpdate: Cascade, onDelete: Cascade)
    syncProviderId  Int?
}

model syncProvider {
    id        Int       @id @default(autoincrement())
    createdAt DateTime  @default(now())
    updatedAt DateTime  @updatedAt
    name      String    @unique
    type      String    @default("")
    enabled   Boolean   @default(false)
    config    Json?
    products  product[]
}

model pricingmatrix {
    id         Int      @id @default(autoincrement())
    createdAt  DateTime @default(now())
    updatedAt  DateTime @updatedAt
    tableName  String   @default("")
    columnName String   @default("")
    type       String   @default("")
    quantity   Int      @default(0)
    markUp     Int      @default(0)
    amount     Float    @default(0)
}

model report {
    id          Int      @id @default(autoincrement())
    title       String   @unique
    description String   @db.Text
    createdAt   DateTime @default(now())
    updatedAt   DateTime @updatedAt
    body        String   @db.Text
}

model settings {
    id    Int    @id @default(autoincrement())
    name  String @unique
    value String @default("")
}

model user {
    id        Int      @id @default(autoincrement())
    email     String   @unique
    name      String
    password  String
    role      String   @default("USER")
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt

    uuid   String  @unique @default(cuid())
    active Boolean @default(false)

    jobs         job[]
    client       client? @relation(fields: [clientId], references: [id])
    clientId     Int?
    jobsCreated  job[]   @relation("createdBy")
    jobsAssigned job[]   @relation("assignedTo")

    favourite Boolean @default(false)
    phone     String  @default("")
    address1  String  @default("")
    address2  String  @default("")
    city      String  @default("")
    state     String  @default("")
    postcode  String  @default("")
    country   String  @default("Australia")
}
