Repository: US-EPA-CAMD/easey-camd-services
Pull request #346: fix/6622-Create-List-of-Submissions-Report
Author: login: Jhernandez29
Created: 2025-03-11T16:57:33Z | Merged: 2025-04-18T19:05:57Z

Ticket number:
https://github.com/US-EPA-CAMD/easey-ui/issues/6622
Changes:
Created a new module, controller, service, and repository. 
I created a new params dto, a submission list dto, and an entity for the view table. 



Diff:
diff --git a/src/app.module.ts b/src/app.module.ts
index 065ee27a..7f56486f 100644
--- a/src/app.module.ts
+++ b/src/app.module.ts
@@ -38,6 +38,7 @@ import { EmSubmissionAccessModule } from './em-submission-access/em-submission-a
 import { SubmissionModule } from './submission/submission.module';
 import { MatsFileUploadModule } from './mats-file-upload/mats-file-upload.module';
 import { CopyOfRecordModule } from './copy-of-record/copy-of-record.module';
+import { SubmissionReportModule } from './submission-report/submission-report.module';
 
 @Module({
   imports: [
@@ -58,6 +59,7 @@ import { CopyOfRecordModule } from './copy-of-record/copy-of-record.module';
     ReportWorkspaceModule,
     MailModule,
     ErrorSuppressionsModule,
+    SubmissionReportModule,
     EvaluationModule,
     AdminModule,
     QaTestExtensionExemptionModule,
diff --git a/src/dto/submission-report-params.dto.ts b/src/dto/submission-report-params.dto.ts
new file mode 100644
index 00000000..cfcdbf0c
--- /dev/null
+++ b/src/dto/submission-report-params.dto.ts
@@ -0,0 +1,107 @@
+import { ApiProperty } from '@nestjs/swagger';
+import { Type } from 'class-transformer';
+import {
+  IsOptional,
+  IsString,
+  ValidationArguments,
+  IsEnum
+} from 'class-validator';
+
+import { IsValidCode, IsInRange } from '@us-epa-camd/easey-common/pipes';
+import { SeverityCodes } from '../enums/severity-codes.enum';
+import { SeverityCode } from '../entities/severity-code.entity';
+import { CheckCatalogService } from '@us-epa-camd/easey-common/check-catalog';
+import { IsDateHrQtrFormat } from '../pipes/is-date-hr-qtr-format.pipe';
+import { FindOneOptions } from 'typeorm/find-options/FindOneOptions';
+import { Plant } from '../entities/plant.entity';
+import { currentDateTime } from '@us-epa-camd/easey-common/utilities/functions';
+import { SubmissionTypeCodes } from '../enums/submission-code.enum';
+const msgA =
+  'The [property] is not valid refer to the list of available [property]s for valid values';
+const msgB = `Ensure [property] are in the following formats Date Range - YYYY-mm-dd /Hour Range- YYYY-mm-dd hh/Quarter Range – YYYY Q1/Q2/Q3/Q4`;
+
+export class SubmissionReportParamsDTO {
+ @ApiProperty()
+ @IsOptional()
+ @IsValidCode(Plant, {
+    message: (args: ValidationArguments) => {
+    return `The ${args.property} is not valid. Refer to the list of available facilityRecordIds for valid values '/facilities-mgmt/facilities'`;
+  },
+ },(args: ValidationArguments): FindOneOptions<Plant> => {
+     return {
+      where: {
+         orisCode: args.value,
+        },
+    };
+  })
+@Type(() => Number)
+orisCode?: number;
+
+@IsOptional()
+@ApiProperty()
+@IsInRange(1930, currentDateTime().getFullYear(), {
+    message: () => {
+    return `Ensure the year value is in the range from 1930 to ${currentDateTime().getFullYear()}`;
+    },
+})
+@Type(() => Number)
+year?: number;
+  
+@IsOptional()
+@ApiProperty()
+@IsInRange(1, 4, {
+     message: () => {
+      return `Ensure that the Quarter value is a number from 1 to 4.`;
+    },
+})
+@Type(() => Number)
+quarter?: number;
+
+@IsOptional()
+@ApiProperty({ enum: SeverityCodes })
+@IsString()
+@IsValidCode(SeverityCode, {
+   message: (args: ValidationArguments) => {
+    return CheckCatalogService.formatMessage(msgA, {
+      property: args.property,
+      value: args.value,
+    });
+ },
+})
+severityCode?: string;
+
+
+@IsOptional()
+@ApiProperty({ enum: SubmissionTypeCodes })
+@IsString()
+@IsEnum(SubmissionTypeCodes, {
+    message: () => {
+      return `The status must have a value of EM, MP, QA, or MATS`;
+    },
+  })
+submissionType?: string;
+
+@IsOptional()
+@ApiProperty()
+@IsString()
+@IsDateHrQtrFormat({
+ message: (args: ValidationArguments) => {
+    return CheckCatalogService.formatMessage(msgB, {
+     property: args.property,
+    });
+ },
+})
+submissionFrom?: string;
+
+@IsOptional()
+@ApiProperty()
+@IsString()
+@IsDateHrQtrFormat({
+ message: (args: ValidationArguments) => {
+    return CheckCatalogService.formatMessage(msgB, {
+      property: args.property,
+      });
+    },
+})
+submissionTo?: string;
+}
diff --git a/src/dto/submission-report.dto.ts b/src/dto/submission-report.dto.ts
new file mode 100644
index 00000000..0f60e25e
--- /dev/null
+++ b/src/dto/submission-report.dto.ts
@@ -0,0 +1,84 @@
+import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsDate,
+  IsNumber,
+  IsString,
+} from 'class-validator';
+
+export class SubmissionReportDTO {
+  @ApiProperty()
+  @IsNumber()
+  orisCode: number;
+
+  @ApiProperty()
+  @IsString()
+  facilityName: string;
+
+  @ApiProperty()
+  @IsString()
+  state: string;
+
+  @ApiProperty()
+  @IsString()
+  locations: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingPeriodAbbreviation: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingFrequencyCode: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionTypeCode: string;
+
+  @ApiProperty()
+  @IsNumber()
+  submissionId: number;
+
+  @ApiProperty()
+  @IsDate()
+  submissionDateTime: Date;
+
+  @ApiProperty()
+  @IsString()
+  severityLevel: string; 
+
+  @ApiProperty()
+  @IsString()
+  mostRecent: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionStatus: string;
+
+  @ApiProperty()
+  @IsString()
+  severityCode: string;
+
+  @ApiProperty()
+  @IsString()
+  criticalErrLevelOne: string;
+
+  @ApiProperty()
+  @IsString()
+  criticalErrLevelTwo: string;
+
+  @ApiProperty()
+  @IsString()
+  nonCritical: string;
+
+  @ApiProperty()
+  @IsString()
+  infoMessage: string;
+
+  @ApiProperty()
+  @IsString()
+  adminOverride: string;
+
+  @ApiProperty()
+  @IsString()
+  submitter: string;
+}
diff --git a/src/entities/submission-list-vw.entity.ts b/src/entities/submission-list-vw.entity.ts
new file mode 100644
index 00000000..3dc9e4ff
--- /dev/null
+++ b/src/entities/submission-list-vw.entity.ts
@@ -0,0 +1,116 @@
+import { NumericColumnTransformer } from '@us-epa-camd/easey-common/transforms';
+import { BaseEntity, Column, ViewEntity } from 'typeorm';
+
+@ViewEntity({ name: 'camdecmpsaux.vw_submission_list' })
+export class SubmissionListView extends BaseEntity {
+
+  @Column({
+    name: 'oris_code',
+    transformer: new NumericColumnTransformer(),
+  })
+  orisCode: number;
+
+  @Column({
+     name: 'facility_name',
+   })
+  facilityName: string;
+
+  @Column({
+    name: 'state',
+  })
+  state: string;
+
+  @Column({
+    name: 'locations',
+  })
+  locations: string;
+
+  @Column({
+    name: 'reporting_period',
+  })
+  reportingPeriod: string;
+
+  @Column({
+    name: 'reporting_frequency',
+  })
+  reportingFrequencyCode: string;
+
+  @Column({
+    name: 'process_cd',
+  })
+  submissionTypeCode: string;
+
+  @Column({
+    name: 'submission_id',
+    transformer: new NumericColumnTransformer(),
+  })
+  submissionId: number;
+
+  @Column({
+    name: 'queued_time',
+    type: 'date',
+  })
+  submissionDateTime: Date;
+
+  @Column({
+    name: 'severity_level',
+  })
+  severityLevel: string; 
+
+  @Column({
+    name: 'most_recent',
+  })
+  mostRecent: string;
+
+  @Column({
+    name: 'submission_status',
+  })
+  submissionStatus: string;
+
+  @Column({
+    name: 'severity_cd',
+  })
+  severityCode: string;
+
+  @Column({
+    name: 'severity_critical_1',
+  })
+  criticalErrLevelOne: string;
+
+  @Column({
+    name: 'severity_critical_2',
+  })
+  criticalErrLevelTwo: string;
+
+  @Column({
+    name: 'severity_non_critical',
+  })
+  nonCritical: string;
+
+  @Column({
+    name: 'severity_informational',
+  })
+  infoMessage: string;
+
+  @Column({
+    name: 'severity_administrative_override',
+  })
+  adminOverride: string;
+
+  @Column({
+    name: 'submitter',
+  })
+  submitter: string;
+
+  @Column({
+    name: 'mon_plan_id',
+    transformer: new NumericColumnTransformer(),
+  })
+  monitorPlanId: number;
+
+  @Column({
+    name: 'rpt_period_id',
+    transformer: new NumericColumnTransformer(),
+  })
+  reportingPeriodId: number;
+}
diff --git a/src/enums/submission-code.enum.ts b/src/enums/submission-code.enum.ts
new file mode 100644
index 00000000..0719e3f3
--- /dev/null
+++ b/src/enums/submission-code.enum.ts
@@ -0,0 +1,7 @@
+export enum SubmissionTypeCodes {
+    EM,
+    MP,
+    QA,
+    MATS
+  }
+  
\ No newline at end of file
diff --git a/src/maps/submission-list.map.ts b/src/maps/submission-list.map.ts
new file mode 100644
index 00000000..55dc8a54
--- /dev/null
+++ b/src/maps/submission-list.map.ts
@@ -0,0 +1,37 @@
+import { Injectable } from '@nestjs/common';
+import { BaseMap } from '@us-epa-camd/easey-common/maps';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionListView } from 'src/entities/submission-list-vw.entity';
+
+@Injectable()
+export class SubmissionListMap extends BaseMap<
+SubmissionListView,
+SubmissionReportDTO
+> {
+  public async one(
+    entity: SubmissionListView,
+  ): Promise<SubmissionReportDTO> {
+    
+    return {
+        orisCode :  entity?.orisCode,
+        facilityName :  entity?.facilityName,
+        state :  entity?.state,
+        locations :  entity?.locations,
+        reportingPeriodAbbreviation :  entity?.reportingPeriod,
+        reportingFrequencyCode :  entity?.reportingFrequencyCode,
+        submissionTypeCode :  entity?.submissionTypeCode,
+        submissionId :  entity?.submissionId,
+        submissionDateTime :  entity?.submissionDateTime,
+        severityLevel :  entity?.severityLevel,
+        mostRecent :  entity?.mostRecent,
+        submissionStatus :  entity?.submissionStatus,
+        severityCode :  entity?.severityCode,
+        criticalErrLevelOne :  entity?.criticalErrLevelOne,
+        criticalErrLevelTwo :  entity?.criticalErrLevelTwo,
+        nonCritical :  entity?.nonCritical,
+        infoMessage :  entity?.infoMessage,
+        adminOverride :  entity?.adminOverride,
+        submitter :  entity?.submitter
+    };
+  }
+}
diff --git a/src/routes.ts b/src/routes.ts
index ebcb7beb..582665c8 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -5,6 +5,7 @@ import { ReportModule } from './report/report.module';
 import { ReportWorkspaceModule } from './report-workspace/report.module';
 import { MailModule } from './mail/mail.module';
 import { ErrorSuppressionsModule } from './error-suppressions/error-suppressions.module';
+import { SubmissionReportModule } from './submission-report/submission-report.module';
 import { AdminModule } from './admin/admin.module';
 import { QaMaintenanceModule } from './qa-maintenance/qa-maintenance.module';
 import { QaTestSummaryModule } from './qa-test-summary/qa-test-summary.module';
@@ -77,6 +78,10 @@ const routes = [
         path: '/error-suppressions',
         module: ErrorSuppressionsModule,
       },
+      {
+        path: '/submission-report',
+        module: SubmissionReportModule,
+      },
     ],
   },
 ];
