Skip to content

Commit

Permalink
Merge pull request #81 from icefoganalytics/elcc-61/add-wage-enhancem…
Browse files Browse the repository at this point in the history
…ent-replication-across-months

ELCC-61: Add Wage Enhancement Replication Across Months
  • Loading branch information
klondikemarlen authored Jun 5, 2024
2 parents d430192 + bb09c3f commit 9aa82ea
Show file tree
Hide file tree
Showing 21 changed files with 862 additions and 142 deletions.
Binary file modified _Design/Entity Relationship Diagrams.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
325 changes: 201 additions & 124 deletions _Design/Entity Relationship Diagrams.wsd
Original file line number Diff line number Diff line change
@@ -1,151 +1,228 @@
@startuml Entity Relationship Diagrams

class "SequelizeMeta" {
+name: nvarchar(255)
+created_at: datetime2
+updated_at: datetime2
entity "centre_funding_periods" {
* id: int [PK]
--
* centre_id: int [FK]
* fiscal_period_id: int [FK]
* notes: nvarchar(MAX)
* created_at: datetime2
* updated_at: datetime2
}

class "centres" {
+id: int
+name: nvarchar(200)
+license: nvarchar(255)
+community: nvarchar(255)
+status: nvarchar(255)
+hot_meal: bit
+licensed_for: int
+last_submission: date
+created_at: datetime2
+updated_at: datetime2
entity "centres" {
* id: int [PK]
--
* name: nvarchar(200)
* community: nvarchar(255)
* status: nvarchar(255)
* is_first_nation_program: bit
* region: nvarchar(100)
license: nvarchar(255)
hot_meal: bit
licensed_for: int
last_submission: date
license_holder_name: nvarchar(100)
contact_name: nvarchar(100)
physical_address: nvarchar(250)
mailing_address: nvarchar(250)
email: nvarchar(100)
alt_email: nvarchar(100)
phone_number: nvarchar(20)
alt_phone_number: nvarchar(20)
fax_number: nvarchar(20)
vendor_identifier: nvarchar(20)
inspector_name: nvarchar(100)
neighborhood: nvarchar(100)
* created_at: datetime2
* updated_at: datetime2
}

entity "employee_benefits" {
* id: int [PK]
--
* centre_id: int [FK]
* fiscal_period_id: int [FK]
* gross_payroll_monthly_actual: decimal(10,2)
* gross_payroll_monthly_estimated: decimal(10,2)
* cost_cap_percentage: decimal(5,2)
* employee_cost_actual: decimal(10,2)
* employee_cost_estimated: decimal(10,2)
* employer_cost_actual: decimal(10,2)
* employer_cost_estimated: decimal(10,2)
* created_at: datetime2
* updated_at: datetime2
}

entity "employee_wage_tiers" {
* id: int [PK]
--
* fiscal_period_id: int [FK]
* tier_level: int
* tier_label: nvarchar(50)
* wage_rate_per_hour: float
* created_at: datetime2
* updated_at: datetime2
}

class "employee_benefits" {
+id: int
+centre_id: int
+fiscal_period_id: int
+gross_payroll_monthly_actual: decimal(10, 2)
+gross_payroll_monthly_estimated: decimal(10, 2)
+cost_cap_percentage: decimal(5, 2)
+employee_cost_actual: decimal(10, 2)
+employee_cost_estimated: decimal(10, 2)
+employer_cost_actual: decimal(10, 2)
+employer_cost_estimated: decimal(10, 2)
+created_at: datetime2(0)
+updated_at: datetime2(0)
entity "fiscal_periods" {
* id: int [PK]
--
* fiscal_year: nvarchar(10)
* month: nvarchar(10)
* date_start: datetime2(0)
* date_end: datetime2(0)
* created_at: datetime2
* updated_at: datetime2
}

class "fiscal_periods" {
+id: int
+fiscal_year: nvarchar(10)
+month: nvarchar(10)
+date_start: datetime2(0)
+date_end: datetime2(0)
+created_at: datetime2(0)
+updated_at: datetime2(0)
entity "funding_periods" {
* id: int [PK]
--
* fiscal_year: nvarchar(10)
* from_date: datetime2(0)
* to_date: datetime2(0)
* title: nvarchar(100)
* is_fiscal_year: bit
* is_school_month: bit
* created_at: datetime2
* updated_at: datetime2
}

class "funding_periods" {
+id: int
+fiscal_year: nvarchar(10)
+from_date: datetime2(0)
+to_date: datetime2(0)
+title: nvarchar(100)
+is_fiscal_year: bit
+is_school_month: bit
+created_at: datetime2
+updated_at: datetime2
entity "funding_submission_line_jsons" {
* id: int [PK]
--
* centre_id: int [FK]
* fiscal_year: nvarchar(10)
* date_name: nvarchar(100)
* date_start: datetime2(0)
* date_end: datetime2(0)
* values: nvarchar(MAX) - JSON array of FundingLineValues
* created_at: datetime2
* updated_at: datetime2
}

class "funding_submission_lines" {
+id: int
+fiscal_year: nvarchar(10)
+section_name: nvarchar(200)
+line_name: nvarchar(200)
+from_age: int
+to_age: int
+monthly_amount: float
+created_at: datetime2
+updated_at: datetime2
' This is stored as json in the funding_submission_line_jsons::values column
entity "FundingLineValue" {
- no PK as not table in the database
--
* submissionLineId: int [FK]
* sectionName: nvarchar(200)
* lineName: nvarchar(200)
* monthlyAmount: float
* estimatedChildOccupancyRate: float
* actualChildOccupancyRate: float
* estimatedComputedTotal: float
* actualComputedTotal: float
}

class "logs" {
+id: int
+table_name: nvarchar(200)
+operation: nvarchar(200)
+user_email: nvarchar(200)
+data: nvarchar(2000)
+created_at: datetime2
+updated_at: datetime2
' This table is not in use currently.
entity "funding_submission_line_values" {
* id: int [PK]
--
* centre_id: int [FK]
* submission_line_id: int [FK]
* fiscal_year: nvarchar(10)
* section_name: nvarchar(200)
* line_name: nvarchar(200)
* monthly_amount: float
* date_name: nvarchar(100)
* date_start: datetime2(0)
* date_end: datetime2(0)
* child_count: float
* computed_total: float
* is_actual: bit
* created_at: datetime2
* updated_at: datetime2
}

class "users" {
+email: nvarchar(200)
+sub: nvarchar(200)
+first_name: nvarchar(100)
+last_name: nvarchar(100)
+status: nvarchar(50)
+is_admin: bit
+ynet_id: nvarchar(50)
+directory_id: nvarchar(50)
+id: int
+created_at: datetime2
+updated_at: datetime2
entity "funding_submission_lines" {
* id: int [PK]
--
* fiscal_year: nvarchar(10)
* section_name: nvarchar(200)
* line_name: nvarchar(200)
* monthly_amount: float
from_age: int
to_age: int
* created_at: datetime2
* updated_at: datetime2
}

class "centre_funding_periods" {
+id: int
+centre_id: int
+fiscal_period_id: int
+notes: nvarchar(MAX)
+created_at: datetime2
+updated_at: datetime2
' This table is a sort of polymorphic table to store changes relating to some abitrary table.
entity "logs" {
* id: int [PK]
--
* table_name: nvarchar(200)
* operation: nvarchar(200)
* user_email: nvarchar(200)
* data: nvarchar(2000)
* created_at: datetime2
* updated_at: datetime2
}

class "funding_submission_line_jsons" {
+id: int
+centre_id: int
+fiscal_year: nvarchar(10)
+date_name: nvarchar(100)
+date_start: datetime2(0)
+date_end: datetime2(0)
+values: nvarchar(MAX)
+created_at: datetime2
+updated_at: datetime2
entity "payments" {
* id: int [PK]
--
* centre_id: int [FK]
* fiscal_year: nvarchar(10)
* paid_on: date
* amount_in_cents: int
* name: nvarchar(100)
* created_at: datetime2
* updated_at: datetime2
}

note right of "funding_submission_line_jsons"
The "values" column stores an array of sections.
The format is
<code>
[{
"submissionLineId": 50,
"sectionName": "Child Care Spaces",
"lineName": "Infants",
"monthlyAmount": 700,
"estimatedChildOccupancyRate": 1,
"actualChildOccupancyRate": 2,
"estimatedComputedTotal": 700,
"actualComputedTotal": 1400
},
...
]
</code>

This is generated from the "funding_submission_lines" table.
end note

class "user_roles" {
+role: nvarchar(255)
+id: int
+user_id: int
+created_at: datetime2
+updated_at: datetime2
entity "user_roles" {
* id: int [PK]
--
* user_id: int [FK]
* role: nvarchar(255)
* created_at: datetime2
* updated_at: datetime2
}

"centres" --|> "centre_funding_periods" : centre_id
"centres" --|> "funding_submission_line_jsons" : centre_id
"users" --|> "user_roles" : user_id
"fiscal_periods" --|> "employee_benefits" : fiscal_period_id
entity "users" {
* id: int [PK]
--
* email: nvarchar(200)
* sub: nvarchar(200) - refers to Auth0 Subject
* first_name: nvarchar(100)
* last_name: nvarchar(100)
* status: nvarchar(50)
* is_admin: bit
ynet_id: nvarchar(50)
directory_id: nvarchar(50)
* created_at: datetime2
* updated_at: datetime2
}

entity "wage_enhancements" {
* id: int [PK]
--
* centre_id: int [FK]
* employee_wage_tier_id: int [FK]
* employee_name: nvarchar(100)
* hours_estimated: float
* hours_actual: float
* created_at: datetime2
* updated_at: datetime2
}

centres::id }o--|| centre_funding_periods::centre_id
centres::id }o--|| employee_benefits::centre_id
centres::id }o--|| funding_submission_line_jsons::centre_id
centres::id }o--|| funding_submission_line_values::centre_id
centres::id }o--|| payments::centre_id
centres::id }o--|| wage_enhancements::centre_id
centres }o--o| logs::table_name
employee_wage_tiers::id }o--|| wage_enhancements::employee_wage_tier_id
fiscal_periods::id }o--|| centre_funding_periods::fiscal_period_id
fiscal_periods::id }o--|| employee_benefits::fiscal_period_id
fiscal_periods::id }o--|| employee_wage_tiers::fiscal_period_id
funding_submission_line_jsons::values }o--|| FundingLineValue
funding_submission_lines::id }o--|| FundingLineValue::submissionLineId
funding_submission_lines::id }o--|| funding_submission_line_values::submission_line_id
users::id }o--|| user_roles::user_id
users::email }o--|| logs::user_email
@enduml
1 change: 1 addition & 0 deletions api/src/controllers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ export { WageEnhancementsController } from "./wage-enhancements-controller"

