| Conditions | 1 |
| Total Lines | 118 |
| Code Lines | 41 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | import { Inject } from '@nestjs/common'; |
||
| 60 | |||
| 61 | public async execute( |
||
| 62 | _: GetPayrollElementsQuery |
||
| 63 | ): Promise<PayrollElementsView[]> { |
||
| 64 | const sql = ` |
||
| 65 | SELECT |
||
| 66 | "user".id AS "userId", |
||
| 67 | "firstName", |
||
| 68 | "lastName", |
||
| 69 | "executivePosition", |
||
| 70 | "joiningDate", |
||
| 71 | "leavingDate", |
||
| 72 | "annualEarnings", |
||
| 73 | ("annualEarnings" / 12) AS "monthlyEarnings", |
||
| 74 | "workingTime", |
||
| 75 | "transportFee", |
||
| 76 | "healthInsurance", |
||
| 77 | ( |
||
| 78 | SELECT |
||
| 79 | COALESCE(SUM(leave.time / 60.0 / 7.0), 0) |
||
| 80 | FROM leave_request |
||
| 81 | INNER JOIN leave ON leave."leaveRequestId" = leave_request.id |
||
| 82 | INNER JOIN "user" AS u ON u.id = leave_request."userId" AND u.id = "user".id |
||
| 83 | WHERE leave_request.status = 'accepted' |
||
| 84 | AND leave_request.type = 'paid' |
||
| 85 | AND u.id = "user".id |
||
| 86 | ) AS "totalPaidLeaves", |
||
| 87 | ( |
||
| 88 | SELECT |
||
| 89 | COALESCE(SUM(leave.time / 60.0 / 7.0), 0) |
||
| 90 | FROM leave_request |
||
| 91 | INNER JOIN leave ON leave."leaveRequestId" = leave_request.id |
||
| 92 | INNER JOIN "user" AS u ON u.id = leave_request."userId" AND u.id = "user".id |
||
| 93 | WHERE leave_request.status = 'accepted' |
||
| 94 | AND leave_request.type = 'unpaid' |
||
| 95 | ) AS "totalUnpaidLeaves", |
||
| 96 | ( |
||
| 97 | SELECT |
||
| 98 | COALESCE(SUM(leave.time / 60.0 / 7.0), 0) |
||
| 99 | FROM leave_request |
||
| 100 | INNER JOIN leave ON leave."leaveRequestId" = leave_request.id |
||
| 101 | INNER JOIN "user" AS u ON u.id = leave_request."userId" AND u.id = "user".id |
||
| 102 | WHERE leave_request.status = 'accepted' |
||
| 103 | AND leave_request.type = 'medical' |
||
| 104 | ) AS "totalMedicalLeaves", |
||
| 105 | ( |
||
| 106 | SELECT |
||
| 107 | COALESCE(SUM(leave.time / 60.0 / 7.0), 0) |
||
| 108 | FROM leave_request |
||
| 109 | INNER JOIN leave ON leave."leaveRequestId" = leave_request.id |
||
| 110 | INNER JOIN "user" AS u ON u.id = leave_request."userId" AND u.id = "user".id |
||
| 111 | WHERE leave_request.status = 'accepted' |
||
| 112 | AND leave_request.type = 'special' |
||
| 113 | ) AS "totalSpecialLeaves" |
||
| 114 | FROM "user" |
||
| 115 | INNER JOIN user_administrative AS user_a ON "user"."userAdministrativeId" = user_a.id |
||
| 116 | WHERE user_a."leavingDate" IS NULL; |
||
| 117 | `; |
||
| 118 | |||
| 119 | const rows = await this.manager.query(sql); |
||
| 120 | |||
| 121 | const leaveSql = ` |
||
| 122 | SELECT |
||
| 123 | "user".id AS "userId", |
||
| 124 | "startDate", |
||
| 125 | "endDate" |
||
| 126 | FROM leave_request |
||
| 127 | INNER JOIN "user" ON "user".id = leave_request."userId" |
||
| 128 | WHERE leave_request.status = 'accepted' |
||
| 129 | ORDER BY "startDate"; |
||
| 130 | `; |
||
| 131 | |||
| 132 | const leaveRows = await this.manager.query(leaveSql); |
||
| 133 | |||
| 134 | const mealTicketsByUserId = await this.getUserMealTickets(); |
||
| 135 | |||
| 136 | return rows.map( |
||
| 137 | ({ |
||
| 138 | userId, |
||
| 139 | firstName, |
||
| 140 | lastName, |
||
| 141 | executivePosition, |
||
| 142 | joiningDate, |
||
| 143 | leavingDate, |
||
| 144 | annualEarnings, |
||
| 145 | monthlyEarnings, |
||
| 146 | workingTime, |
||
| 147 | transportFee, |
||
| 148 | healthInsurance, |
||
| 149 | totalPaidLeaves, |
||
| 150 | totalUnpaidLeaves, |
||
| 151 | totalMedicalLeaves, |
||
| 152 | totalSpecialLeaves |
||
| 153 | }) => { |
||
| 154 | const leaves = leaveRows |
||
| 155 | .filter(({ userId: leaveUserId }) => leaveUserId === userId) |
||
| 156 | .map(({ startDate, endDate }) => new LeaveView(startDate, endDate)); |
||
| 157 | |||
| 158 | const mealTickets = mealTicketsByUserId.get(userId); |
||
| 159 | |||
| 160 | return new PayrollElementsView( |
||
| 161 | userId, |
||
| 162 | firstName, |
||
| 163 | lastName, |
||
| 164 | executivePosition, |
||
| 165 | joiningDate, |
||
| 166 | leavingDate, |
||
| 167 | +annualEarnings * 0.01, |
||
| 168 | +monthlyEarnings * 0.01, |
||
| 169 | workingTime, |
||
| 170 | +transportFee * 0.01, |
||
| 171 | mealTickets, |
||
| 172 | healthInsurance, |
||
| 173 | +totalPaidLeaves, |
||
| 174 | +totalUnpaidLeaves, |
||
| 175 | +totalMedicalLeaves, |
||
| 176 | +totalSpecialLeaves, |
||
| 177 | leaves |
||
| 178 | ); |
||
| 183 |