diff --git a/src/submission-report/submission-report-view.repository.spec.ts b/src/submission-report/submission-report-view.repository.spec.ts
new file mode 100644
index 00000000..554bfb9d
--- /dev/null
+++ b/src/submission-report/submission-report-view.repository.spec.ts
@@ -0,0 +1,49 @@
+import { Test } from '@nestjs/testing';
+import { EntityManager, SelectQueryBuilder } from 'typeorm';
+
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+import { SubmissionListViewRepository } from './submission-report-view.repository';
+
+const mockQueryBuilder = () => ({
+  andWhere: jest.fn(),
+  getMany: jest.fn(),
+  select: jest.fn(),
+});
+
+let filters = new SubmissionReportParamsDTO();
+
+describe('SubmissionListViewRepository', () => {
+  let repository: SubmissionListViewRepository;
+  let queryBuilder: any;
+
+  beforeEach(async () => {
+    const module = await Test.createTestingModule({
+      providers: [
+        SubmissionListViewRepository,
+        EntityManager,
+        {
+          provide: SelectQueryBuilder,
+          useFactory: mockQueryBuilder,
+        },
+      ],
+    }).compile();
+
+    repository = module.get(SubmissionListViewRepository);
+    queryBuilder = module.get(SelectQueryBuilder);
+
+    queryBuilder.select.mockReturnValue(queryBuilder);
+    queryBuilder.andWhere.mockReturnValue(queryBuilder);
+    queryBuilder.getMany.mockReturnValue('mockResults');
+
+    repository.createQueryBuilder = jest.fn().mockReturnValue(queryBuilder);
+  });
+
+  describe('getSubmissionReportList', () => {
+    it('gets all submission report list data from the repository', async () => {
+      const result = await repository.getSubmissionReportList(filters);
+
+      expect(queryBuilder.getMany).toHaveBeenCalled();
+      expect(result).toEqual('mockResults');
+    });
+  });
+});
diff --git a/src/submission-report/submission-report-view.repository.ts b/src/submission-report/submission-report-view.repository.ts
new file mode 100644
index 00000000..a82856d7
--- /dev/null
+++ b/src/submission-report/submission-report-view.repository.ts
@@ -0,0 +1,92 @@
+import { Injectable } from '@nestjs/common';
+import { EntityManager, Repository } from 'typeorm';
+
+import { SubmissionListView } from '../entities/submission-list-vw.entity';
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+
+@Injectable()
+export class SubmissionListViewRepository extends Repository<SubmissionListView> {
+  constructor(entityManager: EntityManager) {
+    super(SubmissionListView, entityManager);
+  }
+
+  async getSubmissionReportList(
+    params: SubmissionReportParamsDTO,
+  ): Promise<SubmissionListView[]> {
+    const {
+      orisCode,
+      year,
+      quarter,
+      severityCode,
+      submissionType,
+      submissionFrom,
+      submissionTo
+    } = params;
+    let query = this.createQueryBuilder('ss').select([
+        'ss.orisCode',
+        'ss.facilityName',
+        'ss.state',
+        'ss.locations',
+        'ss.reportingPeriod',
+        'ss.reportingFrequencyCode',
+        'ss.submissionTypeCode',
+        'ss.submissionId',
+        'ss.submissionDateTime',
+        'ss.severityLevel',
+        'ss.mostRecent',
+        'ss.submissionStatus',
+        'ss.severityCode',
+        'ss.criticalErrLevelOne',
+        'ss.criticalErrLevelTwo',
+        'ss.nonCritical',
+        'ss.infoMessage',
+        'ss.adminOverride',
+        'ss.submitter',
+        'ss.monitorPlanId',
+        'ss.reportingPeriodId'
+      ]);
+  
+      if (orisCode) {
+        query.andWhere('ss.orisCode = :orisCode', {
+          orisCode
+        });
+      }
+  
+      if (quarter && year) {
+        query.andWhere('ss.reportingPeriod = :reportingPeriod', {
+            reportingPeriod: `${year} Q${quarter}`,
+        });
+      }
+  
+      if (severityCode) {
+        query.andWhere(
+          `(ss.severityCode = :severityCode)`,
+          { severityCode },
+        );
+      }
+
+      if (submissionType) {
+        query.andWhere(
+          `(ss.submissionTypeCode = :submissionType)`,
+          { submissionType},
+        );
+      }      
+
+      if (submissionFrom) {
+        query.andWhere(
+          `CAST(ss.submissionDateTime AS date) >= TO_DATE(COALESCE(:submissionFrom, '1900/01/01'), 'YYYY/MM/DD')`,
+          { submissionFrom },
+        );
+      }
+
+      if (submissionTo) {
+        query.andWhere(
+          `CAST(ss.submissionDateTime AS date) <= TO_DATE(COALESCE(:submissionTo, '9999/12/31'), 'YYYY/MM/DD')`,
+          { submissionTo },
+        );
+      }
+
+      return query.getMany();
+    }
+  }
+  
\ No newline at end of file
diff --git a/src/submission-report/submission-report.controller.spec.ts b/src/submission-report/submission-report.controller.spec.ts
new file mode 100644
index 00000000..c6c2d588
--- /dev/null
+++ b/src/submission-report/submission-report.controller.spec.ts
@@ -0,0 +1,57 @@
+import { ConfigService } from '@nestjs/config';
+import { LoggerModule } from '@us-epa-camd/easey-common/logger';
+import { HttpModule } from '@nestjs/axios';
+import { DataSource, EntityManager } from 'typeorm';
+import { Test, TestingModule } from '@nestjs/testing';
+
+import { SubmissionReportService } from './submission-report.service';
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionReportController } from './submission-report.controller'
+import { SubmissionListViewRepository } from './submission-report-view.repository';
+import { SubmissionListMap } from '../maps/submission-list.map';
+
+describe('SubmissionReportController', () => {
+  let controller: SubmissionReportController;
+  let service: SubmissionReportService;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      imports: [LoggerModule, HttpModule],
+      controllers: [SubmissionReportController],
+      providers: [
+        SubmissionReportService,
+        SubmissionListMap,
+        SubmissionListViewRepository,
+        ConfigService,
+        EntityManager,
+        {
+          provide: DataSource,
+          useValue: {},
+        },
+      ],
+    }).compile();
+
+    controller = module.get<SubmissionReportController>(
+        SubmissionReportController,
+    );
+    service = module.get<SubmissionReportService>(SubmissionReportService);
+  });
+
+  it('should be defined', () => {
+    expect(controller).toBeDefined();
+  });
+
+  it('Retrieves Submission Report (CAT) per filter criteria', async () => {
+    const paramsDto = new SubmissionReportParamsDTO();
+    const mockedValues = new SubmissionReportDTO();
+    jest
+      .spyOn(service, 'getSubmissionReport')
+      .mockResolvedValue([mockedValues]);
+
+    expect(await controller.getSubmissionReport(paramsDto)).toEqual({
+      items: [mockedValues],
+    });
+  });
+
+});
diff --git a/src/submission-report/submission-report.controller.ts b/src/submission-report/submission-report.controller.ts
new file mode 100644
index 00000000..80050103
--- /dev/null
+++ b/src/submission-report/submission-report.controller.ts
@@ -0,0 +1,55 @@
+import { Controller } from '@nestjs/common';
+import {
+  Get,
+  Query,
+} from '@nestjs/common/decorators';
+import {
+  ApiOkResponse,
+  ApiOperation,
+  ApiQuery,
+  ApiSecurity,
+  ApiTags,
+} from '@nestjs/swagger';
+import { ApiExcludeControllerByEnv } from '../decorators/swagger-decorator';
+import { BadRequestResponse, NotFoundResponse } from '@us-epa-camd/easey-common/utilities/common-swagger';
+import { ArrayResponse } from '@us-epa-camd/easey-common/interfaces/common.interface';
+import { SubmissionReportService } from './submission-report.service';
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { Logger } from '@us-epa-camd/easey-common/logger';
+
+@Controller()
+@ApiSecurity('APIKey')
+@ApiTags('Submission Report')
+@ApiExcludeControllerByEnv()
+export class SubmissionReportController {
+  constructor(
+    private readonly logger: Logger,
+    private service: SubmissionReportService
+  ) {
+    this.logger.setContext('SubmissionReportController')
+  }
+
+  @Get()
+  @ApiOkResponse({
+    isArray: true,
+    type: SubmissionReportDTO,
+    description: 'Data retrieved successfully',
+  })
+  @NotFoundResponse()
+  @BadRequestResponse()
+  @ApiOperation({
+    description: 'Retrieves Submission Report (CAT) per filter criteria.',
+  })
+  async getSubmissionReport(
+    @Query() submissionReportParamsDTO: SubmissionReportParamsDTO,
+  ): Promise<ArrayResponse<SubmissionReportDTO>> {
+
+    this.logger.info(submissionReportParamsDTO)
+    const submissionReports = await this.service.getSubmissionReport(submissionReportParamsDTO);
+
+    return  {
+      items: submissionReports
+    };
+  }
+}
diff --git a/src/submission-report/submission-report.module.ts b/src/submission-report/submission-report.module.ts
new file mode 100644
index 00000000..a2dc268c
--- /dev/null
+++ b/src/submission-report/submission-report.module.ts
@@ -0,0 +1,24 @@
+import { Module } from '@nestjs/common';
+import { HttpModule } from '@nestjs/axios';
+import { ConfigService } from '@nestjs/config';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { SubmissionListViewRepository } from './submission-report-view.repository';
+import { SubmissionReportController } from './submission-report.controller';
+import { SubmissionReportService } from './submission-report.service';
+import { SubmissionListMap } from '../maps/submission-list.map';
+
+@Module({
+  imports: [
+   TypeOrmModule.forFeature([SubmissionListViewRepository]),
+    HttpModule
+  ],
+  controllers: [SubmissionReportController],
+  providers: [
+    ConfigService,
+    SubmissionListViewRepository,
+    SubmissionReportService,
+    SubmissionListMap
+  ],
+  exports: [TypeOrmModule],
+})
+export class SubmissionReportModule {}
diff --git a/src/submission-report/submission-report.service.spec.ts b/src/submission-report/submission-report.service.spec.ts
new file mode 100644
index 00000000..983c4982
--- /dev/null
+++ b/src/submission-report/submission-report.service.spec.ts
@@ -0,0 +1,80 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { SubmissionReportService } from './submission-report.service';
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionListViewRepository } from './submission-report-view.repository';
+import { SubmissionListMap } from '../maps/submission-list.map';
+import { EntityManager } from 'typeorm';
+import { genSubmissionList } from '../../test/object-generators/submisison-report-list';
+
+const mockViewRepository = () => ({
+  getSubmissionReportList: jest.fn(),
+  findOneBy: jest.fn(),
+});
+
+const mockMap = () => ({
+  many: jest.fn(),
+  one: jest.fn(),
+});
+
+const mockEntityManager = () => ({
+  query: jest.fn(),
+});
+
+describe('SubmissionReportService', () => {
+  let service: SubmissionReportService;
+  let viewRepository: any;
+  let map: any;
+  let entityManager: any;
+
+  beforeEach(async () => {
+    const module: TestingModule = await Test.createTestingModule({
+      providers: [
+        SubmissionReportService,
+        {
+          provide: SubmissionListViewRepository,
+          useFactory: mockViewRepository,
+        },
+        {
+          provide: SubmissionListMap,
+          useFactory: mockMap,
+        },
+        {
+          provide: EntityManager,
+          useFactory: mockEntityManager,
+        },
+      ],
+    }).compile();
+
+    service = module.get(SubmissionReportService);
+    viewRepository = module.get<SubmissionListViewRepository>(SubmissionListViewRepository);
+    map = module.get(SubmissionListMap);
+    entityManager = module.get(EntityManager);
+  });
+
+  it('should be defined', () => {
+    expect(service).toBeDefined();
+  });
+
+  it('should successfully return data only from SubmissionListViewRepository', async () => {
+    const mockedViewRecords = genSubmissionList<SubmissionReportDTO>();
+    map.many.mockReturnValue(mockedViewRecords);
+    entityManager.query.mockResolvedValue([]);
+
+    let filters = new SubmissionReportParamsDTO();
+    filters.orisCode = null;
+    filters.year = null;
+    filters.quarter = null;
+    filters.severityCode = null;
+    filters.severityCode = null;
+    filters.submissionFrom = null;
+    filters.submissionTo = null;
+
+    let result = await service.getSubmissionReport(filters);
+
+    expect(result).toEqual(mockedViewRecords);
+    expect(viewRepository.getSubmissionReportList).toHaveBeenCalledWith(filters);
+    expect(entityManager.query).not.toHaveBeenCalled();
+  });
+
+});
diff --git a/src/submission-report/submission-report.service.ts b/src/submission-report/submission-report.service.ts
new file mode 100644
index 00000000..e723db1e
--- /dev/null
+++ b/src/submission-report/submission-report.service.ts
@@ -0,0 +1,32 @@
+import { Injectable, HttpStatus } from '@nestjs/common';
+import { EaseyException } from '@us-epa-camd/easey-common/exceptions';
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionListViewRepository } from './submission-report-view.repository';
+import { SubmissionListMap} from '../maps/submission-list.map';
+@Injectable()
+export class SubmissionReportService  {
+  constructor(
+    private readonly map: SubmissionListMap,
+    private readonly viewRepository: SubmissionListViewRepository,
+    
+  ) {}
+
+  async getSubmissionReport(
+    params: SubmissionReportParamsDTO,
+  ): Promise<SubmissionReportDTO[]> {
+    let query;
+    try{
+    let rowsSubmissionReport = []
+
+    query = await this.viewRepository.getSubmissionReportList(params)
+    rowsSubmissionReport = await this.map.many(query);
+
+    return [...rowsSubmissionReport]
+    }
+    catch(e)
+    {
+      throw new EaseyException(e, HttpStatus.INTERNAL_SERVER_ERROR);
+    }
+  }
+}
diff --git a/test/object-generators/submisison-report-list.ts b/test/object-generators/submisison-report-list.ts
new file mode 100644
index 00000000..acd74bb1
--- /dev/null
+++ b/test/object-generators/submisison-report-list.ts
@@ -0,0 +1,33 @@
+import { faker } from '@faker-js/faker';
+
+export const genSubmissionList = <RepoType>(amount = 1): RepoType[] => {
+  const submissionList: RepoType[] = [];
+  for (
+    let submissionListCount = 0;
+    submissionListCount < amount;
+    submissionListCount++
+  ) {
+    submissionList.push({
+      orisCode :  faker.datatype.number(),
+      facilityName :  faker.datatype.string(),
+      state :  faker.datatype.string(),
+      locations :  faker.datatype.string(),
+      reportingPeriodAbbreviation :  faker.datatype.string(),
+      reportingFrequencyCode :  faker.datatype.string(),
+      submissionTypeCode :  faker.datatype.string(),
+      submissionId :  faker.datatype.number(),
+      submissionDateTime :  faker.datatype.datetime(),
+      severityLevel :  faker.datatype.string(),
+      mostRecent :  faker.datatype.string(),
+      submissionStatus :  faker.datatype.string(),
+      severityCode :  faker.datatype.string(),
+      criticalErrLevelOne :  faker.datatype.string(),
+      criticalErrLevelTwo :  faker.datatype.string(),
+      nonCritical :  faker.datatype.string(),
+      infoMessage :  faker.datatype.string(),
+      adminOverride :  faker.datatype.string(),
+      submitter :  faker.datatype.string()
+    } as unknown as RepoType);
+  }
+  return submissionList;
+};


