feat: add stock keeping units management

- Created migration to drop `type` column from `stock_keeping_units` table.
- Added `Guild` model to Prisma schema.
- Implemented `BusinessActivitiesQueryService` for querying business activities.
- Developed `GoodsSharedService` for handling goods creation and updates.
- Introduced DTOs for creating and updating stock keeping units.
- Created controller and service for managing stock keeping units.
- Implemented response DTOs for stock keeping units service.
- Established module for stock keeping units management.
This commit is contained in:
2026-05-07 20:30:24 +03:30
parent 658496320b
commit fbe7230865
77 changed files with 2065 additions and 1846 deletions
+6 -32
View File
@@ -14,40 +14,14 @@ model AdminAccount {
}
model Admin {
id String @id @default(ulid())
mobile_number String @unique()
national_code String? @unique()
id String @id @default(ulid())
mobile_number String @unique
national_code String? @unique
first_name String
last_name String
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
accounts AdminAccount[]
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
accounts AdminAccount[]
@@map("admins")
}
// model LegalProfile {
// user_id String @id
// company_name String
// register_no String @unique()
// representative_name String?
// representative_national_id String?
// // user User @relation(fields: [user_id], references: [id])
// @@map("legal_profiles")
// }
// model IndividualProfile {
// user_id String @id
// national_code String @unique()
// first_name String
// last_name String
// birth_date DateTime?
// mobile_number String
// // user User @relation(fields: [user_id], references: [id])
// @@map("individual_profiles")
// }
+7 -50
View File
@@ -1,56 +1,13 @@
model Account {
id String @id @default(ulid())
username String @unique()
password String
status AccountStatus
type AccountType
id String @id @default(ulid())
username String @unique
password String
status AccountStatus
type AccountType
admin_account AdminAccount?
provider_account ProviderAccount?
partner_account PartnerAccount?
consumer_account ConsumerAccount?
// admin_account_id String? @unique
// admin_account AdminAccount? @relation(fields: [admin_account_id], references: [id], onDelete: Cascade)
// provider_account_id String? @unique
// provider_account ProviderAccount? @relation(fields: [provider_account_id], references: [id], onDelete: Cascade)
// partner_account_id String? @unique
// partner_account PartnerAccount? @relation(fields: [partner_account_id], references: [id], onDelete: Cascade)
// consumer_account_id String? @unique
// consumer_account ConsumerAccount? @relation(fields: [consumer_account_id], references: [id], onDelete: Cascade)
// tokens Token[]
// refresh_tokens RefreshToken[]
partner_account PartnerAccount?
provider_account ProviderAccount?
@@map("accounts")
}
// model Token {
// id String @id @d @uniqueefault(ulid())
// token String @unique
// type TokenType
// created_at DateTime @default(now())
// expires_at DateTime
// account_id String
// account Account @relation(fields: [account_id], references: [id])
// @@unique([type, account_id])
// @@map("tokens")
// }
// model VerificationCode {
// id String @id @default(ulid())
// code String
// is_used Boolean @default(false)
// created_at DateTime @default(now())
// expires_at DateTime
// account_id String
// account Account @relation(fields: [account_id], references: [id])
// @@map("verification_codes")
// }
+11 -15
View File
@@ -1,27 +1,23 @@
model DeviceBrand {
id String @id @default(ulid())
name String
id String @id @default(ulid())
name String
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
devices Device[]
updated_at DateTime @updatedAt @db.Timestamp(0)
devices Device[]
@@map("device_brands")
}
model Device {
id String @id @default(ulid())
id String @id @default(ulid())
name String
os_version String?
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
brand_id String
brand DeviceBrand @relation(fields: [brand_id], references: [id])
poses Pos[]
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
brand_id String
brand DeviceBrand @relation(fields: [brand_id], references: [id])
poses Pos[]
@@index([brand_id])
@@map("devices")
}
+63 -81
View File
@@ -1,133 +1,115 @@
model LicenseChargeTransaction {
id String @id @default(ulid())
id String @id @default(ulid())
activation_expires_at DateTime
tracking_code String @unique()
tracking_code String @unique
purchased_count Int
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
partner_id String
partner Partner @relation(fields: [partner_id], references: [id])
licenses License[]
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
partner_id String
partner Partner @relation(fields: [partner_id], references: [id])
licenses License[]
@@index([partner_id])
@@map("license_charged_transactions")
}
model License {
id String @id @default(ulid())
accounts_limit Int @default(2)
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
id String @id @default(ulid())
accounts_limit Int @default(2)
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
charge_transaction_id String
charge_transaction LicenseChargeTransaction @relation(fields: [charge_transaction_id], references: [id])
activation LicenseActivation?
activation LicenseActivation?
@@index([charge_transaction_id])
@@map("licenses")
}
model LicenseActivation {
id String @id @unique() @default(ulid())
starts_at DateTime
expires_at DateTime
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
license_id String @unique
license License @relation(fields: [license_id], references: [id])
business_activity_id String @unique
business_activity BusinessActivity @relation(fields: [business_activity_id], references: [id])
license_renews LicenseRenew[]
account_allocations LicenseAccountAllocation[]
id String @id @unique @default(ulid())
starts_at DateTime
expires_at DateTime
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
license_id String @unique
business_activity_id String @unique
account_allocations LicenseAccountAllocation[]
license_renews LicenseRenew[]
business_activity BusinessActivity @relation(fields: [business_activity_id], references: [id])
license License @relation(fields: [license_id], references: [id])
@@map("licenses_activated")
}
model LicenseRenewChargeTransaction {
id String @id @default(ulid())
id String @id @default(ulid())
activation_expires_at DateTime
tracking_code String @unique()
tracking_code String @unique
purchased_count Int
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
partner_id String
license_renews LicenseRenew[]
partner Partner @relation(fields: [partner_id], references: [id])
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
partner_id String
partner Partner @relation(fields: [partner_id], references: [id])
license_renews LicenseRenew[]
@@index([partner_id])
@@map("license_renew_charge_transaction")
}
model LicenseRenew {
id String @id @default(ulid())
expires_at DateTime
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
id String @id @default(ulid())
expires_at DateTime
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
charge_transaction_id String
activation_id String?
activation LicenseActivation? @relation(fields: [activation_id], references: [id])
charge_transaction LicenseRenewChargeTransaction @relation(fields: [charge_transaction_id], references: [id])
activation_id String?
activation LicenseActivation? @relation(fields: [activation_id], references: [id])
@@index([activation_id])
@@index([charge_transaction_id])
@@map("license_renew")
}
model PartnerAccountQuotaChargeTransaction {
id String @id @default(ulid())
id String @id @default(ulid())
activation_expires_at DateTime
tracking_code String @unique()
tracking_code String @unique
purchased_count Int
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
partner_id String
partner Partner @relation(fields: [partner_id], references: [id])
credits PartnerAccountQuotaCredit[]
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
partner_id String
partner Partner @relation(fields: [partner_id], references: [id])
credits PartnerAccountQuotaCredit[]
@@index([partner_id])
@@map("partner_account_quota_charge_transaction")
}
model PartnerAccountQuotaCredit {
id String @id @default(ulid())
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
id String @id @default(ulid())
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
charge_transaction_id String?
allocation LicenseAccountAllocation?
charge_transaction PartnerAccountQuotaChargeTransaction? @relation(fields: [charge_transaction_id], references: [id])
allocation LicenseAccountAllocation?
@@index([charge_transaction_id])
@@map("partner_account_quota_credit")
}
model LicenseAccountAllocation {
id String @id @default(ulid())
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
id String @id @default(ulid())
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
license_activation_id String?
license_activation LicenseActivation? @relation(fields: [license_activation_id], references: [id])
account_id String? @unique
account ConsumerAccount? @relation(fields: [account_id], references: [id])
credit_id String? @unique
credit PartnerAccountQuotaCredit? @relation(fields: [credit_id], references: [id])
account_id String? @unique
credit_id String? @unique
account ConsumerAccount? @relation(fields: [account_id], references: [id])
credit PartnerAccountQuotaCredit? @relation(fields: [credit_id], references: [id])
license_activation LicenseActivation? @relation(fields: [license_activation_id], references: [id])
@@index([license_activation_id])
@@map("license_account_allocation")
}
+18 -22
View File
@@ -1,36 +1,32 @@
model PartnerAccount {
id String @id @default(ulid())
role PartnerRole
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @default(now()) @updatedAt @db.Timestamp(0)
id String @id @default(ulid())
role PartnerRole
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @default(now()) @updatedAt @db.Timestamp(0)
partner_id String
partner Partner @relation(fields: [partner_id], references: [id])
account_id String @unique
account Account @relation(fields: [account_id], references: [id], onDelete: Cascade)
account_id String @unique
account Account @relation(fields: [account_id], references: [id], onDelete: Cascade)
partner Partner @relation(fields: [partner_id], references: [id])
@@index([partner_id], map: "partner_accounts_partner_id_fkey")
@@map("partner_accounts")
}
model Partner {
id String @id @default(ulid())
name String
code String @unique()
status PartnerStatus @default(ACTIVE)
tsp_provider TspProviderType @default(NAMA)
logo_url String?
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @default(now()) @updatedAt @db.Timestamp(0)
accounts PartnerAccount[]
id String @id @default(ulid())
name String
code String @unique
status PartnerStatus @default(ACTIVE)
logo_url String?
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @default(now()) @updatedAt @db.Timestamp(0)
tsp_provider TspProviderType @default(NAMA)
consumers_individual ConsumerIndividual[]
consumers_legal ConsumerLegal[]
license_charge_transactions LicenseChargeTransaction[]
account_quota_charge_transactions PartnerAccountQuotaChargeTransaction[]
license_renew_charge_transactions LicenseRenewChargeTransaction[]
account_quota_charge_transactions PartnerAccountQuotaChargeTransaction[]
accounts PartnerAccount[]
@@map("partners")
}
+20 -25
View File
@@ -1,54 +1,49 @@
model PermissionConsumer {
id String @id @default(ulid())
consumer_account_id String @unique
consumer_account ConsumerAccount @relation(fields: [consumer_account_id], references: [id], onDelete: Cascade)
pos_permissions PermissionPos[]
complex_permissions PermissionComplex[]
id String @id @default(ulid())
consumer_account_id String @unique
business_permissions PermissionBusiness[]
complex_permissions PermissionComplex[]
consumer_account ConsumerAccount @relation(fields: [consumer_account_id], references: [id], onDelete: Cascade)
pos_permissions PermissionPos[]
@@map("permission_consumers")
}
model PermissionPos {
id String @id @default(ulid())
role POSRole
id String @id @default(ulid())
role POSRole
pos_id String
permission_id String
pos Pos @relation(fields: [pos_id], references: [id], onDelete: Cascade)
permission PermissionConsumer @relation(fields: [permission_id], references: [id], onDelete: Cascade)
permission PermissionConsumer @relation(fields: [permission_id], references: [id], onDelete: Cascade)
pos Pos @relation(fields: [pos_id], references: [id], onDelete: Cascade)
@@unique([permission_id, pos_id])
@@index([pos_id], map: "permission_poses_pos_id_fkey")
@@map("permission_poses")
}
model PermissionComplex {
id String @id @default(ulid())
role ComplexRole
id String @id @default(ulid())
role ComplexRole
complex_id String
permission_id String
complex Complex @relation(fields: [complex_id], references: [id], onDelete: Cascade)
permission PermissionConsumer @relation(fields: [permission_id], references: [id], onDelete: Cascade)
complex Complex @relation(fields: [complex_id], references: [id], onDelete: Cascade)
permission PermissionConsumer @relation(fields: [permission_id], references: [id], onDelete: Cascade)
@@unique([permission_id, complex_id])
@@index([complex_id], map: "permission_complexes_complex_id_fkey")
@@map("permission_complexes")
}
model PermissionBusiness {
id String @id @default(ulid())
role BusinessRole
id String @id @default(ulid())
role BusinessRole
business_id String
permission_id String
business BusinessActivity @relation(fields: [business_id], references: [id], onDelete: Cascade)
permission PermissionConsumer @relation(fields: [permission_id], references: [id], onDelete: Cascade)
business BusinessActivity @relation(fields: [business_id], references: [id], onDelete: Cascade)
permission PermissionConsumer @relation(fields: [permission_id], references: [id], onDelete: Cascade)
@@unique([permission_id, business_id])
@@index([business_id], map: "permission_business_activities_business_id_fkey")
@@map("permission_business_activities")
}
+16 -20
View File
@@ -1,30 +1,26 @@
model ProviderAccount {
id String @id @default(ulid())
role ProviderRole
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt() @db.Timestamp(0)
id String @id @default(ulid())
role ProviderRole
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
provider_id String
provider Provider @relation(fields: [provider_id], references: [id])
account_id String @unique
account Account @relation(fields: [account_id], references: [id], onDelete: Cascade)
account_id String @unique
account Account @relation(fields: [account_id], references: [id], onDelete: Cascade)
provider Provider @relation(fields: [provider_id], references: [id])
@@index([provider_id], map: "provider_accounts_provider_id_fkey")
@@map("provider_accounts")
}
model Provider {
id String @id @default(ulid())
code String @unique()
status PartnerStatus @default(ACTIVE)
name String
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
accounts ProviderAccount[]
pos_list Pos[]
id String @id @default(ulid())
code String @unique
status PartnerStatus @default(ACTIVE)
name String
created_at DateTime @default(now()) @db.Timestamp(0)
updated_at DateTime @updatedAt @db.Timestamp(0)
pos_list Pos[]
accounts ProviderAccount[]
@@map("providers")
}