// bundled exports
export * as FundingSubmissionLineJsons from "./funding-submission-line-jsons"
export * as WageEnhancements from "./wage-enhancements"
1 change: 1 addition & 0 deletions api/src/controllers/wage-enhancements/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { ReplicateEstimatesController } from "./replicate-estimates-controller"
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { isNaN } from "lodash"

import { ReplicateEstimatesService } from "@/services/wage-enhancements"
import BaseController from "@/controllers/base-controller"

export class ReplicateEstimatesController extends BaseController {
async create() {
try {
const centreId = parseInt((this.query.centreId as string) ?? this.request.body.centreId)
const fiscalPeriodId = parseInt(
(this.query.fiscalPeriodId as string) ?? this.request.body.fiscalPeriodId
)
if (isNaN(centreId)) {
return this.response.status(422).json({
message: "centreId not provided or invalid",
})
}

if (isNaN(fiscalPeriodId)) {
return this.response.status(422).json({
message: "fiscalPeriodId not provided or invalid",
})
}

await ReplicateEstimatesService.perform(centreId, fiscalPeriodId)
return this.response.status(201).json({
message: "Wage enhancement estimates replicated successfully",
})
} catch (error) {
return this.response.status(422).json({
message: `Error replicating wage enhancement estimates: ${error}`,
})
}
}
}

export default ReplicateEstimatesController
Loading

0 comments on commit 9aa82ea

Please sign in to comment.