From d508e27bac0c4870792e6c96c4ca751cbbf90ce0 Mon Sep 17 00:00:00 2001 From: Rayan Konecny Date: Tue, 5 May 2026 12:53:41 -0300 Subject: [PATCH] Acert script on database --- .claude/settings.json | 14 +- README.md | 156 ++++++++-- backend/[teste.env] | 11 + backend/package-lock.json | 46 +++ backend/package.json | 11 +- backend/prisma/schema.prisma | 40 +-- .../src/generated/prisma/commonInputTypes.ts | 132 ++++++--- .../src/generated/prisma/internal/class.ts | 8 +- .../prisma/internal/prismaNamespace.ts | 6 + .../prisma/internal/prismaNamespaceBrowser.ts | 6 + .../src/generated/prisma/models/companies.ts | 112 ++++++- backend/src/generated/prisma/models/rides.ts | 137 ++++++++- .../src/repositories/companies.repository.ts | 12 + backend/src/repositories/rides.repository.ts | 12 + backend/src/services/sync.service.ts | 12 + proposta-toptran.html | 280 ++++++++++++++++++ proposta-toptran.pdf | Bin 0 -> 128888 bytes toptran-app/.env.development | 1 + toptran-app/.env.production | 1 + toptran-app/database/create_tables.sql | 49 ++- toptran-app/eas.json | 2 +- toptran-app/src/app/cadastros.tsx | 17 +- toptran-app/src/app/empresas.tsx | 54 +++- toptran-app/src/app/lancamento.tsx | 33 +++ toptran-app/src/app/sincronizar.tsx | 3 + toptran-app/src/server/api.ts | 6 +- toptran-app/src/services/db.ts | 114 ++++++- 27 files changed, 1136 insertions(+), 139 deletions(-) create mode 100644 backend/[teste.env] create mode 100644 proposta-toptran.html create mode 100644 proposta-toptran.pdf create mode 100644 toptran-app/.env.development create mode 100644 toptran-app/.env.production diff --git a/.claude/settings.json b/.claude/settings.json index 17e7b3e..2f1e3fc 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -17,7 +17,19 @@ "Bash(python3 -c \"import sys,json; d=json.load\\(sys.stdin\\); print\\('Scripts:', d.get\\('scripts',{}\\)\\); print\\('Deps:', list\\(d.get\\('dependencies',{}\\).keys\\(\\)\\)\\)\")", "Bash(podman-compose down *)", "Bash(podman-compose up *)", - "Bash(podman logs *)" + "Bash(podman logs *)", + "Bash(apt-cache show *)", + "Bash(dpkg -l)", + "Bash(REACT_NATIVE_DEVTOOLS=false npx expo start)", + "Bash(REACT_NATIVE_DEVTOOLS=false npx expo start --port 8082)", + "Read(//home/dev/.cache/dotslash/cb/2a59c5919ce27ef30b55119edf89e556e015ef/React Native DevTools-linux-x64/**)", + "Bash(perl -i -0pe 's/ try \\\\{/ try {\\\\n const db = await dbPromise;/g' /home/dev/projetos/toptran/toptran-app/src/services/db.ts)", + "Bash(python3 -c \"import reportlab\")", + "Bash(python3 -c \"import weasyprint\")", + "Read(//usr/bin/**)", + "Bash(chromium --headless --disable-gpu --no-sandbox --print-to-pdf=proposta-toptran.pdf --no-pdf-header-footer file:///home/dev/projetos/toptran/proposta-toptran.html)", + "Bash(npx tsc *)", + "Bash(echo \"exit=$?\")" ] } } diff --git a/README.md b/README.md index 8cca035..b9e2d29 100644 --- a/README.md +++ b/README.md @@ -100,17 +100,20 @@ model companies { } model rides { - id String @id - user_id String - company String - km Decimal @db.Decimal(10, 2) - cost_per_km Decimal @db.Decimal(10, 2) - total Decimal @db.Decimal(10, 2) - ride_date String - synced Int? @default(0) @db.SmallInt - createdAt DateTime? @default(now()) @db.Timestamptz(6) - updatedAt DateTime? @default(now()) @db.Timestamptz(6) - users users @relation(fields: [user_id], references: [id], onDelete: Cascade) + id String @id + user_id String + company String + km Decimal @db.Decimal(10, 2) + cost_per_km Decimal @db.Decimal(10, 2) + total Decimal @db.Decimal(10, 2) + ride_date String + departures Int? @default(0) + failed_service Int? @default(0) + idle_hours Decimal? @default(0) @db.Decimal(10, 2) + synced Int? @default(0) @db.SmallInt + createdAt DateTime? @default(now()) @db.Timestamptz(6) + updatedAt DateTime? @default(now()) @db.Timestamptz(6) + users users @relation(fields: [user_id], references: [id], onDelete: Cascade) } enum TokenType { @@ -120,21 +123,32 @@ enum TokenType { ### Variáveis de ambiente -Crie o arquivo `backend/.env` com as variáveis abaixo: +O backend trabalha com **dois bancos** — um de homologação (`toptrandev`) e um de produção (`toptranprod`) — e dois arquivos `.env` separados: + +| Arquivo | Banco | Porta | +|---|---|---| +| `backend/.env.development` | `toptrandev` | `4000` | +| `backend/.env.production` | `toptranprod` | `5000` | + +Modelo do `.env.development`: ```env -DB_USER=postgres -DB_PASSWORD=postgres -DB_HOST=localhost +DATABASE_URL=postgresql://USER:PASS@HOST:5432/toptrandev +DB_USER=... +DB_PASSWORD=... +DB_HOST=... DB_PORT=5432 -DB_NAME=toptran - -DATABASE_URL="postgresql://postgres:postgres@localhost:5432/toptran" +DB_NAME=toptrandev PORT=4000 -JWT_SECRET=sua_chave_secreta_aqui +NODE_ENV=development + +JWT_SECRET=... +JWT_REFRESH_SECRET=... ``` +Modelo do `.env.production`: idêntico, trocando `DB_NAME=toptranprod`, `PORT=5000` e `NODE_ENV=production`. + > `JWT_SECRET` é obrigatório em produção. O access token expira em **15 minutos** e o refresh token em **7 dias**. ### Instalação e execução @@ -148,15 +162,28 @@ npm install # Gerar cliente Prisma npx prisma generate -# Rodar migrations -npx prisma migrate deploy - -# Iniciar em modo desenvolvimento +# Rodar a API apontando pro banco de homologação (toptrandev) npm run dev -# Build de produção +# Rodar a API apontando pro banco de produção (toptranprod) +npm run dev:prod + +# Build + start em produção npm run build -npm start +npm start # usa .env.production por padrão +npm run start:dev # caso queira o build rodando contra o banco de dev +``` + +**Migrations e Prisma CLI por ambiente** (via `dotenv-cli`): + +```bash +# Homologação +npm run prisma:dev migrate dev +npm run prisma:dev studio + +# Produção +npm run prisma:prod migrate deploy +npm run prisma:prod studio ``` ### API Reference @@ -365,7 +392,19 @@ Retorna todas as corridas cadastradas no servidor. { "success": true, "data": [ - { "id": "uuid", "user_id": "uuid", "company": "Empresa X", "km": "12.5", "total": "31.25", ... } + { + "id": "uuid", + "user_id": "uuid", + "company": "Empresa X", + "km": "12.5", + "cost_per_km": "2.50", + "total": "31.25", + "ride_date": "2026-05-01", + "departures": 3, + "failed_service": 1, + "idle_hours": "1.50", + "synced": 1 + } ] } ``` @@ -374,13 +413,24 @@ Retorna todas as corridas cadastradas no servidor. **POST `/sync/rides`** -Sincroniza (upsert) uma lista de corridas no servidor. +Sincroniza (upsert) uma lista de corridas no servidor. Os campos `departures`, `failed_service` e `idle_hours` são opcionais e assumem `0` por padrão. ```json // Request body { "rides": [ - { "id": "uuid", "user_id": "uuid", "company": "Empresa X", "km": 12.5, "cost_per_km": 2.50, "total": 31.25, "ride_date": "2026-05-01" } + { + "id": "uuid", + "user_id": "uuid", + "company": "Empresa X", + "km": 12.5, + "cost_per_km": 2.50, + "total": 31.25, + "ride_date": "2026-05-01", + "departures": 3, + "failed_service": 1, + "idle_hours": 1.5 + } ] } @@ -392,6 +442,22 @@ Sincroniza (upsert) uma lista de corridas no servidor. } ``` +**Campos da corrida:** + +| Campo | Tipo | Descrição | +|---|---|---| +| `id` | string | Identificador único da corrida | +| `user_id` | string | ID do usuário dono da corrida | +| `company` | string | Nome da empresa | +| `km` | number\|string | Quilômetros rodados | +| `cost_per_km` | number\|string | Custo por km no momento da corrida | +| `total` | number\|string | Valor total da corrida | +| `ride_date` | string | Data da corrida (formato `YYYY-MM-DD`) | +| `departures` | number? | Quantidade de partidas/saídas (default `0`) | +| `failed_service` | number? | Quantidade de serviços não realizados (default `0`) | +| `idle_hours` | number\|string? | Horas ociosas, com 2 casas decimais (default `0`) | +| `synced` | number? | Flag de sincronização (`0` ou `1`) | + --- #### Respostas de erro @@ -507,6 +573,34 @@ A tela `/sincronizar` executa três etapas em sequência com feedback visual em 2. **Download de empresas** — baixa empresas do servidor se o cadastro local estiver vazio 3. **Upload de corridas** — compara IDs locais com os do servidor e envia apenas as corridas ausentes via `POST /sync/rides` +### Ambientes (dev / prod) + +O app não conversa direto com o PostgreSQL — ele consome a API do backend. Alternar de banco no app significa apontar pra um backend diferente via `EXPO_PUBLIC_API_URL`. + +| Arquivo | API | Banco | +|---|---|---| +| `toptran-app/.env.development` | `http://175.15.15.93:4000/api` | `toptrandev` | +| `toptran-app/.env.production` | `https://toptran.olymp.com.br/api` | `toptranprod` | + +O Expo carrega o arquivo certo automaticamente conforme o modo: + +| Comando | Arquivo carregado | +|---|---| +| `npx expo start` (dev) | `.env.development` | +| `npx expo export` / EAS Build production | `.env.production` | + +> Variáveis `EXPO_PUBLIC_*` são inlined no bundle em build time. Reinicie sempre com `npx expo start -c` após trocar o `.env`. + +#### Perfis EAS + +Configurados em [`toptran-app/eas.json`](toptran-app/eas.json): + +| Perfil | Formato | API/Banco | Comando | Pra quê serve | +|---|---|---|---|---| +| `development` | APK + dev client | dev (`:4000` → `toptrandev`) | `eas build --profile development` | Rodar com `expo start` plugado, hot reload | +| `preview` | APK standalone | prod (`toptranprod`) | `eas build --profile preview` | APK pra testar/distribuir fora da Play | +| `production` | AAB | prod (`toptranprod`) | `eas build --profile production` | Bundle pra Google Play (`eas submit`) | + ### Execução ```bash @@ -515,7 +609,7 @@ cd toptran-app # Instalar dependências npm install -# Iniciar o servidor Expo +# Iniciar o servidor Expo (carrega .env.development → backend dev) npm start # Build e abrir no Android @@ -528,8 +622,8 @@ npm run ios ### Conectar ao dispositivo Android via AVD na VM 1. Ligue o dispositivo Android (AVD) -2. Rodar o comando - ```bash +2. Rodar o comando + ```bash adb tcpip 5555 ``` 3. No terminal local, crie o túnel SSH reverso: diff --git a/backend/[teste.env] b/backend/[teste.env] new file mode 100644 index 0000000..bebc774 --- /dev/null +++ b/backend/[teste.env] @@ -0,0 +1,11 @@ +DB_USER=toptranadm +DB_PASSWORD=ft7zJdVNk8FivQUk +DB_HOST=175.15.15.90 +DB_PORT=5432 +DB_NAME=toptrandev + +DATABASE_URL="postgresql://toptranadm:ft7zJdVNk8FivQUk@175.15.15.90:5432/toptrandev" + +PORT=4000 + +JWT_SECRET=iDgji2sbBKqmPerRHnQXFK0iHwmfNTNb5zreuetUecD diff --git a/backend/package-lock.json b/backend/package-lock.json index 46e104c..0235997 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -26,6 +26,7 @@ "@types/jsonwebtoken": "^9.0.10", "@types/node": "^25.6.0", "dotenv": "^17.4.2", + "dotenv-cli": "^11.0.0", "prisma": "^7.8.0", "ts-node-dev": "^2.0.0", "tsx": "^4.21.0" @@ -1627,6 +1628,51 @@ "url": "https://dotenvx.com" } }, + "node_modules/dotenv-cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-11.0.0.tgz", + "integrity": "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^17.1.0", + "dotenv-expand": "^12.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-expand": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", + "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", diff --git a/backend/package.json b/backend/package.json index 4c0f08a..b5459e2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,10 +4,14 @@ "description": "", "main": "index.js", "scripts": { - "dev": "tsx watch src/server.ts", + "dev": "tsx watch --env-file=.env.development src/server.ts", + "dev:prod": "tsx watch --env-file=.env.production src/server.ts", "build": "tsc", - "start": "node dist/server.js", - "typecheck": "tsc --noEmit" + "start": "node --env-file=.env.production dist/server.js", + "start:dev": "node --env-file=.env.development dist/server.js", + "typecheck": "tsc --noEmit", + "prisma:dev": "dotenv -e env.development -- prisma migrate dev", + "prisma:prod": "dotenv -e env.production -- prisma migrate deploy" }, "keywords": [], "author": "Rayan", @@ -20,6 +24,7 @@ "@types/jsonwebtoken": "^9.0.10", "@types/node": "^25.6.0", "dotenv": "^17.4.2", + "dotenv-cli": "^11.0.0", "prisma": "^7.8.0", "ts-node-dev": "^2.0.0", "tsx": "^4.21.0" diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index e0a9527..647d7f0 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -33,28 +33,34 @@ model users { } model companies { - id String @id - name String - cost_per_km Decimal @db.Decimal(10, 2) - notes String? @default("") - createdAt DateTime? @default(now()) @db.Timestamptz(6) - updatedAt DateTime? @default(now()) @db.Timestamptz(6) + id String @id + name String + cost_per_km Decimal @db.Decimal(10, 2) + departures Int? @default(0) + failed_service Int? @default(0) + idle_hours Decimal @default(0.0) @db.Decimal(10, 2) + notes String? @default("") + createdAt DateTime? @default(now()) @db.Timestamptz(6) + updatedAt DateTime? @default(now()) @db.Timestamptz(6) @@index([name], map: "idx_companies_name") } model rides { - id String @id - user_id String - company String - km Decimal @db.Decimal(10, 2) - cost_per_km Decimal @db.Decimal(10, 2) - total Decimal @db.Decimal(10, 2) - ride_date String - synced Int? @default(0) @db.SmallInt - createdAt DateTime? @default(now()) @db.Timestamptz(6) - updatedAt DateTime? @default(now()) @db.Timestamptz(6) - users users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction) + id String @id + user_id String + company String + km Decimal @db.Decimal(10, 2) + cost_per_km Decimal @db.Decimal(10, 2) + total Decimal @db.Decimal(10, 2) + ride_date String + departures Int? @default(0) + failed_service Int? @default(0) + idle_hours Decimal? @default(0) @db.Decimal(10, 2) + synced Int? @default(0) @db.SmallInt + createdAt DateTime? @default(now()) @db.Timestamptz(6) + updatedAt DateTime? @default(now()) @db.Timestamptz(6) + users users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction) @@index([synced], map: "idx_rides_synced") @@index([user_id], map: "idx_rides_user_id") diff --git a/backend/src/generated/prisma/commonInputTypes.ts b/backend/src/generated/prisma/commonInputTypes.ts index 2f567c9..5930639 100644 --- a/backend/src/generated/prisma/commonInputTypes.ts +++ b/backend/src/generated/prisma/commonInputTypes.ts @@ -138,6 +138,17 @@ export type DecimalFilter<$PrismaModel = never> = { not?: Prisma.NestedDecimalFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string } +export type IntNullableFilter<$PrismaModel = never> = { + equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null + in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null + notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null + lt?: number | Prisma.IntFieldRefInput<$PrismaModel> + lte?: number | Prisma.IntFieldRefInput<$PrismaModel> + gt?: number | Prisma.IntFieldRefInput<$PrismaModel> + gte?: number | Prisma.IntFieldRefInput<$PrismaModel> + not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null +} + export type DateTimeNullableFilter<$PrismaModel = never> = { equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null @@ -165,31 +176,6 @@ export type DecimalWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDecimalFilter<$PrismaModel> } -export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null - _count?: Prisma.NestedIntNullableFilter<$PrismaModel> - _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> - _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> -} - -export type IntNullableFilter<$PrismaModel = never> = { - equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null - in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null - notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null - lt?: number | Prisma.IntFieldRefInput<$PrismaModel> - lte?: number | Prisma.IntFieldRefInput<$PrismaModel> - gt?: number | Prisma.IntFieldRefInput<$PrismaModel> - gte?: number | Prisma.IntFieldRefInput<$PrismaModel> - not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null -} - export type IntNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null @@ -206,6 +192,47 @@ export type IntNullableWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedIntNullableFilter<$PrismaModel> } +export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> +} + +export type DecimalNullableFilter<$PrismaModel = never> = { + equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null + in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + not?: Prisma.NestedDecimalNullableFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null +} + +export type DecimalNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null + in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + not?: Prisma.NestedDecimalNullableWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedDecimalNullableFilter<$PrismaModel> + _sum?: Prisma.NestedDecimalNullableFilter<$PrismaModel> + _min?: Prisma.NestedDecimalNullableFilter<$PrismaModel> + _max?: Prisma.NestedDecimalNullableFilter<$PrismaModel> +} + export type NestedStringFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -370,20 +397,6 @@ export type NestedDecimalWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDecimalFilter<$PrismaModel> } -export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null - _count?: Prisma.NestedIntNullableFilter<$PrismaModel> - _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> - _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> -} - export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null @@ -411,4 +424,45 @@ export type NestedFloatNullableFilter<$PrismaModel = never> = { not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null } +export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> +} + +export type NestedDecimalNullableFilter<$PrismaModel = never> = { + equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null + in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + not?: Prisma.NestedDecimalNullableFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null +} + +export type NestedDecimalNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null + in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null + lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> + not?: Prisma.NestedDecimalNullableWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _avg?: Prisma.NestedDecimalNullableFilter<$PrismaModel> + _sum?: Prisma.NestedDecimalNullableFilter<$PrismaModel> + _min?: Prisma.NestedDecimalNullableFilter<$PrismaModel> + _max?: Prisma.NestedDecimalNullableFilter<$PrismaModel> +} + diff --git a/backend/src/generated/prisma/internal/class.ts b/backend/src/generated/prisma/internal/class.ts index 9465508..f55d637 100644 --- a/backend/src/generated/prisma/internal/class.ts +++ b/backend/src/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel tokens {\n id String @id\n token String @unique\n type TokenType\n userId String\n expiresAt DateTime\n createdAt DateTime @default(now())\n users users @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel users {\n id String @id\n name String\n email String @unique\n password String\n profilePhoto String? @default(\"\")\n bio String? @default(\"\")\n createdAt DateTime @default(now())\n updatedAt DateTime\n rides rides[]\n tokens tokens[]\n\n @@index([email], map: \"idx_users_email\")\n}\n\nmodel companies {\n id String @id\n name String\n cost_per_km Decimal @db.Decimal(10, 2)\n notes String? @default(\"\")\n createdAt DateTime? @default(now()) @db.Timestamptz(6)\n updatedAt DateTime? @default(now()) @db.Timestamptz(6)\n\n @@index([name], map: \"idx_companies_name\")\n}\n\nmodel rides {\n id String @id\n user_id String\n company String\n km Decimal @db.Decimal(10, 2)\n cost_per_km Decimal @db.Decimal(10, 2)\n total Decimal @db.Decimal(10, 2)\n ride_date String\n synced Int? @default(0) @db.SmallInt\n createdAt DateTime? @default(now()) @db.Timestamptz(6)\n updatedAt DateTime? @default(now()) @db.Timestamptz(6)\n users users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)\n\n @@index([synced], map: \"idx_rides_synced\")\n @@index([user_id], map: \"idx_rides_user_id\")\n}\n\nenum TokenType {\n REFRESH\n}\n", + "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel tokens {\n id String @id\n token String @unique\n type TokenType\n userId String\n expiresAt DateTime\n createdAt DateTime @default(now())\n users users @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel users {\n id String @id\n name String\n email String @unique\n password String\n profilePhoto String? @default(\"\")\n bio String? @default(\"\")\n createdAt DateTime @default(now())\n updatedAt DateTime\n rides rides[]\n tokens tokens[]\n\n @@index([email], map: \"idx_users_email\")\n}\n\nmodel companies {\n id String @id\n name String\n cost_per_km Decimal @db.Decimal(10, 2)\n departures Int? @default(0)\n failed_service Int? @default(0)\n idle_hours Decimal @default(0.0) @db.Decimal(10, 2)\n notes String? @default(\"\")\n createdAt DateTime? @default(now()) @db.Timestamptz(6)\n updatedAt DateTime? @default(now()) @db.Timestamptz(6)\n\n @@index([name], map: \"idx_companies_name\")\n}\n\nmodel rides {\n id String @id\n user_id String\n company String\n km Decimal @db.Decimal(10, 2)\n cost_per_km Decimal @db.Decimal(10, 2)\n total Decimal @db.Decimal(10, 2)\n ride_date String\n departures Int? @default(0)\n failed_service Int? @default(0)\n idle_hours Decimal? @default(0) @db.Decimal(10, 2)\n synced Int? @default(0) @db.SmallInt\n createdAt DateTime? @default(now()) @db.Timestamptz(6)\n updatedAt DateTime? @default(now()) @db.Timestamptz(6)\n users users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)\n\n @@index([synced], map: \"idx_rides_synced\")\n @@index([user_id], map: \"idx_rides_user_id\")\n}\n\nenum TokenType {\n REFRESH\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"tokens\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"TokenType\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"users\",\"relationName\":\"tokensTousers\"}],\"dbName\":null},\"users\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profilePhoto\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"rides\",\"kind\":\"object\",\"type\":\"rides\",\"relationName\":\"ridesTousers\"},{\"name\":\"tokens\",\"kind\":\"object\",\"type\":\"tokens\",\"relationName\":\"tokensTousers\"}],\"dbName\":null},\"companies\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cost_per_km\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"notes\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"rides\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user_id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"company\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"km\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"cost_per_km\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"total\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"ride_date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"synced\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"users\",\"relationName\":\"ridesTousers\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"tokens\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"TokenType\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"users\",\"relationName\":\"tokensTousers\"}],\"dbName\":null},\"users\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profilePhoto\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bio\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"rides\",\"kind\":\"object\",\"type\":\"rides\",\"relationName\":\"ridesTousers\"},{\"name\":\"tokens\",\"kind\":\"object\",\"type\":\"tokens\",\"relationName\":\"tokensTousers\"}],\"dbName\":null},\"companies\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cost_per_km\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"departures\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"failed_service\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"idle_hours\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"notes\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"rides\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user_id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"company\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"km\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"cost_per_km\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"total\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"ride_date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"departures\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"failed_service\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"idle_hours\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"synced\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"users\",\"relationName\":\"ridesTousers\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"rides\",\"tokens\",\"_count\",\"tokens.findUnique\",\"tokens.findUniqueOrThrow\",\"tokens.findFirst\",\"tokens.findFirstOrThrow\",\"tokens.findMany\",\"data\",\"tokens.createOne\",\"tokens.createMany\",\"tokens.createManyAndReturn\",\"tokens.updateOne\",\"tokens.updateMany\",\"tokens.updateManyAndReturn\",\"create\",\"update\",\"tokens.upsertOne\",\"tokens.deleteOne\",\"tokens.deleteMany\",\"having\",\"_min\",\"_max\",\"tokens.groupBy\",\"tokens.aggregate\",\"users.findUnique\",\"users.findUniqueOrThrow\",\"users.findFirst\",\"users.findFirstOrThrow\",\"users.findMany\",\"users.createOne\",\"users.createMany\",\"users.createManyAndReturn\",\"users.updateOne\",\"users.updateMany\",\"users.updateManyAndReturn\",\"users.upsertOne\",\"users.deleteOne\",\"users.deleteMany\",\"users.groupBy\",\"users.aggregate\",\"companies.findUnique\",\"companies.findUniqueOrThrow\",\"companies.findFirst\",\"companies.findFirstOrThrow\",\"companies.findMany\",\"companies.createOne\",\"companies.createMany\",\"companies.createManyAndReturn\",\"companies.updateOne\",\"companies.updateMany\",\"companies.updateManyAndReturn\",\"companies.upsertOne\",\"companies.deleteOne\",\"companies.deleteMany\",\"_avg\",\"_sum\",\"companies.groupBy\",\"companies.aggregate\",\"rides.findUnique\",\"rides.findUniqueOrThrow\",\"rides.findFirst\",\"rides.findFirstOrThrow\",\"rides.findMany\",\"rides.createOne\",\"rides.createMany\",\"rides.createManyAndReturn\",\"rides.updateOne\",\"rides.updateMany\",\"rides.updateManyAndReturn\",\"rides.upsertOne\",\"rides.deleteOne\",\"rides.deleteMany\",\"rides.groupBy\",\"rides.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"user_id\",\"company\",\"km\",\"cost_per_km\",\"total\",\"ride_date\",\"synced\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"name\",\"notes\",\"email\",\"password\",\"profilePhoto\",\"bio\",\"every\",\"some\",\"none\",\"token\",\"TokenType\",\"type\",\"userId\",\"expiresAt\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "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-ACFWEAB-ACFXEAB-ACFYAQB9ACFZAgCRAQAhWkAAgAEAIVtAAIABACECAAAABQAgDAAAwQEAIAIAAAC_AQAgDAAAwAEAIA1PAAC-AQAwUAAAvwEAEFEAAL4BADBSAQB9ACFTAQB9ACFUAQB9ACFVEAB-ACFWEAB-ACFXEAB-ACFYAQB9ACFZAgCRAQAhWkAAgAEAIVtAAIABACENTwAAvgEAMFAAAL8BABBRAAC-AQAwUgEAfQAhUwEAfQAhVAEAfQAhVRAAfgAhVhAAfgAhVxAAfgAhWAEAfQAhWQIAkQEAIVpAAIABACFbQACAAQAhCVIBAJgBACFUAQCYAQAhVRAAmQEAIVYQAJkBACFXEACZAQAhWAEAmAEAIVkCAJoBACFaQACbAQAhW0AAmwEAIQlSAQCYAQAhVAEAmAEAIVUQAJkBACFWEACZAQAhVxAAmQEAIVgBAJgBACFZAgCaAQAhWkAAmwEAIVtAAJsBACEJUgEAAAABVAEAAAABVRAAAAABVhAAAAABVxAAAAABWAEAAAABWQIAAAABWkAAAAABW0AAAAABBBMAALcBADB3AAC4AQAweQAAugEAIH0AALsBADAEEwAAqgEAMHcAAKsBADB5AACtAQAgfQAArgEAMAAAAAAABRMAAM0BACAUAADQAQAgdwAAzgEAIHgAAM8BACB9AAAhACADEwAAzQEAIHcAAM4BACB9AAAhACAEBAAAxQEAIAUAAMYBACBrAACSAQAgbAAAkgEAIAkEAADDAQAgUgEAAAABWkAAAAABW0AAAAABZwEAAAABaQEAAAABagEAAAABawEAAAABbAEAAAABAgAAACEAIBMAAM0BACADAAAAJAAgEwAAzQEAIBQAANEBACALAAAAJAAgBAAAqAEAIAwAANEBACBSAQCYAQAhWkAApwEAIVtAAKcBACFnAQCYAQAhaQEAmAEAIWoBAJgBACFrAQCjAQAhbAEAowEAIQkEAACoAQAgUgEAmAEAIVpAAKcBACFbQACnAQAhZwEAmAEAIWkBAJgBACFqAQCYAQAhawEAowEAIWwBAKMBACEJUgEAAAABVAEAAAABVRAAAAABVhAAAAABVxAAAAABWAEAAAABWQIAAAABWkAAAAABW0AAAAABBVIBAAAAAVpAAAAAAXABAAAAAXIAAAByAnRAAAAAAQkFAADEAQAgUgEAAAABWkAAAAABW0AAAAABZwEAAAABaQEAAAABagEAAAABawEAAAABbAEAAAABAgAAACEAIBMAANQBACADAAAAJAAgEwAA1AEAIBQAANgBACALAAAAJAAgBQAAqQEAIAwAANgBACBSAQCYAQAhWkAApwEAIVtAAKcBACFnAQCYAQAhaQEAmAEAIWoBAJgBACFrAQCjAQAhbAEAowEAIQkFAACpAQAgUgEAmAEAIVpAAKcBACFbQACnAQAhZwEAmAEAIWkBAJgBACFqAQCYAQAhawEAowEAIWwBAKMBACEBAwACAwQGAwUJAQYABAEDAAICBAoABQsAAAEDAAIBAwACAwYACRkAChoACwAAAAMGAAkZAAoaAAsAAAMGABAZABEaABIAAAADBgAQGQARGgASAAAABQYAGBkAGxoAHDsAGTwAGgAAAAAABQYAGBkAGxoAHDsAGTwAGgEDAAIBAwACBQYAIRkAJBoAJTsAIjwAIwAAAAAABQYAIRkAJBoAJTsAIjwAIwcCAQgMAQkNAQoOAQsPAQ0RAQ4TBQ8UBhAWAREYBRIZBxUaARYbARccBRsfCBwgDB0iAh4jAh8mAiAnAiEoAiIqAiMsBSQtDSUvAiYxBScyDigzAik0Aio1BSs4Dyw5Ey07FC48FC8_FDBAFDFBFDJDFDNFBTRGFTVIFDZKBTdLFjhMFDlNFDpOBT1RFz5SHT9TA0BUA0FVA0JWA0NXA0RZA0VbBUZcHkdeA0hgBUlhH0piA0tjA0xkBU1nIE5oJg" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"rides\",\"tokens\",\"_count\",\"tokens.findUnique\",\"tokens.findUniqueOrThrow\",\"tokens.findFirst\",\"tokens.findFirstOrThrow\",\"tokens.findMany\",\"data\",\"tokens.createOne\",\"tokens.createMany\",\"tokens.createManyAndReturn\",\"tokens.updateOne\",\"tokens.updateMany\",\"tokens.updateManyAndReturn\",\"create\",\"update\",\"tokens.upsertOne\",\"tokens.deleteOne\",\"tokens.deleteMany\",\"having\",\"_min\",\"_max\",\"tokens.groupBy\",\"tokens.aggregate\",\"users.findUnique\",\"users.findUniqueOrThrow\",\"users.findFirst\",\"users.findFirstOrThrow\",\"users.findMany\",\"users.createOne\",\"users.createMany\",\"users.createManyAndReturn\",\"users.updateOne\",\"users.updateMany\",\"users.updateManyAndReturn\",\"users.upsertOne\",\"users.deleteOne\",\"users.deleteMany\",\"users.groupBy\",\"users.aggregate\",\"companies.findUnique\",\"companies.findUniqueOrThrow\",\"companies.findFirst\",\"companies.findFirstOrThrow\",\"companies.findMany\",\"companies.createOne\",\"companies.createMany\",\"companies.createManyAndReturn\",\"companies.updateOne\",\"companies.updateMany\",\"companies.updateManyAndReturn\",\"companies.upsertOne\",\"companies.deleteOne\",\"companies.deleteMany\",\"_avg\",\"_sum\",\"companies.groupBy\",\"companies.aggregate\",\"rides.findUnique\",\"rides.findUniqueOrThrow\",\"rides.findFirst\",\"rides.findFirstOrThrow\",\"rides.findMany\",\"rides.createOne\",\"rides.createMany\",\"rides.createManyAndReturn\",\"rides.updateOne\",\"rides.updateMany\",\"rides.updateManyAndReturn\",\"rides.upsertOne\",\"rides.deleteOne\",\"rides.deleteMany\",\"rides.groupBy\",\"rides.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"user_id\",\"company\",\"km\",\"cost_per_km\",\"total\",\"ride_date\",\"departures\",\"failed_service\",\"idle_hours\",\"synced\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"name\",\"notes\",\"email\",\"password\",\"profilePhoto\",\"bio\",\"every\",\"some\",\"none\",\"token\",\"TokenType\",\"type\",\"userId\",\"expiresAt\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "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_ADBQAAA9ABBRAAB_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-ACAaAAB-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-Uh0_UwNAVANBVQNCVgNDVwNEWQNFWwVGXB5HXgNIYAVJYR9KYgNLYwNMZAVNZyBOaCY" } async function decodeBase64AsWasm(wasmBase64: string): Promise { diff --git a/backend/src/generated/prisma/internal/prismaNamespace.ts b/backend/src/generated/prisma/internal/prismaNamespace.ts index ce4e9c4..eb8c73b 100644 --- a/backend/src/generated/prisma/internal/prismaNamespace.ts +++ b/backend/src/generated/prisma/internal/prismaNamespace.ts @@ -772,6 +772,9 @@ export const CompaniesScalarFieldEnum = { id: 'id', name: 'name', cost_per_km: 'cost_per_km', + departures: 'departures', + failed_service: 'failed_service', + idle_hours: 'idle_hours', notes: 'notes', createdAt: 'createdAt', updatedAt: 'updatedAt' @@ -788,6 +791,9 @@ export const RidesScalarFieldEnum = { cost_per_km: 'cost_per_km', total: 'total', ride_date: 'ride_date', + departures: 'departures', + failed_service: 'failed_service', + idle_hours: 'idle_hours', synced: 'synced', createdAt: 'createdAt', updatedAt: 'updatedAt' diff --git a/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts index d72e48a..5f1499e 100644 --- a/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -103,6 +103,9 @@ export const CompaniesScalarFieldEnum = { id: 'id', name: 'name', cost_per_km: 'cost_per_km', + departures: 'departures', + failed_service: 'failed_service', + idle_hours: 'idle_hours', notes: 'notes', createdAt: 'createdAt', updatedAt: 'updatedAt' @@ -119,6 +122,9 @@ export const RidesScalarFieldEnum = { cost_per_km: 'cost_per_km', total: 'total', ride_date: 'ride_date', + departures: 'departures', + failed_service: 'failed_service', + idle_hours: 'idle_hours', synced: 'synced', createdAt: 'createdAt', updatedAt: 'updatedAt' diff --git a/backend/src/generated/prisma/models/companies.ts b/backend/src/generated/prisma/models/companies.ts index 63a623e..24c359b 100644 --- a/backend/src/generated/prisma/models/companies.ts +++ b/backend/src/generated/prisma/models/companies.ts @@ -28,16 +28,25 @@ export type AggregateCompanies = { export type CompaniesAvgAggregateOutputType = { cost_per_km: runtime.Decimal | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null } export type CompaniesSumAggregateOutputType = { cost_per_km: runtime.Decimal | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null } export type CompaniesMinAggregateOutputType = { id: string | null name: string | null cost_per_km: runtime.Decimal | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null notes: string | null createdAt: Date | null updatedAt: Date | null @@ -47,6 +56,9 @@ export type CompaniesMaxAggregateOutputType = { id: string | null name: string | null cost_per_km: runtime.Decimal | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null notes: string | null createdAt: Date | null updatedAt: Date | null @@ -56,6 +68,9 @@ export type CompaniesCountAggregateOutputType = { id: number name: number cost_per_km: number + departures: number + failed_service: number + idle_hours: number notes: number createdAt: number updatedAt: number @@ -65,16 +80,25 @@ export type CompaniesCountAggregateOutputType = { export type CompaniesAvgAggregateInputType = { cost_per_km?: true + departures?: true + failed_service?: true + idle_hours?: true } export type CompaniesSumAggregateInputType = { cost_per_km?: true + departures?: true + failed_service?: true + idle_hours?: true } export type CompaniesMinAggregateInputType = { id?: true name?: true cost_per_km?: true + departures?: true + failed_service?: true + idle_hours?: true notes?: true createdAt?: true updatedAt?: true @@ -84,6 +108,9 @@ export type CompaniesMaxAggregateInputType = { id?: true name?: true cost_per_km?: true + departures?: true + failed_service?: true + idle_hours?: true notes?: true createdAt?: true updatedAt?: true @@ -93,6 +120,9 @@ export type CompaniesCountAggregateInputType = { id?: true name?: true cost_per_km?: true + departures?: true + failed_service?: true + idle_hours?: true notes?: true createdAt?: true updatedAt?: true @@ -189,6 +219,9 @@ export type CompaniesGroupByOutputType = { id: string name: string cost_per_km: runtime.Decimal + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal notes: string | null createdAt: Date | null updatedAt: Date | null @@ -221,6 +254,9 @@ export type companiesWhereInput = { id?: Prisma.StringFilter<"companies"> | string name?: Prisma.StringFilter<"companies"> | string cost_per_km?: Prisma.DecimalFilter<"companies"> | runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: Prisma.IntNullableFilter<"companies"> | number | null + failed_service?: Prisma.IntNullableFilter<"companies"> | number | null + idle_hours?: Prisma.DecimalFilter<"companies"> | runtime.Decimal | runtime.DecimalJsLike | number | string notes?: Prisma.StringNullableFilter<"companies"> | string | null createdAt?: Prisma.DateTimeNullableFilter<"companies"> | Date | string | null updatedAt?: Prisma.DateTimeNullableFilter<"companies"> | Date | string | null @@ -230,6 +266,9 @@ export type companiesOrderByWithRelationInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder cost_per_km?: Prisma.SortOrder + departures?: Prisma.SortOrderInput | Prisma.SortOrder + failed_service?: Prisma.SortOrderInput | Prisma.SortOrder + idle_hours?: Prisma.SortOrder notes?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrderInput | Prisma.SortOrder updatedAt?: Prisma.SortOrderInput | Prisma.SortOrder @@ -242,6 +281,9 @@ export type companiesWhereUniqueInput = Prisma.AtLeast<{ NOT?: Prisma.companiesWhereInput | Prisma.companiesWhereInput[] name?: Prisma.StringFilter<"companies"> | string cost_per_km?: Prisma.DecimalFilter<"companies"> | runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: Prisma.IntNullableFilter<"companies"> | number | null + failed_service?: Prisma.IntNullableFilter<"companies"> | number | null + idle_hours?: Prisma.DecimalFilter<"companies"> | runtime.Decimal | runtime.DecimalJsLike | number | string notes?: Prisma.StringNullableFilter<"companies"> | string | null createdAt?: Prisma.DateTimeNullableFilter<"companies"> | Date | string | null updatedAt?: Prisma.DateTimeNullableFilter<"companies"> | Date | string | null @@ -251,6 +293,9 @@ export type companiesOrderByWithAggregationInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder cost_per_km?: Prisma.SortOrder + departures?: Prisma.SortOrderInput | Prisma.SortOrder + failed_service?: Prisma.SortOrderInput | Prisma.SortOrder + idle_hours?: Prisma.SortOrder notes?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrderInput | Prisma.SortOrder updatedAt?: Prisma.SortOrderInput | Prisma.SortOrder @@ -268,6 +313,9 @@ export type companiesScalarWhereWithAggregatesInput = { id?: Prisma.StringWithAggregatesFilter<"companies"> | string name?: Prisma.StringWithAggregatesFilter<"companies"> | string cost_per_km?: Prisma.DecimalWithAggregatesFilter<"companies"> | runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: Prisma.IntNullableWithAggregatesFilter<"companies"> | number | null + failed_service?: Prisma.IntNullableWithAggregatesFilter<"companies"> | number | null + idle_hours?: Prisma.DecimalWithAggregatesFilter<"companies"> | runtime.Decimal | runtime.DecimalJsLike | number | string notes?: Prisma.StringNullableWithAggregatesFilter<"companies"> | string | null createdAt?: Prisma.DateTimeNullableWithAggregatesFilter<"companies"> | Date | string | null updatedAt?: Prisma.DateTimeNullableWithAggregatesFilter<"companies"> | Date | string | null @@ -277,6 +325,9 @@ export type companiesCreateInput = { id: string name: string cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string notes?: string | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -286,6 +337,9 @@ export type companiesUncheckedCreateInput = { id: string name: string cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string notes?: string | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -295,6 +349,9 @@ export type companiesUpdateInput = { id?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -304,6 +361,9 @@ export type companiesUncheckedUpdateInput = { id?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -313,6 +373,9 @@ export type companiesCreateManyInput = { id: string name: string cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string notes?: string | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -322,6 +385,9 @@ export type companiesUpdateManyMutationInput = { id?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -331,6 +397,9 @@ export type companiesUncheckedUpdateManyInput = { id?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string notes?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -340,6 +409,9 @@ export type companiesCountOrderByAggregateInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder cost_per_km?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder notes?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder @@ -347,12 +419,18 @@ export type companiesCountOrderByAggregateInput = { export type companiesAvgOrderByAggregateInput = { cost_per_km?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder } export type companiesMaxOrderByAggregateInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder cost_per_km?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder notes?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder @@ -362,6 +440,9 @@ export type companiesMinOrderByAggregateInput = { id?: Prisma.SortOrder name?: Prisma.SortOrder cost_per_km?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder notes?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder @@ -369,6 +450,9 @@ export type companiesMinOrderByAggregateInput = { export type companiesSumOrderByAggregateInput = { cost_per_km?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder } export type DecimalFieldUpdateOperationsInput = { @@ -379,6 +463,14 @@ export type DecimalFieldUpdateOperationsInput = { divide?: runtime.Decimal | runtime.DecimalJsLike | number | string } +export type NullableIntFieldUpdateOperationsInput = { + set?: number | null + increment?: number + decrement?: number + multiply?: number + divide?: number +} + export type NullableDateTimeFieldUpdateOperationsInput = { set?: Date | string | null } @@ -389,6 +481,9 @@ export type companiesSelect = runtime.Types.Extensions.GetOmit<"id" | "name" | "cost_per_km" | "notes" | "createdAt" | "updatedAt", ExtArgs["result"]["companies"]> +export type companiesOmit = runtime.Types.Extensions.GetOmit<"id" | "name" | "cost_per_km" | "departures" | "failed_service" | "idle_hours" | "notes" | "createdAt" | "updatedAt", ExtArgs["result"]["companies"]> export type $companiesPayload = { name: "companies" @@ -430,6 +534,9 @@ export type $companiesPayload readonly name: Prisma.FieldRef<"companies", 'String'> readonly cost_per_km: Prisma.FieldRef<"companies", 'Decimal'> + readonly departures: Prisma.FieldRef<"companies", 'Int'> + readonly failed_service: Prisma.FieldRef<"companies", 'Int'> + readonly idle_hours: Prisma.FieldRef<"companies", 'Decimal'> readonly notes: Prisma.FieldRef<"companies", 'String'> readonly createdAt: Prisma.FieldRef<"companies", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"companies", 'DateTime'> diff --git a/backend/src/generated/prisma/models/rides.ts b/backend/src/generated/prisma/models/rides.ts index 18b28f7..8220d11 100644 --- a/backend/src/generated/prisma/models/rides.ts +++ b/backend/src/generated/prisma/models/rides.ts @@ -30,6 +30,9 @@ export type RidesAvgAggregateOutputType = { km: runtime.Decimal | null cost_per_km: runtime.Decimal | null total: runtime.Decimal | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null synced: number | null } @@ -37,6 +40,9 @@ export type RidesSumAggregateOutputType = { km: runtime.Decimal | null cost_per_km: runtime.Decimal | null total: runtime.Decimal | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null synced: number | null } @@ -48,6 +54,9 @@ export type RidesMinAggregateOutputType = { cost_per_km: runtime.Decimal | null total: runtime.Decimal | null ride_date: string | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null synced: number | null createdAt: Date | null updatedAt: Date | null @@ -61,6 +70,9 @@ export type RidesMaxAggregateOutputType = { cost_per_km: runtime.Decimal | null total: runtime.Decimal | null ride_date: string | null + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null synced: number | null createdAt: Date | null updatedAt: Date | null @@ -74,6 +86,9 @@ export type RidesCountAggregateOutputType = { cost_per_km: number total: number ride_date: number + departures: number + failed_service: number + idle_hours: number synced: number createdAt: number updatedAt: number @@ -85,6 +100,9 @@ export type RidesAvgAggregateInputType = { km?: true cost_per_km?: true total?: true + departures?: true + failed_service?: true + idle_hours?: true synced?: true } @@ -92,6 +110,9 @@ export type RidesSumAggregateInputType = { km?: true cost_per_km?: true total?: true + departures?: true + failed_service?: true + idle_hours?: true synced?: true } @@ -103,6 +124,9 @@ export type RidesMinAggregateInputType = { cost_per_km?: true total?: true ride_date?: true + departures?: true + failed_service?: true + idle_hours?: true synced?: true createdAt?: true updatedAt?: true @@ -116,6 +140,9 @@ export type RidesMaxAggregateInputType = { cost_per_km?: true total?: true ride_date?: true + departures?: true + failed_service?: true + idle_hours?: true synced?: true createdAt?: true updatedAt?: true @@ -129,6 +156,9 @@ export type RidesCountAggregateInputType = { cost_per_km?: true total?: true ride_date?: true + departures?: true + failed_service?: true + idle_hours?: true synced?: true createdAt?: true updatedAt?: true @@ -229,6 +259,9 @@ export type RidesGroupByOutputType = { cost_per_km: runtime.Decimal total: runtime.Decimal ride_date: string + departures: number | null + failed_service: number | null + idle_hours: runtime.Decimal | null synced: number | null createdAt: Date | null updatedAt: Date | null @@ -265,6 +298,9 @@ export type ridesWhereInput = { cost_per_km?: Prisma.DecimalFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFilter<"rides"> | string + departures?: Prisma.IntNullableFilter<"rides"> | number | null + failed_service?: Prisma.IntNullableFilter<"rides"> | number | null + idle_hours?: Prisma.DecimalNullableFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.IntNullableFilter<"rides"> | number | null createdAt?: Prisma.DateTimeNullableFilter<"rides"> | Date | string | null updatedAt?: Prisma.DateTimeNullableFilter<"rides"> | Date | string | null @@ -279,6 +315,9 @@ export type ridesOrderByWithRelationInput = { cost_per_km?: Prisma.SortOrder total?: Prisma.SortOrder ride_date?: Prisma.SortOrder + departures?: Prisma.SortOrderInput | Prisma.SortOrder + failed_service?: Prisma.SortOrderInput | Prisma.SortOrder + idle_hours?: Prisma.SortOrderInput | Prisma.SortOrder synced?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrderInput | Prisma.SortOrder updatedAt?: Prisma.SortOrderInput | Prisma.SortOrder @@ -296,6 +335,9 @@ export type ridesWhereUniqueInput = Prisma.AtLeast<{ cost_per_km?: Prisma.DecimalFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFilter<"rides"> | string + departures?: Prisma.IntNullableFilter<"rides"> | number | null + failed_service?: Prisma.IntNullableFilter<"rides"> | number | null + idle_hours?: Prisma.DecimalNullableFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.IntNullableFilter<"rides"> | number | null createdAt?: Prisma.DateTimeNullableFilter<"rides"> | Date | string | null updatedAt?: Prisma.DateTimeNullableFilter<"rides"> | Date | string | null @@ -310,6 +352,9 @@ export type ridesOrderByWithAggregationInput = { cost_per_km?: Prisma.SortOrder total?: Prisma.SortOrder ride_date?: Prisma.SortOrder + departures?: Prisma.SortOrderInput | Prisma.SortOrder + failed_service?: Prisma.SortOrderInput | Prisma.SortOrder + idle_hours?: Prisma.SortOrderInput | Prisma.SortOrder synced?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrderInput | Prisma.SortOrder updatedAt?: Prisma.SortOrderInput | Prisma.SortOrder @@ -331,6 +376,9 @@ export type ridesScalarWhereWithAggregatesInput = { cost_per_km?: Prisma.DecimalWithAggregatesFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalWithAggregatesFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringWithAggregatesFilter<"rides"> | string + departures?: Prisma.IntNullableWithAggregatesFilter<"rides"> | number | null + failed_service?: Prisma.IntNullableWithAggregatesFilter<"rides"> | number | null + idle_hours?: Prisma.DecimalNullableWithAggregatesFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.IntNullableWithAggregatesFilter<"rides"> | number | null createdAt?: Prisma.DateTimeNullableWithAggregatesFilter<"rides"> | Date | string | null updatedAt?: Prisma.DateTimeNullableWithAggregatesFilter<"rides"> | Date | string | null @@ -343,6 +391,9 @@ export type ridesCreateInput = { cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string total: runtime.Decimal | runtime.DecimalJsLike | number | string ride_date: string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: number | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -357,6 +408,9 @@ export type ridesUncheckedCreateInput = { cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string total: runtime.Decimal | runtime.DecimalJsLike | number | string ride_date: string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: number | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -369,6 +423,9 @@ export type ridesUpdateInput = { cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFieldUpdateOperationsInput | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.NullableDecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.NullableIntFieldUpdateOperationsInput | number | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -383,6 +440,9 @@ export type ridesUncheckedUpdateInput = { cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFieldUpdateOperationsInput | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.NullableDecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.NullableIntFieldUpdateOperationsInput | number | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -396,6 +456,9 @@ export type ridesCreateManyInput = { cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string total: runtime.Decimal | runtime.DecimalJsLike | number | string ride_date: string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: number | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -408,6 +471,9 @@ export type ridesUpdateManyMutationInput = { cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFieldUpdateOperationsInput | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.NullableDecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.NullableIntFieldUpdateOperationsInput | number | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -421,6 +487,9 @@ export type ridesUncheckedUpdateManyInput = { cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFieldUpdateOperationsInput | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.NullableDecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.NullableIntFieldUpdateOperationsInput | number | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -444,6 +513,9 @@ export type ridesCountOrderByAggregateInput = { cost_per_km?: Prisma.SortOrder total?: Prisma.SortOrder ride_date?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder synced?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder @@ -453,6 +525,9 @@ export type ridesAvgOrderByAggregateInput = { km?: Prisma.SortOrder cost_per_km?: Prisma.SortOrder total?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder synced?: Prisma.SortOrder } @@ -464,6 +539,9 @@ export type ridesMaxOrderByAggregateInput = { cost_per_km?: Prisma.SortOrder total?: Prisma.SortOrder ride_date?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder synced?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder @@ -477,6 +555,9 @@ export type ridesMinOrderByAggregateInput = { cost_per_km?: Prisma.SortOrder total?: Prisma.SortOrder ride_date?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder synced?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder @@ -486,6 +567,9 @@ export type ridesSumOrderByAggregateInput = { km?: Prisma.SortOrder cost_per_km?: Prisma.SortOrder total?: Prisma.SortOrder + departures?: Prisma.SortOrder + failed_service?: Prisma.SortOrder + idle_hours?: Prisma.SortOrder synced?: Prisma.SortOrder } @@ -531,12 +615,12 @@ export type ridesUncheckedUpdateManyWithoutUsersNestedInput = { deleteMany?: Prisma.ridesScalarWhereInput | Prisma.ridesScalarWhereInput[] } -export type NullableIntFieldUpdateOperationsInput = { - set?: number | null - increment?: number - decrement?: number - multiply?: number - divide?: number +export type NullableDecimalFieldUpdateOperationsInput = { + set?: runtime.Decimal | runtime.DecimalJsLike | number | string | null + increment?: runtime.Decimal | runtime.DecimalJsLike | number | string + decrement?: runtime.Decimal | runtime.DecimalJsLike | number | string + multiply?: runtime.Decimal | runtime.DecimalJsLike | number | string + divide?: runtime.Decimal | runtime.DecimalJsLike | number | string } export type ridesCreateWithoutUsersInput = { @@ -546,6 +630,9 @@ export type ridesCreateWithoutUsersInput = { cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string total: runtime.Decimal | runtime.DecimalJsLike | number | string ride_date: string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: number | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -558,6 +645,9 @@ export type ridesUncheckedCreateWithoutUsersInput = { cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string total: runtime.Decimal | runtime.DecimalJsLike | number | string ride_date: string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: number | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -600,6 +690,9 @@ export type ridesScalarWhereInput = { cost_per_km?: Prisma.DecimalFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFilter<"rides"> | string + departures?: Prisma.IntNullableFilter<"rides"> | number | null + failed_service?: Prisma.IntNullableFilter<"rides"> | number | null + idle_hours?: Prisma.DecimalNullableFilter<"rides"> | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.IntNullableFilter<"rides"> | number | null createdAt?: Prisma.DateTimeNullableFilter<"rides"> | Date | string | null updatedAt?: Prisma.DateTimeNullableFilter<"rides"> | Date | string | null @@ -612,6 +705,9 @@ export type ridesCreateManyUsersInput = { cost_per_km: runtime.Decimal | runtime.DecimalJsLike | number | string total: runtime.Decimal | runtime.DecimalJsLike | number | string ride_date: string + departures?: number | null + failed_service?: number | null + idle_hours?: runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: number | null createdAt?: Date | string | null updatedAt?: Date | string | null @@ -624,6 +720,9 @@ export type ridesUpdateWithoutUsersInput = { cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFieldUpdateOperationsInput | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.NullableDecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.NullableIntFieldUpdateOperationsInput | number | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -636,6 +735,9 @@ export type ridesUncheckedUpdateWithoutUsersInput = { cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFieldUpdateOperationsInput | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.NullableDecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.NullableIntFieldUpdateOperationsInput | number | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -648,6 +750,9 @@ export type ridesUncheckedUpdateManyWithoutUsersInput = { cost_per_km?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string total?: Prisma.DecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string ride_date?: Prisma.StringFieldUpdateOperationsInput | string + departures?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + failed_service?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + idle_hours?: Prisma.NullableDecimalFieldUpdateOperationsInput | runtime.Decimal | runtime.DecimalJsLike | number | string | null synced?: Prisma.NullableIntFieldUpdateOperationsInput | number | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null @@ -663,6 +768,9 @@ export type ridesSelect = runtime.Types.Extensions.GetOmit<"id" | "user_id" | "company" | "km" | "cost_per_km" | "total" | "ride_date" | "synced" | "createdAt" | "updatedAt", ExtArgs["result"]["rides"]> +export type ridesOmit = runtime.Types.Extensions.GetOmit<"id" | "user_id" | "company" | "km" | "cost_per_km" | "total" | "ride_date" | "departures" | "failed_service" | "idle_hours" | "synced" | "createdAt" | "updatedAt", ExtArgs["result"]["rides"]> export type ridesInclude = { users?: boolean | Prisma.usersDefaultArgs } @@ -734,6 +851,9 @@ export type $ridesPayload readonly total: Prisma.FieldRef<"rides", 'Decimal'> readonly ride_date: Prisma.FieldRef<"rides", 'String'> + readonly departures: Prisma.FieldRef<"rides", 'Int'> + readonly failed_service: Prisma.FieldRef<"rides", 'Int'> + readonly idle_hours: Prisma.FieldRef<"rides", 'Decimal'> readonly synced: Prisma.FieldRef<"rides", 'Int'> readonly createdAt: Prisma.FieldRef<"rides", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"rides", 'DateTime'> diff --git a/backend/src/repositories/companies.repository.ts b/backend/src/repositories/companies.repository.ts index 64db4cb..09b4736 100644 --- a/backend/src/repositories/companies.repository.ts +++ b/backend/src/repositories/companies.repository.ts @@ -8,6 +8,9 @@ export async function createCompany(data: { id: string; name: string; cost_per_km: any; + departures?: number; + failed_service?: number; + idle_hours?: any; notes?: string; }) { return prisma.companies.create({ data }); @@ -18,6 +21,9 @@ export async function updateCompany( data: Partial<{ name: string; cost_per_km: any; + departures: number; + failed_service: number; + idle_hours: any; notes: string; }> ) { @@ -36,6 +42,9 @@ export async function upsertCompany(data: { id: string; name: string; cost_per_km: any; + departures?: number; + failed_service?: number; + idle_hours?: any; notes?: string; }) { return prisma.companies.upsert({ @@ -43,6 +52,9 @@ export async function upsertCompany(data: { update: { name: data.name, cost_per_km: data.cost_per_km, + departures: data.departures, + failed_service: data.failed_service, + idle_hours: data.idle_hours, notes: data.notes, }, create: data, diff --git a/backend/src/repositories/rides.repository.ts b/backend/src/repositories/rides.repository.ts index 9cf271e..feb1260 100644 --- a/backend/src/repositories/rides.repository.ts +++ b/backend/src/repositories/rides.repository.ts @@ -12,6 +12,9 @@ export async function createRide(data: { cost_per_km: any; total: any; ride_date: string; + departures?: number; + failed_service?: number; + idle_hours?: any; synced?: number; }) { return prisma.rides.create({ data }); @@ -26,6 +29,9 @@ export async function updateRide( cost_per_km: any; total: any; ride_date: string; + departures: number; + failed_service: number; + idle_hours: any; synced: number; }> ) { @@ -68,6 +74,9 @@ export async function upsertRide(data: { cost_per_km: any; total: any; ride_date: string; + departures?: number; + failed_service?: number; + idle_hours?: any; synced?: number; }) { return prisma.rides.upsert({ @@ -79,6 +88,9 @@ export async function upsertRide(data: { cost_per_km: data.cost_per_km, total: data.total, ride_date: data.ride_date, + departures: data.departures, + failed_service: data.failed_service, + idle_hours: data.idle_hours, synced: data.synced, }, create: data, diff --git a/backend/src/services/sync.service.ts b/backend/src/services/sync.service.ts index b4ecd61..87b777d 100644 --- a/backend/src/services/sync.service.ts +++ b/backend/src/services/sync.service.ts @@ -9,6 +9,9 @@ export const syncCompaniesSchema = z.object({ id: z.string(), name: z.string(), cost_per_km: z.number().or(z.string()), + departures: z.number().optional(), + failed_service: z.number().optional(), + idle_hours: z.number().or(z.string()).optional(), notes: z.string().optional(), }) ), @@ -24,6 +27,9 @@ export const syncRidesSchema = z.object({ cost_per_km: z.number().or(z.string()), total: z.number().or(z.string()), ride_date: z.string(), + departures: z.number().optional(), + failed_service: z.number().optional(), + idle_hours: z.number().or(z.string()).optional(), synced: z.number().optional(), }) ), @@ -38,6 +44,9 @@ export async function syncCompanies( id: company.id, name: company.name, cost_per_km: company.cost_per_km, + departures: company.departures, + failed_service: company.failed_service, + idle_hours: company.idle_hours, notes: company.notes, }); synced.push(result); @@ -58,6 +67,9 @@ export async function syncRides( cost_per_km: ride.cost_per_km, total: ride.total, ride_date: ride.ride_date, + departures: ride.departures, + failed_service: ride.failed_service, + idle_hours: ride.idle_hours, synced: ride.synced, }); synced.push(result); diff --git a/proposta-toptran.html b/proposta-toptran.html new file mode 100644 index 0000000..2d497e3 --- /dev/null +++ b/proposta-toptran.html @@ -0,0 +1,280 @@ + + + + +Proposta — TopTran + + + + +
+

Proposta Comercial — TopTran

+
Aplicativo mobile + backend para gestão de corridas de transporte
+
Análise técnica e estimativa de valor · Maio de 2026
+
+ +

1. Escopo entregue

+ +

Backend — API REST

+

Node.jsExpress 5TypeScriptPrisma 7PostgreSQLDocker

+
    +
  • ~1.100 linhas de código próprio, arquitetura em camadas (routes → middleware → controller → service → repository)
  • +
  • Autenticação JWT com access token (15 min) + refresh token (7 dias)
  • +
  • Validação de input com Zod, hash de senha com bcrypt
  • +
  • 13 endpoints REST: /auth (register, login, logout), /users (me, profile, update, delete), /sync (companies, rides — upload e download)
  • +
  • Deploy completo com Docker + Compose (ambientes development e production) e script de deploy automatizado
  • +
+ +

Aplicativo Mobile

+

React Native 0.83Expo SDK 55Expo RouterSQLiteTypeScript

+
    +
  • ~4.460 linhas de código distribuídas em 21 arquivos
  • +
  • 11 telas: login, cadastro, dashboard, lançamento de corrida, histórico, empresas (CRUD), relatório mensal com PDF, perfil (foto + bio), sincronização com timeline visual, hub de cadastros, redirect de corrida
  • +
  • Offline-first: SQLite local com 4 tabelas e sincronização inteligente (compara IDs locais com servidor)
  • +
  • Tema escuro customizado aplicado em todo o app
  • +
  • Geração e compartilhamento de relatório em PDF (expo-print + expo-sharing)
  • +
  • Upload de foto de perfil via expo-image-picker
  • +
  • Build Android nativo com keystore de produção assinado (.jks)
  • +
  • Configuração EAS pronta para futuros builds
  • +
+ +

2. Estimativa de esforço técnico

+ + + + + + + + + + + + + + +
Frente de trabalhoHoras estimadas
Backend (API + autenticação + sync + deploy Docker)50 – 70 h
Mobile — telas e UI (11 telas com tema custom)70 – 90 h
Mobile — sincronização offline-first + SQLite + lógica de negócio30 – 40 h
Relatório PDF + perfil + upload de imagem15 – 20 h
Build / assinatura Android + ajustes de New Architecture15 – 20 h
Testes, debug em dispositivo, polimento20 – 30 h
Total estimado200 – 270 h
+ +

3. Faixa de preço sugerida

+ +

Como o projeto é um aplicativo interno corporativo — sem publicação em loja pública, sem onboarding de usuário externo e sem complexidade de marketing — a precificação é mais direta:

+ + + + + + + + + + +
CenárioValor/horaPreço total
Mínimo — freelancer pleno, projeto diretoR$ 90/hR$ 18.000 – 24.000
Justo — fullstack experiente, entrega completaR$ 130/hR$ 26.000 – 35.000
Premium — sênior, com garantia e suporte inicialR$ 180/hR$ 36.000 – 48.000
+ +
+ O que justifica o valor: +
    +
  • Stack moderna e correta (Expo SDK 55, React Native 0.83, Prisma 7)
  • +
  • Arquitetura limpa no backend, com separação real de responsabilidades
  • +
  • Sincronização offline-first não trivial: bidirecional, com reconciliação de IDs e flag synced
  • +
  • App em produção, com APK assinado e pronto para distribuição interna
  • +
+
+ +

Itens não inclusos no preço de desenvolvimento

+ + + + + + + + + +
ItemCusto recorrente
Hospedagem do backend (VPS)R$ 60 – 150 / mês
Manutenção mensal e correçõesR$ 800 – 2.000 / mês
Novas features (push, dashboard web, multi-empresa real)sob orçamento
+ +

4. Modelo alternativo — Aluguel / SaaS

+ +

Em vez de venda única do código-fonte, o aplicativo pode ser disponibilizado em modelo de assinatura (SaaS): o cliente não compra o app, paga uma mensalidade pelo uso. Setup baixo, receita recorrente, atualizações contínuas inclusas.

+ +

Setup inicial (taxa única)

+ + + + + + + + +
FaixaValor
Setup enxuto — cliente fornece a VPSR$ 1.500
Setup completo — VPS, domínio e deploy gerenciadosR$ 2.500 – 3.500
+

Inclui deploy do backend, criação do banco, geração do APK assinado, cadastro inicial de empresas/usuários e treinamento de 1 – 2 h.

+ +

Planos mensais

+ + + + + + + + + +
PlanoLimiteMensalAnual (10% off)
Básicoaté 5 motoristas, 1 empresaR$ 349R$ 3.770
Profissionalaté 20 motoristas, até 5 empresas, suporte prioritárioR$ 899R$ 9.710
Empresarialusuários e empresas ilimitados, customizações leves, SLAR$ 1.890R$ 20.412
+ +

Alternativa por usuário ativo

+

Se o cliente preferir escalar conforme o uso real:

+
    +
  • R$ 29 por motorista / mês, mínimo de 5 usuários (R$ 145/mês)
  • +
  • Setup de R$ 2.500
  • +
  • Inclui hospedagem, atualizações e correções de bug
  • +
+ +

O que está incluso na mensalidade

+
    +
  • Hospedagem do backend em VPS gerenciada
  • +
  • Banco PostgreSQL com backups diários
  • +
  • Atualizações de versão e correções de bugs
  • +
  • Suporte por WhatsApp/e-mail (tempo de resposta conforme o plano)
  • +
  • Geração de novas versões do APK quando houver atualização
  • +
+ +

Não incluso (cobrado à parte)

+ + + + + + + + + + +
ItemValor
Novas funcionalidades sob demandaR$ 130 – 150 / h
Migração de dados de sistema legadosob orçamento
Integrações externas (ERP, gateways de pagamento, etc.)sob orçamento
Publicação na Play Store (taxa Google + serviço)USD 25 + R$ 600 – 1.000
+ +
+ Ponto de equilíbrio e benefícios do modelo: +
    +
  • Plano Profissional (R$ 899/mês) se equipara à venda de R$ 30.000 em aproximadamente 33 meses
  • +
  • Para o cliente: vira despesa operacional (OPEX) em vez de investimento (CAPEX) — geralmente mais fácil de aprovar
  • +
  • Para o fornecedor: receita previsível, atualizações contínuas e relação de longo prazo
  • +
  • Sem risco de o cliente ficar com versão desatualizada ou sem suporte
  • +
+
+ +

5. Recomendação final

+ +
+

Modelo de venda única: R$ 25.000 – R$ 30.000, com 30 dias de garantia para correção de bugs. Valor por hora alternativo: R$ 120 – R$ 150/hora.

+

Modelo SaaS recomendado: Setup R$ 2.500 + Plano Profissional R$ 899/mês — equilíbrio entre acessibilidade para o cliente e sustentabilidade do serviço.

+
+ +
+ Proposta gerada com base em análise direta do código-fonte do projeto TopTran · backend + toptran-app +
+ + + diff --git a/proposta-toptran.pdf b/proposta-toptran.pdf new file mode 100644 index 0000000000000000000000000000000000000000..50a494ed9613a9769757819b208f5ed8d3bf085b GIT binary patch literal 128888 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 literal 0 HcmV?d00001 diff --git a/toptran-app/.env.development b/toptran-app/.env.development new file mode 100644 index 0000000..60ccca6 --- /dev/null +++ b/toptran-app/.env.development @@ -0,0 +1 @@ +EXPO_PUBLIC_API_URL=http://175.15.15.93:4000/api diff --git a/toptran-app/.env.production b/toptran-app/.env.production new file mode 100644 index 0000000..628db25 --- /dev/null +++ b/toptran-app/.env.production @@ -0,0 +1 @@ +EXPO_PUBLIC_API_URL=https://toptran.olymp.com.br/api diff --git a/toptran-app/database/create_tables.sql b/toptran-app/database/create_tables.sql index d407f2f..35de6b1 100644 --- a/toptran-app/database/create_tables.sql +++ b/toptran-app/database/create_tables.sql @@ -39,30 +39,47 @@ CREATE TABLE IF NOT EXISTS tokens ( -- Companies -- ============================================================ CREATE TABLE IF NOT EXISTS companies ( - id TEXT PRIMARY KEY, - name TEXT NOT NULL, - cost_per_km NUMERIC(10,2) NOT NULL, - notes TEXT DEFAULT '', - "createdAt" TIMESTAMPTZ DEFAULT NOW(), - "updatedAt" TIMESTAMPTZ DEFAULT NOW() + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + cost_per_km NUMERIC(10,2) NOT NULL, + departures INTEGER DEFAULT 0, + failed_service INTEGER DEFAULT 0, + idle_hours NUMERIC(10,2) DEFAULT 0, + notes TEXT DEFAULT '', + "createdAt" TIMESTAMPTZ DEFAULT NOW(), + "updatedAt" TIMESTAMPTZ DEFAULT NOW() ); +ALTER TABLE companies ADD COLUMN IF NOT EXISTS departures INTEGER DEFAULT 0; +ALTER TABLE companies ADD COLUMN IF NOT EXISTS failed_service INTEGER DEFAULT 0; +ALTER TABLE companies ADD COLUMN IF NOT EXISTS idle_hours NUMERIC(10,2) DEFAULT 0; + -- ============================================================ -- Rides -- ============================================================ CREATE TABLE IF NOT EXISTS rides ( - id TEXT PRIMARY KEY, - user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, - company TEXT NOT NULL, - km NUMERIC(10,2) NOT NULL, - cost_per_km NUMERIC(10,2) NOT NULL, - total NUMERIC(10,2) NOT NULL, - ride_date TEXT NOT NULL, - synced SMALLINT DEFAULT 0, - "createdAt" TIMESTAMPTZ DEFAULT NOW(), - "updatedAt" TIMESTAMPTZ DEFAULT NOW() + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, + company TEXT NOT NULL, + km NUMERIC(10,2) NOT NULL, + cost_per_km NUMERIC(10,2) NOT NULL, + total NUMERIC(10,2) NOT NULL, + ride_date TEXT NOT NULL, + departures INTEGER DEFAULT 0, + failed_service INTEGER DEFAULT 0, + idle_hours NUMERIC(10,2) DEFAULT 0, + synced SMALLINT DEFAULT 0, + "createdAt" TIMESTAMPTZ DEFAULT NOW(), + "updatedAt" TIMESTAMPTZ DEFAULT NOW() ); +-- ============================================================ +-- Migrations: add new columns if table already exists +-- ============================================================ +ALTER TABLE rides ADD COLUMN IF NOT EXISTS departures INTEGER DEFAULT 0; +ALTER TABLE rides ADD COLUMN IF NOT EXISTS failed_service INTEGER DEFAULT 0; +ALTER TABLE rides ADD COLUMN IF NOT EXISTS idle_hours NUMERIC(10,2) DEFAULT 0; + -- ============================================================ -- Indexes -- ============================================================ diff --git a/toptran-app/eas.json b/toptran-app/eas.json index e188fd7..3a60d22 100644 --- a/toptran-app/eas.json +++ b/toptran-app/eas.json @@ -11,7 +11,7 @@ "buildType": "apk" }, "env": { - "EXPO_PUBLIC_API_URL": "https://toptran.olymp.com.br/api" + "EXPO_PUBLIC_API_URL": "http://175.15.15.93:4000/api" } }, "preview": { diff --git a/toptran-app/src/app/cadastros.tsx b/toptran-app/src/app/cadastros.tsx index 7f3eca7..6ff41d2 100644 --- a/toptran-app/src/app/cadastros.tsx +++ b/toptran-app/src/app/cadastros.tsx @@ -2,6 +2,7 @@ import { BORDER_RADIUS, COLORS, SPACING } from "@/constants/theme"; import { router } from "expo-router"; import React from "react"; import { + Alert, ScrollView, StyleSheet, Text, @@ -31,19 +32,25 @@ export default function CadastrosPage() { icon: "👤", label: "Motoristas", description: "Cadastro de motoristas", - onPress: () => {}, + onPress: () => { + Alert.alert("Em desenvolvimento!"); + }, }, { icon: "🚛", label: "Veículos", description: "Cadastro de veículos", - onPress: () => {}, + onPress: () => { + Alert.alert("Em desenvolvimento!"); + }, }, { icon: "📍", label: "Rotas", description: "Rotas e destinos frequentes", - onPress: () => {}, + onPress: () => { + Alert.alert("Em desenvolvimento!"); + }, }, ]; @@ -66,9 +73,7 @@ export default function CadastrosPage() { > Cadastros - - Gerencie os dados base do sistema - + Gerencie os dados base do sistema Categorias diff --git a/toptran-app/src/app/empresas.tsx b/toptran-app/src/app/empresas.tsx index 123f3dc..4619e65 100644 --- a/toptran-app/src/app/empresas.tsx +++ b/toptran-app/src/app/empresas.tsx @@ -26,10 +26,20 @@ import { SafeAreaView } from "react-native-safe-area-context"; type FormState = { nome: string; custoPorKm: string; + partidas: string; + servicoFalho: string; + horasOciosas: string; observacoes: string; }; -const FORM_VAZIO: FormState = { nome: "", custoPorKm: "", observacoes: "" }; +const FORM_VAZIO: FormState = { + nome: "", + custoPorKm: "", + partidas: "", + servicoFalho: "", + horasOciosas: "", + observacoes: "", +}; export default function EmpresasPage() { const [empresas, setEmpresas] = useState([]); @@ -59,6 +69,9 @@ export default function EmpresasPage() { setForm({ nome: empresa.name, custoPorKm: empresa.cost_per_km.toString(), + partidas: (empresa.departures ?? 0).toString(), + servicoFalho: (empresa.failed_service ?? 0).toString(), + horasOciosas: (empresa.idle_hours ?? 0).toString(), observacoes: empresa.notes ?? "", }); setModalVisible(true); @@ -73,6 +86,9 @@ export default function EmpresasPage() { const handleSalvar = async () => { const nomeTrimmed = form.nome.trim(); const custo = parseFloat(form.custoPorKm.replace(",", ".")); + const partidas = parseInt(form.partidas, 10) || 0; + const servicoFalho = parseInt(form.servicoFalho, 10) || 0; + const horasOciosas = parseFloat(form.horasOciosas.replace(",", ".")) || 0; if (!nomeTrimmed) { Alert.alert("Validação", "Informe o nome da empresa."); @@ -90,6 +106,9 @@ export default function EmpresasPage() { id: editando.id, name: nomeTrimmed, cost_per_km: custo, + departures: partidas, + failed_service: servicoFalho, + idle_hours: horasOciosas, notes: form.observacoes.trim(), }); } else { @@ -97,6 +116,9 @@ export default function EmpresasPage() { id: Date.now().toString(), name: nomeTrimmed, cost_per_km: custo, + departures: partidas, + failed_service: servicoFalho, + idle_hours: horasOciosas, notes: form.observacoes.trim(), }); } @@ -258,6 +280,36 @@ export default function EmpresasPage() { /> + + Partidas + setForm((f) => ({ ...f, partidas: v }))} + /> + + + + Serviço falho + setForm((f) => ({ ...f, servicoFalho: v }))} + /> + + + + Horas ociosas + setForm((f) => ({ ...f, horasOciosas: v }))} + /> + + Observações (opcional) ([]); const [empresaId, setEmpresaId] = useState(""); const [custoPorKm, setCustoPorKm] = useState(0); + const [partidas, setPartidas] = useState(0); + const [servicoFalho, setServicoFalho] = useState(0); + const [horasOciosas, setHorasOciosas] = useState(0); const [distancia, setDistancia] = useState(""); const [loading, setLoading] = useState(false); @@ -56,6 +59,9 @@ export default function LancamentoPage() { setEmpresaId(id); const found = empresasDB.find((e) => e.id === id); setCustoPorKm(found?.cost_per_km ?? 0); + setPartidas(found?.departures ?? 0); + setServicoFalho(found?.failed_service ?? 0); + setHorasOciosas(found?.idle_hours ?? 0); }; const handleLancarCorrida = async () => { @@ -80,11 +86,17 @@ export default function LancamentoPage() { cost_per_km: custoPorKm, total: totalCorrida, ride_date: new Date().toLocaleString("pt-BR"), + departures: partidas, + failed_service: servicoFalho, + idle_hours: horasOciosas, synced: 0, }); setEmpresaId(""); setCustoPorKm(0); setDistancia(""); + setPartidas(0); + setServicoFalho(0); + setHorasOciosas(0); Alert.alert("Sucesso", "Corrida registrada com sucesso!", [ { text: "OK", onPress: () => router.back() }, ]); @@ -140,6 +152,27 @@ export default function LancamentoPage() { + + + Partidas + {partidas} + + + + + + Serviço falho + {servicoFalho} + + + + + + Horas ociosas + {horasOciosas.toFixed(2)} + + + Valor Total R$ {totalCorrida.toFixed(2)} diff --git a/toptran-app/src/app/sincronizar.tsx b/toptran-app/src/app/sincronizar.tsx index 624a04f..2d04903 100644 --- a/toptran-app/src/app/sincronizar.tsx +++ b/toptran-app/src/app/sincronizar.tsx @@ -105,6 +105,9 @@ export default function SincronizarPage() { id: c.id, name: c.name, cost_per_km: Number(c.cost_per_km), + departures: Number(c.departures ?? 0), + failed_service: Number(c.failed_service ?? 0), + idle_hours: Number(c.idle_hours ?? 0), notes: c.notes ?? "", }); } diff --git a/toptran-app/src/server/api.ts b/toptran-app/src/server/api.ts index 7bfefa9..f9b3800 100644 --- a/toptran-app/src/server/api.ts +++ b/toptran-app/src/server/api.ts @@ -1,6 +1,10 @@ import axios from "axios"; -const BASE_URL = process.env.EXPO_PUBLIC_API_URL ?? "http://175.15.15.93:3000"; +const BASE_URL = process.env.EXPO_PUBLIC_API_URL; + +if (!BASE_URL) { + throw new Error("EXPO_PUBLIC_API_URL não definida — verifique .env.development / .env.production"); +} export const api = axios.create({ baseURL: BASE_URL, diff --git a/toptran-app/src/services/db.ts b/toptran-app/src/services/db.ts index 69a913e..72ae661 100644 --- a/toptran-app/src/services/db.ts +++ b/toptran-app/src/services/db.ts @@ -18,6 +18,9 @@ export type RideDB = { cost_per_km: number; total: number; ride_date: string; + departures: number; + failed_service: number; + idle_hours: number; synced: 0 | 1; createdAt: string; }; @@ -26,6 +29,9 @@ export type CompanyDB = { id: string; name: string; cost_per_km: number; + departures: number; + failed_service: number; + idle_hours: number; notes: string; createdAt: string; }; @@ -51,11 +57,34 @@ export const initDB = async () => { cost_per_km REAL NOT NULL, total REAL NOT NULL, ride_date TEXT NOT NULL, + departures INTEGER DEFAULT 0, + failed_service INTEGER DEFAULT 0, + idle_hours REAL DEFAULT 0, synced INTEGER DEFAULT 0, createdAt TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) );`, ); + + const ridesCols = await db.getAllAsync<{ name: string }>( + `PRAGMA table_info(rides);`, + ); + const colNames = new Set(ridesCols.map((c) => c.name)); + if (!colNames.has("departures")) { + await db.execAsync( + `ALTER TABLE rides ADD COLUMN departures INTEGER DEFAULT 0;`, + ); + } + if (!colNames.has("failed_service")) { + await db.execAsync( + `ALTER TABLE rides ADD COLUMN failed_service INTEGER DEFAULT 0;`, + ); + } + if (!colNames.has("idle_hours")) { + await db.execAsync( + `ALTER TABLE rides ADD COLUMN idle_hours REAL DEFAULT 0;`, + ); + } await db.execAsync( `CREATE TABLE IF NOT EXISTS settings ( key TEXT PRIMARY KEY, @@ -67,10 +96,33 @@ export const initDB = async () => { id TEXT PRIMARY KEY, name TEXT NOT NULL, cost_per_km REAL NOT NULL, + departures INTEGER DEFAULT 0, + failed_service INTEGER DEFAULT 0, + idle_hours REAL DEFAULT 0, notes TEXT DEFAULT '', createdAt TEXT DEFAULT CURRENT_TIMESTAMP );`, ); + + const companiesCols = await db.getAllAsync<{ name: string }>( + `PRAGMA table_info(companies);`, + ); + const compColNames = new Set(companiesCols.map((c) => c.name)); + if (!compColNames.has("departures")) { + await db.execAsync( + `ALTER TABLE companies ADD COLUMN departures INTEGER DEFAULT 0;`, + ); + } + if (!compColNames.has("failed_service")) { + await db.execAsync( + `ALTER TABLE companies ADD COLUMN failed_service INTEGER DEFAULT 0;`, + ); + } + if (!compColNames.has("idle_hours")) { + await db.execAsync( + `ALTER TABLE companies ADD COLUMN idle_hours REAL DEFAULT 0;`, + ); + } } catch (error) { console.error("Failed to initialize database:", error); throw error; @@ -178,8 +230,8 @@ export const salvarCorrida = async (corrida: Omit) => { try { const db = await dbPromise; const result = await db.runAsync( - `INSERT INTO rides (id, user_id, company, km, cost_per_km, total, ride_date, synced) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, + `INSERT INTO rides (id, user_id, company, km, cost_per_km, total, ride_date, departures, failed_service, idle_hours, synced) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [ corrida.id, corrida.user_id, @@ -188,6 +240,9 @@ export const salvarCorrida = async (corrida: Omit) => { corrida.cost_per_km, corrida.total, corrida.ride_date, + corrida.departures, + corrida.failed_service, + corrida.idle_hours, corrida.synced, ], ); @@ -282,8 +337,17 @@ export const salvarEmpresa = async ( try { const db = await dbPromise; await db.runAsync( - `INSERT INTO companies (id, name, cost_per_km, notes) VALUES (?, ?, ?, ?)`, - [empresa.id, empresa.name, empresa.cost_per_km, empresa.notes], + `INSERT INTO companies (id, name, cost_per_km, departures, failed_service, idle_hours, notes) + VALUES (?, ?, ?, ?, ?, ?, ?)`, + [ + empresa.id, + empresa.name, + empresa.cost_per_km, + empresa.departures, + empresa.failed_service, + empresa.idle_hours, + empresa.notes, + ], ); } catch (error) { console.error("Error saving company:", error); @@ -297,8 +361,17 @@ export const upsertEmpresaLocal = async ( try { const db = await dbPromise; await db.runAsync( - `INSERT OR REPLACE INTO companies (id, name, cost_per_km, notes) VALUES (?, ?, ?, ?)`, - [empresa.id, empresa.name, empresa.cost_per_km, empresa.notes], + `INSERT OR REPLACE INTO companies (id, name, cost_per_km, departures, failed_service, idle_hours, notes) + VALUES (?, ?, ?, ?, ?, ?, ?)`, + [ + empresa.id, + empresa.name, + empresa.cost_per_km, + empresa.departures, + empresa.failed_service, + empresa.idle_hours, + empresa.notes, + ], ); } catch (error) { console.error("Error upserting company:", error); @@ -312,9 +385,20 @@ export const upsertCorridaLocal = async ( try { const db = await dbPromise; await db.runAsync( - `INSERT OR REPLACE INTO rides (id, user_id, company, km, cost_per_km, total, ride_date, synced) - VALUES (?, ?, ?, ?, ?, ?, ?, 1)`, - [corrida.id, corrida.user_id, corrida.company, corrida.km, corrida.cost_per_km, corrida.total, corrida.ride_date], + `INSERT OR REPLACE INTO rides (id, user_id, company, km, cost_per_km, total, ride_date, departures, failed_service, idle_hours, synced) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`, + [ + corrida.id, + corrida.user_id, + corrida.company, + corrida.km, + corrida.cost_per_km, + corrida.total, + corrida.ride_date, + corrida.departures, + corrida.failed_service, + corrida.idle_hours, + ], ); } catch (error) { console.error("Error upserting ride:", error); @@ -328,8 +412,16 @@ export const atualizarEmpresa = async ( try { const db = await dbPromise; await db.runAsync( - `UPDATE companies SET name = ?, cost_per_km = ?, notes = ? WHERE id = ?`, - [empresa.name, empresa.cost_per_km, empresa.notes, empresa.id], + `UPDATE companies SET name = ?, cost_per_km = ?, departures = ?, failed_service = ?, idle_hours = ?, notes = ? WHERE id = ?`, + [ + empresa.name, + empresa.cost_per_km, + empresa.departures, + empresa.failed_service, + empresa.idle_hours, + empresa.notes, + empresa.id, + ], ); } catch (error) { console.error("Error updating company:", error);