diff --git a/package.json b/package.json index 9d631c1..7116078 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "dependencies": { "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", + "@nestjs/jwt": "^11.0.2", "@nestjs/platform-express": "^11.0.1", "@nestjs/swagger": "^11.2.3", "@prisma/adapter-mariadb": "^7.1.0", @@ -12,6 +13,7 @@ "dayjs": "^1.11.19", "dotenv": "^17.2.3", "jalaliday": "^3.1.1", + "jsonwebtoken": "^9.0.3", "mysql2": "^3.15.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e7a3ec..41cffe2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@nestjs/core': specifier: ^11.0.1 version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/jwt': + specifier: ^11.0.2 + version: 11.0.2(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@nestjs/platform-express': specifier: ^11.0.1 version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9) @@ -41,6 +44,9 @@ importers: jalaliday: specifier: ^3.1.1 version: 3.1.1(dayjs@1.11.19) + jsonwebtoken: + specifier: ^9.0.3 + version: 9.0.3 mysql2: specifier: ^3.15.3 version: 3.15.3 @@ -915,6 +921,11 @@ packages: '@nestjs/websockets': optional: true + '@nestjs/jwt@11.0.2': + resolution: {integrity: sha512-rK8aE/3/Ma45gAWfCksAXUNbOoSOUudU0Kn3rT39htPF7wsYXtKfjALKeKKJbFrIWbLjsbqfXX5bIJNvgBugGA==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + '@nestjs/mapped-types@2.1.0': resolution: {integrity: sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==} peerDependencies: @@ -1144,9 +1155,15 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@22.19.1': resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} @@ -1575,6 +1592,9 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1854,6 +1874,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -2555,6 +2578,16 @@ packages: jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2592,12 +2625,33 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -4441,6 +4495,12 @@ snapshots: optionalDependencies: '@nestjs/platform-express': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9) + '@nestjs/jwt@11.0.2(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))': + dependencies: + '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@types/jsonwebtoken': 9.0.10 + jsonwebtoken: 9.0.3 + '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)': dependencies: '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -4711,8 +4771,15 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 22.19.1 + '@types/methods@1.1.4': {} + '@types/ms@2.1.0': {} + '@types/node@22.19.1': dependencies: undici-types: 6.21.0 @@ -5193,6 +5260,8 @@ snapshots: dependencies: node-int64: 0.4.0 + buffer-equal-constant-time@1.0.1: {} + buffer-from@1.1.2: {} buffer@5.7.1: @@ -5427,6 +5496,10 @@ snapshots: eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + ee-first@1.1.1: {} effect@3.18.4: @@ -6368,6 +6441,30 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.3 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -6397,10 +6494,24 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} lodash.merge@4.6.2: {} + lodash.once@4.1.1: {} + lodash@4.17.21: {} log-symbols@4.1.0: diff --git a/prisma/migrations/20251215085308_init/migration.sql b/prisma/migrations/20251215085308_init/migration.sql index 657de4b..c6c8ff0 100644 --- a/prisma/migrations/20251215085308_init/migration.sql +++ b/prisma/migrations/20251215085308_init/migration.sql @@ -15,17 +15,13 @@ CREATE INDEX `Sales_Invoices_inventoryId_fkey` ON `Sales_Invoices` (`inventoryId ALTER TABLE `Sales_Invoices` ADD CONSTRAINT `Sales_Invoices_inventoryId_fkey` FOREIGN KEY (`inventoryId`) REFERENCES `Inventories` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE; --- ------------------------------------------ --- Trigger: trg_transfer_item_after_insert --- Event: INSERT --- Table: Inventory_Transfer_Items --- ------------------------------------------ DROP TRIGGER IF EXISTS `trg_transfer_item_after_insert`; -CREATE DEFINER=`pos`@`%` TRIGGER `trg_transfer_item_after_insert` AFTER INSERT ON `Inventory_Transfer_Items` FOR EACH ROW begin +CREATE TRIGGER `trg_transfer_item_after_insert` AFTER +INSERT + ON `Inventory_Transfer_Items` FOR EACH ROW begin - - DECLARE fromInv INT; +DECLARE fromInv INT; DECLARE toInv INT; DECLARE _avgCost DECIMAL(10,2); DECLARE latestQuantityInOrigin DECIMAL(10,2); @@ -61,9 +57,11 @@ end; -- ------------------------------------------ DROP TRIGGER IF EXISTS `trg_purchase_receipt_item_after_insert`; -CREATE DEFINER=`pos`@`%` TRIGGER `trg_purchase_receipt_item_after_insert` AFTER INSERT ON `Purchase_Receipt_Items` FOR EACH ROW BEGIN - DECLARE latestQuantity DECIMAL(10,2) DEFAULT 0; - DECLARE invId INT; +CREATE TRIGGER `trg_purchase_receipt_item_after_insert` AFTER +INSERT + ON `Purchase_Receipt_Items` FOR EACH ROW BEGIN DECLARE latestQuantity DECIMAL(10, 2) DEFAULT 0; + +DECLARE invId INT; DECLARE suppId INT; -- Get inventory & supplier from receipt @@ -107,11 +105,103 @@ CREATE DEFINER=`pos`@`%` TRIGGER `trg_purchase_receipt_item_after_insert` AFTER CASE WHEN NEW.count = 0 THEN 0 ELSE NEW.total / NEW.count - END, + END + +, suppId, latestQuantity + NEW.count, NOW() ); + +END; + +-- ------------------------------------------ +-- Trigger: trg_sales_invoice_items_before_insert +-- Event: INSERT +-- Table: Sales_Invoice_Items +-- ------------------------------------------ +DROP TRIGGER IF EXISTS `trg_sales_invoice_items_before_insert`; + +CREATE TRIGGER `trg_sales_invoice_items_before_insert` BEFORE +INSERT + ON `Sales_Invoice_Items` FOR EACH ROW begin DECLARE current_stock DECIMAL(10, 2); + +DECLARE inventory_id INT; + + + SELECT inventoryId INTO inventory_id + FROM Sales_Invoices si + WHERE si.id = NEW.invoiceId + LIMIT 1; + + SELECT COALESCE(quantity, 0) INTO current_stock + FROM Stock_Balance sb + WHERE productId = NEW.productId AND sb.inventoryId = inventory_id + LIMIT 1; + + + + IF NEW.count > current_stock THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'موجودی کالا در انبار کافی نیست.'; + END IF; +end; + +-- ------------------------------------------ +-- Trigger: trg_sales_invoice_items_after_insert +-- Event: INSERT +-- Table: Sales_Invoice_Items +-- ------------------------------------------ +DROP TRIGGER IF EXISTS `trg_sales_invoice_items_after_insert`; + +CREATE TRIGGER `trg_sales_invoice_items_after_insert` AFTER +INSERT + ON `Sales_Invoice_Items` FOR EACH ROW begin DECLARE current_stock DECIMAL(10, 2); + +DECLARE inventory_id INT; + + + SELECT inventoryId INTO inventory_id + FROM Sales_Invoices si + WHERE si.id = NEW.invoiceId + LIMIT 1; + + SELECT COALESCE(quantity, 0) INTO current_stock + FROM Stock_Balance sb + WHERE productId = NEW.productId AND sb.inventoryId = inventory_id + LIMIT 1; + + + + INSERT INTO Stock_Movements ( + type, + quantity, + fee, + totalCost, + referenceType, + referenceId, + productId, + inventoryId, + avgCost, + remainedInStock, + createdAt + ) + VALUES ( + 'OUT', + NEW.count, + NEW.fee, + NEW.total, + 'SALES', + NEW.invoiceId, + NEW.productId, + inventory_id, + CASE + WHEN NEW.count = 0 THEN 0 + ELSE NEW.total / NEW.count + END + +, current_stock + NEW.count, NOW() ); + END; -- ------------------------------------------ @@ -121,81 +211,82 @@ END; -- ------------------------------------------ DROP TRIGGER IF EXISTS `trg_stock_transfer`; -CREATE DEFINER=`pos`@`%` TRIGGER `trg_stock_transfer` AFTER INSERT ON `Stock_Movements` FOR EACH ROW BEGIN - - IF NEW.referenceType = 'INVENTORY_TRANSFER' THEN - - IF NEW.type = 'IN' THEN - INSERT INTO Stock_Balance ( +CREATE TRIGGER `trg_stock_transfer` AFTER +INSERT + ON `Stock_Movements` FOR EACH ROW BEGIN IF NEW.referenceType = 'INVENTORY_TRANSFER' THEN IF NEW.type = 'IN' THEN +INSERT INTO + Stock_Balance ( productId, inventoryId, quantity, totalCost, avgCost, updatedAt - ) - VALUES ( + ) +VALUES ( NEW.productId, NEW.inventoryId, NEW.quantity, NEW.totalCost, CASE - WHEN NEW.quantity = 0 THEN 0 - ELSE NEW.totalCost / NEW.quantity + WHEN NEW.quantity = 0 THEN 0 + ELSE NEW.totalCost / NEW.quantity END, NOW() - ) - ON DUPLICATE KEY UPDATE - quantity = quantity + NEW.quantity, - totalCost = totalCost + NEW.totalCost, - avgCost = CASE - WHEN (quantity + NEW.quantity) = 0 THEN 0 - ELSE (totalCost + NEW.totalCost) / (quantity + NEW.quantity) - END, - updatedAt = NOW(); - END IF; + ) +ON DUPLICATE KEY UPDATE + quantity = quantity + NEW.quantity, + totalCost = totalCost + NEW.totalCost, + avgCost = CASE + WHEN (quantity + NEW.quantity) = 0 THEN 0 + ELSE (totalCost + NEW.totalCost) / (quantity + NEW.quantity) + END, + updatedAt = NOW(); +END IF; - IF NEW.type = 'OUT' THEN +IF NEW.type = 'OUT' THEN IF EXISTS ( + SELECT 1 + FROM Stock_Balance sb + WHERE + sb.productId = NEW.productId + AND sb.inventoryId = NEW.inventoryId +) THEN +UPDATE Stock_Balance sb +SET + sb.quantity = sb.quantity - NEW.quantity, + sb.totalCost = sb.totalCost - (sb.avgCost * NEW.quantity), + sb.updatedAt = NOW() +WHERE + sb.productId = NEW.productId + AND sb.inventoryId = NEW.inventoryId; - IF EXISTS( - SELECT 1 FROM Stock_Balance sb - WHERE sb.productId = NEW.productId - AND sb.inventoryId = NEW.inventoryId - ) THEN +ELSE +INSERT INTO + Stock_Balance ( + productId, + inventoryId, + quantity, + totalCost, + avgCost, + updatedAt + ) +VALUES ( + NEW.productId, + NEW.inventoryId, + - NEW.quantity, + - COALESCE(NEW.fee, 0) * NEW.quantity, + COALESCE(NEW.fee, 0), + NOW() + ); +END IF; - UPDATE Stock_Balance sb - SET - sb.quantity = sb.quantity - NEW.quantity, - sb.totalCost = sb.totalCost - (sb.avgCost * NEW.quantity), - sb.updatedAt = NOW() - WHERE sb.productId = NEW.productId - AND sb.inventoryId = NEW.inventoryId; +END IF; - ELSE - INSERT INTO Stock_Balance ( - productId, - inventoryId, - quantity, - totalCost, - avgCost, - updatedAt - ) - VALUES ( - NEW.productId, - NEW.inventoryId, - -NEW.quantity, - -COALESCE(NEW.fee, 0) * NEW.quantity, - COALESCE(NEW.fee, 0), - NOW() - ); - END IF; +END IF; - END IF; - - END IF; END; -- ------------------------------------------ @@ -205,22 +296,69 @@ END; -- ------------------------------------------ DROP TRIGGER IF EXISTS `trg_stock_purchase_insert`; -CREATE DEFINER=`pos`@`%` TRIGGER `trg_stock_purchase_insert` AFTER INSERT ON `Stock_Movements` FOR EACH ROW BEGIN - IF NEW.referenceType = 'PURCHASE' THEN +CREATE TRIGGER `trg_stock_purchase_insert` AFTER +INSERT + ON `Stock_Movements` FOR EACH ROW BEGIN IF NEW.referenceType = 'PURCHASE' THEN - INSERT INTO Stock_Balance (productId, quantity, avgCost, totalCost, inventoryId, updatedAt) - VALUES ( - NEW.productId, - NEW.quantity, - NEW.fee, - NEW.totalCost, - NEW.inventoryId, - NOW() - ) - ON DUPLICATE KEY UPDATE - quantity = quantity + NEW.quantity, - totalCost = totalCost + NEW.totalCost, - avgCost = totalCost / quantity; +INSERT INTO + Stock_Balance ( + productId, + quantity, + avgCost, + totalCost, + inventoryId, + updatedAt + ) +VALUES ( + NEW.productId, + NEW.quantity, + NEW.fee, + NEW.totalCost, + NEW.inventoryId, + NOW() + ) +ON DUPLICATE KEY UPDATE + quantity = quantity + NEW.quantity, + totalCost = totalCost + NEW.totalCost, + avgCost = totalCost / quantity; + +END IF; + +END; + +-- ------------------------------------------ +-- Trigger: trg_stock_sale_insert +-- Event: INSERT +-- Table: Stock_Movements +-- ------------------------------------------ +DROP TRIGGER IF EXISTS `trg_stock_sale_insert`; + +CREATE TRIGGER `trg_stock_sale_insert` AFTER +INSERT + ON `Stock_Movements` FOR EACH ROW BEGIN IF NEW.referenceType = 'SALES' THEN + +INSERT INTO + Stock_Balance ( + productId, + quantity, + avgCost, + totalCost, + inventoryId, + updatedAt + ) +VALUES ( + NEW.productId, + NEW.quantity, + NEW.fee, + NEW.totalCost, + NEW.inventoryId, + NOW() + ) +ON DUPLICATE KEY UPDATE + quantity = quantity - NEW.quantity, + totalCost = totalCost - NEW.totalCost, + avgCost = totalCost / quantity; + +END IF; - END IF; END; diff --git a/prisma/migrations/20251221091624_init/migration.sql b/prisma/migrations/20251221091624_init/migration.sql new file mode 100644 index 0000000..61fc3de --- /dev/null +++ b/prisma/migrations/20251221091624_init/migration.sql @@ -0,0 +1,37 @@ +/* + Warnings: + + - A unique constraint covering the columns `[name]` on the table `Roles` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateTable +CREATE TABLE `Otp_Codes` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `mobileNumber` VARCHAR(20) NOT NULL, + `code` VARCHAR(10) NOT NULL, + `used` BOOLEAN NOT NULL DEFAULT false, + `expiresAt` TIMESTAMP(0) NOT NULL, + `createdAt` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `Otp_Codes_mobileNumber_idx`(`mobileNumber`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `Refresh_Tokens` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `tokenHash` VARCHAR(255) NOT NULL, + `userId` INTEGER NOT NULL, + `revoked` BOOLEAN NOT NULL DEFAULT false, + `expiresAt` TIMESTAMP(0) NOT NULL, + `createdAt` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), + + INDEX `Refresh_Tokens_userId_idx`(`userId`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateIndex +CREATE UNIQUE INDEX `Roles_name_key` ON `Roles`(`name`); + +-- AddForeignKey +ALTER TABLE `Refresh_Tokens` ADD CONSTRAINT `Refresh_Tokens_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `Users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5e70722..0700af7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -10,16 +10,17 @@ datasource db { } model User { - id Int @id @default(autoincrement()) - mobileNumber String @unique @db.Char(11) - password String - firstName String - lastName String - roleId Int - createdAt DateTime @default(now()) @db.Timestamp(0) - deletedAt DateTime? @db.Timestamp(0) - updatedAt DateTime @updatedAt @db.Timestamp(0) - role Role @relation("User_Role", fields: [roleId], references: [id], onUpdate: NoAction) + id Int @id @default(autoincrement()) + mobileNumber String @unique @db.Char(11) + password String + firstName String + lastName String + roleId Int + createdAt DateTime @default(now()) @db.Timestamp(0) + deletedAt DateTime? @db.Timestamp(0) + updatedAt DateTime @updatedAt @db.Timestamp(0) + role Role @relation("User_Role", fields: [roleId], references: [id], onUpdate: NoAction) + refreshTokens RefreshToken[] @@index([roleId], map: "Users_roleId_fkey") @@map("Users") @@ -27,7 +28,7 @@ model User { model Role { id Int @id @default(autoincrement()) - name String @db.VarChar(100) + name String @unique() @db.VarChar(100) description String? @db.Text permissions Json? createdAt DateTime @default(now()) @db.Timestamp(0) @@ -345,6 +346,32 @@ model StockBalance { @@map("Stock_Balance") } +model OtpCode { + id Int @id @default(autoincrement()) + mobileNumber String @db.VarChar(20) + code String @db.VarChar(10) + used Boolean @default(false) + expiresAt DateTime @db.Timestamp(0) + createdAt DateTime @default(now()) @db.Timestamp(0) + + @@index([mobileNumber]) + @@map("Otp_Codes") +} + +model RefreshToken { + id Int @id @default(autoincrement()) + tokenHash String @db.VarChar(255) + userId Int + revoked Boolean @default(false) + expiresAt DateTime @db.Timestamp(0) + createdAt DateTime @default(now()) @db.Timestamp(0) + + user User @relation(fields: [userId], references: [id]) + + @@index([userId]) + @@map("Refresh_Tokens") +} + model InventoryTransfer { id Int @id @default(autoincrement()) code String @unique @db.VarChar(100) diff --git a/prisma/seed.ts b/prisma/seed.ts index 671542a..fa80320 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -11,6 +11,24 @@ async function main() { }) } + if ((await prisma.user.count()) === 0) { + const adminRole = await prisma.role.findUnique({ where: { name: 'Admin' } }) + if (!adminRole) { + return + } + await prisma.user.upsert({ + where: { id: 1, firstName: 'عباس', lastName: 'حسنی' }, + update: {}, + create: { + firstName: 'عباس', + lastName: 'حسنی', + roleId: adminRole.id, + mobileNumber: '09120258156', + password: '12345678', + }, + }) + } + if ((await prisma.inventory.count()) === 0) { await prisma.inventory.createMany({ data: [ diff --git a/prisma/triggers/dump_triggers.sql b/prisma/triggers/dump_triggers.sql index 872fe6d..0aeef6e 100644 --- a/prisma/triggers/dump_triggers.sql +++ b/prisma/triggers/dump_triggers.sql @@ -1,5 +1,5 @@ -- AUTO-GENERATED MYSQL TRIGGER DUMP --- Generated at: 2025-12-15T15:21:49.148Z +-- Generated at: 2025-12-21T08:07:11.406Z -- ------------------------------------------ -- Trigger: trg_transfer_item_after_insert diff --git a/src/app.module.ts b/src/app.module.ts index 23193e2..3f4c7bb 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,11 +1,13 @@ import { Module } from '@nestjs/common' import { AppController } from './app.controller' import { AppService } from './app.service' +import { AuthModule } from './auth/auth.module' import { CustomersModule } from './customers/customers.module' import { InventoriesModule } from './inventories/inventories.module' import { InventoryTransferItemsModule } from './inventory-transfer-items/inventory-transfer-items.module' import { InventoryTransfersModule } from './inventory-transfers/inventory-transfers.module' -import { PosModule } from './pos/pos.module' +import { CardexModule } from './modules/cardex/cardex.module' +import { PosModule } from './modules/pos/pos.module' import { PrismaModule } from './prisma/prisma.module' import { ProductBrandsModule } from './product-brands/product-brands.module' import { ProductCategoriesModule } from './product-categories/product-categories.module' @@ -28,6 +30,7 @@ import { UsersModule } from './users/users.module' imports: [ PrismaModule, UsersModule, + AuthModule, RolesModule, ProductsModule, ProductVariantsModule, @@ -48,6 +51,7 @@ import { UsersModule } from './users/users.module' StockAdjustmentsModule, StockBalanceModule, PosModule, + CardexModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts new file mode 100644 index 0000000..1ce7f8e --- /dev/null +++ b/src/auth/auth.controller.ts @@ -0,0 +1,41 @@ +import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common' +import { ApiTags } from '@nestjs/swagger' +import { ResponseMapper } from '../common/response/response-mapper' +import { AuthService } from './auth.service' +import { CurrentUser } from './current-user.decorator' +import { RefreshTokenDto } from './dto/refresh-token.dto' +import { SendCodeDto } from './dto/send-code.dto' +import { VerifyCodeDto } from './dto/verify-code.dto' +import { JwtAuthGuard } from './jwt-auth.guard' + +@ApiTags('auth') +@Controller('auth') +export class AuthController { + constructor(private readonly auth: AuthService) {} + + @Post('send-code') + async sendCode(@Body() dto: SendCodeDto) { + return this.auth.sendCode(dto) + } + + @Post('login') + async login(@Body() dto: VerifyCodeDto) { + return this.auth.loginWithCode(dto) + } + + @Post('refresh') + async refresh(@Body() dto: RefreshTokenDto) { + return this.auth.refreshToken(dto) + } + + @Post('logout') + async logout(@Body() dto: RefreshTokenDto) { + return this.auth.logout(dto.refreshToken) + } + + @Get('me') + @UseGuards(JwtAuthGuard) + async me(@CurrentUser() user: any) { + return ResponseMapper.single(user) + } +} diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts new file mode 100644 index 0000000..5d7c56a --- /dev/null +++ b/src/auth/auth.module.ts @@ -0,0 +1,22 @@ +import { Module } from '@nestjs/common' +import { JwtModule } from '@nestjs/jwt' +import 'dotenv/config' +import { env } from 'prisma/config' +import { PrismaModule } from '../prisma/prisma.module' +import { AuthController } from './auth.controller' +import { AuthService } from './auth.service' +import { JwtAuthGuard } from './jwt-auth.guard' + +@Module({ + imports: [ + PrismaModule, + JwtModule.register({ + secret: env('JWT_SECRET') || 'secret', + signOptions: { expiresIn: Number(env('JWT_EXPIRES_IN')) || '15m' }, + }), + ], + providers: [AuthService, JwtAuthGuard], + controllers: [AuthController], + exports: [AuthService, JwtAuthGuard], +}) +export class AuthModule {} diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts new file mode 100644 index 0000000..b065c55 --- /dev/null +++ b/src/auth/auth.service.ts @@ -0,0 +1,126 @@ +import { + BadRequestException, + Injectable, + NotFoundException, + UnauthorizedException, +} from '@nestjs/common' +import { JwtService } from '@nestjs/jwt' +import { createHash, randomBytes } from 'crypto' +import 'dotenv/config' +import { env } from 'prisma/config' +import { ResponseMapper } from '../common/response/response-mapper' +import { PrismaService } from '../prisma/prisma.service' +import { RefreshTokenDto } from './dto/refresh-token.dto' +import { SendCodeDto } from './dto/send-code.dto' +import { VerifyCodeDto } from './dto/verify-code.dto' + +@Injectable() +export class AuthService { + private readonly OTP_TTL_MINUTES = 2 + private readonly ACCESS_TOKEN_EXP = Number(env('JWT_EXPIRES_IN')) || '15m' + private readonly REFRESH_TOKEN_EXP_DAYS = 30 + + constructor( + private prisma: PrismaService, + private jwt: JwtService, + ) {} + + private generateCode() { + // For development you may want fixed code via env, otherwise random 5-digit + const staticCode = process.env.OTP_STATIC_CODE + if (staticCode) return staticCode + return Math.floor(10000 + Math.random() * 90000).toString() + } + + async sendCode(dto: SendCodeDto) { + const { mobileNumber } = dto + const user = await this.prisma.user.findFirst({ where: { mobileNumber } }) + if (!user) { + throw new NotFoundException('کاربری با این شماره تماس یافت نشد') + } + const code = this.generateCode() + const expiresAt = new Date(Date.now() + this.OTP_TTL_MINUTES * 60 * 1000) + + await this.prisma.otpCode.create({ + data: { + mobileNumber, + code, + expiresAt, + }, + }) + + // TODO: integrate SMS provider. For now return the code for dev. + return { + ok: true, + } + } + + async loginWithCode(dto: VerifyCodeDto) { + const { mobileNumber, code } = dto + const user = await this.prisma.user.findFirst({ + where: { mobileNumber }, + include: { + role: true, + }, + }) + if (!user) { + throw new NotFoundException('کاربری با این شماره تماس یافت نشد') + } + + const otp = await this.prisma.otpCode.findFirst({ + where: { mobileNumber, used: false }, + }) + + if (!otp) throw new BadRequestException('اطلاعات ورودی درست نیست') + if (otp.used) throw new BadRequestException('کد قبلن استفاده شده است') + if (otp.expiresAt.getTime() < Date.now()) + throw new BadRequestException('کد وارد شده منقضی شده است') + if (otp.code !== code) throw new BadRequestException('کد وارد شده اشتباه است') + + // mark used + await this.prisma.otpCode.update({ where: { id: otp.id }, data: { used: true } }) + + const accessToken = this.jwt.sign( + { sub: user.id, mobileNumber }, + { expiresIn: this.ACCESS_TOKEN_EXP }, + ) + const refreshTokenPlain = randomBytes(48).toString('hex') + const tokenHash = createHash('sha256').update(refreshTokenPlain).digest('hex') + const expiresAt = new Date( + Date.now() + this.REFRESH_TOKEN_EXP_DAYS * 24 * 60 * 60 * 1000, + ) + + await this.prisma.refreshToken.create({ + data: { tokenHash, userId: user.id, expiresAt }, + }) + + return ResponseMapper.single({ accessToken, refreshToken: refreshTokenPlain, user }) + } + + async refreshToken(dto: RefreshTokenDto) { + const { refreshToken } = dto + const tokenHash = createHash('sha256').update(refreshToken).digest('hex') + const record = await this.prisma.refreshToken.findFirst({ where: { tokenHash } }) + if (!record || record.revoked || record.expiresAt.getTime() < Date.now()) { + throw new UnauthorizedException('Invalid refresh token') + } + + const user = await this.prisma.user.findUnique({ where: { id: record.userId } }) + if (!user) throw new UnauthorizedException('User not found') + + const accessToken = this.jwt.sign( + { sub: user.id, mobileNumber: user.mobileNumber }, + { expiresIn: this.ACCESS_TOKEN_EXP }, + ) + return { accessToken } + } + + async logout(refreshToken: string) { + const tokenHash = createHash('sha256').update(refreshToken).digest('hex') + await this.prisma.refreshToken.updateMany({ + where: { tokenHash }, + data: { revoked: true }, + }) + return { ok: true } + } +} diff --git a/src/auth/current-user.decorator.ts b/src/auth/current-user.decorator.ts new file mode 100644 index 0000000..8d9b532 --- /dev/null +++ b/src/auth/current-user.decorator.ts @@ -0,0 +1,8 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common' + +export const CurrentUser = createParamDecorator( + (data: unknown, ctx: ExecutionContext) => { + const req = ctx.switchToHttp().getRequest() + return req.user + }, +) diff --git a/src/auth/dto/login.dto.ts b/src/auth/dto/login.dto.ts new file mode 100644 index 0000000..5dad18a --- /dev/null +++ b/src/auth/dto/login.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger' +import { IsString } from 'class-validator' + +export class LoginDto { + @ApiProperty({ description: 'Mobile number used as username', example: '09123456789' }) + @IsString() + mobileNumber: string + + @ApiProperty({ description: 'OTP password (one-time password)', example: '12345' }) + @IsString() + password: string +} diff --git a/src/auth/dto/refresh-token.dto.ts b/src/auth/dto/refresh-token.dto.ts new file mode 100644 index 0000000..e0b184b --- /dev/null +++ b/src/auth/dto/refresh-token.dto.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from '@nestjs/swagger' +import { IsString } from 'class-validator' + +export class RefreshTokenDto { + @ApiProperty() + @IsString() + refreshToken: string +} diff --git a/src/auth/dto/send-code.dto.ts b/src/auth/dto/send-code.dto.ts new file mode 100644 index 0000000..f58bbb2 --- /dev/null +++ b/src/auth/dto/send-code.dto.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from '@nestjs/swagger' +import { IsString } from 'class-validator' + +export class SendCodeDto { + @ApiProperty({ example: '09123456789' }) + @IsString() + mobileNumber: string +} diff --git a/src/auth/dto/verify-code.dto.ts b/src/auth/dto/verify-code.dto.ts new file mode 100644 index 0000000..6dcf55b --- /dev/null +++ b/src/auth/dto/verify-code.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger' +import { IsString } from 'class-validator' + +export class VerifyCodeDto { + @ApiProperty({ example: '09123456789' }) + @IsString() + mobileNumber: string + + @ApiProperty({ example: '12345' }) + @IsString() + code: string +} diff --git a/src/auth/jwt-auth.guard.ts b/src/auth/jwt-auth.guard.ts new file mode 100644 index 0000000..64e64a6 --- /dev/null +++ b/src/auth/jwt-auth.guard.ts @@ -0,0 +1,35 @@ +import { + CanActivate, + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common' +import { JwtService } from '@nestjs/jwt' +import { Request } from 'express' + +@Injectable() +export class JwtAuthGuard implements CanActivate { + constructor(private jwt: JwtService) {} + + async canActivate(context: ExecutionContext): Promise { + const req = context.switchToHttp().getRequest() + const auth = req.headers.authorization + if (!auth) throw new UnauthorizedException('Missing Authorization header') + + const parts = auth.split(' ') + if (parts.length !== 2 || parts[0] !== 'Bearer') { + throw new UnauthorizedException('Invalid Authorization header format') + } + + const token = parts[1] + try { + const payload = this.jwt.verify(token, { + secret: process.env.JWT_SECRET || 'secret', + }) + ;(req as any).user = payload + return true + } catch (err) { + throw new UnauthorizedException('Invalid or expired token') + } + } +} diff --git a/src/generated/prisma/browser.ts b/src/generated/prisma/browser.ts index f9f5cd2..0e24962 100644 --- a/src/generated/prisma/browser.ts +++ b/src/generated/prisma/browser.ts @@ -107,6 +107,16 @@ export type StockMovement = Prisma.StockMovementModel * */ export type StockBalance = Prisma.StockBalanceModel +/** + * Model OtpCode + * + */ +export type OtpCode = Prisma.OtpCodeModel +/** + * Model RefreshToken + * + */ +export type RefreshToken = Prisma.RefreshTokenModel /** * Model InventoryTransfer * diff --git a/src/generated/prisma/client.ts b/src/generated/prisma/client.ts index 69f2d17..3b960cf 100644 --- a/src/generated/prisma/client.ts +++ b/src/generated/prisma/client.ts @@ -127,6 +127,16 @@ export type StockMovement = Prisma.StockMovementModel * */ export type StockBalance = Prisma.StockBalanceModel +/** + * Model OtpCode + * + */ +export type OtpCode = Prisma.OtpCodeModel +/** + * Model RefreshToken + * + */ +export type RefreshToken = Prisma.RefreshTokenModel /** * Model InventoryTransfer * diff --git a/src/generated/prisma/internal/class.ts b/src/generated/prisma/internal/class.ts index 4eeb0ca..6821fda 100644 --- a/src/generated/prisma/internal/class.ts +++ b/src/generated/prisma/internal/class.ts @@ -22,7 +22,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.1.0", "engineVersion": "ab635e6b9d606fa5c8fb8b1a7f909c3c3c1c98ba", "activeProvider": "mysql", - "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n previewFeatures = [\"views\"]\n moduleFormat = \"cjs\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n mobileNumber String @unique @db.Char(11)\n password String\n firstName String\n lastName String\n roleId Int\n createdAt DateTime @default(now()) @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n role Role @relation(\"User_Role\", fields: [roleId], references: [id], onUpdate: NoAction)\n\n @@index([roleId], map: \"Users_roleId_fkey\")\n @@map(\"Users\")\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @db.VarChar(100)\n description String? @db.Text\n permissions Json?\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n users User[] @relation(\"User_Role\")\n\n @@map(\"Roles\")\n}\n\nmodel ProductVariant {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n basePrice Decimal @db.Decimal(10, 2)\n salePrice Decimal @db.Decimal(10, 2)\n description String? @db.Text\n barcode String? @unique(map: \"products_barcode_unique\") @db.VarChar(100)\n imageUrl String? @db.VarChar(255)\n unit String? @db.VarChar(10)\n quantity Decimal? @default(0.00) @db.Decimal(10, 2)\n alertQuantity Decimal? @default(5.00) @db.Decimal(10, 2)\n isActive Boolean @default(true)\n isFeatured Boolean @default(false)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n productId Int\n product Product @relation(\"Product_Variant\", fields: [productId], references: [id], onUpdate: NoAction)\n\n @@index([productId], map: \"Product_Variants_productId_fkey\")\n @@map(\"Product_Variants\")\n}\n\nmodel Product {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n description String? @db.Text\n sku String? @unique(map: \"products_sku_unique\") @db.VarChar(100)\n barcode String? @unique(map: \"products_barcode_unique\") @db.VarChar(100)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n salePrice Decimal @default(0.00) @db.Decimal(10, 2)\n brandId Int?\n categoryId Int?\n inventoryTransferItems InventoryTransferItem[] @relation(\"InventoryTransferItem_Product\")\n productCharges ProductCharge[] @relation(\"Product_Charges\")\n variants ProductVariant[] @relation(\"Product_Variant\")\n brand ProductBrand? @relation(\"Product_Brand\", fields: [brandId], references: [id], onUpdate: NoAction)\n category ProductCategory? @relation(\"Product_Category\", fields: [categoryId], references: [id], onUpdate: NoAction)\n purchaseReceiptItems PurchaseReceiptItem[] @relation(\"Product_PurchaseReceiptItems\")\n salesInvoiceItems SalesInvoiceItem[] @relation(\"Product_SalesInvoiceItems\")\n stockAdjustments StockAdjustment[] @relation(\"Product_Stock_Adjustments\")\n stockMovements StockMovement[] @relation(\"StockMovement_Product\")\n\n stockBalances StockBalance[] @relation(\"StockBalance_Product\")\n\n @@index([brandId], map: \"Products_brandId_fkey\")\n @@index([categoryId], map: \"Products_categoryId_fkey\")\n @@map(\"Products\")\n}\n\nmodel ProductBrand {\n id Int @id @default(autoincrement())\n name String @db.VarChar(100)\n description String? @db.Text\n imageUrl String? @db.VarChar(255)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n products Product[] @relation(\"Product_Brand\")\n\n @@map(\"Product_brands\")\n}\n\nmodel ProductCategory {\n id Int @id @default(autoincrement())\n name String @db.VarChar(100)\n description String? @db.Text\n imageUrl String? @db.VarChar(255)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n products Product[] @relation(\"Product_Category\")\n\n @@map(\"Product_categories\")\n}\n\nmodel Supplier {\n id Int @id @default(autoincrement())\n firstName String @db.VarChar(255)\n lastName String @db.VarChar(255)\n email String? @db.VarChar(255)\n mobileNumber String @unique @db.Char(11)\n address String? @db.Text\n city String? @db.VarChar(100)\n state String? @db.VarChar(100)\n country String? @db.VarChar(100)\n isActive Boolean @default(true)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n productCharges ProductCharge[] @relation(\"Supplier_Product_Charges\")\n purchaseReceipts PurchaseReceipt[]\n stockMovements StockMovement[] @relation(\"StockMovement_Supplier\")\n\n @@map(\"Suppliers\")\n}\n\nmodel Customer {\n id Int @id @default(autoincrement())\n firstName String @db.VarChar(255)\n lastName String @db.VarChar(255)\n email String? @db.VarChar(255)\n mobileNumber String @unique @db.Char(11)\n address String? @db.Text\n city String? @db.VarChar(100)\n state String? @db.VarChar(100)\n country String? @db.VarChar(100)\n isActive Boolean @default(true)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n orders Order[] @relation(\"Customer_Orders\")\n salesInvoices SalesInvoice[] @relation(\"Customer_Sales_Invoices\")\n\n @@map(\"Customers\")\n}\n\nmodel Inventory {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n location String? @db.VarChar(255)\n isActive Boolean @default(true)\n isPointOfSale Boolean @default(false)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n inventoryTransfersFrom InventoryTransfer[] @relation(\"Inventory_From\")\n inventoryTransfersTo InventoryTransfer[] @relation(\"Inventory_To\")\n productCharges ProductCharge[] @relation(\"Inventory_Product_Charges\")\n purchaseReceipts PurchaseReceipt[]\n stockAdjustments StockAdjustment[] @relation(\"Inventory_Stock_Adjustments\")\n stockMovements StockMovement[] @relation(\"StockMovement_Inventory\")\n stockBalances StockBalance[] @relation(\"StockBalance_inventory\")\n salesInvoices SalesInvoice[] @relation(\"Inventory_SalesInvoices\")\n\n @@map(\"Inventories\")\n}\n\nmodel Store {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n location String? @db.VarChar(255)\n isActive Boolean @default(true)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n\n @@map(\"Stores\")\n}\n\nmodel ProductCharge {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalAmount Decimal @db.Decimal(10, 2)\n isSettled Boolean @default(false)\n buyAt DateTime? @db.Timestamp(0)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n productId Int\n inventoryId Int\n supplierId Int\n inventory Inventory @relation(\"Inventory_Product_Charges\", fields: [inventoryId], references: [id], onUpdate: NoAction)\n product Product @relation(\"Product_Charges\", fields: [productId], references: [id], onUpdate: NoAction)\n supplier Supplier @relation(\"Supplier_Product_Charges\", fields: [supplierId], references: [id], onUpdate: NoAction)\n\n @@index([inventoryId], map: \"Product_Charges_inventoryId_fkey\")\n @@index([productId], map: \"Product_Charges_productId_fkey\")\n @@index([supplierId], map: \"Product_Charges_supplierId_fkey\")\n @@map(\"Product_Charges\")\n}\n\nmodel Order {\n id Int @id @default(autoincrement())\n orderNumber String @unique @db.VarChar(100)\n status OrderStatus @default(pending)\n paymentMethod paymentMethod @default(card)\n totalAmount Decimal @db.Decimal(10, 2)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n customerId Int\n customer Customer @relation(\"Customer_Orders\", fields: [customerId], references: [id], onUpdate: NoAction)\n\n @@index([customerId], map: \"Orders_customerId_fkey\")\n @@map(\"Orders\")\n}\n\nmodel PurchaseReceipt {\n id Int @id @default(autoincrement())\n code String @unique @db.VarChar(100)\n totalAmount Decimal @db.Decimal(10, 2)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n supplierId Int\n inventoryId Int\n items PurchaseReceiptItem[] @relation(\"PurchaseReceipt_Items\")\n inventory Inventory @relation(fields: [inventoryId], references: [id])\n supplier Supplier @relation(fields: [supplierId], references: [id])\n\n @@index([inventoryId], map: \"Purchase_Receipts_inventoryId_fkey\")\n @@index([supplierId], map: \"Purchase_Receipts_supplierId_fkey\")\n @@map(\"Purchase_Receipts\")\n}\n\nmodel PurchaseReceiptItem {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n total Decimal @db.Decimal(10, 2)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n receiptId Int\n productId Int\n receipt PurchaseReceipt @relation(\"PurchaseReceipt_Items\", fields: [receiptId], references: [id])\n product Product @relation(\"Product_PurchaseReceiptItems\", fields: [productId], references: [id])\n\n @@index([productId], map: \"Purchase_Receipt_Items_productId_fkey\")\n @@index([receiptId], map: \"Purchase_Receipt_Items_receiptId_fkey\")\n @@map(\"Purchase_Receipt_Items\")\n}\n\nmodel SalesInvoice {\n id Int @id @default(autoincrement())\n code String @unique @db.VarChar(100)\n totalAmount Decimal @db.Decimal(10, 2)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n customerId Int?\n inventoryId Int\n items SalesInvoiceItem[] @relation(\"SalesInvoice_Items\")\n customer Customer? @relation(\"Customer_Sales_Invoices\", fields: [customerId], references: [id])\n inventory Inventory @relation(\"Inventory_SalesInvoices\", fields: [inventoryId], references: [id])\n\n @@index([inventoryId], map: \"Sales_Invoices_inventoryId_fkey\")\n @@index([customerId], map: \"Sales_Invoices_customerId_fkey\")\n @@map(\"Sales_Invoices\")\n}\n\nmodel SalesInvoiceItem {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n total Decimal @db.Decimal(10, 2)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n invoiceId Int\n productId Int\n invoice SalesInvoice @relation(\"SalesInvoice_Items\", fields: [invoiceId], references: [id])\n product Product @relation(\"Product_SalesInvoiceItems\", fields: [productId], references: [id])\n\n @@index([invoiceId], map: \"Sales_Invoice_Items_invoiceId_fkey\")\n @@index([productId], map: \"Sales_Invoice_Items_productId_fkey\")\n @@map(\"Sales_Invoice_Items\")\n}\n\nmodel StockMovement {\n id Int @id @default(autoincrement())\n type MovementType\n quantity Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalCost Decimal @db.Decimal(10, 2)\n referenceType MovementReferenceType\n referenceId String\n createdAt DateTime @default(now()) @db.Timestamp(0)\n productId Int\n inventoryId Int\n avgCost Decimal @db.Decimal(10, 2)\n remainedInStock Decimal @default(0) @db.Decimal(10, 2)\n inventory Inventory @relation(\"StockMovement_Inventory\", fields: [inventoryId], references: [id])\n product Product @relation(\"StockMovement_Product\", fields: [productId], references: [id])\n supplierId Int?\n supplier Supplier? @relation(\"StockMovement_Supplier\", fields: [supplierId], references: [id])\n\n @@index([inventoryId], map: \"Stock_Movements_inventoryId_fkey\")\n @@index([productId], map: \"Stock_Movements_productId_fkey\")\n @@map(\"Stock_Movements\")\n}\n\nmodel StockBalance {\n id Int @id @default(autoincrement())\n\n productId Int\n inventoryId Int\n\n quantity Decimal @default(0) @db.Decimal(14, 3)\n\n avgCost Decimal @default(0) @db.Decimal(14, 2)\n totalCost Decimal @default(0) @db.Decimal(14, 2)\n\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n\n product Product @relation(\"StockBalance_Product\", fields: [productId], references: [id])\n inventory Inventory @relation(\"StockBalance_inventory\", fields: [inventoryId], references: [id])\n\n @@unique([productId, inventoryId])\n @@index([productId])\n @@index([inventoryId])\n @@map(\"Stock_Balance\")\n}\n\nmodel InventoryTransfer {\n id Int @id @default(autoincrement())\n code String @unique @db.VarChar(100)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n fromInventoryId Int\n toInventoryId Int\n items InventoryTransferItem[] @relation(\"InventoryTransfer_Items\")\n fromInventory Inventory @relation(\"Inventory_From\", fields: [fromInventoryId], references: [id])\n toInventory Inventory @relation(\"Inventory_To\", fields: [toInventoryId], references: [id])\n\n @@index([fromInventoryId], map: \"Inventory_Transfers_fromInventoryId_fkey\")\n @@index([toInventoryId], map: \"Inventory_Transfers_toInventoryId_fkey\")\n @@map(\"Inventory_Transfers\")\n}\n\nmodel InventoryTransferItem {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n productId Int\n transferId Int\n product Product @relation(\"InventoryTransferItem_Product\", fields: [productId], references: [id])\n transfer InventoryTransfer @relation(\"InventoryTransfer_Items\", fields: [transferId], references: [id])\n\n @@index([productId], map: \"Inventory_Transfer_Items_productId_fkey\")\n @@index([transferId], map: \"Inventory_Transfer_Items_transferId_fkey\")\n @@map(\"Inventory_Transfer_Items\")\n}\n\nmodel StockAdjustment {\n id Int @id @default(autoincrement())\n adjustedQuantity Decimal @db.Decimal(10, 2)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n productId Int\n inventoryId Int\n inventory Inventory @relation(\"Inventory_Stock_Adjustments\", fields: [inventoryId], references: [id])\n product Product @relation(\"Product_Stock_Adjustments\", fields: [productId], references: [id])\n\n @@index([inventoryId], map: \"Stock_Adjustments_inventoryId_fkey\")\n @@index([productId], map: \"Stock_Adjustments_productId_fkey\")\n @@map(\"Stock_Adjustments\")\n}\n\nview StockMovements_View {\n id Int @default(0)\n productId Int\n type stock_movements_view_type\n quantity Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalCost Decimal @db.Decimal(10, 2)\n referenceId String\n referenceType stock_movements_view_referenceType\n createdAt DateTime @default(now()) @db.Timestamp(0)\n current_stock Decimal?\n current_avg_cost Decimal?\n\n @@map(\"Stock_Movements_View\")\n @@ignore\n}\n\nview inventory_overview {\n ProductId Int\n stock_quantity Decimal\n avgCost Decimal\n totalCost Decimal\n updatedAt DateTime @default(now()) @db.Timestamp(0)\n\n @@map(\"Inventory_Overview\")\n}\n\nview stock_cardex {\n productId Int\n movement_id Int @default(0)\n type stock_cardex_type\n quantity Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalCost Decimal @db.Decimal(10, 2)\n balance_quantity Decimal?\n balance_avg_cost Decimal?\n createdAt DateTime @default(now()) @db.Timestamp(0)\n\n @@map(\"Stock_Cardex\")\n}\n\nview stock_view {\n productId Int\n inventoryId Int\n stock Decimal? @db.Decimal(32, 2)\n\n @@map(\"Stock_View\")\n}\n\nenum OrderStatus {\n pending\n reject\n done\n}\n\nenum paymentMethod {\n cash\n card\n}\n\nenum MovementType {\n IN\n OUT\n ADJUST\n}\n\nenum MovementReferenceType {\n PURCHASE\n SALES\n ADJUSTMENT\n INVENTORY_TRANSFER\n}\n\nenum stock_cardex_type {\n IN\n OUT\n ADJUST\n}\n\nenum stock_movements_view_type {\n IN\n OUT\n ADJUST\n}\n\nenum stock_movements_view_referenceType {\n PURCHASE\n SALES\n ADJUSTMENT\n}\n\nmodel TriggerLog {\n id Int @id @default(autoincrement())\n name String @db.Text\n message String @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n\n @@map(\"Trigger_Logs\")\n}\n", + "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n previewFeatures = [\"views\"]\n moduleFormat = \"cjs\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n mobileNumber String @unique @db.Char(11)\n password String\n firstName String\n lastName String\n roleId Int\n createdAt DateTime @default(now()) @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n role Role @relation(\"User_Role\", fields: [roleId], references: [id], onUpdate: NoAction)\n refreshTokens RefreshToken[]\n\n @@index([roleId], map: \"Users_roleId_fkey\")\n @@map(\"Users\")\n}\n\nmodel Role {\n id Int @id @default(autoincrement())\n name String @unique() @db.VarChar(100)\n description String? @db.Text\n permissions Json?\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n users User[] @relation(\"User_Role\")\n\n @@map(\"Roles\")\n}\n\nmodel ProductVariant {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n basePrice Decimal @db.Decimal(10, 2)\n salePrice Decimal @db.Decimal(10, 2)\n description String? @db.Text\n barcode String? @unique(map: \"products_barcode_unique\") @db.VarChar(100)\n imageUrl String? @db.VarChar(255)\n unit String? @db.VarChar(10)\n quantity Decimal? @default(0.00) @db.Decimal(10, 2)\n alertQuantity Decimal? @default(5.00) @db.Decimal(10, 2)\n isActive Boolean @default(true)\n isFeatured Boolean @default(false)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n productId Int\n product Product @relation(\"Product_Variant\", fields: [productId], references: [id], onUpdate: NoAction)\n\n @@index([productId], map: \"Product_Variants_productId_fkey\")\n @@map(\"Product_Variants\")\n}\n\nmodel Product {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n description String? @db.Text\n sku String? @unique(map: \"products_sku_unique\") @db.VarChar(100)\n barcode String? @unique(map: \"products_barcode_unique\") @db.VarChar(100)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n salePrice Decimal @default(0.00) @db.Decimal(10, 2)\n brandId Int?\n categoryId Int?\n inventoryTransferItems InventoryTransferItem[] @relation(\"InventoryTransferItem_Product\")\n productCharges ProductCharge[] @relation(\"Product_Charges\")\n variants ProductVariant[] @relation(\"Product_Variant\")\n brand ProductBrand? @relation(\"Product_Brand\", fields: [brandId], references: [id], onUpdate: NoAction)\n category ProductCategory? @relation(\"Product_Category\", fields: [categoryId], references: [id], onUpdate: NoAction)\n purchaseReceiptItems PurchaseReceiptItem[] @relation(\"Product_PurchaseReceiptItems\")\n salesInvoiceItems SalesInvoiceItem[] @relation(\"Product_SalesInvoiceItems\")\n stockAdjustments StockAdjustment[] @relation(\"Product_Stock_Adjustments\")\n stockMovements StockMovement[] @relation(\"StockMovement_Product\")\n\n stockBalances StockBalance[] @relation(\"StockBalance_Product\")\n\n @@index([brandId], map: \"Products_brandId_fkey\")\n @@index([categoryId], map: \"Products_categoryId_fkey\")\n @@map(\"Products\")\n}\n\nmodel ProductBrand {\n id Int @id @default(autoincrement())\n name String @db.VarChar(100)\n description String? @db.Text\n imageUrl String? @db.VarChar(255)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n products Product[] @relation(\"Product_Brand\")\n\n @@map(\"Product_brands\")\n}\n\nmodel ProductCategory {\n id Int @id @default(autoincrement())\n name String @db.VarChar(100)\n description String? @db.Text\n imageUrl String? @db.VarChar(255)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n products Product[] @relation(\"Product_Category\")\n\n @@map(\"Product_categories\")\n}\n\nmodel Supplier {\n id Int @id @default(autoincrement())\n firstName String @db.VarChar(255)\n lastName String @db.VarChar(255)\n email String? @db.VarChar(255)\n mobileNumber String @unique @db.Char(11)\n address String? @db.Text\n city String? @db.VarChar(100)\n state String? @db.VarChar(100)\n country String? @db.VarChar(100)\n isActive Boolean @default(true)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n productCharges ProductCharge[] @relation(\"Supplier_Product_Charges\")\n purchaseReceipts PurchaseReceipt[]\n stockMovements StockMovement[] @relation(\"StockMovement_Supplier\")\n\n @@map(\"Suppliers\")\n}\n\nmodel Customer {\n id Int @id @default(autoincrement())\n firstName String @db.VarChar(255)\n lastName String @db.VarChar(255)\n email String? @db.VarChar(255)\n mobileNumber String @unique @db.Char(11)\n address String? @db.Text\n city String? @db.VarChar(100)\n state String? @db.VarChar(100)\n country String? @db.VarChar(100)\n isActive Boolean @default(true)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n orders Order[] @relation(\"Customer_Orders\")\n salesInvoices SalesInvoice[] @relation(\"Customer_Sales_Invoices\")\n\n @@map(\"Customers\")\n}\n\nmodel Inventory {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n location String? @db.VarChar(255)\n isActive Boolean @default(true)\n isPointOfSale Boolean @default(false)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n inventoryTransfersFrom InventoryTransfer[] @relation(\"Inventory_From\")\n inventoryTransfersTo InventoryTransfer[] @relation(\"Inventory_To\")\n productCharges ProductCharge[] @relation(\"Inventory_Product_Charges\")\n purchaseReceipts PurchaseReceipt[]\n stockAdjustments StockAdjustment[] @relation(\"Inventory_Stock_Adjustments\")\n stockMovements StockMovement[] @relation(\"StockMovement_Inventory\")\n stockBalances StockBalance[] @relation(\"StockBalance_inventory\")\n salesInvoices SalesInvoice[] @relation(\"Inventory_SalesInvoices\")\n\n @@map(\"Inventories\")\n}\n\nmodel Store {\n id Int @id @default(autoincrement())\n name String @db.VarChar(255)\n location String? @db.VarChar(255)\n isActive Boolean @default(true)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n\n @@map(\"Stores\")\n}\n\nmodel ProductCharge {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalAmount Decimal @db.Decimal(10, 2)\n isSettled Boolean @default(false)\n buyAt DateTime? @db.Timestamp(0)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n productId Int\n inventoryId Int\n supplierId Int\n inventory Inventory @relation(\"Inventory_Product_Charges\", fields: [inventoryId], references: [id], onUpdate: NoAction)\n product Product @relation(\"Product_Charges\", fields: [productId], references: [id], onUpdate: NoAction)\n supplier Supplier @relation(\"Supplier_Product_Charges\", fields: [supplierId], references: [id], onUpdate: NoAction)\n\n @@index([inventoryId], map: \"Product_Charges_inventoryId_fkey\")\n @@index([productId], map: \"Product_Charges_productId_fkey\")\n @@index([supplierId], map: \"Product_Charges_supplierId_fkey\")\n @@map(\"Product_Charges\")\n}\n\nmodel Order {\n id Int @id @default(autoincrement())\n orderNumber String @unique @db.VarChar(100)\n status OrderStatus @default(pending)\n paymentMethod paymentMethod @default(card)\n totalAmount Decimal @db.Decimal(10, 2)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n deletedAt DateTime? @db.Timestamp(0)\n customerId Int\n customer Customer @relation(\"Customer_Orders\", fields: [customerId], references: [id], onUpdate: NoAction)\n\n @@index([customerId], map: \"Orders_customerId_fkey\")\n @@map(\"Orders\")\n}\n\nmodel PurchaseReceipt {\n id Int @id @default(autoincrement())\n code String @unique @db.VarChar(100)\n totalAmount Decimal @db.Decimal(10, 2)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n supplierId Int\n inventoryId Int\n items PurchaseReceiptItem[] @relation(\"PurchaseReceipt_Items\")\n inventory Inventory @relation(fields: [inventoryId], references: [id])\n supplier Supplier @relation(fields: [supplierId], references: [id])\n\n @@index([inventoryId], map: \"Purchase_Receipts_inventoryId_fkey\")\n @@index([supplierId], map: \"Purchase_Receipts_supplierId_fkey\")\n @@map(\"Purchase_Receipts\")\n}\n\nmodel PurchaseReceiptItem {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n total Decimal @db.Decimal(10, 2)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n receiptId Int\n productId Int\n receipt PurchaseReceipt @relation(\"PurchaseReceipt_Items\", fields: [receiptId], references: [id])\n product Product @relation(\"Product_PurchaseReceiptItems\", fields: [productId], references: [id])\n\n @@index([productId], map: \"Purchase_Receipt_Items_productId_fkey\")\n @@index([receiptId], map: \"Purchase_Receipt_Items_receiptId_fkey\")\n @@map(\"Purchase_Receipt_Items\")\n}\n\nmodel SalesInvoice {\n id Int @id @default(autoincrement())\n code String @unique @db.VarChar(100)\n totalAmount Decimal @db.Decimal(10, 2)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n customerId Int?\n inventoryId Int\n items SalesInvoiceItem[] @relation(\"SalesInvoice_Items\")\n customer Customer? @relation(\"Customer_Sales_Invoices\", fields: [customerId], references: [id])\n inventory Inventory @relation(\"Inventory_SalesInvoices\", fields: [inventoryId], references: [id])\n\n @@index([inventoryId], map: \"Sales_Invoices_inventoryId_fkey\")\n @@index([customerId], map: \"Sales_Invoices_customerId_fkey\")\n @@map(\"Sales_Invoices\")\n}\n\nmodel SalesInvoiceItem {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n total Decimal @db.Decimal(10, 2)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n invoiceId Int\n productId Int\n invoice SalesInvoice @relation(\"SalesInvoice_Items\", fields: [invoiceId], references: [id])\n product Product @relation(\"Product_SalesInvoiceItems\", fields: [productId], references: [id])\n\n @@index([invoiceId], map: \"Sales_Invoice_Items_invoiceId_fkey\")\n @@index([productId], map: \"Sales_Invoice_Items_productId_fkey\")\n @@map(\"Sales_Invoice_Items\")\n}\n\nmodel StockMovement {\n id Int @id @default(autoincrement())\n type MovementType\n quantity Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalCost Decimal @db.Decimal(10, 2)\n referenceType MovementReferenceType\n referenceId String\n createdAt DateTime @default(now()) @db.Timestamp(0)\n productId Int\n inventoryId Int\n avgCost Decimal @db.Decimal(10, 2)\n remainedInStock Decimal @default(0) @db.Decimal(10, 2)\n inventory Inventory @relation(\"StockMovement_Inventory\", fields: [inventoryId], references: [id])\n product Product @relation(\"StockMovement_Product\", fields: [productId], references: [id])\n supplierId Int?\n supplier Supplier? @relation(\"StockMovement_Supplier\", fields: [supplierId], references: [id])\n\n @@index([inventoryId], map: \"Stock_Movements_inventoryId_fkey\")\n @@index([productId], map: \"Stock_Movements_productId_fkey\")\n @@map(\"Stock_Movements\")\n}\n\nmodel StockBalance {\n id Int @id @default(autoincrement())\n\n productId Int\n inventoryId Int\n\n quantity Decimal @default(0) @db.Decimal(14, 3)\n\n avgCost Decimal @default(0) @db.Decimal(14, 2)\n totalCost Decimal @default(0) @db.Decimal(14, 2)\n\n createdAt DateTime @default(now()) @db.Timestamp(0)\n updatedAt DateTime @updatedAt @db.Timestamp(0)\n\n product Product @relation(\"StockBalance_Product\", fields: [productId], references: [id])\n inventory Inventory @relation(\"StockBalance_inventory\", fields: [inventoryId], references: [id])\n\n @@unique([productId, inventoryId])\n @@index([productId])\n @@index([inventoryId])\n @@map(\"Stock_Balance\")\n}\n\nmodel OtpCode {\n id Int @id @default(autoincrement())\n mobileNumber String @db.VarChar(20)\n code String @db.VarChar(10)\n used Boolean @default(false)\n expiresAt DateTime @db.Timestamp(0)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n\n @@index([mobileNumber])\n @@map(\"Otp_Codes\")\n}\n\nmodel RefreshToken {\n id Int @id @default(autoincrement())\n tokenHash String @db.VarChar(255)\n userId Int\n revoked Boolean @default(false)\n expiresAt DateTime @db.Timestamp(0)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n\n user User @relation(fields: [userId], references: [id])\n\n @@index([userId])\n @@map(\"Refresh_Tokens\")\n}\n\nmodel InventoryTransfer {\n id Int @id @default(autoincrement())\n code String @unique @db.VarChar(100)\n description String? @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n fromInventoryId Int\n toInventoryId Int\n items InventoryTransferItem[] @relation(\"InventoryTransfer_Items\")\n fromInventory Inventory @relation(\"Inventory_From\", fields: [fromInventoryId], references: [id])\n toInventory Inventory @relation(\"Inventory_To\", fields: [toInventoryId], references: [id])\n\n @@index([fromInventoryId], map: \"Inventory_Transfers_fromInventoryId_fkey\")\n @@index([toInventoryId], map: \"Inventory_Transfers_toInventoryId_fkey\")\n @@map(\"Inventory_Transfers\")\n}\n\nmodel InventoryTransferItem {\n id Int @id @default(autoincrement())\n count Decimal @db.Decimal(10, 2)\n productId Int\n transferId Int\n product Product @relation(\"InventoryTransferItem_Product\", fields: [productId], references: [id])\n transfer InventoryTransfer @relation(\"InventoryTransfer_Items\", fields: [transferId], references: [id])\n\n @@index([productId], map: \"Inventory_Transfer_Items_productId_fkey\")\n @@index([transferId], map: \"Inventory_Transfer_Items_transferId_fkey\")\n @@map(\"Inventory_Transfer_Items\")\n}\n\nmodel StockAdjustment {\n id Int @id @default(autoincrement())\n adjustedQuantity Decimal @db.Decimal(10, 2)\n createdAt DateTime @default(now()) @db.Timestamp(0)\n productId Int\n inventoryId Int\n inventory Inventory @relation(\"Inventory_Stock_Adjustments\", fields: [inventoryId], references: [id])\n product Product @relation(\"Product_Stock_Adjustments\", fields: [productId], references: [id])\n\n @@index([inventoryId], map: \"Stock_Adjustments_inventoryId_fkey\")\n @@index([productId], map: \"Stock_Adjustments_productId_fkey\")\n @@map(\"Stock_Adjustments\")\n}\n\nview StockMovements_View {\n id Int @default(0)\n productId Int\n type stock_movements_view_type\n quantity Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalCost Decimal @db.Decimal(10, 2)\n referenceId String\n referenceType stock_movements_view_referenceType\n createdAt DateTime @default(now()) @db.Timestamp(0)\n current_stock Decimal?\n current_avg_cost Decimal?\n\n @@map(\"Stock_Movements_View\")\n @@ignore\n}\n\nview inventory_overview {\n ProductId Int\n stock_quantity Decimal\n avgCost Decimal\n totalCost Decimal\n updatedAt DateTime @default(now()) @db.Timestamp(0)\n\n @@map(\"Inventory_Overview\")\n}\n\nview stock_cardex {\n productId Int\n movement_id Int @default(0)\n type stock_cardex_type\n quantity Decimal @db.Decimal(10, 2)\n fee Decimal @db.Decimal(10, 2)\n totalCost Decimal @db.Decimal(10, 2)\n balance_quantity Decimal?\n balance_avg_cost Decimal?\n createdAt DateTime @default(now()) @db.Timestamp(0)\n\n @@map(\"Stock_Cardex\")\n}\n\nview stock_view {\n productId Int\n inventoryId Int\n stock Decimal? @db.Decimal(32, 2)\n\n @@map(\"Stock_View\")\n}\n\nenum OrderStatus {\n pending\n reject\n done\n}\n\nenum paymentMethod {\n cash\n card\n}\n\nenum MovementType {\n IN\n OUT\n ADJUST\n}\n\nenum MovementReferenceType {\n PURCHASE\n SALES\n ADJUSTMENT\n INVENTORY_TRANSFER\n}\n\nenum stock_cardex_type {\n IN\n OUT\n ADJUST\n}\n\nenum stock_movements_view_type {\n IN\n OUT\n ADJUST\n}\n\nenum stock_movements_view_referenceType {\n PURCHASE\n SALES\n ADJUSTMENT\n}\n\nmodel TriggerLog {\n id Int @id @default(autoincrement())\n name String @db.Text\n message String @db.Text\n createdAt DateTime @default(now()) @db.Timestamp(0)\n\n @@map(\"Trigger_Logs\")\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -30,7 +30,7 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"Role\",\"relationName\":\"User_Role\"}],\"dbName\":\"Users\"},\"Role\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissions\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"User_Role\"}],\"dbName\":\"Roles\"},\"ProductVariant\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"salePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"barcode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"imageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"alertQuantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isFeatured\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Variant\"}],\"dbName\":\"Product_Variants\"},\"Product\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sku\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"barcode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"salePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"brandId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryTransferItems\",\"kind\":\"object\",\"type\":\"InventoryTransferItem\",\"relationName\":\"InventoryTransferItem_Product\"},{\"name\":\"productCharges\",\"kind\":\"object\",\"type\":\"ProductCharge\",\"relationName\":\"Product_Charges\"},{\"name\":\"variants\",\"kind\":\"object\",\"type\":\"ProductVariant\",\"relationName\":\"Product_Variant\"},{\"name\":\"brand\",\"kind\":\"object\",\"type\":\"ProductBrand\",\"relationName\":\"Product_Brand\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProductCategory\",\"relationName\":\"Product_Category\"},{\"name\":\"purchaseReceiptItems\",\"kind\":\"object\",\"type\":\"PurchaseReceiptItem\",\"relationName\":\"Product_PurchaseReceiptItems\"},{\"name\":\"salesInvoiceItems\",\"kind\":\"object\",\"type\":\"SalesInvoiceItem\",\"relationName\":\"Product_SalesInvoiceItems\"},{\"name\":\"stockAdjustments\",\"kind\":\"object\",\"type\":\"StockAdjustment\",\"relationName\":\"Product_Stock_Adjustments\"},{\"name\":\"stockMovements\",\"kind\":\"object\",\"type\":\"StockMovement\",\"relationName\":\"StockMovement_Product\"},{\"name\":\"stockBalances\",\"kind\":\"object\",\"type\":\"StockBalance\",\"relationName\":\"StockBalance_Product\"}],\"dbName\":\"Products\"},\"ProductBrand\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"imageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"products\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Brand\"}],\"dbName\":\"Product_brands\"},\"ProductCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"imageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"products\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Category\"}],\"dbName\":\"Product_categories\"},\"Supplier\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productCharges\",\"kind\":\"object\",\"type\":\"ProductCharge\",\"relationName\":\"Supplier_Product_Charges\"},{\"name\":\"purchaseReceipts\",\"kind\":\"object\",\"type\":\"PurchaseReceipt\",\"relationName\":\"PurchaseReceiptToSupplier\"},{\"name\":\"stockMovements\",\"kind\":\"object\",\"type\":\"StockMovement\",\"relationName\":\"StockMovement_Supplier\"}],\"dbName\":\"Suppliers\"},\"Customer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"orders\",\"kind\":\"object\",\"type\":\"Order\",\"relationName\":\"Customer_Orders\"},{\"name\":\"salesInvoices\",\"kind\":\"object\",\"type\":\"SalesInvoice\",\"relationName\":\"Customer_Sales_Invoices\"}],\"dbName\":\"Customers\"},\"Inventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isPointOfSale\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"inventoryTransfersFrom\",\"kind\":\"object\",\"type\":\"InventoryTransfer\",\"relationName\":\"Inventory_From\"},{\"name\":\"inventoryTransfersTo\",\"kind\":\"object\",\"type\":\"InventoryTransfer\",\"relationName\":\"Inventory_To\"},{\"name\":\"productCharges\",\"kind\":\"object\",\"type\":\"ProductCharge\",\"relationName\":\"Inventory_Product_Charges\"},{\"name\":\"purchaseReceipts\",\"kind\":\"object\",\"type\":\"PurchaseReceipt\",\"relationName\":\"InventoryToPurchaseReceipt\"},{\"name\":\"stockAdjustments\",\"kind\":\"object\",\"type\":\"StockAdjustment\",\"relationName\":\"Inventory_Stock_Adjustments\"},{\"name\":\"stockMovements\",\"kind\":\"object\",\"type\":\"StockMovement\",\"relationName\":\"StockMovement_Inventory\"},{\"name\":\"stockBalances\",\"kind\":\"object\",\"type\":\"StockBalance\",\"relationName\":\"StockBalance_inventory\"},{\"name\":\"salesInvoices\",\"kind\":\"object\",\"type\":\"SalesInvoice\",\"relationName\":\"Inventory_SalesInvoices\"}],\"dbName\":\"Inventories\"},\"Store\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Stores\"},\"ProductCharge\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isSettled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"buyAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"supplierId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_Product_Charges\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Charges\"},{\"name\":\"supplier\",\"kind\":\"object\",\"type\":\"Supplier\",\"relationName\":\"Supplier_Product_Charges\"}],\"dbName\":\"Product_Charges\"},\"Order\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"orderNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"OrderStatus\"},{\"name\":\"paymentMethod\",\"kind\":\"enum\",\"type\":\"paymentMethod\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"customerId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"customer\",\"kind\":\"object\",\"type\":\"Customer\",\"relationName\":\"Customer_Orders\"}],\"dbName\":\"Orders\"},\"PurchaseReceipt\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"supplierId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"PurchaseReceiptItem\",\"relationName\":\"PurchaseReceipt_Items\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"InventoryToPurchaseReceipt\"},{\"name\":\"supplier\",\"kind\":\"object\",\"type\":\"Supplier\",\"relationName\":\"PurchaseReceiptToSupplier\"}],\"dbName\":\"Purchase_Receipts\"},\"PurchaseReceiptItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"total\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"receiptId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"receipt\",\"kind\":\"object\",\"type\":\"PurchaseReceipt\",\"relationName\":\"PurchaseReceipt_Items\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_PurchaseReceiptItems\"}],\"dbName\":\"Purchase_Receipt_Items\"},\"SalesInvoice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"customerId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"SalesInvoiceItem\",\"relationName\":\"SalesInvoice_Items\"},{\"name\":\"customer\",\"kind\":\"object\",\"type\":\"Customer\",\"relationName\":\"Customer_Sales_Invoices\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_SalesInvoices\"}],\"dbName\":\"Sales_Invoices\"},\"SalesInvoiceItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"total\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"invoiceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"invoice\",\"kind\":\"object\",\"type\":\"SalesInvoice\",\"relationName\":\"SalesInvoice_Items\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_SalesInvoiceItems\"}],\"dbName\":\"Sales_Invoice_Items\"},\"StockMovement\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"MovementType\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"referenceType\",\"kind\":\"enum\",\"type\":\"MovementReferenceType\"},{\"name\":\"referenceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avgCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"remainedInStock\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"StockMovement_Inventory\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"StockMovement_Product\"},{\"name\":\"supplierId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"supplier\",\"kind\":\"object\",\"type\":\"Supplier\",\"relationName\":\"StockMovement_Supplier\"}],\"dbName\":\"Stock_Movements\"},\"StockBalance\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"avgCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"StockBalance_Product\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"StockBalance_inventory\"}],\"dbName\":\"Stock_Balance\"},\"InventoryTransfer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"fromInventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"toInventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"InventoryTransferItem\",\"relationName\":\"InventoryTransfer_Items\"},{\"name\":\"fromInventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_From\"},{\"name\":\"toInventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_To\"}],\"dbName\":\"Inventory_Transfers\"},\"InventoryTransferItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"transferId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"InventoryTransferItem_Product\"},{\"name\":\"transfer\",\"kind\":\"object\",\"type\":\"InventoryTransfer\",\"relationName\":\"InventoryTransfer_Items\"}],\"dbName\":\"Inventory_Transfer_Items\"},\"StockAdjustment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"adjustedQuantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_Stock_Adjustments\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Stock_Adjustments\"}],\"dbName\":\"Stock_Adjustments\"},\"TriggerLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Trigger_Logs\"},\"inventory_overview\":{\"fields\":[{\"name\":\"ProductId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"stock_quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"avgCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Inventory_Overview\"},\"stock_cardex\":{\"fields\":[{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"movement_id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"stock_cardex_type\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"balance_quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"balance_avg_cost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Stock_Cardex\"},\"stock_view\":{\"fields\":[{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"stock\",\"kind\":\"scalar\",\"type\":\"Decimal\"}],\"dbName\":\"Stock_View\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"Role\",\"relationName\":\"User_Role\"},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"type\":\"RefreshToken\",\"relationName\":\"RefreshTokenToUser\"}],\"dbName\":\"Users\"},\"Role\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"permissions\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"User_Role\"}],\"dbName\":\"Roles\"},\"ProductVariant\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"salePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"barcode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"imageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"alertQuantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isFeatured\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Variant\"}],\"dbName\":\"Product_Variants\"},\"Product\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sku\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"barcode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"salePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"brandId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryTransferItems\",\"kind\":\"object\",\"type\":\"InventoryTransferItem\",\"relationName\":\"InventoryTransferItem_Product\"},{\"name\":\"productCharges\",\"kind\":\"object\",\"type\":\"ProductCharge\",\"relationName\":\"Product_Charges\"},{\"name\":\"variants\",\"kind\":\"object\",\"type\":\"ProductVariant\",\"relationName\":\"Product_Variant\"},{\"name\":\"brand\",\"kind\":\"object\",\"type\":\"ProductBrand\",\"relationName\":\"Product_Brand\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProductCategory\",\"relationName\":\"Product_Category\"},{\"name\":\"purchaseReceiptItems\",\"kind\":\"object\",\"type\":\"PurchaseReceiptItem\",\"relationName\":\"Product_PurchaseReceiptItems\"},{\"name\":\"salesInvoiceItems\",\"kind\":\"object\",\"type\":\"SalesInvoiceItem\",\"relationName\":\"Product_SalesInvoiceItems\"},{\"name\":\"stockAdjustments\",\"kind\":\"object\",\"type\":\"StockAdjustment\",\"relationName\":\"Product_Stock_Adjustments\"},{\"name\":\"stockMovements\",\"kind\":\"object\",\"type\":\"StockMovement\",\"relationName\":\"StockMovement_Product\"},{\"name\":\"stockBalances\",\"kind\":\"object\",\"type\":\"StockBalance\",\"relationName\":\"StockBalance_Product\"}],\"dbName\":\"Products\"},\"ProductBrand\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"imageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"products\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Brand\"}],\"dbName\":\"Product_brands\"},\"ProductCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"imageUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"products\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Category\"}],\"dbName\":\"Product_categories\"},\"Supplier\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productCharges\",\"kind\":\"object\",\"type\":\"ProductCharge\",\"relationName\":\"Supplier_Product_Charges\"},{\"name\":\"purchaseReceipts\",\"kind\":\"object\",\"type\":\"PurchaseReceipt\",\"relationName\":\"PurchaseReceiptToSupplier\"},{\"name\":\"stockMovements\",\"kind\":\"object\",\"type\":\"StockMovement\",\"relationName\":\"StockMovement_Supplier\"}],\"dbName\":\"Suppliers\"},\"Customer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"orders\",\"kind\":\"object\",\"type\":\"Order\",\"relationName\":\"Customer_Orders\"},{\"name\":\"salesInvoices\",\"kind\":\"object\",\"type\":\"SalesInvoice\",\"relationName\":\"Customer_Sales_Invoices\"}],\"dbName\":\"Customers\"},\"Inventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isPointOfSale\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"inventoryTransfersFrom\",\"kind\":\"object\",\"type\":\"InventoryTransfer\",\"relationName\":\"Inventory_From\"},{\"name\":\"inventoryTransfersTo\",\"kind\":\"object\",\"type\":\"InventoryTransfer\",\"relationName\":\"Inventory_To\"},{\"name\":\"productCharges\",\"kind\":\"object\",\"type\":\"ProductCharge\",\"relationName\":\"Inventory_Product_Charges\"},{\"name\":\"purchaseReceipts\",\"kind\":\"object\",\"type\":\"PurchaseReceipt\",\"relationName\":\"InventoryToPurchaseReceipt\"},{\"name\":\"stockAdjustments\",\"kind\":\"object\",\"type\":\"StockAdjustment\",\"relationName\":\"Inventory_Stock_Adjustments\"},{\"name\":\"stockMovements\",\"kind\":\"object\",\"type\":\"StockMovement\",\"relationName\":\"StockMovement_Inventory\"},{\"name\":\"stockBalances\",\"kind\":\"object\",\"type\":\"StockBalance\",\"relationName\":\"StockBalance_inventory\"},{\"name\":\"salesInvoices\",\"kind\":\"object\",\"type\":\"SalesInvoice\",\"relationName\":\"Inventory_SalesInvoices\"}],\"dbName\":\"Inventories\"},\"Store\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"location\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Stores\"},\"ProductCharge\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isSettled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"buyAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"supplierId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_Product_Charges\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Charges\"},{\"name\":\"supplier\",\"kind\":\"object\",\"type\":\"Supplier\",\"relationName\":\"Supplier_Product_Charges\"}],\"dbName\":\"Product_Charges\"},\"Order\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"orderNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"OrderStatus\"},{\"name\":\"paymentMethod\",\"kind\":\"enum\",\"type\":\"paymentMethod\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"customerId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"customer\",\"kind\":\"object\",\"type\":\"Customer\",\"relationName\":\"Customer_Orders\"}],\"dbName\":\"Orders\"},\"PurchaseReceipt\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"supplierId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"PurchaseReceiptItem\",\"relationName\":\"PurchaseReceipt_Items\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"InventoryToPurchaseReceipt\"},{\"name\":\"supplier\",\"kind\":\"object\",\"type\":\"Supplier\",\"relationName\":\"PurchaseReceiptToSupplier\"}],\"dbName\":\"Purchase_Receipts\"},\"PurchaseReceiptItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"total\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"receiptId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"receipt\",\"kind\":\"object\",\"type\":\"PurchaseReceipt\",\"relationName\":\"PurchaseReceipt_Items\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_PurchaseReceiptItems\"}],\"dbName\":\"Purchase_Receipt_Items\"},\"SalesInvoice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"totalAmount\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"customerId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"SalesInvoiceItem\",\"relationName\":\"SalesInvoice_Items\"},{\"name\":\"customer\",\"kind\":\"object\",\"type\":\"Customer\",\"relationName\":\"Customer_Sales_Invoices\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_SalesInvoices\"}],\"dbName\":\"Sales_Invoices\"},\"SalesInvoiceItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"total\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"invoiceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"invoice\",\"kind\":\"object\",\"type\":\"SalesInvoice\",\"relationName\":\"SalesInvoice_Items\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_SalesInvoiceItems\"}],\"dbName\":\"Sales_Invoice_Items\"},\"StockMovement\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"MovementType\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"referenceType\",\"kind\":\"enum\",\"type\":\"MovementReferenceType\"},{\"name\":\"referenceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"avgCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"remainedInStock\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"StockMovement_Inventory\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"StockMovement_Product\"},{\"name\":\"supplierId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"supplier\",\"kind\":\"object\",\"type\":\"Supplier\",\"relationName\":\"StockMovement_Supplier\"}],\"dbName\":\"Stock_Movements\"},\"StockBalance\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"avgCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"StockBalance_Product\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"StockBalance_inventory\"}],\"dbName\":\"Stock_Balance\"},\"OtpCode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"used\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Otp_Codes\"},\"RefreshToken\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"revoked\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"RefreshTokenToUser\"}],\"dbName\":\"Refresh_Tokens\"},\"InventoryTransfer\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"fromInventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"toInventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"InventoryTransferItem\",\"relationName\":\"InventoryTransfer_Items\"},{\"name\":\"fromInventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_From\"},{\"name\":\"toInventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_To\"}],\"dbName\":\"Inventory_Transfers\"},\"InventoryTransferItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"count\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"transferId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"InventoryTransferItem_Product\"},{\"name\":\"transfer\",\"kind\":\"object\",\"type\":\"InventoryTransfer\",\"relationName\":\"InventoryTransfer_Items\"}],\"dbName\":\"Inventory_Transfer_Items\"},\"StockAdjustment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"adjustedQuantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventory\",\"kind\":\"object\",\"type\":\"Inventory\",\"relationName\":\"Inventory_Stock_Adjustments\"},{\"name\":\"product\",\"kind\":\"object\",\"type\":\"Product\",\"relationName\":\"Product_Stock_Adjustments\"}],\"dbName\":\"Stock_Adjustments\"},\"TriggerLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Trigger_Logs\"},\"inventory_overview\":{\"fields\":[{\"name\":\"ProductId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"stock_quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"avgCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Inventory_Overview\"},\"stock_cardex\":{\"fields\":[{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"movement_id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"type\",\"kind\":\"enum\",\"type\":\"stock_cardex_type\"},{\"name\":\"quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"fee\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"totalCost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"balance_quantity\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"balance_avg_cost\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"Stock_Cardex\"},\"stock_view\":{\"fields\":[{\"name\":\"productId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"inventoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"stock\",\"kind\":\"scalar\",\"type\":\"Decimal\"}],\"dbName\":\"Stock_View\"}},\"enums\":{},\"types\":{}}") async function decodeBase64AsWasm(wasmBase64: string): Promise { const { Buffer } = await import('node:buffer') @@ -356,6 +356,26 @@ export interface PrismaClient< */ get stockBalance(): Prisma.StockBalanceDelegate; + /** + * `prisma.otpCode`: Exposes CRUD operations for the **OtpCode** model. + * Example usage: + * ```ts + * // Fetch zero or more OtpCodes + * const otpCodes = await prisma.otpCode.findMany() + * ``` + */ + get otpCode(): Prisma.OtpCodeDelegate; + + /** + * `prisma.refreshToken`: Exposes CRUD operations for the **RefreshToken** model. + * Example usage: + * ```ts + * // Fetch zero or more RefreshTokens + * const refreshTokens = await prisma.refreshToken.findMany() + * ``` + */ + get refreshToken(): Prisma.RefreshTokenDelegate; + /** * `prisma.inventoryTransfer`: Exposes CRUD operations for the **InventoryTransfer** model. * Example usage: diff --git a/src/generated/prisma/internal/prismaNamespace.ts b/src/generated/prisma/internal/prismaNamespace.ts index a8668d4..d651bba 100644 --- a/src/generated/prisma/internal/prismaNamespace.ts +++ b/src/generated/prisma/internal/prismaNamespace.ts @@ -402,6 +402,8 @@ export const ModelName = { SalesInvoiceItem: 'SalesInvoiceItem', StockMovement: 'StockMovement', StockBalance: 'StockBalance', + OtpCode: 'OtpCode', + RefreshToken: 'RefreshToken', InventoryTransfer: 'InventoryTransfer', InventoryTransferItem: 'InventoryTransferItem', StockAdjustment: 'StockAdjustment', @@ -424,7 +426,7 @@ export type TypeMap + fields: Prisma.OtpCodeFieldRefs + operations: { + findUnique: { + args: Prisma.OtpCodeFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.OtpCodeFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.OtpCodeFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.OtpCodeFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.OtpCodeFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.OtpCodeCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.OtpCodeCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.OtpCodeDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.OtpCodeUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.OtpCodeDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.OtpCodeUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.OtpCodeUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.OtpCodeAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.OtpCodeGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.OtpCodeCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + RefreshToken: { + payload: Prisma.$RefreshTokenPayload + fields: Prisma.RefreshTokenFieldRefs + operations: { + findUnique: { + args: Prisma.RefreshTokenFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.RefreshTokenFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.RefreshTokenFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.RefreshTokenFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.RefreshTokenFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.RefreshTokenCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.RefreshTokenCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.RefreshTokenDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.RefreshTokenUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.RefreshTokenDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.RefreshTokenUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.RefreshTokenUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.RefreshTokenAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.RefreshTokenGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.RefreshTokenCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } InventoryTransfer: { payload: Prisma.$InventoryTransferPayload fields: Prisma.InventoryTransferFieldRefs @@ -2289,6 +2423,30 @@ export const StockBalanceScalarFieldEnum = { export type StockBalanceScalarFieldEnum = (typeof StockBalanceScalarFieldEnum)[keyof typeof StockBalanceScalarFieldEnum] +export const OtpCodeScalarFieldEnum = { + id: 'id', + mobileNumber: 'mobileNumber', + code: 'code', + used: 'used', + expiresAt: 'expiresAt', + createdAt: 'createdAt' +} as const + +export type OtpCodeScalarFieldEnum = (typeof OtpCodeScalarFieldEnum)[keyof typeof OtpCodeScalarFieldEnum] + + +export const RefreshTokenScalarFieldEnum = { + id: 'id', + tokenHash: 'tokenHash', + userId: 'userId', + revoked: 'revoked', + expiresAt: 'expiresAt', + createdAt: 'createdAt' +} as const + +export type RefreshTokenScalarFieldEnum = (typeof RefreshTokenScalarFieldEnum)[keyof typeof RefreshTokenScalarFieldEnum] + + export const InventoryTransferScalarFieldEnum = { id: 'id', code: 'code', @@ -2553,6 +2711,21 @@ export const StockMovementOrderByRelevanceFieldEnum = { export type StockMovementOrderByRelevanceFieldEnum = (typeof StockMovementOrderByRelevanceFieldEnum)[keyof typeof StockMovementOrderByRelevanceFieldEnum] +export const OtpCodeOrderByRelevanceFieldEnum = { + mobileNumber: 'mobileNumber', + code: 'code' +} as const + +export type OtpCodeOrderByRelevanceFieldEnum = (typeof OtpCodeOrderByRelevanceFieldEnum)[keyof typeof OtpCodeOrderByRelevanceFieldEnum] + + +export const RefreshTokenOrderByRelevanceFieldEnum = { + tokenHash: 'tokenHash' +} as const + +export type RefreshTokenOrderByRelevanceFieldEnum = (typeof RefreshTokenOrderByRelevanceFieldEnum)[keyof typeof RefreshTokenOrderByRelevanceFieldEnum] + + export const InventoryTransferOrderByRelevanceFieldEnum = { code: 'code', description: 'description' @@ -2778,6 +2951,8 @@ export type GlobalOmitConfig = { salesInvoiceItem?: Prisma.SalesInvoiceItemOmit stockMovement?: Prisma.StockMovementOmit stockBalance?: Prisma.StockBalanceOmit + otpCode?: Prisma.OtpCodeOmit + refreshToken?: Prisma.RefreshTokenOmit inventoryTransfer?: Prisma.InventoryTransferOmit inventoryTransferItem?: Prisma.InventoryTransferItemOmit stockAdjustment?: Prisma.StockAdjustmentOmit diff --git a/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/src/generated/prisma/internal/prismaNamespaceBrowser.ts index 76a5a2b..107d2a3 100644 --- a/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -69,6 +69,8 @@ export const ModelName = { SalesInvoiceItem: 'SalesInvoiceItem', StockMovement: 'StockMovement', StockBalance: 'StockBalance', + OtpCode: 'OtpCode', + RefreshToken: 'RefreshToken', InventoryTransfer: 'InventoryTransfer', InventoryTransferItem: 'InventoryTransferItem', StockAdjustment: 'StockAdjustment', @@ -374,6 +376,30 @@ export const StockBalanceScalarFieldEnum = { export type StockBalanceScalarFieldEnum = (typeof StockBalanceScalarFieldEnum)[keyof typeof StockBalanceScalarFieldEnum] +export const OtpCodeScalarFieldEnum = { + id: 'id', + mobileNumber: 'mobileNumber', + code: 'code', + used: 'used', + expiresAt: 'expiresAt', + createdAt: 'createdAt' +} as const + +export type OtpCodeScalarFieldEnum = (typeof OtpCodeScalarFieldEnum)[keyof typeof OtpCodeScalarFieldEnum] + + +export const RefreshTokenScalarFieldEnum = { + id: 'id', + tokenHash: 'tokenHash', + userId: 'userId', + revoked: 'revoked', + expiresAt: 'expiresAt', + createdAt: 'createdAt' +} as const + +export type RefreshTokenScalarFieldEnum = (typeof RefreshTokenScalarFieldEnum)[keyof typeof RefreshTokenScalarFieldEnum] + + export const InventoryTransferScalarFieldEnum = { id: 'id', code: 'code', @@ -638,6 +664,21 @@ export const StockMovementOrderByRelevanceFieldEnum = { export type StockMovementOrderByRelevanceFieldEnum = (typeof StockMovementOrderByRelevanceFieldEnum)[keyof typeof StockMovementOrderByRelevanceFieldEnum] +export const OtpCodeOrderByRelevanceFieldEnum = { + mobileNumber: 'mobileNumber', + code: 'code' +} as const + +export type OtpCodeOrderByRelevanceFieldEnum = (typeof OtpCodeOrderByRelevanceFieldEnum)[keyof typeof OtpCodeOrderByRelevanceFieldEnum] + + +export const RefreshTokenOrderByRelevanceFieldEnum = { + tokenHash: 'tokenHash' +} as const + +export type RefreshTokenOrderByRelevanceFieldEnum = (typeof RefreshTokenOrderByRelevanceFieldEnum)[keyof typeof RefreshTokenOrderByRelevanceFieldEnum] + + export const InventoryTransferOrderByRelevanceFieldEnum = { code: 'code', description: 'description' diff --git a/src/generated/prisma/models.ts b/src/generated/prisma/models.ts index f17a6c6..fe26eb1 100644 --- a/src/generated/prisma/models.ts +++ b/src/generated/prisma/models.ts @@ -26,6 +26,8 @@ export type * from './models/SalesInvoice.js' export type * from './models/SalesInvoiceItem.js' export type * from './models/StockMovement.js' export type * from './models/StockBalance.js' +export type * from './models/OtpCode.js' +export type * from './models/RefreshToken.js' export type * from './models/InventoryTransfer.js' export type * from './models/InventoryTransferItem.js' export type * from './models/StockAdjustment.js' diff --git a/src/generated/prisma/models/OtpCode.ts b/src/generated/prisma/models/OtpCode.ts new file mode 100644 index 0000000..1d22129 --- /dev/null +++ b/src/generated/prisma/models/OtpCode.ts @@ -0,0 +1,1105 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `OtpCode` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.js" +import type * as Prisma from "../internal/prismaNamespace.js" + +/** + * Model OtpCode + * + */ +export type OtpCodeModel = runtime.Types.Result.DefaultSelection + +export type AggregateOtpCode = { + _count: OtpCodeCountAggregateOutputType | null + _avg: OtpCodeAvgAggregateOutputType | null + _sum: OtpCodeSumAggregateOutputType | null + _min: OtpCodeMinAggregateOutputType | null + _max: OtpCodeMaxAggregateOutputType | null +} + +export type OtpCodeAvgAggregateOutputType = { + id: number | null +} + +export type OtpCodeSumAggregateOutputType = { + id: number | null +} + +export type OtpCodeMinAggregateOutputType = { + id: number | null + mobileNumber: string | null + code: string | null + used: boolean | null + expiresAt: Date | null + createdAt: Date | null +} + +export type OtpCodeMaxAggregateOutputType = { + id: number | null + mobileNumber: string | null + code: string | null + used: boolean | null + expiresAt: Date | null + createdAt: Date | null +} + +export type OtpCodeCountAggregateOutputType = { + id: number + mobileNumber: number + code: number + used: number + expiresAt: number + createdAt: number + _all: number +} + + +export type OtpCodeAvgAggregateInputType = { + id?: true +} + +export type OtpCodeSumAggregateInputType = { + id?: true +} + +export type OtpCodeMinAggregateInputType = { + id?: true + mobileNumber?: true + code?: true + used?: true + expiresAt?: true + createdAt?: true +} + +export type OtpCodeMaxAggregateInputType = { + id?: true + mobileNumber?: true + code?: true + used?: true + expiresAt?: true + createdAt?: true +} + +export type OtpCodeCountAggregateInputType = { + id?: true + mobileNumber?: true + code?: true + used?: true + expiresAt?: true + createdAt?: true + _all?: true +} + +export type OtpCodeAggregateArgs = { + /** + * Filter which OtpCode to aggregate. + */ + where?: Prisma.OtpCodeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of OtpCodes to fetch. + */ + orderBy?: Prisma.OtpCodeOrderByWithRelationInput | Prisma.OtpCodeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.OtpCodeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` OtpCodes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` OtpCodes. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned OtpCodes + **/ + _count?: true | OtpCodeCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: OtpCodeAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: OtpCodeSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: OtpCodeMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: OtpCodeMaxAggregateInputType +} + +export type GetOtpCodeAggregateType = { + [P in keyof T & keyof AggregateOtpCode]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type OtpCodeGroupByArgs = { + where?: Prisma.OtpCodeWhereInput + orderBy?: Prisma.OtpCodeOrderByWithAggregationInput | Prisma.OtpCodeOrderByWithAggregationInput[] + by: Prisma.OtpCodeScalarFieldEnum[] | Prisma.OtpCodeScalarFieldEnum + having?: Prisma.OtpCodeScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: OtpCodeCountAggregateInputType | true + _avg?: OtpCodeAvgAggregateInputType + _sum?: OtpCodeSumAggregateInputType + _min?: OtpCodeMinAggregateInputType + _max?: OtpCodeMaxAggregateInputType +} + +export type OtpCodeGroupByOutputType = { + id: number + mobileNumber: string + code: string + used: boolean + expiresAt: Date + createdAt: Date + _count: OtpCodeCountAggregateOutputType | null + _avg: OtpCodeAvgAggregateOutputType | null + _sum: OtpCodeSumAggregateOutputType | null + _min: OtpCodeMinAggregateOutputType | null + _max: OtpCodeMaxAggregateOutputType | null +} + +type GetOtpCodeGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof OtpCodeGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type OtpCodeWhereInput = { + AND?: Prisma.OtpCodeWhereInput | Prisma.OtpCodeWhereInput[] + OR?: Prisma.OtpCodeWhereInput[] + NOT?: Prisma.OtpCodeWhereInput | Prisma.OtpCodeWhereInput[] + id?: Prisma.IntFilter<"OtpCode"> | number + mobileNumber?: Prisma.StringFilter<"OtpCode"> | string + code?: Prisma.StringFilter<"OtpCode"> | string + used?: Prisma.BoolFilter<"OtpCode"> | boolean + expiresAt?: Prisma.DateTimeFilter<"OtpCode"> | Date | string + createdAt?: Prisma.DateTimeFilter<"OtpCode"> | Date | string +} + +export type OtpCodeOrderByWithRelationInput = { + id?: Prisma.SortOrder + mobileNumber?: Prisma.SortOrder + code?: Prisma.SortOrder + used?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + _relevance?: Prisma.OtpCodeOrderByRelevanceInput +} + +export type OtpCodeWhereUniqueInput = Prisma.AtLeast<{ + id?: number + AND?: Prisma.OtpCodeWhereInput | Prisma.OtpCodeWhereInput[] + OR?: Prisma.OtpCodeWhereInput[] + NOT?: Prisma.OtpCodeWhereInput | Prisma.OtpCodeWhereInput[] + mobileNumber?: Prisma.StringFilter<"OtpCode"> | string + code?: Prisma.StringFilter<"OtpCode"> | string + used?: Prisma.BoolFilter<"OtpCode"> | boolean + expiresAt?: Prisma.DateTimeFilter<"OtpCode"> | Date | string + createdAt?: Prisma.DateTimeFilter<"OtpCode"> | Date | string +}, "id"> + +export type OtpCodeOrderByWithAggregationInput = { + id?: Prisma.SortOrder + mobileNumber?: Prisma.SortOrder + code?: Prisma.SortOrder + used?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.OtpCodeCountOrderByAggregateInput + _avg?: Prisma.OtpCodeAvgOrderByAggregateInput + _max?: Prisma.OtpCodeMaxOrderByAggregateInput + _min?: Prisma.OtpCodeMinOrderByAggregateInput + _sum?: Prisma.OtpCodeSumOrderByAggregateInput +} + +export type OtpCodeScalarWhereWithAggregatesInput = { + AND?: Prisma.OtpCodeScalarWhereWithAggregatesInput | Prisma.OtpCodeScalarWhereWithAggregatesInput[] + OR?: Prisma.OtpCodeScalarWhereWithAggregatesInput[] + NOT?: Prisma.OtpCodeScalarWhereWithAggregatesInput | Prisma.OtpCodeScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"OtpCode"> | number + mobileNumber?: Prisma.StringWithAggregatesFilter<"OtpCode"> | string + code?: Prisma.StringWithAggregatesFilter<"OtpCode"> | string + used?: Prisma.BoolWithAggregatesFilter<"OtpCode"> | boolean + expiresAt?: Prisma.DateTimeWithAggregatesFilter<"OtpCode"> | Date | string + createdAt?: Prisma.DateTimeWithAggregatesFilter<"OtpCode"> | Date | string +} + +export type OtpCodeCreateInput = { + mobileNumber: string + code: string + used?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type OtpCodeUncheckedCreateInput = { + id?: number + mobileNumber: string + code: string + used?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type OtpCodeUpdateInput = { + mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string + used?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type OtpCodeUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string + used?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type OtpCodeCreateManyInput = { + id?: number + mobileNumber: string + code: string + used?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type OtpCodeUpdateManyMutationInput = { + mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string + used?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type OtpCodeUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string + code?: Prisma.StringFieldUpdateOperationsInput | string + used?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type OtpCodeOrderByRelevanceInput = { + fields: Prisma.OtpCodeOrderByRelevanceFieldEnum | Prisma.OtpCodeOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type OtpCodeCountOrderByAggregateInput = { + id?: Prisma.SortOrder + mobileNumber?: Prisma.SortOrder + code?: Prisma.SortOrder + used?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type OtpCodeAvgOrderByAggregateInput = { + id?: Prisma.SortOrder +} + +export type OtpCodeMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + mobileNumber?: Prisma.SortOrder + code?: Prisma.SortOrder + used?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type OtpCodeMinOrderByAggregateInput = { + id?: Prisma.SortOrder + mobileNumber?: Prisma.SortOrder + code?: Prisma.SortOrder + used?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type OtpCodeSumOrderByAggregateInput = { + id?: Prisma.SortOrder +} + + + +export type OtpCodeSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + mobileNumber?: boolean + code?: boolean + used?: boolean + expiresAt?: boolean + createdAt?: boolean +}, ExtArgs["result"]["otpCode"]> + + + +export type OtpCodeSelectScalar = { + id?: boolean + mobileNumber?: boolean + code?: boolean + used?: boolean + expiresAt?: boolean + createdAt?: boolean +} + +export type OtpCodeOmit = runtime.Types.Extensions.GetOmit<"id" | "mobileNumber" | "code" | "used" | "expiresAt" | "createdAt", ExtArgs["result"]["otpCode"]> + +export type $OtpCodePayload = { + name: "OtpCode" + objects: {} + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + mobileNumber: string + code: string + used: boolean + expiresAt: Date + createdAt: Date + }, ExtArgs["result"]["otpCode"]> + composites: {} +} + +export type OtpCodeGetPayload = runtime.Types.Result.GetResult + +export type OtpCodeCountArgs = + Omit & { + select?: OtpCodeCountAggregateInputType | true + } + +export interface OtpCodeDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['OtpCode'], meta: { name: 'OtpCode' } } + /** + * Find zero or one OtpCode that matches the filter. + * @param {OtpCodeFindUniqueArgs} args - Arguments to find a OtpCode + * @example + * // Get one OtpCode + * const otpCode = await prisma.otpCode.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one OtpCode that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {OtpCodeFindUniqueOrThrowArgs} args - Arguments to find a OtpCode + * @example + * // Get one OtpCode + * const otpCode = await prisma.otpCode.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first OtpCode that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {OtpCodeFindFirstArgs} args - Arguments to find a OtpCode + * @example + * // Get one OtpCode + * const otpCode = await prisma.otpCode.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first OtpCode that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {OtpCodeFindFirstOrThrowArgs} args - Arguments to find a OtpCode + * @example + * // Get one OtpCode + * const otpCode = await prisma.otpCode.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more OtpCodes that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {OtpCodeFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all OtpCodes + * const otpCodes = await prisma.otpCode.findMany() + * + * // Get first 10 OtpCodes + * const otpCodes = await prisma.otpCode.findMany({ take: 10 }) + * + * // Only select the `id` + * const otpCodeWithIdOnly = await prisma.otpCode.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a OtpCode. + * @param {OtpCodeCreateArgs} args - Arguments to create a OtpCode. + * @example + * // Create one OtpCode + * const OtpCode = await prisma.otpCode.create({ + * data: { + * // ... data to create a OtpCode + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many OtpCodes. + * @param {OtpCodeCreateManyArgs} args - Arguments to create many OtpCodes. + * @example + * // Create many OtpCodes + * const otpCode = await prisma.otpCode.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a OtpCode. + * @param {OtpCodeDeleteArgs} args - Arguments to delete one OtpCode. + * @example + * // Delete one OtpCode + * const OtpCode = await prisma.otpCode.delete({ + * where: { + * // ... filter to delete one OtpCode + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one OtpCode. + * @param {OtpCodeUpdateArgs} args - Arguments to update one OtpCode. + * @example + * // Update one OtpCode + * const otpCode = await prisma.otpCode.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more OtpCodes. + * @param {OtpCodeDeleteManyArgs} args - Arguments to filter OtpCodes to delete. + * @example + * // Delete a few OtpCodes + * const { count } = await prisma.otpCode.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more OtpCodes. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {OtpCodeUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many OtpCodes + * const otpCode = await prisma.otpCode.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one OtpCode. + * @param {OtpCodeUpsertArgs} args - Arguments to update or create a OtpCode. + * @example + * // Update or create a OtpCode + * const otpCode = await prisma.otpCode.upsert({ + * create: { + * // ... data to create a OtpCode + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the OtpCode we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__OtpCodeClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of OtpCodes. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {OtpCodeCountArgs} args - Arguments to filter OtpCodes to count. + * @example + * // Count the number of OtpCodes + * const count = await prisma.otpCode.count({ + * where: { + * // ... the filter for the OtpCodes we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a OtpCode. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {OtpCodeAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by OtpCode. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {OtpCodeGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends OtpCodeGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: OtpCodeGroupByArgs['orderBy'] } + : { orderBy?: OtpCodeGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetOtpCodeGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the OtpCode model + */ +readonly fields: OtpCodeFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for OtpCode. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__OtpCodeClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the OtpCode model + */ +export interface OtpCodeFieldRefs { + readonly id: Prisma.FieldRef<"OtpCode", 'Int'> + readonly mobileNumber: Prisma.FieldRef<"OtpCode", 'String'> + readonly code: Prisma.FieldRef<"OtpCode", 'String'> + readonly used: Prisma.FieldRef<"OtpCode", 'Boolean'> + readonly expiresAt: Prisma.FieldRef<"OtpCode", 'DateTime'> + readonly createdAt: Prisma.FieldRef<"OtpCode", 'DateTime'> +} + + +// Custom InputTypes +/** + * OtpCode findUnique + */ +export type OtpCodeFindUniqueArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * Filter, which OtpCode to fetch. + */ + where: Prisma.OtpCodeWhereUniqueInput +} + +/** + * OtpCode findUniqueOrThrow + */ +export type OtpCodeFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * Filter, which OtpCode to fetch. + */ + where: Prisma.OtpCodeWhereUniqueInput +} + +/** + * OtpCode findFirst + */ +export type OtpCodeFindFirstArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * Filter, which OtpCode to fetch. + */ + where?: Prisma.OtpCodeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of OtpCodes to fetch. + */ + orderBy?: Prisma.OtpCodeOrderByWithRelationInput | Prisma.OtpCodeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for OtpCodes. + */ + cursor?: Prisma.OtpCodeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` OtpCodes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` OtpCodes. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of OtpCodes. + */ + distinct?: Prisma.OtpCodeScalarFieldEnum | Prisma.OtpCodeScalarFieldEnum[] +} + +/** + * OtpCode findFirstOrThrow + */ +export type OtpCodeFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * Filter, which OtpCode to fetch. + */ + where?: Prisma.OtpCodeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of OtpCodes to fetch. + */ + orderBy?: Prisma.OtpCodeOrderByWithRelationInput | Prisma.OtpCodeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for OtpCodes. + */ + cursor?: Prisma.OtpCodeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` OtpCodes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` OtpCodes. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of OtpCodes. + */ + distinct?: Prisma.OtpCodeScalarFieldEnum | Prisma.OtpCodeScalarFieldEnum[] +} + +/** + * OtpCode findMany + */ +export type OtpCodeFindManyArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * Filter, which OtpCodes to fetch. + */ + where?: Prisma.OtpCodeWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of OtpCodes to fetch. + */ + orderBy?: Prisma.OtpCodeOrderByWithRelationInput | Prisma.OtpCodeOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing OtpCodes. + */ + cursor?: Prisma.OtpCodeWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` OtpCodes from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` OtpCodes. + */ + skip?: number + distinct?: Prisma.OtpCodeScalarFieldEnum | Prisma.OtpCodeScalarFieldEnum[] +} + +/** + * OtpCode create + */ +export type OtpCodeCreateArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * The data needed to create a OtpCode. + */ + data: Prisma.XOR +} + +/** + * OtpCode createMany + */ +export type OtpCodeCreateManyArgs = { + /** + * The data used to create many OtpCodes. + */ + data: Prisma.OtpCodeCreateManyInput | Prisma.OtpCodeCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * OtpCode update + */ +export type OtpCodeUpdateArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * The data needed to update a OtpCode. + */ + data: Prisma.XOR + /** + * Choose, which OtpCode to update. + */ + where: Prisma.OtpCodeWhereUniqueInput +} + +/** + * OtpCode updateMany + */ +export type OtpCodeUpdateManyArgs = { + /** + * The data used to update OtpCodes. + */ + data: Prisma.XOR + /** + * Filter which OtpCodes to update + */ + where?: Prisma.OtpCodeWhereInput + /** + * Limit how many OtpCodes to update. + */ + limit?: number +} + +/** + * OtpCode upsert + */ +export type OtpCodeUpsertArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * The filter to search for the OtpCode to update in case it exists. + */ + where: Prisma.OtpCodeWhereUniqueInput + /** + * In case the OtpCode found by the `where` argument doesn't exist, create a new OtpCode with this data. + */ + create: Prisma.XOR + /** + * In case the OtpCode was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * OtpCode delete + */ +export type OtpCodeDeleteArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null + /** + * Filter which OtpCode to delete. + */ + where: Prisma.OtpCodeWhereUniqueInput +} + +/** + * OtpCode deleteMany + */ +export type OtpCodeDeleteManyArgs = { + /** + * Filter which OtpCodes to delete + */ + where?: Prisma.OtpCodeWhereInput + /** + * Limit how many OtpCodes to delete. + */ + limit?: number +} + +/** + * OtpCode without action + */ +export type OtpCodeDefaultArgs = { + /** + * Select specific fields to fetch from the OtpCode + */ + select?: Prisma.OtpCodeSelect | null + /** + * Omit specific fields from the OtpCode + */ + omit?: Prisma.OtpCodeOmit | null +} diff --git a/src/generated/prisma/models/RefreshToken.ts b/src/generated/prisma/models/RefreshToken.ts new file mode 100644 index 0000000..1e339e1 --- /dev/null +++ b/src/generated/prisma/models/RefreshToken.ts @@ -0,0 +1,1296 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `RefreshToken` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.js" +import type * as Prisma from "../internal/prismaNamespace.js" + +/** + * Model RefreshToken + * + */ +export type RefreshTokenModel = runtime.Types.Result.DefaultSelection + +export type AggregateRefreshToken = { + _count: RefreshTokenCountAggregateOutputType | null + _avg: RefreshTokenAvgAggregateOutputType | null + _sum: RefreshTokenSumAggregateOutputType | null + _min: RefreshTokenMinAggregateOutputType | null + _max: RefreshTokenMaxAggregateOutputType | null +} + +export type RefreshTokenAvgAggregateOutputType = { + id: number | null + userId: number | null +} + +export type RefreshTokenSumAggregateOutputType = { + id: number | null + userId: number | null +} + +export type RefreshTokenMinAggregateOutputType = { + id: number | null + tokenHash: string | null + userId: number | null + revoked: boolean | null + expiresAt: Date | null + createdAt: Date | null +} + +export type RefreshTokenMaxAggregateOutputType = { + id: number | null + tokenHash: string | null + userId: number | null + revoked: boolean | null + expiresAt: Date | null + createdAt: Date | null +} + +export type RefreshTokenCountAggregateOutputType = { + id: number + tokenHash: number + userId: number + revoked: number + expiresAt: number + createdAt: number + _all: number +} + + +export type RefreshTokenAvgAggregateInputType = { + id?: true + userId?: true +} + +export type RefreshTokenSumAggregateInputType = { + id?: true + userId?: true +} + +export type RefreshTokenMinAggregateInputType = { + id?: true + tokenHash?: true + userId?: true + revoked?: true + expiresAt?: true + createdAt?: true +} + +export type RefreshTokenMaxAggregateInputType = { + id?: true + tokenHash?: true + userId?: true + revoked?: true + expiresAt?: true + createdAt?: true +} + +export type RefreshTokenCountAggregateInputType = { + id?: true + tokenHash?: true + userId?: true + revoked?: true + expiresAt?: true + createdAt?: true + _all?: true +} + +export type RefreshTokenAggregateArgs = { + /** + * Filter which RefreshToken to aggregate. + */ + where?: Prisma.RefreshTokenWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of RefreshTokens to fetch. + */ + orderBy?: Prisma.RefreshTokenOrderByWithRelationInput | Prisma.RefreshTokenOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.RefreshTokenWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` RefreshTokens from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` RefreshTokens. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned RefreshTokens + **/ + _count?: true | RefreshTokenCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: RefreshTokenAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: RefreshTokenSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: RefreshTokenMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: RefreshTokenMaxAggregateInputType +} + +export type GetRefreshTokenAggregateType = { + [P in keyof T & keyof AggregateRefreshToken]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type RefreshTokenGroupByArgs = { + where?: Prisma.RefreshTokenWhereInput + orderBy?: Prisma.RefreshTokenOrderByWithAggregationInput | Prisma.RefreshTokenOrderByWithAggregationInput[] + by: Prisma.RefreshTokenScalarFieldEnum[] | Prisma.RefreshTokenScalarFieldEnum + having?: Prisma.RefreshTokenScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: RefreshTokenCountAggregateInputType | true + _avg?: RefreshTokenAvgAggregateInputType + _sum?: RefreshTokenSumAggregateInputType + _min?: RefreshTokenMinAggregateInputType + _max?: RefreshTokenMaxAggregateInputType +} + +export type RefreshTokenGroupByOutputType = { + id: number + tokenHash: string + userId: number + revoked: boolean + expiresAt: Date + createdAt: Date + _count: RefreshTokenCountAggregateOutputType | null + _avg: RefreshTokenAvgAggregateOutputType | null + _sum: RefreshTokenSumAggregateOutputType | null + _min: RefreshTokenMinAggregateOutputType | null + _max: RefreshTokenMaxAggregateOutputType | null +} + +type GetRefreshTokenGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof RefreshTokenGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type RefreshTokenWhereInput = { + AND?: Prisma.RefreshTokenWhereInput | Prisma.RefreshTokenWhereInput[] + OR?: Prisma.RefreshTokenWhereInput[] + NOT?: Prisma.RefreshTokenWhereInput | Prisma.RefreshTokenWhereInput[] + id?: Prisma.IntFilter<"RefreshToken"> | number + tokenHash?: Prisma.StringFilter<"RefreshToken"> | string + userId?: Prisma.IntFilter<"RefreshToken"> | number + revoked?: Prisma.BoolFilter<"RefreshToken"> | boolean + expiresAt?: Prisma.DateTimeFilter<"RefreshToken"> | Date | string + createdAt?: Prisma.DateTimeFilter<"RefreshToken"> | Date | string + user?: Prisma.XOR +} + +export type RefreshTokenOrderByWithRelationInput = { + id?: Prisma.SortOrder + tokenHash?: Prisma.SortOrder + userId?: Prisma.SortOrder + revoked?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + user?: Prisma.UserOrderByWithRelationInput + _relevance?: Prisma.RefreshTokenOrderByRelevanceInput +} + +export type RefreshTokenWhereUniqueInput = Prisma.AtLeast<{ + id?: number + AND?: Prisma.RefreshTokenWhereInput | Prisma.RefreshTokenWhereInput[] + OR?: Prisma.RefreshTokenWhereInput[] + NOT?: Prisma.RefreshTokenWhereInput | Prisma.RefreshTokenWhereInput[] + tokenHash?: Prisma.StringFilter<"RefreshToken"> | string + userId?: Prisma.IntFilter<"RefreshToken"> | number + revoked?: Prisma.BoolFilter<"RefreshToken"> | boolean + expiresAt?: Prisma.DateTimeFilter<"RefreshToken"> | Date | string + createdAt?: Prisma.DateTimeFilter<"RefreshToken"> | Date | string + user?: Prisma.XOR +}, "id"> + +export type RefreshTokenOrderByWithAggregationInput = { + id?: Prisma.SortOrder + tokenHash?: Prisma.SortOrder + userId?: Prisma.SortOrder + revoked?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.RefreshTokenCountOrderByAggregateInput + _avg?: Prisma.RefreshTokenAvgOrderByAggregateInput + _max?: Prisma.RefreshTokenMaxOrderByAggregateInput + _min?: Prisma.RefreshTokenMinOrderByAggregateInput + _sum?: Prisma.RefreshTokenSumOrderByAggregateInput +} + +export type RefreshTokenScalarWhereWithAggregatesInput = { + AND?: Prisma.RefreshTokenScalarWhereWithAggregatesInput | Prisma.RefreshTokenScalarWhereWithAggregatesInput[] + OR?: Prisma.RefreshTokenScalarWhereWithAggregatesInput[] + NOT?: Prisma.RefreshTokenScalarWhereWithAggregatesInput | Prisma.RefreshTokenScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"RefreshToken"> | number + tokenHash?: Prisma.StringWithAggregatesFilter<"RefreshToken"> | string + userId?: Prisma.IntWithAggregatesFilter<"RefreshToken"> | number + revoked?: Prisma.BoolWithAggregatesFilter<"RefreshToken"> | boolean + expiresAt?: Prisma.DateTimeWithAggregatesFilter<"RefreshToken"> | Date | string + createdAt?: Prisma.DateTimeWithAggregatesFilter<"RefreshToken"> | Date | string +} + +export type RefreshTokenCreateInput = { + tokenHash: string + revoked?: boolean + expiresAt: Date | string + createdAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutRefreshTokensInput +} + +export type RefreshTokenUncheckedCreateInput = { + id?: number + tokenHash: string + userId: number + revoked?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type RefreshTokenUpdateInput = { + tokenHash?: Prisma.StringFieldUpdateOperationsInput | string + revoked?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutRefreshTokensNestedInput +} + +export type RefreshTokenUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + tokenHash?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.IntFieldUpdateOperationsInput | number + revoked?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type RefreshTokenCreateManyInput = { + id?: number + tokenHash: string + userId: number + revoked?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type RefreshTokenUpdateManyMutationInput = { + tokenHash?: Prisma.StringFieldUpdateOperationsInput | string + revoked?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type RefreshTokenUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + tokenHash?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.IntFieldUpdateOperationsInput | number + revoked?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type RefreshTokenListRelationFilter = { + every?: Prisma.RefreshTokenWhereInput + some?: Prisma.RefreshTokenWhereInput + none?: Prisma.RefreshTokenWhereInput +} + +export type RefreshTokenOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type RefreshTokenOrderByRelevanceInput = { + fields: Prisma.RefreshTokenOrderByRelevanceFieldEnum | Prisma.RefreshTokenOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type RefreshTokenCountOrderByAggregateInput = { + id?: Prisma.SortOrder + tokenHash?: Prisma.SortOrder + userId?: Prisma.SortOrder + revoked?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type RefreshTokenAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder +} + +export type RefreshTokenMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + tokenHash?: Prisma.SortOrder + userId?: Prisma.SortOrder + revoked?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type RefreshTokenMinOrderByAggregateInput = { + id?: Prisma.SortOrder + tokenHash?: Prisma.SortOrder + userId?: Prisma.SortOrder + revoked?: Prisma.SortOrder + expiresAt?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type RefreshTokenSumOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder +} + +export type RefreshTokenCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.RefreshTokenCreateWithoutUserInput[] | Prisma.RefreshTokenUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.RefreshTokenCreateOrConnectWithoutUserInput | Prisma.RefreshTokenCreateOrConnectWithoutUserInput[] + createMany?: Prisma.RefreshTokenCreateManyUserInputEnvelope + connect?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] +} + +export type RefreshTokenUncheckedCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.RefreshTokenCreateWithoutUserInput[] | Prisma.RefreshTokenUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.RefreshTokenCreateOrConnectWithoutUserInput | Prisma.RefreshTokenCreateOrConnectWithoutUserInput[] + createMany?: Prisma.RefreshTokenCreateManyUserInputEnvelope + connect?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] +} + +export type RefreshTokenUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.RefreshTokenCreateWithoutUserInput[] | Prisma.RefreshTokenUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.RefreshTokenCreateOrConnectWithoutUserInput | Prisma.RefreshTokenCreateOrConnectWithoutUserInput[] + upsert?: Prisma.RefreshTokenUpsertWithWhereUniqueWithoutUserInput | Prisma.RefreshTokenUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.RefreshTokenCreateManyUserInputEnvelope + set?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + disconnect?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + delete?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + connect?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + update?: Prisma.RefreshTokenUpdateWithWhereUniqueWithoutUserInput | Prisma.RefreshTokenUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.RefreshTokenUpdateManyWithWhereWithoutUserInput | Prisma.RefreshTokenUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.RefreshTokenScalarWhereInput | Prisma.RefreshTokenScalarWhereInput[] +} + +export type RefreshTokenUncheckedUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.RefreshTokenCreateWithoutUserInput[] | Prisma.RefreshTokenUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.RefreshTokenCreateOrConnectWithoutUserInput | Prisma.RefreshTokenCreateOrConnectWithoutUserInput[] + upsert?: Prisma.RefreshTokenUpsertWithWhereUniqueWithoutUserInput | Prisma.RefreshTokenUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.RefreshTokenCreateManyUserInputEnvelope + set?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + disconnect?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + delete?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + connect?: Prisma.RefreshTokenWhereUniqueInput | Prisma.RefreshTokenWhereUniqueInput[] + update?: Prisma.RefreshTokenUpdateWithWhereUniqueWithoutUserInput | Prisma.RefreshTokenUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.RefreshTokenUpdateManyWithWhereWithoutUserInput | Prisma.RefreshTokenUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.RefreshTokenScalarWhereInput | Prisma.RefreshTokenScalarWhereInput[] +} + +export type RefreshTokenCreateWithoutUserInput = { + tokenHash: string + revoked?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type RefreshTokenUncheckedCreateWithoutUserInput = { + id?: number + tokenHash: string + revoked?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type RefreshTokenCreateOrConnectWithoutUserInput = { + where: Prisma.RefreshTokenWhereUniqueInput + create: Prisma.XOR +} + +export type RefreshTokenCreateManyUserInputEnvelope = { + data: Prisma.RefreshTokenCreateManyUserInput | Prisma.RefreshTokenCreateManyUserInput[] + skipDuplicates?: boolean +} + +export type RefreshTokenUpsertWithWhereUniqueWithoutUserInput = { + where: Prisma.RefreshTokenWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type RefreshTokenUpdateWithWhereUniqueWithoutUserInput = { + where: Prisma.RefreshTokenWhereUniqueInput + data: Prisma.XOR +} + +export type RefreshTokenUpdateManyWithWhereWithoutUserInput = { + where: Prisma.RefreshTokenScalarWhereInput + data: Prisma.XOR +} + +export type RefreshTokenScalarWhereInput = { + AND?: Prisma.RefreshTokenScalarWhereInput | Prisma.RefreshTokenScalarWhereInput[] + OR?: Prisma.RefreshTokenScalarWhereInput[] + NOT?: Prisma.RefreshTokenScalarWhereInput | Prisma.RefreshTokenScalarWhereInput[] + id?: Prisma.IntFilter<"RefreshToken"> | number + tokenHash?: Prisma.StringFilter<"RefreshToken"> | string + userId?: Prisma.IntFilter<"RefreshToken"> | number + revoked?: Prisma.BoolFilter<"RefreshToken"> | boolean + expiresAt?: Prisma.DateTimeFilter<"RefreshToken"> | Date | string + createdAt?: Prisma.DateTimeFilter<"RefreshToken"> | Date | string +} + +export type RefreshTokenCreateManyUserInput = { + id?: number + tokenHash: string + revoked?: boolean + expiresAt: Date | string + createdAt?: Date | string +} + +export type RefreshTokenUpdateWithoutUserInput = { + tokenHash?: Prisma.StringFieldUpdateOperationsInput | string + revoked?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type RefreshTokenUncheckedUpdateWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + tokenHash?: Prisma.StringFieldUpdateOperationsInput | string + revoked?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type RefreshTokenUncheckedUpdateManyWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + tokenHash?: Prisma.StringFieldUpdateOperationsInput | string + revoked?: Prisma.BoolFieldUpdateOperationsInput | boolean + expiresAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type RefreshTokenSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + tokenHash?: boolean + userId?: boolean + revoked?: boolean + expiresAt?: boolean + createdAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["refreshToken"]> + + + +export type RefreshTokenSelectScalar = { + id?: boolean + tokenHash?: boolean + userId?: boolean + revoked?: boolean + expiresAt?: boolean + createdAt?: boolean +} + +export type RefreshTokenOmit = runtime.Types.Extensions.GetOmit<"id" | "tokenHash" | "userId" | "revoked" | "expiresAt" | "createdAt", ExtArgs["result"]["refreshToken"]> +export type RefreshTokenInclude = { + user?: boolean | Prisma.UserDefaultArgs +} + +export type $RefreshTokenPayload = { + name: "RefreshToken" + objects: { + user: Prisma.$UserPayload + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + tokenHash: string + userId: number + revoked: boolean + expiresAt: Date + createdAt: Date + }, ExtArgs["result"]["refreshToken"]> + composites: {} +} + +export type RefreshTokenGetPayload = runtime.Types.Result.GetResult + +export type RefreshTokenCountArgs = + Omit & { + select?: RefreshTokenCountAggregateInputType | true + } + +export interface RefreshTokenDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['RefreshToken'], meta: { name: 'RefreshToken' } } + /** + * Find zero or one RefreshToken that matches the filter. + * @param {RefreshTokenFindUniqueArgs} args - Arguments to find a RefreshToken + * @example + * // Get one RefreshToken + * const refreshToken = await prisma.refreshToken.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one RefreshToken that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {RefreshTokenFindUniqueOrThrowArgs} args - Arguments to find a RefreshToken + * @example + * // Get one RefreshToken + * const refreshToken = await prisma.refreshToken.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first RefreshToken that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {RefreshTokenFindFirstArgs} args - Arguments to find a RefreshToken + * @example + * // Get one RefreshToken + * const refreshToken = await prisma.refreshToken.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first RefreshToken that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {RefreshTokenFindFirstOrThrowArgs} args - Arguments to find a RefreshToken + * @example + * // Get one RefreshToken + * const refreshToken = await prisma.refreshToken.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more RefreshTokens that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {RefreshTokenFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all RefreshTokens + * const refreshTokens = await prisma.refreshToken.findMany() + * + * // Get first 10 RefreshTokens + * const refreshTokens = await prisma.refreshToken.findMany({ take: 10 }) + * + * // Only select the `id` + * const refreshTokenWithIdOnly = await prisma.refreshToken.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a RefreshToken. + * @param {RefreshTokenCreateArgs} args - Arguments to create a RefreshToken. + * @example + * // Create one RefreshToken + * const RefreshToken = await prisma.refreshToken.create({ + * data: { + * // ... data to create a RefreshToken + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many RefreshTokens. + * @param {RefreshTokenCreateManyArgs} args - Arguments to create many RefreshTokens. + * @example + * // Create many RefreshTokens + * const refreshToken = await prisma.refreshToken.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a RefreshToken. + * @param {RefreshTokenDeleteArgs} args - Arguments to delete one RefreshToken. + * @example + * // Delete one RefreshToken + * const RefreshToken = await prisma.refreshToken.delete({ + * where: { + * // ... filter to delete one RefreshToken + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one RefreshToken. + * @param {RefreshTokenUpdateArgs} args - Arguments to update one RefreshToken. + * @example + * // Update one RefreshToken + * const refreshToken = await prisma.refreshToken.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more RefreshTokens. + * @param {RefreshTokenDeleteManyArgs} args - Arguments to filter RefreshTokens to delete. + * @example + * // Delete a few RefreshTokens + * const { count } = await prisma.refreshToken.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more RefreshTokens. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {RefreshTokenUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many RefreshTokens + * const refreshToken = await prisma.refreshToken.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one RefreshToken. + * @param {RefreshTokenUpsertArgs} args - Arguments to update or create a RefreshToken. + * @example + * // Update or create a RefreshToken + * const refreshToken = await prisma.refreshToken.upsert({ + * create: { + * // ... data to create a RefreshToken + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the RefreshToken we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__RefreshTokenClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of RefreshTokens. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {RefreshTokenCountArgs} args - Arguments to filter RefreshTokens to count. + * @example + * // Count the number of RefreshTokens + * const count = await prisma.refreshToken.count({ + * where: { + * // ... the filter for the RefreshTokens we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a RefreshToken. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {RefreshTokenAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by RefreshToken. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {RefreshTokenGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends RefreshTokenGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: RefreshTokenGroupByArgs['orderBy'] } + : { orderBy?: RefreshTokenGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetRefreshTokenGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the RefreshToken model + */ +readonly fields: RefreshTokenFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for RefreshToken. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__RefreshTokenClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + user = {}>(args?: Prisma.Subset>): Prisma.Prisma__UserClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the RefreshToken model + */ +export interface RefreshTokenFieldRefs { + readonly id: Prisma.FieldRef<"RefreshToken", 'Int'> + readonly tokenHash: Prisma.FieldRef<"RefreshToken", 'String'> + readonly userId: Prisma.FieldRef<"RefreshToken", 'Int'> + readonly revoked: Prisma.FieldRef<"RefreshToken", 'Boolean'> + readonly expiresAt: Prisma.FieldRef<"RefreshToken", 'DateTime'> + readonly createdAt: Prisma.FieldRef<"RefreshToken", 'DateTime'> +} + + +// Custom InputTypes +/** + * RefreshToken findUnique + */ +export type RefreshTokenFindUniqueArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * Filter, which RefreshToken to fetch. + */ + where: Prisma.RefreshTokenWhereUniqueInput +} + +/** + * RefreshToken findUniqueOrThrow + */ +export type RefreshTokenFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * Filter, which RefreshToken to fetch. + */ + where: Prisma.RefreshTokenWhereUniqueInput +} + +/** + * RefreshToken findFirst + */ +export type RefreshTokenFindFirstArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * Filter, which RefreshToken to fetch. + */ + where?: Prisma.RefreshTokenWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of RefreshTokens to fetch. + */ + orderBy?: Prisma.RefreshTokenOrderByWithRelationInput | Prisma.RefreshTokenOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for RefreshTokens. + */ + cursor?: Prisma.RefreshTokenWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` RefreshTokens from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` RefreshTokens. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of RefreshTokens. + */ + distinct?: Prisma.RefreshTokenScalarFieldEnum | Prisma.RefreshTokenScalarFieldEnum[] +} + +/** + * RefreshToken findFirstOrThrow + */ +export type RefreshTokenFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * Filter, which RefreshToken to fetch. + */ + where?: Prisma.RefreshTokenWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of RefreshTokens to fetch. + */ + orderBy?: Prisma.RefreshTokenOrderByWithRelationInput | Prisma.RefreshTokenOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for RefreshTokens. + */ + cursor?: Prisma.RefreshTokenWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` RefreshTokens from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` RefreshTokens. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of RefreshTokens. + */ + distinct?: Prisma.RefreshTokenScalarFieldEnum | Prisma.RefreshTokenScalarFieldEnum[] +} + +/** + * RefreshToken findMany + */ +export type RefreshTokenFindManyArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * Filter, which RefreshTokens to fetch. + */ + where?: Prisma.RefreshTokenWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of RefreshTokens to fetch. + */ + orderBy?: Prisma.RefreshTokenOrderByWithRelationInput | Prisma.RefreshTokenOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing RefreshTokens. + */ + cursor?: Prisma.RefreshTokenWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` RefreshTokens from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` RefreshTokens. + */ + skip?: number + distinct?: Prisma.RefreshTokenScalarFieldEnum | Prisma.RefreshTokenScalarFieldEnum[] +} + +/** + * RefreshToken create + */ +export type RefreshTokenCreateArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * The data needed to create a RefreshToken. + */ + data: Prisma.XOR +} + +/** + * RefreshToken createMany + */ +export type RefreshTokenCreateManyArgs = { + /** + * The data used to create many RefreshTokens. + */ + data: Prisma.RefreshTokenCreateManyInput | Prisma.RefreshTokenCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * RefreshToken update + */ +export type RefreshTokenUpdateArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * The data needed to update a RefreshToken. + */ + data: Prisma.XOR + /** + * Choose, which RefreshToken to update. + */ + where: Prisma.RefreshTokenWhereUniqueInput +} + +/** + * RefreshToken updateMany + */ +export type RefreshTokenUpdateManyArgs = { + /** + * The data used to update RefreshTokens. + */ + data: Prisma.XOR + /** + * Filter which RefreshTokens to update + */ + where?: Prisma.RefreshTokenWhereInput + /** + * Limit how many RefreshTokens to update. + */ + limit?: number +} + +/** + * RefreshToken upsert + */ +export type RefreshTokenUpsertArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * The filter to search for the RefreshToken to update in case it exists. + */ + where: Prisma.RefreshTokenWhereUniqueInput + /** + * In case the RefreshToken found by the `where` argument doesn't exist, create a new RefreshToken with this data. + */ + create: Prisma.XOR + /** + * In case the RefreshToken was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * RefreshToken delete + */ +export type RefreshTokenDeleteArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + /** + * Filter which RefreshToken to delete. + */ + where: Prisma.RefreshTokenWhereUniqueInput +} + +/** + * RefreshToken deleteMany + */ +export type RefreshTokenDeleteManyArgs = { + /** + * Filter which RefreshTokens to delete + */ + where?: Prisma.RefreshTokenWhereInput + /** + * Limit how many RefreshTokens to delete. + */ + limit?: number +} + +/** + * RefreshToken without action + */ +export type RefreshTokenDefaultArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null +} diff --git a/src/generated/prisma/models/Role.ts b/src/generated/prisma/models/Role.ts index 584c340..798a89c 100644 --- a/src/generated/prisma/models/Role.ts +++ b/src/generated/prisma/models/Role.ts @@ -245,17 +245,17 @@ export type RoleOrderByWithRelationInput = { export type RoleWhereUniqueInput = Prisma.AtLeast<{ id?: number + name?: string AND?: Prisma.RoleWhereInput | Prisma.RoleWhereInput[] OR?: Prisma.RoleWhereInput[] NOT?: Prisma.RoleWhereInput | Prisma.RoleWhereInput[] - name?: Prisma.StringFilter<"Role"> | string description?: Prisma.StringNullableFilter<"Role"> | string | null permissions?: Prisma.JsonNullableFilter<"Role"> createdAt?: Prisma.DateTimeFilter<"Role"> | Date | string updatedAt?: Prisma.DateTimeFilter<"Role"> | Date | string deletedAt?: Prisma.DateTimeNullableFilter<"Role"> | Date | string | null users?: Prisma.UserListRelationFilter -}, "id"> +}, "id" | "name"> export type RoleOrderByWithAggregationInput = { id?: Prisma.SortOrder diff --git a/src/generated/prisma/models/User.ts b/src/generated/prisma/models/User.ts index 483825c..7aa9309 100644 --- a/src/generated/prisma/models/User.ts +++ b/src/generated/prisma/models/User.ts @@ -253,6 +253,7 @@ export type UserWhereInput = { deletedAt?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string role?: Prisma.XOR + refreshTokens?: Prisma.RefreshTokenListRelationFilter } export type UserOrderByWithRelationInput = { @@ -266,6 +267,7 @@ export type UserOrderByWithRelationInput = { deletedAt?: Prisma.SortOrderInput | Prisma.SortOrder updatedAt?: Prisma.SortOrder role?: Prisma.RoleOrderByWithRelationInput + refreshTokens?: Prisma.RefreshTokenOrderByRelationAggregateInput _relevance?: Prisma.UserOrderByRelevanceInput } @@ -283,6 +285,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{ deletedAt?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string role?: Prisma.XOR + refreshTokens?: Prisma.RefreshTokenListRelationFilter }, "id" | "mobileNumber"> export type UserOrderByWithAggregationInput = { @@ -326,6 +329,7 @@ export type UserCreateInput = { deletedAt?: Date | string | null updatedAt?: Date | string role: Prisma.RoleCreateNestedOneWithoutUsersInput + refreshTokens?: Prisma.RefreshTokenCreateNestedManyWithoutUserInput } export type UserUncheckedCreateInput = { @@ -338,6 +342,7 @@ export type UserUncheckedCreateInput = { createdAt?: Date | string deletedAt?: Date | string | null updatedAt?: Date | string + refreshTokens?: Prisma.RefreshTokenUncheckedCreateNestedManyWithoutUserInput } export type UserUpdateInput = { @@ -349,6 +354,7 @@ export type UserUpdateInput = { deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string role?: Prisma.RoleUpdateOneRequiredWithoutUsersNestedInput + refreshTokens?: Prisma.RefreshTokenUpdateManyWithoutUserNestedInput } export type UserUncheckedUpdateInput = { @@ -361,6 +367,7 @@ export type UserUncheckedUpdateInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + refreshTokens?: Prisma.RefreshTokenUncheckedUpdateManyWithoutUserNestedInput } export type UserCreateManyInput = { @@ -459,6 +466,11 @@ export type UserOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } +export type UserScalarRelationFilter = { + is?: Prisma.UserWhereInput + isNot?: Prisma.UserWhereInput +} + export type StringFieldUpdateOperationsInput = { set?: string } @@ -521,6 +533,20 @@ export type UserUncheckedUpdateManyWithoutRoleNestedInput = { deleteMany?: Prisma.UserScalarWhereInput | Prisma.UserScalarWhereInput[] } +export type UserCreateNestedOneWithoutRefreshTokensInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutRefreshTokensInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutRefreshTokensNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutRefreshTokensInput + upsert?: Prisma.UserUpsertWithoutRefreshTokensInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutRefreshTokensInput> +} + export type UserCreateWithoutRoleInput = { mobileNumber: string password: string @@ -529,6 +555,7 @@ export type UserCreateWithoutRoleInput = { createdAt?: Date | string deletedAt?: Date | string | null updatedAt?: Date | string + refreshTokens?: Prisma.RefreshTokenCreateNestedManyWithoutUserInput } export type UserUncheckedCreateWithoutRoleInput = { @@ -540,6 +567,7 @@ export type UserUncheckedCreateWithoutRoleInput = { createdAt?: Date | string deletedAt?: Date | string | null updatedAt?: Date | string + refreshTokens?: Prisma.RefreshTokenUncheckedCreateNestedManyWithoutUserInput } export type UserCreateOrConnectWithoutRoleInput = { @@ -583,6 +611,68 @@ export type UserScalarWhereInput = { updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string } +export type UserCreateWithoutRefreshTokensInput = { + mobileNumber: string + password: string + firstName: string + lastName: string + createdAt?: Date | string + deletedAt?: Date | string | null + updatedAt?: Date | string + role: Prisma.RoleCreateNestedOneWithoutUsersInput +} + +export type UserUncheckedCreateWithoutRefreshTokensInput = { + id?: number + mobileNumber: string + password: string + firstName: string + lastName: string + roleId: number + createdAt?: Date | string + deletedAt?: Date | string | null + updatedAt?: Date | string +} + +export type UserCreateOrConnectWithoutRefreshTokensInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutRefreshTokensInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutRefreshTokensInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutRefreshTokensInput = { + mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + firstName?: Prisma.StringFieldUpdateOperationsInput | string + lastName?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.RoleUpdateOneRequiredWithoutUsersNestedInput +} + +export type UserUncheckedUpdateWithoutRefreshTokensInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + firstName?: Prisma.StringFieldUpdateOperationsInput | string + lastName?: Prisma.StringFieldUpdateOperationsInput | string + roleId?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + export type UserCreateManyRoleInput = { id?: number mobileNumber: string @@ -602,6 +692,7 @@ export type UserUpdateWithoutRoleInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + refreshTokens?: Prisma.RefreshTokenUpdateManyWithoutUserNestedInput } export type UserUncheckedUpdateWithoutRoleInput = { @@ -613,6 +704,7 @@ export type UserUncheckedUpdateWithoutRoleInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + refreshTokens?: Prisma.RefreshTokenUncheckedUpdateManyWithoutUserNestedInput } export type UserUncheckedUpdateManyWithoutRoleInput = { @@ -627,6 +719,35 @@ export type UserUncheckedUpdateManyWithoutRoleInput = { } +/** + * Count Type UserCountOutputType + */ + +export type UserCountOutputType = { + refreshTokens: number +} + +export type UserCountOutputTypeSelect = { + refreshTokens?: boolean | UserCountOutputTypeCountRefreshTokensArgs +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the UserCountOutputType + */ + select?: Prisma.UserCountOutputTypeSelect | null +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeCountRefreshTokensArgs = { + where?: Prisma.RefreshTokenWhereInput +} + export type UserSelect = runtime.Types.Extensions.GetSelect<{ id?: boolean @@ -639,6 +760,8 @@ export type UserSelect + refreshTokens?: boolean | Prisma.User$refreshTokensArgs + _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs }, ExtArgs["result"]["user"]> @@ -658,12 +781,15 @@ export type UserSelectScalar = { export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "mobileNumber" | "password" | "firstName" | "lastName" | "roleId" | "createdAt" | "deletedAt" | "updatedAt", ExtArgs["result"]["user"]> export type UserInclude = { role?: boolean | Prisma.RoleDefaultArgs + refreshTokens?: boolean | Prisma.User$refreshTokensArgs + _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs } export type $UserPayload = { name: "User" objects: { role: Prisma.$RolePayload + refreshTokens: Prisma.$RefreshTokenPayload[] } scalars: runtime.Types.Extensions.GetPayloadResult<{ id: number @@ -1016,6 +1142,7 @@ readonly fields: UserFieldRefs; export interface Prisma__UserClient extends Prisma.PrismaPromise { readonly [Symbol.toStringTag]: "PrismaPromise" role = {}>(args?: Prisma.Subset>): Prisma.Prisma__RoleClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + refreshTokens = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. @@ -1396,6 +1523,30 @@ export type UserDeleteManyArgs = { + /** + * Select specific fields to fetch from the RefreshToken + */ + select?: Prisma.RefreshTokenSelect | null + /** + * Omit specific fields from the RefreshToken + */ + omit?: Prisma.RefreshTokenOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.RefreshTokenInclude | null + where?: Prisma.RefreshTokenWhereInput + orderBy?: Prisma.RefreshTokenOrderByWithRelationInput | Prisma.RefreshTokenOrderByWithRelationInput[] + cursor?: Prisma.RefreshTokenWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.RefreshTokenScalarFieldEnum | Prisma.RefreshTokenScalarFieldEnum[] +} + /** * User without action */ diff --git a/src/modules/cardex/cardex.controller.ts b/src/modules/cardex/cardex.controller.ts new file mode 100644 index 0000000..098004d --- /dev/null +++ b/src/modules/cardex/cardex.controller.ts @@ -0,0 +1,27 @@ +import { Controller, Get, Query } from '@nestjs/common' +import { ApiQuery } from '@nestjs/swagger' +import { CardexService } from './cardex.service' + +@Controller('cardex') +export class CardexController { + constructor(private readonly service: CardexService) {} + + @Get('') + @ApiQuery({ name: 'startDate', required: true, type: Date }) + @ApiQuery({ name: 'endDate', required: false, type: Date }) + @ApiQuery({ name: 'inventoryId', required: false, type: Number }) + @ApiQuery({ name: 'productId', required: false, type: Number }) + async getStock( + @Query('startDate') startDate: Date, + @Query('endDate') endDate: Date, + @Query('inventoryId') inventoryId: number, + @Query('productId') productId: number, + ) { + return this.service.getCardex({ + startDate, + endDate, + inventoryId, + productId, + }) + } +} diff --git a/src/modules/cardex/cardex.module.ts b/src/modules/cardex/cardex.module.ts new file mode 100644 index 0000000..4a9ea50 --- /dev/null +++ b/src/modules/cardex/cardex.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common' +import { PrismaModule } from '../../prisma/prisma.module' +import { CardexController } from './cardex.controller' +import { CardexService } from './cardex.service' + +@Module({ + imports: [PrismaModule], + controllers: [CardexController], + providers: [CardexService], +}) +export class CardexModule {} diff --git a/src/modules/cardex/cardex.service.ts b/src/modules/cardex/cardex.service.ts new file mode 100644 index 0000000..8529c32 --- /dev/null +++ b/src/modules/cardex/cardex.service.ts @@ -0,0 +1,56 @@ +import { Injectable } from '@nestjs/common' +import dayjs from 'dayjs' +import { ResponseMapper } from '../../common/response/response-mapper' +import { Prisma } from '../../generated/prisma/client' +import { PrismaService } from '../../prisma/prisma.service' +import { ReadCardexDto } from './dto/read-pos.dto' + +@Injectable() +export class CardexService { + constructor(private prisma: PrismaService) {} + + async getCardex({ startDate, endDate, inventoryId, productId }: ReadCardexDto) { + if (!endDate) { + endDate = dayjs(startDate).add(1, 'months').toDate() + } + const where: Prisma.StockMovementWhereInput = {} + + if (inventoryId !== undefined) where.inventoryId = inventoryId + if (productId !== undefined) where.productId = productId + + if (startDate || endDate) { + where.createdAt = {} + if (startDate) where.createdAt.gte = new Date(startDate) + if (endDate) where.createdAt.lte = new Date(endDate) + } + + const items = await this.prisma.stockMovement.findMany({ + where, + include: { product: true, inventory: true }, + orderBy: { createdAt: 'desc' }, + }) + + const mapped = items.map(i => ({ + id: i.id, + type: i.type, + quantity: Number(i.quantity), + fee: Number(i.fee), + totalCost: Number(i.totalCost), + referenceType: i.referenceType, + referenceId: i.referenceId, + createdAt: i.createdAt, + avgCost: Number(i.avgCost), + product: { + name: i.product.name, + sku: i.product.sku, + id: i.productId, + }, + inventory: { + name: i.inventory.name, + id: i.inventoryId, + }, + })) + + return ResponseMapper.list(mapped) + } +} diff --git a/src/modules/cardex/dto/read-pos.dto.ts b/src/modules/cardex/dto/read-pos.dto.ts new file mode 100644 index 0000000..be8ac56 --- /dev/null +++ b/src/modules/cardex/dto/read-pos.dto.ts @@ -0,0 +1,23 @@ +import { ApiPropertyOptional } from '@nestjs/swagger' +import { IsDateString, IsNumber, IsOptional } from 'class-validator' + +export class ReadCardexDto { + @ApiPropertyOptional() + @IsDateString() + startDate: Date + + @ApiPropertyOptional() + @IsOptional() + @IsDateString() + endDate?: Date + + @ApiPropertyOptional() + @IsOptional() + @IsNumber() + inventoryId?: number + + @ApiPropertyOptional() + @IsOptional() + @IsNumber() + productId?: number +} diff --git a/src/pos/dto/create-pos.dto.ts b/src/modules/pos/dto/create-pos.dto.ts similarity index 100% rename from src/pos/dto/create-pos.dto.ts rename to src/modules/pos/dto/create-pos.dto.ts diff --git a/src/pos/dto/update-pos.dto.ts b/src/modules/pos/dto/update-pos.dto.ts similarity index 100% rename from src/pos/dto/update-pos.dto.ts rename to src/modules/pos/dto/update-pos.dto.ts diff --git a/src/pos/pos.controller.ts b/src/modules/pos/pos.controller.ts similarity index 100% rename from src/pos/pos.controller.ts rename to src/modules/pos/pos.controller.ts diff --git a/src/pos/pos.module.ts b/src/modules/pos/pos.module.ts similarity index 81% rename from src/pos/pos.module.ts rename to src/modules/pos/pos.module.ts index 396359f..5439eea 100644 --- a/src/pos/pos.module.ts +++ b/src/modules/pos/pos.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common' -import { PrismaModule } from '../prisma/prisma.module' +import { PrismaModule } from '../../prisma/prisma.module' import { PosController } from './pos.controller' import { PosService } from './pos.service' diff --git a/src/pos/pos.service.ts b/src/modules/pos/pos.service.ts similarity index 95% rename from src/pos/pos.service.ts rename to src/modules/pos/pos.service.ts index b4e90f5..599ed20 100644 --- a/src/pos/pos.service.ts +++ b/src/modules/pos/pos.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common' -import { ResponseMapper } from '../common/response/response-mapper' -import { Prisma } from '../generated/prisma/client' -import { PrismaService } from '../prisma/prisma.service' +import { ResponseMapper } from '../../common/response/response-mapper' +import { Prisma } from '../../generated/prisma/client' +import { PrismaService } from '../../prisma/prisma.service' import { CreateOrderDto } from './dto/create-pos.dto' @Injectable() diff --git a/src/products/products.controller.ts b/src/products/products.controller.ts index c2354e6..0a5ee07 100644 --- a/src/products/products.controller.ts +++ b/src/products/products.controller.ts @@ -1,4 +1,5 @@ -import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common' +import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from '@nestjs/common' +import { ApiQuery } from '@nestjs/swagger' import { CreateProductDto } from './dto/create-product.dto' import { UpdateProductDto } from './dto/update-product.dto' import { ProductsService } from './products.service' @@ -13,8 +14,10 @@ export class ProductsController { } @Get() - findAll() { - return this.productsService.findAll() + @ApiQuery({ name: 'page', required: false, type: Number, default: 1 }) + @ApiQuery({ name: 'pageSize', required: false, type: Number, default: 30 }) + findAll(@Query('page') page: number = 1, @Query('pageSize') pageSize: number = 30) { + return this.productsService.findAll(page, pageSize) } @Get(':id') diff --git a/src/products/products.service.ts b/src/products/products.service.ts index b109815..725c26e 100644 --- a/src/products/products.service.ts +++ b/src/products/products.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common' import { ShortEntity } from '../common/interfaces/response-models' import { ResponseMapper } from '../common/response/response-mapper' +import { Prisma } from '../generated/prisma/client' import { PrismaService } from '../prisma/prisma.service' import { CreateProductDto } from './dto/create-product.dto' @@ -28,10 +29,17 @@ export class ProductsService { return ResponseMapper.create(item) } - async findAll() { - const items = await this.prisma.product.findMany({ - include: { brand: true, category: true, stockBalances: true }, - }) + async findAll(page = 1, pageSize = 20) { + const query: Prisma.ProductFindManyArgs = {} + + const [items, count] = await this.prisma.$transaction([ + this.prisma.product.findMany({ + include: { brand: true, category: true, stockBalances: true }, + skip: (page - 1) * pageSize, + take: pageSize, + }), + this.prisma.product.count(), + ]) const mapped = items.map(p => { const { brandId, categoryId, ...rest } = p as any @@ -48,7 +56,7 @@ export class ProductsService { return { ...rest, brand, category, stock } }) - return ResponseMapper.list(mapped) + return ResponseMapper.paginate(mapped, count, page, pageSize) } async findOne(id: number) { diff --git a/src/purchase-receipt-items/purchase-receipt-items.service.ts b/src/purchase-receipt-items/purchase-receipt-items.service.ts index 975202d..0cc5b20 100644 --- a/src/purchase-receipt-items/purchase-receipt-items.service.ts +++ b/src/purchase-receipt-items/purchase-receipt-items.service.ts @@ -23,8 +23,8 @@ export class PurchaseReceiptItemsService { const item = await this.prisma.purchaseReceiptItem.create({ data: payload }) return ResponseMapper.create(item) } - async findAll(receiptId?: number) { - const where = receiptId ? { receiptId: Number(receiptId) } : undefined + async findAll(receiptId: number) { + const where = { receiptId: Number(receiptId) } const items = await this.prisma.purchaseReceiptItem.findMany({ where, include: { product: true }, diff --git a/src/purchase-receipts/purchase-receipts.service.ts b/src/purchase-receipts/purchase-receipts.service.ts index 4f508d1..cfe5ce7 100644 --- a/src/purchase-receipts/purchase-receipts.service.ts +++ b/src/purchase-receipts/purchase-receipts.service.ts @@ -47,7 +47,22 @@ export class PurchaseReceiptsService { async findOne(id: number) { const item = await this.prisma.purchaseReceipt.findUnique({ where: { id }, - include: { supplier: true, inventory: true, items: true }, + include: { + supplier: { + select: { + id: true, + firstName: true, + lastName: true, + }, + }, + inventory: { + select: { + id: true, + name: true, + }, + }, + items: true, + }, }) if (!item) return null return ResponseMapper.single(item) diff --git a/src/suppliers/suppliers.controller.ts b/src/suppliers/suppliers.controller.ts index b76f97e..b62ece8 100644 --- a/src/suppliers/suppliers.controller.ts +++ b/src/suppliers/suppliers.controller.ts @@ -17,9 +17,22 @@ export class SuppliersController { return this.suppliersService.findAll() } - @Get(':id') - findOne(@Param('id') id: string) { - return this.suppliersService.findOne(Number(id)) + @Get(':supplierId') + findOne(@Param('supplierId') supplierId: string) { + return this.suppliersService.findOne(Number(supplierId)) + } + + @Get(':supplierId/invoices') + getInvoices(@Param('supplierId') supplierId: string) { + return this.suppliersService.getInvoices(Number(supplierId)) + } + + @Get(':supplierId/invoices/:invoiceId') + getInvoice( + @Param('supplierId') supplierId: string, + @Param('invoiceId') invoiceId: string, + ) { + return this.suppliersService.getInvoice(Number(supplierId), Number(invoiceId)) } @Patch(':id') diff --git a/src/suppliers/suppliers.service.ts b/src/suppliers/suppliers.service.ts index 9b041c8..e2c1cad 100644 --- a/src/suppliers/suppliers.service.ts +++ b/src/suppliers/suppliers.service.ts @@ -18,7 +18,82 @@ export class SuppliersService { async findOne(id: number) { const item = await this.prisma.supplier.findUnique({ where: { id } }) if (!item) return null - return ResponseMapper.single(item) + const receiptsInfo = await this.prisma.purchaseReceipt.aggregate({ + where: { + supplierId: id, + }, + _count: true, + _sum: { + totalAmount: true, + }, + }) + + return ResponseMapper.single({ + ...item, + receiptsOverview: { + totalPayment: receiptsInfo._sum.totalAmount, + count: receiptsInfo._count, + }, + }) + } + + async getInvoices(supplierId: number) { + const items = await this.prisma.purchaseReceipt.findMany({ + where: { + supplierId, + }, + include: { + inventory: { + select: { + id: true, + name: true, + }, + }, + items: { + select: { + id: true, + count: true, + fee: true, + total: true, + product: { + select: { + id: true, + name: true, + sku: true, + }, + }, + }, + }, + }, + omit: { + inventoryId: true, + supplierId: true, + }, + }) + return ResponseMapper.list(items) + } + + async getInvoice(supplierId: number, invoiceId: number) { + const invoice = await this.prisma.purchaseReceipt.findUnique({ + where: { + id: invoiceId, + supplierId, + }, + include: { + inventory: { + select: { + id: true, + name: true, + }, + }, + items: true, + }, + omit: { + inventoryId: true, + supplierId: true, + }, + }) + return ResponseMapper.single(invoice) } async update(id: number, data: any) {