diff --git a/prisma/dbml/schema.dbml b/prisma/dbml/schema.dbml index 667f6215..b3ea74d1 100644 --- a/prisma/dbml/schema.dbml +++ b/prisma/dbml/schema.dbml @@ -668,10 +668,10 @@ Table types_of_maintenances { Table maintenance_companies { id String [pk] - specialty_maintenance String [not null] + specialty_maintenance String Maintenance maintenance [not null] LegalPerson legal_people [not null] - cnpj String [unique, not null] + legal_person_id String [unique, not null] created_at DateTime [default: `now()`, not null] updated_at DateTime [default: `now()`, not null] CreatedBy users [not null] @@ -683,7 +683,7 @@ Table maintenance_companies { Table maintenance { id String [pk] MaintenanceCompany maintenance_companies [not null] - maintenance_company_cnpj String [not null] + maintenance_company_id String [not null] Vehicle vehicles [not null] plate String [not null] TypeOfMaintenance types_of_maintenances [not null] @@ -898,13 +898,13 @@ Ref: types_of_maintenances.created_by > users.id Ref: types_of_maintenances.updated_by > users.id -Ref: maintenance_companies.cnpj - legal_people.cnpj +Ref: maintenance_companies.legal_person_id - legal_people.id Ref: maintenance_companies.created_by > users.id Ref: maintenance_companies.updated_by > users.id -Ref: maintenance.maintenance_company_cnpj > maintenance_companies.cnpj +Ref: maintenance.maintenance_company_id > maintenance_companies.id Ref: maintenance.plate > vehicles.plate diff --git a/prisma/migrations/20240406132931_/migration.sql b/prisma/migrations/20240406132931_/migration.sql new file mode 100644 index 00000000..22e08323 --- /dev/null +++ b/prisma/migrations/20240406132931_/migration.sql @@ -0,0 +1,36 @@ +/* + Warnings: + + - You are about to drop the column `maintenance_company_cnpj` on the `maintenance` table. All the data in the column will be lost. + - You are about to drop the column `cnpj` on the `maintenance_companies` table. All the data in the column will be lost. + - A unique constraint covering the columns `[legal_person_id]` on the table `maintenance_companies` will be added. If there are existing duplicate values, this will fail. + - Added the required column `maintenance_company_id` to the `maintenance` table without a default value. This is not possible if the table is not empty. + - Added the required column `legal_person_id` to the `maintenance_companies` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "maintenance" DROP CONSTRAINT "maintenance_maintenance_company_cnpj_fkey"; + +-- DropForeignKey +ALTER TABLE "maintenance_companies" DROP CONSTRAINT "maintenance_companies_cnpj_fkey"; + +-- DropIndex +DROP INDEX "maintenance_companies_cnpj_key"; + +-- AlterTable +ALTER TABLE "maintenance" DROP COLUMN "maintenance_company_cnpj", +ADD COLUMN "maintenance_company_id" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "maintenance_companies" DROP COLUMN "cnpj", +ADD COLUMN "legal_person_id" TEXT NOT NULL, +ALTER COLUMN "specialty_maintenance" DROP NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "maintenance_companies_legal_person_id_key" ON "maintenance_companies"("legal_person_id"); + +-- AddForeignKey +ALTER TABLE "maintenance_companies" ADD CONSTRAINT "maintenance_companies_legal_person_id_fkey" FOREIGN KEY ("legal_person_id") REFERENCES "legal_people"("cnpj") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "maintenance" ADD CONSTRAINT "maintenance_maintenance_company_id_fkey" FOREIGN KEY ("maintenance_company_id") REFERENCES "maintenance_companies"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20240406135042_/migration.sql b/prisma/migrations/20240406135042_/migration.sql new file mode 100644 index 00000000..cefaf871 --- /dev/null +++ b/prisma/migrations/20240406135042_/migration.sql @@ -0,0 +1,5 @@ +-- DropForeignKey +ALTER TABLE "maintenance_companies" DROP CONSTRAINT "maintenance_companies_legal_person_id_fkey"; + +-- AddForeignKey +ALTER TABLE "maintenance_companies" ADD CONSTRAINT "maintenance_companies_legal_person_id_fkey" FOREIGN KEY ("legal_person_id") REFERENCES "legal_people"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0dc055fb..ba381fba 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -768,19 +768,19 @@ model TypeOfMaintenance { } model MaintenanceCompany { - id String @id @default(uuid()) - specialty_maintenance String + id String @id @default(uuid()) + specialty_maintenance String? Maintenance Maintenance[] - LegalPerson LegalPerson @relation(fields: [cnpj], references: [cnpj]) - cnpj String @unique - created_at DateTime @default(now()) - updated_at DateTime @default(now()) - CreatedBy User @relation("created_by", fields: [created_by], references: [id]) - created_by String - UpdatedBy User @relation("updated_by", fields: [updated_by], references: [id]) - updated_by String + LegalPerson LegalPerson @relation(fields: [legal_person_id], references: [id]) + legal_person_id String @unique + created_at DateTime @default(now()) + updated_at DateTime @default(now()) + CreatedBy User @relation("created_by", fields: [created_by], references: [id]) + created_by String + UpdatedBy User @relation("updated_by", fields: [updated_by], references: [id]) + updated_by String @@map("maintenance_companies") } @@ -788,18 +788,18 @@ model MaintenanceCompany { model Maintenance { id String @id @default(uuid()) - MaintenanceCompany MaintenanceCompany @relation(fields: [maintenance_company_cnpj], references: [cnpj]) - maintenance_company_cnpj String - Vehicle Vehicle @relation(fields: [plate], references: [plate]) - plate String - TypeOfMaintenance TypeOfMaintenance @relation(fields: [maintenance_process_id], references: [id]) - maintenance_process_id String - created_at DateTime @default(now()) - updated_at DateTime @default(now()) - CreatedBy User @relation("created_by", fields: [created_by], references: [id]) - created_by String - UpdatedBy User @relation("updated_by", fields: [updated_by], references: [id]) - updated_by String + MaintenanceCompany MaintenanceCompany @relation(fields: [maintenance_company_id], references: [id]) + maintenance_company_id String + Vehicle Vehicle @relation(fields: [plate], references: [plate]) + plate String + TypeOfMaintenance TypeOfMaintenance @relation(fields: [maintenance_process_id], references: [id]) + maintenance_process_id String + created_at DateTime @default(now()) + updated_at DateTime @default(now()) + CreatedBy User @relation("created_by", fields: [created_by], references: [id]) + created_by String + UpdatedBy User @relation("updated_by", fields: [updated_by], references: [id]) + updated_by String @@map("maintenance") } diff --git a/src/app.module.ts b/src/app.module.ts index 084e862b..11bd3104 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -21,6 +21,7 @@ import { LegalClientModule } from 'infra/graphql/entities/LegalClientGraphql/Leg import { LegalClientOrderModule } from 'infra/graphql/entities/LegalClientOrderGraphql/LegalClientOrder.module'; import { LegalClientQuoteTableModule } from 'infra/graphql/entities/LegalClientQuoteTableGraphql/LegalClientQuoteTable.module'; import { LegalContractModule } from 'infra/graphql/entities/LegalContractGraphql/LegalContract.module'; +import { MaintenanceCompanyModule } from 'infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.module'; import { OrderProcessingModule } from 'infra/graphql/entities/OrderProcessingGraphql/OrderProcessing.module'; import { OutsourcedDriverModule } from 'infra/graphql/entities/OutsourcedDriverGraphql/OutsourcedDriver.module'; import { OutsourcedTransportCompanyContractModule } from 'infra/graphql/entities/OutsourcedTransportCompanyContractGraphql/OutsourcedTransportCompanyContract.module'; @@ -94,6 +95,7 @@ import { AuthModule } from 'infra/guard/auth.module'; FreightExpenseModule, CtePdfModule, TypeOfMaintenanceModule, + MaintenanceCompanyModule, ], }) export class AppModule {} diff --git a/src/app/dtos/MaintenanceCompanyDto/CreateMaintenanceCompanyDto.ts b/src/app/dtos/MaintenanceCompanyDto/CreateMaintenanceCompanyDto.ts new file mode 100644 index 00000000..f92d0f5b --- /dev/null +++ b/src/app/dtos/MaintenanceCompanyDto/CreateMaintenanceCompanyDto.ts @@ -0,0 +1,13 @@ +import { type CreateLegalPersonDTO } from '../LegalPerson/CreateLegalPersonDto'; + +export abstract class CreateMaintenanceCompanyDTO { + legal_person_id?: string; + + specialty_maintenance: string; + + LegalPerson?: CreateLegalPersonDTO; + + updated_by: string; + + created_by?: string; +} diff --git a/src/app/dtos/MaintenanceCompanyDto/UpdateMaintenanceCompanyDto.ts b/src/app/dtos/MaintenanceCompanyDto/UpdateMaintenanceCompanyDto.ts new file mode 100644 index 00000000..330fe814 --- /dev/null +++ b/src/app/dtos/MaintenanceCompanyDto/UpdateMaintenanceCompanyDto.ts @@ -0,0 +1,9 @@ +import { type UpdateLegalPersonDTO } from '../LegalPerson/UpdateLegalPersonDto'; + +export abstract class UpdateMaintenanceCompanyDTO { + specialty_maintenance?: string; + + LegalPerson: UpdateLegalPersonDTO; + + updated_by?: string; +} diff --git a/src/app/useCases/LegalPersonUseCases/LegalPersonUseCases.ts b/src/app/useCases/LegalPersonUseCases/LegalPersonUseCases.ts index 0dae487e..1081fbaf 100644 --- a/src/app/useCases/LegalPersonUseCases/LegalPersonUseCases.ts +++ b/src/app/useCases/LegalPersonUseCases/LegalPersonUseCases.ts @@ -38,7 +38,7 @@ export class LegalPersonUseCases { state_registration: data?.state_registration, id: data?.id, }); - console.log(data); + console.log(person); if (person) { let errors = ''; @@ -63,7 +63,7 @@ export class LegalPersonUseCases { extensions: { code: HttpStatus.CONFLICT }, }); } - } else if (!person?.id) + } else if (person?.id) throw new GraphQLError('LEGAL PERSON NOT FOUND', { extensions: { code: HttpStatus.NOT_FOUND }, }); diff --git a/src/app/useCases/MaintenanceCompanyUseCases/MaintenanceCompanyUseCase.ts b/src/app/useCases/MaintenanceCompanyUseCases/MaintenanceCompanyUseCase.ts new file mode 100644 index 00000000..d10f7728 --- /dev/null +++ b/src/app/useCases/MaintenanceCompanyUseCases/MaintenanceCompanyUseCase.ts @@ -0,0 +1,92 @@ +import { HttpStatus, Injectable } from '@nestjs/common'; + +import { GraphQLError } from 'graphql'; + +import { type GetMaintenanceCompanyDTO } from 'domain/dto/repositories/getDataDtos/GetMaintenanceCompanyDto'; +import { type FindAllMaintenanceCompanyWhereRequestDTO } from 'domain/dto/repositories/whereDtos/MaintenanceCompanyRepositoryDto'; +import { MaintenanceCompany } from 'domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany'; +import { MaintenanceCompanyRepository } from 'domain/repositories/MaintenanceCompanyRepositoy'; + +import { LegalPersonEntityDto } from 'app/dtos/LegalPerson/LegalPersonEntityDto'; +import { type CreateMaintenanceCompanyDTO } from 'app/dtos/MaintenanceCompanyDto/CreateMaintenanceCompanyDto'; +import { type UpdateMaintenanceCompanyDTO } from 'app/dtos/MaintenanceCompanyDto/UpdateMaintenanceCompanyDto'; + +import { LegalPersonUseCases } from '../LegalPersonUseCases/LegalPersonUseCases'; + +@Injectable() +export class MaintenanceCompanyUseCases { + constructor( + private maintenanceCompanyRepository: MaintenanceCompanyRepository, + private legalPersonUseCase: LegalPersonUseCases, + ) {} + async getMaintenanceCompany(request: GetMaintenanceCompanyDTO) { + if ( + !request.cnpj && + !request.corporateName && + !request.fantasyName && + !request.id && + !request.legalPersonId + ) + throw new GraphQLError( + 'IS NECESSARY IN CNPJ, CORPORATENAME, FANTASYNAME, ID OR LEGALPERSONID', + { extensions: { code: HttpStatus.BAD_REQUEST } }, + ); + const maintenancecompany = + await this.maintenanceCompanyRepository.findMaintenanceCompany(request); + if (maintenancecompany) return maintenancecompany; + + throw new GraphQLError('MaintenanceCompany Not Found', { + extensions: { code: HttpStatus.NOT_FOUND }, + }); + } + + async getAllMaintenanceCompanys( + request: FindAllMaintenanceCompanyWhereRequestDTO, + ) { + const companies = + await this.maintenanceCompanyRepository.getAllMaintenanceCompany(request); + if (companies.length === 0) + throw new GraphQLError('ANY MAINTENANCE COMPANY FOUND', { + extensions: { code: HttpStatus.NOT_FOUND }, + }); + + return companies; + } + + async createMaintenanceCompany(data: CreateMaintenanceCompanyDTO) { + if (data.LegalPerson) + await this.legalPersonUseCase.validatePerson(data.LegalPerson); + const maintenanceCompany = new MaintenanceCompany({ + specialty_maintenance: data.specialty_maintenance, + updated_by: data.updated_by, + created_by: data.created_by, + legal_person_id: data.legal_person_id, + }); + const legalPerson = LegalPersonEntityDto.createEntity(data.LegalPerson); + + return this.maintenanceCompanyRepository.createMaintenanceCompany( + maintenanceCompany, + legalPerson, + data.legal_person_id, + ); + } + + async updateMaintenanceCompany( + id: string, + data: UpdateMaintenanceCompanyDTO, + ) { + const legalPerson = LegalPersonEntityDto.updateEntity(data.LegalPerson); + const maintenanceCompany = new MaintenanceCompany({ + specialty_maintenance: data.specialty_maintenance, + updated_by: data.updated_by, + created_by: null, + legal_person_id: null, + }); + + return this.maintenanceCompanyRepository.updateMaintenanceCompany( + id, + maintenanceCompany, + legalPerson, + ); + } +} diff --git a/src/domain/dto/repositories/getDataDtos/GetMaintenanceCompanyDto.ts b/src/domain/dto/repositories/getDataDtos/GetMaintenanceCompanyDto.ts new file mode 100644 index 00000000..4a2b61d9 --- /dev/null +++ b/src/domain/dto/repositories/getDataDtos/GetMaintenanceCompanyDto.ts @@ -0,0 +1,5 @@ +import { GetLegalPersonDTO } from './GetLegalPersonDto'; + +export abstract class GetMaintenanceCompanyDTO extends GetLegalPersonDTO { + id?: string; +} diff --git a/src/domain/dto/repositories/whereDtos/MaintenceCompanyRepositoryDto.ts b/src/domain/dto/repositories/whereDtos/MaintenanceCompanyRepositoryDto.ts similarity index 87% rename from src/domain/dto/repositories/whereDtos/MaintenceCompanyRepositoryDto.ts rename to src/domain/dto/repositories/whereDtos/MaintenanceCompanyRepositoryDto.ts index 765079a7..861608e6 100644 --- a/src/domain/dto/repositories/whereDtos/MaintenceCompanyRepositoryDto.ts +++ b/src/domain/dto/repositories/whereDtos/MaintenanceCompanyRepositoryDto.ts @@ -6,16 +6,20 @@ export abstract class WhereMaintenanceCompanyTypeDTO extends WhereDTO { id?: StringFilterDTO; specialty_maintenance?: StringFilterDTO; legal_person_id?: StringFilterDTO; - created_at?: DateTimeFilterDTO; updated_at?: DateTimeFilterDTO; + created_at?: DateTimeFilterDTO; + updated_by?: StringFilterDTO; + created_by?: StringFilterDTO; } export abstract class SortByMaintenanceCompanyTypeDTO { id?: 'asc' | 'desc'; specialty_maintenance?: 'asc' | 'desc'; legal_person_id?: 'asc' | 'desc'; - created_at?: 'asc' | 'desc'; updated_at?: 'asc' | 'desc'; + created_at?: 'asc' | 'desc'; + updated_by?: 'asc' | 'desc'; + created_by?: 'asc' | 'desc'; } export class FindAllMaintenanceCompanyWhereRequestDTO { diff --git a/src/domain/dto/repositories/whereDtos/MaintenceRepositoryDto.ts b/src/domain/dto/repositories/whereDtos/MaintenceRepositoryDto.ts deleted file mode 100644 index d6db33a9..00000000 --- a/src/domain/dto/repositories/whereDtos/MaintenceRepositoryDto.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { type DateTimeFilterDTO } from 'domain/shared/dtos/DateTimeFilterDto'; -import { type StringFilterDTO } from 'domain/shared/dtos/StringFilterDto'; -import { WhereDTO } from 'domain/shared/dtos/WhereDto'; - -export abstract class WhereMaintenanceTypeDTO extends WhereDTO { - id?: StringFilterDTO; - maintenance_company_cnpj?: StringFilterDTO; - plate?: StringFilterDTO; - created_at?: DateTimeFilterDTO; - updated_at?: DateTimeFilterDTO; -} - -export abstract class SortByMaintenanceTypeDTO { - id?: 'asc' | 'desc'; - maintenance_company_cnpj?: 'asc' | 'desc'; - plate?: 'asc' | 'desc'; - created_at?: 'asc' | 'desc'; - updated_at?: 'asc' | 'desc'; -} - -export class FindAllMaintenanceWhereRequestDTO { - limit: number; - offset: number; - sort?: SortByMaintenanceTypeDTO; - where?: WhereMaintenanceTypeDTO; -} diff --git a/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.spec.ts b/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.spec.ts index 7ca8ce28..d214863e 100644 --- a/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.spec.ts +++ b/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.spec.ts @@ -8,6 +8,8 @@ describe('MaintenanceCompany', () => { updated_at: new Date(), id: 'sdsd', specialty_maintenance: 'Pneumatica', + created_by: '123', + updated_by: '1313', }); expect(maintenanceCompany).toBeTruthy(); diff --git a/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.ts b/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.ts index d3f36053..f2dc6cd8 100644 --- a/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.ts +++ b/src/domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany.ts @@ -6,12 +6,14 @@ import { Entity } from '../../../shared/entities/Entity'; import { type IValidationField } from '../../../shared/notification/Notification'; import { NotificationError } from '../../../shared/notification/NotificationError'; -interface IMaintenanceCompany { +export interface IMaintenanceCompany { id?: string; - specialty_maintenance: string; + specialty_maintenance?: string; legal_person_id?: string; created_at: Date; updated_at: Date; + created_by: string; + updated_by: string; } export class MaintenanceCompany extends Entity { @@ -97,4 +99,20 @@ export class MaintenanceCompany extends Entity { public get updated_at(): Date { return this.props.updated_at; } + + get updated_by(): string { + return this.props.updated_by; + } + + set updated_by(updated_by: string) { + this.props.updated_by = updated_by; + } + + get created_by(): string { + return this.props.created_by; + } + + set created_by(created_by: string) { + this.props.created_by = created_by; + } } diff --git a/src/domain/repositories/MaintenanceCompanyRepositoy.ts b/src/domain/repositories/MaintenanceCompanyRepositoy.ts new file mode 100644 index 00000000..3b0a10af --- /dev/null +++ b/src/domain/repositories/MaintenanceCompanyRepositoy.ts @@ -0,0 +1,23 @@ +import { type GetMaintenanceCompanyDTO } from 'domain/dto/repositories/getDataDtos/GetMaintenanceCompanyDto'; +import { type FindAllMaintenanceCompanyWhereRequestDTO } from 'domain/dto/repositories/whereDtos/MaintenanceCompanyRepositoryDto'; +import { type LegalPerson } from 'domain/entities/LegalPerson/LegalPerson'; +import { type MaintenanceCompany } from 'domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany'; + +export abstract class MaintenanceCompanyRepository { + abstract findMaintenanceCompany( + request: GetMaintenanceCompanyDTO, + ): Promise; + abstract createMaintenanceCompany( + maintenanceCompany: MaintenanceCompany, + legalPerson: LegalPerson, + idLegalPerson?: string, + ): Promise; + abstract updateMaintenanceCompany( + id: string, + maintenanceCompany?: MaintenanceCompany, + legalPerson?: LegalPerson, + ): Promise; + abstract getAllMaintenanceCompany( + parameters: FindAllMaintenanceCompanyWhereRequestDTO, + ): Promise; +} diff --git a/src/infra/database/prisma/services/MaintenanceCompany.service.ts b/src/infra/database/prisma/services/MaintenanceCompany.service.ts new file mode 100644 index 00000000..5db4c803 --- /dev/null +++ b/src/infra/database/prisma/services/MaintenanceCompany.service.ts @@ -0,0 +1,80 @@ +import { Injectable } from '@nestjs/common'; + +import { type GetMaintenanceCompanyDTO } from 'domain/dto/repositories/getDataDtos/GetMaintenanceCompanyDto'; +import { type FindAllMaintenanceCompanyWhereRequestDTO } from 'domain/dto/repositories/whereDtos/MaintenanceCompanyRepositoryDto'; +import { type LegalPerson } from 'domain/entities/LegalPerson/LegalPerson'; +import { type MaintenanceCompany } from 'domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany'; +import { type MaintenanceCompanyRepository } from 'domain/repositories/MaintenanceCompanyRepositoy'; + +import { PrismaService } from '../prisma.service'; +import { MaintenanceCompanyPrismaDTO } from './prismaDTO/MaintenanceCompanyPrismaDto'; + +@Injectable() +export class MaintenanceCompanyPrismaService + implements MaintenanceCompanyRepository +{ + constructor(private prisma: PrismaService) {} + async findMaintenanceCompany( + request: GetMaintenanceCompanyDTO, + ): Promise { + const maintenanceCompany = await this.prisma.maintenanceCompany.findFirst({ + where: { + OR: [ + { id: request.id }, + { LegalPerson: { fantasy_name: request.fantasyName } }, + { LegalPerson: { corporate_name: request.corporateName } }, + { LegalPerson: { cnpj: request.cnpj } }, + ], + }, + }); + + return MaintenanceCompanyPrismaDTO.PrismaToEntity(maintenanceCompany); + } + async createMaintenanceCompany( + maintenanceCompany: MaintenanceCompany, + legalPerson?: LegalPerson, + idLegalPerson?: string, + ): Promise { + const maintenanceCompanyPrisma = + await this.prisma.maintenanceCompany.create({ + data: MaintenanceCompanyPrismaDTO.EntityToCreatePrisma( + maintenanceCompany, + legalPerson, + idLegalPerson, + ), + }); + + return MaintenanceCompanyPrismaDTO.PrismaToEntity(maintenanceCompanyPrisma); + } + async updateMaintenanceCompany( + id: string, + maintenanceCompany?: MaintenanceCompany, + legalPerson?: LegalPerson, + ): Promise { + const maintenanceCompanyPrisma = + await this.prisma.maintenanceCompany.update({ + data: MaintenanceCompanyPrismaDTO.EntityToPrismaUpdate( + maintenanceCompany, + legalPerson, + ), + where: { id }, + }); + + return MaintenanceCompanyPrismaDTO.PrismaToEntity(maintenanceCompanyPrisma); + } + + async getAllMaintenanceCompany( + parameters: FindAllMaintenanceCompanyWhereRequestDTO, + ): Promise { + const maintenanceCompanys = await this.prisma.maintenanceCompany.findMany({ + take: parameters.limit, + skip: parameters.offset, + where: parameters.where, + orderBy: parameters.sort, + }); + + return maintenanceCompanys.map(maintenanceCompany => + MaintenanceCompanyPrismaDTO.PrismaToEntity(maintenanceCompany), + ); + } +} diff --git a/src/infra/database/prisma/services/legal-person.service.ts b/src/infra/database/prisma/services/legal-person.service.ts index 382c5d2d..c5b9464e 100644 --- a/src/infra/database/prisma/services/legal-person.service.ts +++ b/src/infra/database/prisma/services/legal-person.service.ts @@ -26,6 +26,7 @@ export class LegalPersonPrismaService implements LegalPersonRepository { ], }, }); + console.log(request); return LegalPersonPrismaDTO.PrismaToEntity(legalPersonPrisma); } diff --git a/src/infra/database/prisma/services/prismaDTO/MaintenanceCompanyPrismaDto.ts b/src/infra/database/prisma/services/prismaDTO/MaintenanceCompanyPrismaDto.ts new file mode 100644 index 00000000..662c84cd --- /dev/null +++ b/src/infra/database/prisma/services/prismaDTO/MaintenanceCompanyPrismaDto.ts @@ -0,0 +1,81 @@ +import { + type Prisma, + type MaintenanceCompany as MaintenanceCompanyPrisma, +} from '@prisma/client'; + +import { type LegalPerson } from 'domain/entities/LegalPerson/LegalPerson'; +import { MaintenanceCompany } from 'domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany'; + +import { LegalPersonPrismaDTO } from './LegalPersonPrismaDto'; + +export class MaintenanceCompanyPrismaDTO { + public static PrismaToEntity( + maintenancecompanyPrisma: MaintenanceCompanyPrisma, + ) { + if (!maintenancecompanyPrisma) return null; + + return new MaintenanceCompany({ + id: maintenancecompanyPrisma.id, + specialty_maintenance: maintenancecompanyPrisma.specialty_maintenance, + legal_person_id: maintenancecompanyPrisma.legal_person_id, + updated_by: maintenancecompanyPrisma.updated_by, + created_by: maintenancecompanyPrisma.created_by, + }); + } + public static EntityToCreatePrisma( + maintenanceCompany: MaintenanceCompany, + legalPerson?: LegalPerson, + idLegalPerson?: string, + ) { + if (idLegalPerson) { + return this.createMaintenanceCompanyWithLegalPersonExist( + maintenanceCompany, + idLegalPerson, + ); + } + + const maintenanceCompanyPrisma: Prisma.MaintenanceCompanyCreateInput = { + specialty_maintenance: maintenanceCompany.specialty_maintenance, + CreatedBy: { connect: { id: maintenanceCompany.created_by } }, + UpdatedBy: { connect: { id: maintenanceCompany.created_by } }, + LegalPerson: legalPerson + ? { + create: LegalPersonPrismaDTO.EntityToCreatePrisma(legalPerson), + } + : undefined, + }; + + return maintenanceCompanyPrisma; + } + + public static EntityToPrismaUpdate( + maintenancecompany?: MaintenanceCompany, + legalPerson?: LegalPerson, + ) { + const maintenancecompanyUptade: Prisma.MaintenanceCompanyUpdateInput = { + specialty_maintenance: maintenancecompany.specialty_maintenance, + UpdatedBy: { connect: { id: maintenancecompany.updated_by } }, + LegalPerson: { + update: legalPerson + ? LegalPersonPrismaDTO.EntityToPrismaUpdate(legalPerson) + : undefined, + }, + }; + + return maintenancecompanyUptade; + } + + private static createMaintenanceCompanyWithLegalPersonExist( + maintenanceCompany: MaintenanceCompany, + legalPersonId: string, + ) { + const createMaintenanceCompany: Prisma.MaintenanceCompanyCreateInput = { + specialty_maintenance: maintenanceCompany.specialty_maintenance, + CreatedBy: { connect: { id: maintenanceCompany.created_by } }, + UpdatedBy: { connect: { id: maintenanceCompany.updated_by } }, + LegalPerson: { connect: { id: legalPersonId } }, + }; + + return createMaintenanceCompany; + } +} diff --git a/src/infra/graphql/entities/MaintenanceCompanyGraphql/Args/GetMaintenanceCompanyArgs.ts b/src/infra/graphql/entities/MaintenanceCompanyGraphql/Args/GetMaintenanceCompanyArgs.ts new file mode 100644 index 00000000..82830595 --- /dev/null +++ b/src/infra/graphql/entities/MaintenanceCompanyGraphql/Args/GetMaintenanceCompanyArgs.ts @@ -0,0 +1,9 @@ +import { ArgsType, Field } from '@nestjs/graphql'; + +import { GetLegalPersonArgs } from '../../LegalPersonGraphql/Args/GetLegalPersonArgs'; + +@ArgsType() +export class GetMaintenanceCompanyArgs extends GetLegalPersonArgs { + @Field({ nullable: true }) + id?: string; +} diff --git a/src/infra/graphql/entities/MaintenanceCompanyGraphql/Args/WhereMaintenanceCompanyArgs.ts b/src/infra/graphql/entities/MaintenanceCompanyGraphql/Args/WhereMaintenanceCompanyArgs.ts new file mode 100644 index 00000000..98113f2f --- /dev/null +++ b/src/infra/graphql/entities/MaintenanceCompanyGraphql/Args/WhereMaintenanceCompanyArgs.ts @@ -0,0 +1,33 @@ +import { ArgsType, Field, Int } from '@nestjs/graphql'; + +import { Type } from 'class-transformer'; +import { Max, Min, IsOptional } from 'class-validator'; + +import { MaintenanceCompanyOrderByWithRelationInput } from 'infra/graphql/prisma-generated/maintenance-company/maintenance-company-order-by-with-relation.input'; +import { MaintenanceCompanyWhereInput } from 'infra/graphql/prisma-generated/maintenance-company/maintenance-company-where.input'; + +@ArgsType() +export class MaintenanceCompanyWhereArgs { + @Field(() => Int, { defaultValue: 0 }) + @IsOptional() + @Min(0) + offset = 0; + + @Field(() => Int, { defaultValue: 25 }) + @IsOptional() + @Min(1) + @Max(50) + limit = 25; + + @Field(() => MaintenanceCompanyWhereInput, { nullable: true }) + @Type(() => MaintenanceCompanyWhereInput) + @IsOptional() + where?: MaintenanceCompanyWhereInput; + + @Field(() => MaintenanceCompanyOrderByWithRelationInput, { + nullable: true, + }) + @Type(() => MaintenanceCompanyOrderByWithRelationInput) + @IsOptional() + sort?: MaintenanceCompanyOrderByWithRelationInput; +} diff --git a/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.input.ts b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.input.ts new file mode 100644 index 00000000..d3c0dc4f --- /dev/null +++ b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.input.ts @@ -0,0 +1,47 @@ +import { + Field, + HideField, + InputType, + OmitType, + PartialType, +} from '@nestjs/graphql'; + +import { Allow, IsObject, IsOptional, IsString } from 'class-validator'; + +import { type IMaintenanceCompany } from 'domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany'; + +import { + LegalPersonUpdateInput, + LegalPersonInput, +} from '../LegalPersonGraphql/LegalPerson.input'; + +@InputType() +export class MaintenanceCompanyInput + implements Omit +{ + @Field({ nullable: true }) + @IsString() + @IsOptional() + legal_person_id?: string; + @Field({ nullable: true }) + @IsString() + @IsOptional() + specialty_maintenance: string; + @Field(() => LegalPersonInput, { nullable: true }) + @IsObject() + @IsOptional() + LegalPerson?: LegalPersonInput; + @HideField() + @Allow() + updated_by: string; + @HideField() + @Allow() + created_by: string; +} +@InputType() +export class MaintenanceCompanyUpdateInput extends PartialType( + OmitType(MaintenanceCompanyInput, ['LegalPerson', 'legal_person_id']), +) { + @Field(() => LegalPersonUpdateInput) + LegalPerson: LegalPersonUpdateInput; +} diff --git a/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.model.ts b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.model.ts new file mode 100644 index 00000000..b5c98c46 --- /dev/null +++ b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.model.ts @@ -0,0 +1,35 @@ +import { Field, ObjectType, PartialType } from '@nestjs/graphql'; + +import { type IMaintenanceCompany } from 'domain/entities/MaintenceEntities/MaintenanceCompany/MaintenanceCompany'; + +import { LegalPersonModel } from '../LegalPersonGraphql/LegalPerson.model'; +import { UserModelRefereces } from '../UserGraphql/user.model'; + +@ObjectType() +export class MaintenanceCompanyModel implements IMaintenanceCompany { + @Field() + id?: string; + @Field({ nullable: true }) + specialty_maintenance: string; + @Field() + legal_person_id: string; + @Field(() => LegalPersonModel) + LegalPerson: LegalPersonModel; + + @Field(() => Date) + updated_at: Date; + @Field(() => Date) + created_at: Date; + @Field() + created_by: string; + @Field() + updated_by: string; + @Field(() => UserModelRefereces) + CreatedUser: UserModelRefereces; + @Field(() => UserModelRefereces) + UpdatedUser: UserModelRefereces; +} +@ObjectType() +export class MaintenanceCompanyModelRefereces extends PartialType( + MaintenanceCompanyModel, +) {} diff --git a/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.module.ts b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.module.ts new file mode 100644 index 00000000..32aea0a6 --- /dev/null +++ b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.module.ts @@ -0,0 +1,25 @@ +import { Module } from '@nestjs/common'; + +import { MaintenanceCompanyRepository } from 'domain/repositories/MaintenanceCompanyRepositoy'; + +import { MaintenanceCompanyUseCases } from 'app/useCases/MaintenanceCompanyUseCases/MaintenanceCompanyUseCase'; + +import { MaintenanceCompanyPrismaService } from 'infra/database/prisma/services/MaintenanceCompany.service'; + +import { GraphqlCenterModule } from '../GraphqlCenter.module'; +import { LegalPersonModule } from '../LegalPersonGraphql/LegalPerson.module'; +import { MaintenanceCompanyResolver } from './MaintenanceCompany.resolver'; + +@Module({ + imports: [GraphqlCenterModule, LegalPersonModule], + providers: [ + { + provide: MaintenanceCompanyRepository, + useClass: MaintenanceCompanyPrismaService, + }, + MaintenanceCompanyUseCases, + MaintenanceCompanyResolver, + ], + exports: [MaintenanceCompanyUseCases], +}) +export class MaintenanceCompanyModule {} diff --git a/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.resolver.ts b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.resolver.ts new file mode 100644 index 00000000..d28b5a0f --- /dev/null +++ b/src/infra/graphql/entities/MaintenanceCompanyGraphql/MaintenanceCompany.resolver.ts @@ -0,0 +1,115 @@ +import { UseGuards, UseInterceptors } from '@nestjs/common'; +import { + Resolver, + Args, + Mutation, + ResolveField, + Parent, + Query, +} from '@nestjs/graphql'; + +import { ROLE, User } from 'domain/entities/User/User'; + +import { LegalPersonUseCases } from 'app/useCases/LegalPersonUseCases/LegalPersonUseCases'; +import { MaintenanceCompanyUseCases } from 'app/useCases/MaintenanceCompanyUseCases/MaintenanceCompanyUseCase'; +import { UserUseCases } from 'app/useCases/user/UserCases'; + +import { GetMaintenanceCompanyArgs } from 'infra/graphql/entities/MaintenanceCompanyGraphql/Args/GetMaintenanceCompanyArgs'; +import { MaintenanceCompanyWhereArgs } from 'infra/graphql/entities/MaintenanceCompanyGraphql/Args/WhereMaintenanceCompanyArgs'; +import { AcessAllowed } from 'infra/graphql/utilities/decorators/AcessAllowed'; +import { CurrentUser } from 'infra/graphql/utilities/decorators/CurrentUser'; +import { RoleInterceptor } from 'infra/graphql/utilities/interceptors/RoleInterceptor'; +import { GraphQLAuthGuard } from 'infra/guard/GraphQlAuthGuard'; + +import { LegalPersonModel } from '../LegalPersonGraphql/LegalPerson.model'; +import { UserModelRefereces } from '../UserGraphql/user.model'; +import { + MaintenanceCompanyInput, + MaintenanceCompanyUpdateInput, +} from './MaintenanceCompany.input'; +import { MaintenanceCompanyModel } from './MaintenanceCompany.model'; + +@UseGuards(GraphQLAuthGuard) +@UseInterceptors(RoleInterceptor) +@AcessAllowed(ROLE.USER) +@Resolver(() => MaintenanceCompanyModel) +export class MaintenanceCompanyResolver { + constructor( + private maintenanceCompanyUseCase: MaintenanceCompanyUseCases, + private userCase: UserUseCases, + private legalPersonUseCase: LegalPersonUseCases, + ) {} + @Query(() => MaintenanceCompanyModel) + async getMaintenanceCompanyModel( + @Args() maintenanceCompanySearch: GetMaintenanceCompanyArgs, + ) { + return await this.maintenanceCompanyUseCase.getMaintenanceCompany( + maintenanceCompanySearch, + ); + } + @Query(() => [MaintenanceCompanyModel], { nullable: true }) + async getAllMaintenanceCompany(@Args() args: MaintenanceCompanyWhereArgs) { + const maintenancecompany = + await this.maintenanceCompanyUseCase.getAllMaintenanceCompanys({ + limit: args.limit, + offset: args.offset, + sort: args.sort, + where: args.where, + }); + + return maintenancecompany.length > 0 ? maintenancecompany : null; + } + @Mutation(() => MaintenanceCompanyModel) + async createMaintenanceCompany( + @Args('maintenancecompanyInput') + maintenancecompanyInput: MaintenanceCompanyInput, + @CurrentUser() user: User, + ) { + maintenancecompanyInput.created_by = user.id; + maintenancecompanyInput.updated_by = user.id; + + return await this.maintenanceCompanyUseCase.createMaintenanceCompany( + maintenancecompanyInput, + ); + } + @Mutation(() => MaintenanceCompanyModel) + async updateMaintenanceCompany( + @Args('id') id: string, + @Args('maintenancecompanyInput') + maintenancecompanyInput: MaintenanceCompanyUpdateInput, + @CurrentUser() user: User, + ) { + maintenancecompanyInput.updated_by = user.id; + + return await this.maintenanceCompanyUseCase.updateMaintenanceCompany( + id, + maintenancecompanyInput, + ); + } + @ResolveField(() => LegalPersonModel) + async LegalPerson( + @Parent() + maintenanceCompany: MaintenanceCompanyInput, + ) { + const { legal_person_id: legalPersonID } = maintenanceCompany; + console.log(legalPersonID); + const legalPerson = await this.legalPersonUseCase.getLegalPerson({ + legalPersonId: legalPersonID, + }); + + return legalPerson; + } + + @ResolveField(() => UserModelRefereces) + async CreatedUser(@Parent() user: MaintenanceCompanyInput) { + const { created_by: createdBy } = user; + + return await this.userCase.getUser({ id: createdBy }); + } + @ResolveField(() => UserModelRefereces) + async UpdatedUser(@Parent() user: MaintenanceCompanyInput) { + const { updated_by: updatedBy } = user; + + return await this.userCase.getUser({ id: updatedBy }); + } +} diff --git a/src/infra/graphql/generated/schema.gql b/src/infra/graphql/generated/schema.gql index a031a4ab..1ea2eb63 100644 --- a/src/infra/graphql/generated/schema.gql +++ b/src/infra/graphql/generated/schema.gql @@ -1138,12 +1138,31 @@ input LegalPersonWhereInput { updated_at: DateTimeFilter } +input MaintenanceCompanyInput { + LegalPerson: LegalPersonInput + legal_person_id: String + specialty_maintenance: String +} + input MaintenanceCompanyListRelationFilter { every: MaintenanceCompanyWhereInput none: MaintenanceCompanyWhereInput some: MaintenanceCompanyWhereInput } +type MaintenanceCompanyModel { + CreatedUser: UserModelRefereces! + LegalPerson: LegalPersonModel! + UpdatedUser: UserModelRefereces! + created_at: Timestamp! + created_by: String! + id: String! + legal_person_id: String! + specialty_maintenance: String + updated_at: Timestamp! + updated_by: String! +} + input MaintenanceCompanyOrderByRelationAggregateInput { _count: SortOrder } @@ -1153,15 +1172,20 @@ input MaintenanceCompanyOrderByWithRelationInput { LegalPerson: LegalPersonOrderByWithRelationInput Maintenance: MaintenanceOrderByRelationAggregateInput UpdatedBy: UserOrderByWithRelationInput - cnpj: SortOrder created_at: SortOrder created_by: SortOrder id: SortOrder + legal_person_id: SortOrder specialty_maintenance: SortOrder updated_at: SortOrder updated_by: SortOrder } +input MaintenanceCompanyUpdateInput { + LegalPerson: LegalPersonUpdateInput! + specialty_maintenance: String +} + input MaintenanceCompanyWhereInput { AND: [MaintenanceCompanyWhereInput!] CreatedBy: UserWhereInput @@ -1170,11 +1194,11 @@ input MaintenanceCompanyWhereInput { NOT: [MaintenanceCompanyWhereInput!] OR: [MaintenanceCompanyWhereInput!] UpdatedBy: UserWhereInput - cnpj: StringFilter created_at: DateTimeFilter created_by: StringFilter id: StringFilter - specialty_maintenance: StringFilter + legal_person_id: StringFilter + specialty_maintenance: StringNullableFilter updated_at: DateTimeFilter updated_by: StringFilter } @@ -1201,7 +1225,7 @@ input MaintenanceWhereInput { created_at: DateTimeFilter created_by: StringFilter id: StringFilter - maintenance_company_cnpj: StringFilter + maintenance_company_id: StringFilter maintenance_process_id: StringFilter plate: StringFilter updated_at: DateTimeFilter @@ -1221,6 +1245,7 @@ type Mutation { createLegalClientOrder(legalClientOrderInput: LegalClientOrderInput!): LegalClientOrderModel! createLegalClientQuoteTable(legalClientQuoteTableInput: LegalClientQuoteTableInput!): LegalClientQuoteTableModel! createLegalContract(legalContractInput: LegalContractInput!): LegalContractModel! + createMaintenanceCompany(maintenancecompanyInput: MaintenanceCompanyInput!): MaintenanceCompanyModel! createOrderProcessing(data: OrderProcessingInput!): OrderProcessingModel! createOutsourcedDriver(outsourcedDriver: OutsourcedDriverInput!): OutsourcedDriverModel! createOutsourcedTransportCompany(outsourcedTransportCompanyInput: OutsourcedTransportCompanyInput!): OutsourcedTransportCompanyModel! @@ -1249,6 +1274,7 @@ type Mutation { updateIcms(id: String!, invoiceForLegalClientInput: IcmsUpdateInput!): IcmsModel! updateLegalClientCte(id: String!, ownDriverUpdate: LegalClientCteUpdateInput!): LegalClientCteModel! updateLegalClientQuoteTable(id: String!, legalClientQuoteTableUpdate: LegalClientQuoteTableUpdate!): LegalClientQuoteTableModel! + updateMaintenanceCompany(id: String!, maintenancecompanyInput: MaintenanceCompanyUpdateInput!): MaintenanceCompanyModel! updateOrderProcessing(data: OrderProcessingUpdateInput!, id: String!): OrderProcessingModel! updateOutsourcedDriver(id: String!, outsourcedDriver: OutsourcedDriverUpdateInput!): OutsourcedDriverModel! updateOwnDriver(id: String!, ownDriverUpdate: OwnDriverUpdate!): OwnDriverModel! @@ -2428,6 +2454,7 @@ type Query { getAllLegalClientOrder(limit: Int! = 25, offset: Int! = 0, sort: LegalClientOrderOrderByWithRelationInput, where: LegalClientOrderWhereInput): [LegalClientOrderModel!] getAllLegalClientQuoteTable(limit: Int! = 25, offset: Int! = 0, sort: LegalClientQuoteTableOrderByWithRelationInput, where: LegalClientQuoteTableWhereInput): [LegalClientQuoteTableModel!]! getAllLegalContract(limit: Int! = 25, offset: Int! = 0, sort: LegalContractOrderByWithRelationInput, where: LegalContractWhereInput): [LegalContractModel!] + getAllMaintenanceCompany(limit: Int! = 25, offset: Int! = 0, sort: MaintenanceCompanyOrderByWithRelationInput, where: MaintenanceCompanyWhereInput): [MaintenanceCompanyModel!] getAllOrderProcessing(limit: Int! = 25, offset: Int! = 0, sort: OrderProcessingOrderByWithRelationInput, where: OrderProcessingWhereInput): [OrderProcessingModel!]! getAllOutsourcedDriver(limit: Int! = 25, offset: Int! = 0, sort: OutsourcedDriverOrderByWithRelationInput, where: OutsourcedDriverWhereInput): [OutsourcedDriverModel!]! getAllOutsourcedTransportCompany(limit: Int! = 25, offset: Int! = 0, sort: OutsourcedTransportCompanyOrderByWithRelationInput, where: OutsourcedTransportCompanyWhereInput): [OutsourcedTransportCompanyModel!] @@ -2458,6 +2485,7 @@ type Query { getLegalClientOrderModel(id: String, order: String): LegalClientOrderModel getLegalClientQuoteTable(cod_quote: String, id: String): LegalClientQuoteTableModel getLegalContractModel(contractNumber: String, id: String): LegalContractModel! + getMaintenanceCompanyModel(cnpj: String, corporateName: String, fantasyName: String, id: String, legalPersonId: String): MaintenanceCompanyModel! getOutsourcedDriver(cnh: String, cpf: String, id: String, naturalPersonId: String, rg: String): OutsourcedDriverModel! getOutsourcedTransportCompanyContractModel(contractNumber: String, id: String): OutsourcedTransportCompanyContractModel getOutsourcedTransportCompanyDriverModel(cnh: String, cpf: String, id: String, naturalPersonId: String, rg: String): OutsourcedTransportCompanyDriverModel!