257 lines
7.9 KiB
TypeScript
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),
|
|
]),
|
|
);
|
|
}),
|
|
);
|
|
}
|
|
}
|