Reviews:
user: login: mark-hayward-erg
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-17T17:06:56Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:29:56Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:30:04Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:30:11Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:30:20Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:30:28Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:30:36Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:30:51Z
user: login: Jhernandez29
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-18T16:31:02Z
user: login: mark-hayward-erg
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-18T19:05:46Z

Review comments:
diff_hunk: @@ -0,0 +1,84 @@
+import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsDate,
+  IsNumber,
+  IsString,
+} from 'class-validator';
+
+export class SubmissionReportDTO {
+  @ApiProperty()
+  @IsNumber()
+  orisCode: number;
+
+  @ApiProperty()
+  @IsString()
+  facilityName: string;
+
+  @ApiProperty()
+  @IsString()
+  state: string;
+
+  @ApiProperty()
+  @IsString()
+  locations: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingPeriodAbbreviation: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingFrequencyCode: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionTypeCode: string;
+
+  @ApiProperty()
+  @IsNumber()
+  submissionId: number;
+
+  @ApiProperty()
+  @IsDate()
+  submissionDateTime: Date;
+
+  @ApiProperty()
+  @IsString()
+  severityLevel: string; 
+
+  @ApiProperty()
+  @IsString()
+  mostRecet: string;
path: src/dto/submission-report.dto.ts
user: login: mark-hayward-erg
body: this should be "mostRecent"
created_at: 2025-04-17T17:00:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,84 @@
+import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsDate,
+  IsNumber,
+  IsString,
+} from 'class-validator';
+
+export class SubmissionReportDTO {
+  @ApiProperty()
+  @IsNumber()
+  orisCode: number;
+
+  @ApiProperty()
+  @IsString()
+  facilityName: string;
+
+  @ApiProperty()
+  @IsString()
+  state: string;
+
+  @ApiProperty()
+  @IsString()
+  locations: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingPeriodAbbreviation: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingFrequencyCode: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionTypeCode: string;
+
+  @ApiProperty()
+  @IsNumber()
+  submissionId: number;
+
+  @ApiProperty()
+  @IsDate()
+  submissionDateTime: Date;
+
+  @ApiProperty()
+  @IsString()
+  severityLevel: string; 
+
+  @ApiProperty()
+  @IsString()
+  mostRecet: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionCode: string;
path: src/dto/submission-report.dto.ts
user: login: mark-hayward-erg
body: this should be "submissionStatus"  (matching the entity column name).
created_at: 2025-04-17T17:01:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,116 @@
+import { NumericColumnTransformer } from '@us-epa-camd/easey-common/transforms';
+import { BaseEntity, Column, ViewEntity } from 'typeorm';
+
+@ViewEntity({ name: 'camdecmps.vw_submission_list' })
+export class SubmissionListView extends BaseEntity {
+
+  @Column({
+    name: 'oris_code',
+    transformer: new NumericColumnTransformer(),
+  })
+  orisCode: number;
+
+  @Column({
+     name: 'facility_name',
+   })
+  facilityName: string;
+
+  @Column({
+    name: 'state',
+  })
+  state: string;
+
+  @Column({
+    name: 'locations',
+  })
+  locations: string;
+
+  @Column({
+    name: 'reporting_period',
+  })
+  reportingPeriod: string;
+
+  @Column({
+    name: 'reporting_frequency',
+  })
+  reportingFrequencyCode: string;
+
+  @Column({
+    name: 'process_cd',
+  })
+  submissionTypeCode: string;
+
+  @Column({
+    name: 'submission_id',
+    transformer: new NumericColumnTransformer(),
+  })
+  submissionId: number;
+
+  @Column({
+    name: 'queued_time',
+    type: 'date',
+  })
+  submissionDateTime: Date;
+
+  @Column({
+    name: 'severity_level',
+  })
+  severityLevel: string; 
+
+  @Column({
+    name: 'most_recent',
+  })
+  mostRecet: string;
path: src/entities/submission-list-vw.entity.ts
user: login: mark-hayward-erg
body: this should be "mostRecent"
created_at: 2025-04-17T17:02:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,37 @@
+import { Injectable } from '@nestjs/common';
+import { BaseMap } from '@us-epa-camd/easey-common/maps';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionListView } from 'src/entities/submission-list-vw.entity';
+
+@Injectable()
+export class SubmissionListMap extends BaseMap<
+SubmissionListView,
+SubmissionReportDTO
+> {
+  public async one(
+    entity: SubmissionListView,
+  ): Promise<SubmissionReportDTO> {
+    
+    return {
+        orisCode :  entity?.orisCode,
+        facilityName :  entity?.facilityName,
+        state :  entity?.state,
+        locations :  entity?.locations,
+        reportingPeriodAbbreviation :  entity?.reportingPeriod,
+        reportingFrequencyCode :  entity?.reportingFrequencyCode,
+        submissionTypeCode :  entity?.submissionTypeCode,
+        submissionId :  entity?.submissionId,
+        submissionDateTime :  entity?.submissionDateTime,
+        severityLevel :  entity?.severityLevel,
+        mostRecet :  entity?.mostRecet,
path: src/maps/submission-list.map.ts
user: login: mark-hayward-erg
body: this should be "mostRecent"
created_at: 2025-04-17T17:04:41Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,37 @@
+import { Injectable } from '@nestjs/common';
+import { BaseMap } from '@us-epa-camd/easey-common/maps';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionListView } from 'src/entities/submission-list-vw.entity';
+
+@Injectable()
+export class SubmissionListMap extends BaseMap<
+SubmissionListView,
+SubmissionReportDTO
+> {
+  public async one(
+    entity: SubmissionListView,
+  ): Promise<SubmissionReportDTO> {
+    
+    return {
+        orisCode :  entity?.orisCode,
+        facilityName :  entity?.facilityName,
+        state :  entity?.state,
+        locations :  entity?.locations,
+        reportingPeriodAbbreviation :  entity?.reportingPeriod,
+        reportingFrequencyCode :  entity?.reportingFrequencyCode,
+        submissionTypeCode :  entity?.submissionTypeCode,
+        submissionId :  entity?.submissionId,
+        submissionDateTime :  entity?.submissionDateTime,
+        severityLevel :  entity?.severityLevel,
+        mostRecet :  entity?.mostRecet,
+        submissionCode :  entity?.submissionStatus,
path: src/maps/submission-list.map.ts
user: login: mark-hayward-erg
body: this should be "submissionStatus"
created_at: 2025-04-17T17:04:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,92 @@
+import { Injectable } from '@nestjs/common';
+import { EntityManager, Repository } from 'typeorm';
+
+import { SubmissionListView } from '../entities/submission-list-vw.entity';
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+
+@Injectable()
+export class SubmissionListViewRepository extends Repository<SubmissionListView> {
+  constructor(entityManager: EntityManager) {
+    super(SubmissionListView, entityManager);
+  }
+
+  async getSubmissionReportList(
+    params: SubmissionReportParamsDTO,
+  ): Promise<SubmissionListView[]> {
+    const {
+      orisCode,
+      year,
+      quarter,
+      severityCode,
+      submissionType,
+      submissionFrom,
+      submissionTo
+    } = params;
+    let query = this.createQueryBuilder('ss').select([
+        'ss.orisCode',
+        'ss.facilityName',
+        'ss.state',
+        'ss.locations',
+        'ss.reportingPeriod',
+        'ss.reportingFrequencyCode',
+        'ss.submissionTypeCode',
+        'ss.submissionId',
+        'ss.submissionDateTime',
+        'ss.severityLevel',
+        'ss.mostRecet',
path: src/submission-report/submission-report-view.repository.ts
user: login: mark-hayward-erg
body: this should be "mostRecent"
created_at: 2025-04-17T17:05:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,33 @@
+import { faker } from '@faker-js/faker';
+
+export const genSubmissionList = <RepoType>(amount = 1): RepoType[] => {
+  const submissionList: RepoType[] = [];
+  for (
+    let submissionListCount = 0;
+    submissionListCount < amount;
+    submissionListCount++
+  ) {
+    submissionList.push({
+      orisCode :  faker.datatype.number(),
+      facilityName :  faker.datatype.string(),
+      state :  faker.datatype.string(),
+      locations :  faker.datatype.string(),
+      reportingPeriodAbbreviation :  faker.datatype.string(),
+      reportingFrequencyCode :  faker.datatype.string(),
+      submissionTypeCode :  faker.datatype.string(),
+      submissionId :  faker.datatype.number(),
+      submissionDateTime :  faker.datatype.datetime(),
+      severityLevel :  faker.datatype.string(),
+      mostRecet :  faker.datatype.string(),
path: test/object-generators/submisison-report-list.ts
user: login: mark-hayward-erg
body: this should be "mostRecent"
created_at: 2025-04-17T17:06:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,33 @@
+import { faker } from '@faker-js/faker';
+
+export const genSubmissionList = <RepoType>(amount = 1): RepoType[] => {
+  const submissionList: RepoType[] = [];
+  for (
+    let submissionListCount = 0;
+    submissionListCount < amount;
+    submissionListCount++
+  ) {
+    submissionList.push({
+      orisCode :  faker.datatype.number(),
+      facilityName :  faker.datatype.string(),
+      state :  faker.datatype.string(),
+      locations :  faker.datatype.string(),
+      reportingPeriodAbbreviation :  faker.datatype.string(),
+      reportingFrequencyCode :  faker.datatype.string(),
+      submissionTypeCode :  faker.datatype.string(),
+      submissionId :  faker.datatype.number(),
+      submissionDateTime :  faker.datatype.datetime(),
+      severityLevel :  faker.datatype.string(),
+      mostRecet :  faker.datatype.string(),
+      submissionCode :  faker.datatype.string(),
path: test/object-generators/submisison-report-list.ts
user: login: mark-hayward-erg
body: this should be "submissionStatus"
created_at: 2025-04-17T17:06:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,84 @@
+import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsDate,
+  IsNumber,
+  IsString,
+} from 'class-validator';
+
+export class SubmissionReportDTO {
+  @ApiProperty()
+  @IsNumber()
+  orisCode: number;
+
+  @ApiProperty()
+  @IsString()
+  facilityName: string;
+
+  @ApiProperty()
+  @IsString()
+  state: string;
+
+  @ApiProperty()
+  @IsString()
+  locations: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingPeriodAbbreviation: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingFrequencyCode: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionTypeCode: string;
+
+  @ApiProperty()
+  @IsNumber()
+  submissionId: number;
+
+  @ApiProperty()
+  @IsDate()
+  submissionDateTime: Date;
+
+  @ApiProperty()
+  @IsString()
+  severityLevel: string; 
+
+  @ApiProperty()
+  @IsString()
+  mostRecet: string;
path: src/dto/submission-report.dto.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:29:56Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,116 @@
+import { NumericColumnTransformer } from '@us-epa-camd/easey-common/transforms';
+import { BaseEntity, Column, ViewEntity } from 'typeorm';
+
+@ViewEntity({ name: 'camdecmps.vw_submission_list' })
+export class SubmissionListView extends BaseEntity {
+
+  @Column({
+    name: 'oris_code',
+    transformer: new NumericColumnTransformer(),
+  })
+  orisCode: number;
+
+  @Column({
+     name: 'facility_name',
+   })
+  facilityName: string;
+
+  @Column({
+    name: 'state',
+  })
+  state: string;
+
+  @Column({
+    name: 'locations',
+  })
+  locations: string;
+
+  @Column({
+    name: 'reporting_period',
+  })
+  reportingPeriod: string;
+
+  @Column({
+    name: 'reporting_frequency',
+  })
+  reportingFrequencyCode: string;
+
+  @Column({
+    name: 'process_cd',
+  })
+  submissionTypeCode: string;
+
+  @Column({
+    name: 'submission_id',
+    transformer: new NumericColumnTransformer(),
+  })
+  submissionId: number;
+
+  @Column({
+    name: 'queued_time',
+    type: 'date',
+  })
+  submissionDateTime: Date;
+
+  @Column({
+    name: 'severity_level',
+  })
+  severityLevel: string; 
+
+  @Column({
+    name: 'most_recent',
+  })
+  mostRecet: string;
path: src/entities/submission-list-vw.entity.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:30:03Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,37 @@
+import { Injectable } from '@nestjs/common';
+import { BaseMap } from '@us-epa-camd/easey-common/maps';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionListView } from 'src/entities/submission-list-vw.entity';
+
+@Injectable()
+export class SubmissionListMap extends BaseMap<
+SubmissionListView,
+SubmissionReportDTO
+> {
+  public async one(
+    entity: SubmissionListView,
+  ): Promise<SubmissionReportDTO> {
+    
+    return {
+        orisCode :  entity?.orisCode,
+        facilityName :  entity?.facilityName,
+        state :  entity?.state,
+        locations :  entity?.locations,
+        reportingPeriodAbbreviation :  entity?.reportingPeriod,
+        reportingFrequencyCode :  entity?.reportingFrequencyCode,
+        submissionTypeCode :  entity?.submissionTypeCode,
+        submissionId :  entity?.submissionId,
+        submissionDateTime :  entity?.submissionDateTime,
+        severityLevel :  entity?.severityLevel,
+        mostRecet :  entity?.mostRecet,
path: src/maps/submission-list.map.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:30:11Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,37 @@
+import { Injectable } from '@nestjs/common';
+import { BaseMap } from '@us-epa-camd/easey-common/maps';
+import { SubmissionReportDTO } from '../dto/submission-report.dto';
+import { SubmissionListView } from 'src/entities/submission-list-vw.entity';
+
+@Injectable()
+export class SubmissionListMap extends BaseMap<
+SubmissionListView,
+SubmissionReportDTO
+> {
+  public async one(
+    entity: SubmissionListView,
+  ): Promise<SubmissionReportDTO> {
+    
+    return {
+        orisCode :  entity?.orisCode,
+        facilityName :  entity?.facilityName,
+        state :  entity?.state,
+        locations :  entity?.locations,
+        reportingPeriodAbbreviation :  entity?.reportingPeriod,
+        reportingFrequencyCode :  entity?.reportingFrequencyCode,
+        submissionTypeCode :  entity?.submissionTypeCode,
+        submissionId :  entity?.submissionId,
+        submissionDateTime :  entity?.submissionDateTime,
+        severityLevel :  entity?.severityLevel,
+        mostRecet :  entity?.mostRecet,
+        submissionCode :  entity?.submissionStatus,
path: src/maps/submission-list.map.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:30:19Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,92 @@
+import { Injectable } from '@nestjs/common';
+import { EntityManager, Repository } from 'typeorm';
+
+import { SubmissionListView } from '../entities/submission-list-vw.entity';
+import { SubmissionReportParamsDTO } from '../dto/submission-report-params.dto';
+
+@Injectable()
+export class SubmissionListViewRepository extends Repository<SubmissionListView> {
+  constructor(entityManager: EntityManager) {
+    super(SubmissionListView, entityManager);
+  }
+
+  async getSubmissionReportList(
+    params: SubmissionReportParamsDTO,
+  ): Promise<SubmissionListView[]> {
+    const {
+      orisCode,
+      year,
+      quarter,
+      severityCode,
+      submissionType,
+      submissionFrom,
+      submissionTo
+    } = params;
+    let query = this.createQueryBuilder('ss').select([
+        'ss.orisCode',
+        'ss.facilityName',
+        'ss.state',
+        'ss.locations',
+        'ss.reportingPeriod',
+        'ss.reportingFrequencyCode',
+        'ss.submissionTypeCode',
+        'ss.submissionId',
+        'ss.submissionDateTime',
+        'ss.severityLevel',
+        'ss.mostRecet',
path: src/submission-report/submission-report-view.repository.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:30:28Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,33 @@
+import { faker } from '@faker-js/faker';
+
+export const genSubmissionList = <RepoType>(amount = 1): RepoType[] => {
+  const submissionList: RepoType[] = [];
+  for (
+    let submissionListCount = 0;
+    submissionListCount < amount;
+    submissionListCount++
+  ) {
+    submissionList.push({
+      orisCode :  faker.datatype.number(),
+      facilityName :  faker.datatype.string(),
+      state :  faker.datatype.string(),
+      locations :  faker.datatype.string(),
+      reportingPeriodAbbreviation :  faker.datatype.string(),
+      reportingFrequencyCode :  faker.datatype.string(),
+      submissionTypeCode :  faker.datatype.string(),
+      submissionId :  faker.datatype.number(),
+      submissionDateTime :  faker.datatype.datetime(),
+      severityLevel :  faker.datatype.string(),
+      mostRecet :  faker.datatype.string(),
+      submissionCode :  faker.datatype.string(),
path: test/object-generators/submisison-report-list.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:30:36Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,33 @@
+import { faker } from '@faker-js/faker';
+
+export const genSubmissionList = <RepoType>(amount = 1): RepoType[] => {
+  const submissionList: RepoType[] = [];
+  for (
+    let submissionListCount = 0;
+    submissionListCount < amount;
+    submissionListCount++
+  ) {
+    submissionList.push({
+      orisCode :  faker.datatype.number(),
+      facilityName :  faker.datatype.string(),
+      state :  faker.datatype.string(),
+      locations :  faker.datatype.string(),
+      reportingPeriodAbbreviation :  faker.datatype.string(),
+      reportingFrequencyCode :  faker.datatype.string(),
+      submissionTypeCode :  faker.datatype.string(),
+      submissionId :  faker.datatype.number(),
+      submissionDateTime :  faker.datatype.datetime(),
+      severityLevel :  faker.datatype.string(),
+      mostRecet :  faker.datatype.string(),
path: test/object-generators/submisison-report-list.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:30:51Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,84 @@
+import { ApiProperty } from '@nestjs/swagger';
+import {
+  IsDate,
+  IsNumber,
+  IsString,
+} from 'class-validator';
+
+export class SubmissionReportDTO {
+  @ApiProperty()
+  @IsNumber()
+  orisCode: number;
+
+  @ApiProperty()
+  @IsString()
+  facilityName: string;
+
+  @ApiProperty()
+  @IsString()
+  state: string;
+
+  @ApiProperty()
+  @IsString()
+  locations: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingPeriodAbbreviation: string;
+
+  @ApiProperty()
+  @IsString()
+  reportingFrequencyCode: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionTypeCode: string;
+
+  @ApiProperty()
+  @IsNumber()
+  submissionId: number;
+
+  @ApiProperty()
+  @IsDate()
+  submissionDateTime: Date;
+
+  @ApiProperty()
+  @IsString()
+  severityLevel: string; 
+
+  @ApiProperty()
+  @IsString()
+  mostRecet: string;
+
+  @ApiProperty()
+  @IsString()
+  submissionCode: string;
path: src/dto/submission-report.dto.ts
user: login: Jhernandez29
body: corrected in commit https://github.com/US-EPA-CAMD/easey-camd-services/pull/346/commits/4a2c745b0e4ba856c000884c1e4b2d838c4ce545
created_at: 2025-04-18T16:31:02Z
author_association: COLLABORATOR

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-04-18T18:58:46Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=US-EPA-CAMD_easey-camd-services&pullRequest=346) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2 New issues](https://sonarcloud.io/project/issues?id=US-EPA-CAMD_easey-camd-services&pullRequest=346&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=US-EPA-CAMD_easey-camd-services&pullRequest=346&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=US-EPA-CAMD_easey-camd-services&pullRequest=346&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [50.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=US-EPA-CAMD_easey-camd-services&pullRequest=346&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=US-EPA-CAMD_easey-camd-services&pullRequest=346&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=US-EPA-CAMD_easey-camd-services&pullRequest=346)


author_association: NONE