avicenna/service/data-hub/data-connector/src/modules/feat-etl/feat-loaders/loaders.service.ts

257 lines
7.9 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { from, map, of, switchMap } from 'rxjs';
import { TransformersService } from '../feat-transformers/transformers.service';
import { FinalRepository } from './final.repository';
import { AttendanceRegistrationLoader } from './loaders/attendance-registration.loader';
import { EmployeeDispoliveLoader } from './loaders/employee-dispolive';
import { EmployeeDyflexisLoader } from './loaders/employee-dyflexis';
import { PatientLoader } from './loaders/patient.loader';
import { PlannedTimeLoader } from './loaders/planned-time.loader';
import { TourLoader } from './loaders/tour.loader';
import { WorkTimeLoader } from './loaders/work-time.loader';
@Injectable()
export class LoadersService {
constructor(
private readonly repository: FinalRepository,
private readonly transformersService: TransformersService,
) {}
loadTours() {
return from(this.transformersService.findTours()).pipe(
switchMap((stagingTours) => {
if (stagingTours.length === 0) {
return of({
staging: [],
final: [],
});
}
const { startDate: firstTourDate } = stagingTours.at(0);
const { startDate: lastTourDate } = stagingTours.at(-1);
return from(
this.repository.findToursInInterval(
{
start: firstTourDate,
end: lastTourDate,
},
stagingTours.map(({ operationId }) => operationId),
),
).pipe(
map((finalTours) => ({
final: finalTours,
staging: stagingTours,
})),
);
}),
map(({ staging, final }) =>
TourLoader.determineLoadOperations(staging, final),
),
switchMap(({ deleted, updated, created }) => {
return from(
Promise.all([
this.repository.deleteTours(deleted),
this.repository.updateTours(updated),
this.repository.createTours(created),
]),
);
}),
);
}
loadPatients() {
return from(this.transformersService.findPatients()).pipe(
switchMap((stagingPatients) =>
from(this.repository.findPatients()).pipe(
map((finalPatients) => ({
final: finalPatients,
staging: stagingPatients,
})),
),
),
map(({ staging, final }) =>
PatientLoader.determineLoadOperations(staging, final),
),
switchMap(({ deleted, updated, created }) =>
from(
Promise.all([
this.repository.deletePatients(deleted),
this.repository.updatePatients(updated),
this.repository.createPatients(created),
]),
),
),
);
}
loadDyflexisEmployees() {
return from(this.transformersService.findDyflexisEmployees()).pipe(
switchMap((stagingEmployees) =>
from(this.repository.findEmployeeDyflexis()).pipe(
map((finalEmployees) => ({
final: finalEmployees,
staging: stagingEmployees,
})),
),
),
map(({ staging, final }) =>
EmployeeDyflexisLoader.determineLoadOperations(staging, final),
),
switchMap(({ deleted, updated, created }) =>
from(
Promise.all([
this.repository.deleteEmployeeDyflexis(deleted),
this.repository.updateEmployeeDyflexis(updated),
this.repository.createEmployeeDyflexis(created),
]),
),
),
);
}
loadDispoliveEmployees() {
return from(this.transformersService.findDispoliveEmployees()).pipe(
switchMap((stagingEmployees) =>
from(this.repository.findEmployeeDispolive()).pipe(
map((finalEmployees) => ({
final: finalEmployees,
staging: stagingEmployees,
})),
),
),
map(({ staging, final }) =>
EmployeeDispoliveLoader.determineLoadOperations(staging, final),
),
switchMap(({ deleted, updated, created }) =>
from(
Promise.all([
this.repository.deleteEmployeeDispolive(deleted),
this.repository.updateEmployeeDispolive(updated),
this.repository.createEmployeeDispolive(created),
]),
),
),
);
}
loadAttendanceRegistrations() {
return from(this.transformersService.findAttendanceRegistrations()).pipe(
switchMap((stagingAttendanceRegistrations) => {
if (stagingAttendanceRegistrations.length === 0) {
return of({
staging: [],
final: [],
});
}
const { dateTime: firstAttendanceRegistration } = [
...stagingAttendanceRegistrations,
].shift();
const { dateTime: lastAttendanceRegistration } = [
...stagingAttendanceRegistrations,
].pop();
return from(
this.repository.findAttendanceRegistrationsInInterval({
start: firstAttendanceRegistration,
end: lastAttendanceRegistration,
}),
).pipe(
map((finalAttendanceRegistrations) => ({
final: finalAttendanceRegistrations,
staging: stagingAttendanceRegistrations,
})),
);
}),
map(({ staging, final }) =>
AttendanceRegistrationLoader.determineLoadOperations(staging, final),
),
switchMap(({ deleted, updated, created }) => {
return from(
Promise.all([
this.repository.deleteAttendanceRegistrations(deleted),
this.repository.updateAttendanceRegistrations(updated),
this.repository.createAttendanceRegistrations(created),
]),
);
}),
);
}
loadPlannedTimes() {
return from(this.transformersService.findPlannedTimes()).pipe(
switchMap((stagingPlannedTimes) => {
if (stagingPlannedTimes.length === 0) {
return of({
staging: [],
final: [],
});
}
const { startDate: firstPlannedTime } = [
...stagingPlannedTimes,
].shift();
const { startDate: lastPlannedTime } = [...stagingPlannedTimes].pop();
return from(
this.repository.findPlannedTimesInInterval({
start: firstPlannedTime,
end: lastPlannedTime,
}),
).pipe(
map((finalPlannedTimes) => ({
final: finalPlannedTimes,
staging: stagingPlannedTimes,
})),
);
}),
map(({ staging, final }) =>
PlannedTimeLoader.determineLoadOperations(staging, final),
),
switchMap(({ deleted, updated, created }) => {
return from(
Promise.all([
this.repository.deletePlannedTimes(deleted),
this.repository.updatePlannedTimes(updated),
this.repository.createPlannedTimes(created),
]),
);
}),
);
}
loadWorkTimes() {
return from(this.transformersService.findWorkTimes()).pipe(
switchMap((stagingWorkTimes) => {
if (stagingWorkTimes.length === 0) {
return of({
staging: [],
final: [],
});
}
const { startDate: firstWorkTime } = [...stagingWorkTimes].shift();
const { startDate: lastWorkTime } = [...stagingWorkTimes].pop();
return from(
this.repository.findWorkTimesInInterval({
start: firstWorkTime,
end: lastWorkTime,
}),
).pipe(
map((finalTours) => ({
final: finalTours,
staging: stagingWorkTimes,
})),
);
}),
map(({ staging, final }) =>
WorkTimeLoader.determineLoadOperations(staging, final),
),
switchMap(({ deleted, updated, created }) => {
return from(
Promise.all([
this.repository.deleteWorkTimes(deleted),
this.repository.updateWorkTimes(updated),
this.repository.createWorkTimes(created),
]),
);
}),
);
}
}