Skip to content

Commit

Permalink
fix: mise a jour de la requete taux de couverture des organismes (#3843)
Browse files Browse the repository at this point in the history
  • Loading branch information
nkrmr authored Oct 2, 2024
1 parent 55f4f0e commit 3694129
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 165 deletions.
250 changes: 94 additions & 156 deletions server/src/common/actions/indicateurs/indicateurs.actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,26 +136,31 @@ export async function getIndicateursOrganismesParDepartement(
filters: DateFilters & TerritoireFilters,
acl: Acl
): Promise<IndicateursOrganismesAvecDepartement[]> {
const { date, ...restFilters } = filters;

// On ne prend pas en compte la date dans le match car des organismes n'ont pas de date de transmission
const filtersWithoutDate = buildOrganismeMongoFilters(restFilters, acl.infoTransmissionEffectifs);

const dateFilterCondition = date ? [{ $lte: ["$first_transmission_date", new Date(date)] }] : [];

const indicateurs = (await organismesDb()
.aggregate([
{
$match: combineFilters(...buildOrganismeMongoFilters(filters, acl.infoTransmissionEffectifs), {
fiabilisation_statut: "FIABLE",
ferme: false,
}),
$match: {
...combineFilters(...filtersWithoutDate, {
fiabilisation_statut: "FIABLE",
ferme: false,
}),
},
},
{
$group: {
_id: "$adresse.departement",
organismes: {
$sum: 1,
},
totalOrganismes: { $sum: 1 },
responsables: {
$sum: {
$cond: {
if: {
$eq: ["$nature", "responsable"],
},
if: { $eq: ["$nature", "responsable"] },
then: 1,
else: 0,
},
Expand All @@ -164,9 +169,7 @@ export async function getIndicateursOrganismesParDepartement(
responsablesFormateurs: {
$sum: {
$cond: {
if: {
$eq: ["$nature", "responsable_formateur"],
},
if: { $eq: ["$nature", "responsable_formateur"] },
then: 1,
else: 0,
},
Expand All @@ -175,9 +178,7 @@ export async function getIndicateursOrganismesParDepartement(
formateurs: {
$sum: {
$cond: {
if: {
$eq: ["$nature", "formateur"],
},
if: { $eq: ["$nature", "formateur"] },
then: 1,
else: 0,
},
Expand All @@ -187,12 +188,7 @@ export async function getIndicateursOrganismesParDepartement(
$sum: {
$cond: {
if: {
$ne: [
null,
{
$ifNull: ["$first_transmission_date", null],
},
],
$and: [{ $ne: [null, { $ifNull: ["$first_transmission_date", null] }] }, ...dateFilterCondition],
},
then: 1,
else: 0,
Expand All @@ -204,17 +200,9 @@ export async function getIndicateursOrganismesParDepartement(
$cond: {
if: {
$and: [
{
$ne: [
null,
{
$ifNull: ["$first_transmission_date", null],
},
],
},
{
$eq: ["$nature", "responsable"],
},
{ $ne: [null, { $ifNull: ["$first_transmission_date", null] }] },
...dateFilterCondition,
{ $eq: ["$nature", "responsable"] },
],
},
then: 1,
Expand All @@ -227,17 +215,9 @@ export async function getIndicateursOrganismesParDepartement(
$cond: {
if: {
$and: [
{
$ne: [
null,
{
$ifNull: ["$first_transmission_date", null],
},
],
},
{
$eq: ["$nature", "responsable_formateur"],
},
{ $ne: [null, { $ifNull: ["$first_transmission_date", null] }] },
...dateFilterCondition,
{ $eq: ["$nature", "responsable_formateur"] },
],
},
then: 1,
Expand All @@ -250,17 +230,9 @@ export async function getIndicateursOrganismesParDepartement(
$cond: {
if: {
$and: [
{
$ne: [
null,
{
$ifNull: ["$first_transmission_date", null],
},
],
},
{
$eq: ["$nature", "formateur"],
},
{ $ne: [null, { $ifNull: ["$first_transmission_date", null] }] },
...dateFilterCondition,
{ $eq: ["$nature", "formateur"] },
],
},
then: 1,
Expand All @@ -275,13 +247,13 @@ export async function getIndicateursOrganismesParDepartement(
_id: 0,
departement: "$_id",
totalOrganismes: {
total: "$organismes",
total: "$totalOrganismes",
responsables: "$responsables",
responsablesFormateurs: "$responsablesFormateurs",
formateurs: "$formateurs",
inconnues: {
$subtract: [
"$organismes",
"$totalOrganismes",
{
$add: ["$responsables", "$responsablesFormateurs", "$formateurs"],
},
Expand Down Expand Up @@ -309,121 +281,87 @@ export async function getIndicateursOrganismesParDepartement(
},
},
{
$addFields:
/**
* newField: The new field name.
* expression: The new field expression.
*/
{
tauxCouverture: {
total: {
$cond: {
if: {
$gte: [0, "$totalOrganismes.total"],
},
then: 100,
else: {
$multiply: [
100,
{
$divide: ["$organismesTransmetteurs.total", "$totalOrganismes.total"],
},
],
},
$addFields: {
tauxCouverture: {
total: {
$cond: {
if: { $eq: ["$totalOrganismes.total", 0] },
then: 100,
else: {
$multiply: [100, { $divide: ["$organismesTransmetteurs.total", "$totalOrganismes.total"] }],
},
},
responsables: {
$cond: {
if: {
$gte: [0, "$totalOrganismes.responsables"],
},
then: 100,
else: {
$multiply: [
100,
{
$divide: ["$organismesTransmetteurs.responsables", "$totalOrganismes.responsables"],
},
],
},
},
responsables: {
$cond: {
if: { $eq: ["$totalOrganismes.responsables", 0] },
then: 100,
else: {
$multiply: [
100,
{ $divide: ["$organismesTransmetteurs.responsables", "$totalOrganismes.responsables"] },
],
},
},
responsablesFormateurs: {
$cond: {
if: {
$gte: [0, "$totalOrganismes.responsablesFormateurs"],
},
then: 100,
else: {
$multiply: [
100,
{
$divide: [
"$organismesTransmetteurs.responsablesFormateurs",
"$totalOrganismes.responsablesFormateurs",
],
},
],
},
},
responsablesFormateurs: {
$cond: {
if: { $eq: ["$totalOrganismes.responsablesFormateurs", 0] },
then: 100,
else: {
$multiply: [
100,
{
$divide: [
"$organismesTransmetteurs.responsablesFormateurs",
"$totalOrganismes.responsablesFormateurs",
],
},
],
},
},
formateurs: {
$cond: {
if: {
$gte: [0, "$totalOrganismes.formateurs"],
},
then: 100,
else: {
$multiply: [
100,
{
$divide: ["$organismesTransmetteurs.formateurs", "$totalOrganismes.formateurs"],
},
],
},
},
formateurs: {
$cond: {
if: { $eq: ["$totalOrganismes.formateurs", 0] },
then: 100,
else: {
$multiply: [100, { $divide: ["$organismesTransmetteurs.formateurs", "$totalOrganismes.formateurs"] }],
},
},
inconnues: {
$cond: {
if: {
$gte: [0, "$totalOrganismes.inconnues"],
},
then: 100,
else: {
$multiply: [
100,
{
$divide: ["$organismesTransmetteurs.inconnues", "$totalOrganismes.inconnues"],
},
],
},
},
inconnues: {
$cond: {
if: { $eq: ["$totalOrganismes.inconnues", 0] },
then: 100,
else: {
$multiply: [100, { $divide: ["$organismesTransmetteurs.inconnues", "$totalOrganismes.inconnues"] }],
},
},
},
organismesNonTransmetteurs: {
total: {
$subtract: ["$totalOrganismes.total", "$organismesTransmetteurs.total"],
},
responsables: {
$subtract: ["$totalOrganismes.responsables", "$organismesTransmetteurs.responsables"],
},
responsablesFormateurs: {
$subtract: [
"$totalOrganismes.responsablesFormateurs",
"$organismesTransmetteurs.responsablesFormateurs",
],
},
formateurs: {
$subtract: ["$totalOrganismes.formateurs", "$organismesTransmetteurs.formateurs"],
},
inconnues: {
$subtract: ["$totalOrganismes.inconnues", "$organismesTransmetteurs.inconnues"],
},
},
organismesNonTransmetteurs: {
total: {
$subtract: ["$totalOrganismes.total", "$organismesTransmetteurs.total"],
},
responsables: {
$subtract: ["$totalOrganismes.responsables", "$organismesTransmetteurs.responsables"],
},
responsablesFormateurs: {
$subtract: ["$totalOrganismes.responsablesFormateurs", "$organismesTransmetteurs.responsablesFormateurs"],
},
formateurs: {
$subtract: ["$totalOrganismes.formateurs", "$organismesTransmetteurs.formateurs"],
},
inconnues: {
$subtract: ["$totalOrganismes.inconnues", "$organismesTransmetteurs.inconnues"],
},
},
},
},
])
.toArray()) as IndicateursOrganismesAvecDepartement[];

return indicateurs;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import Boom from "boom";
import { isToday } from "date-fns";
import { Filter, ObjectId } from "mongodb";
import { PermissionScope, assertUnreachable, entries } from "shared";
import { IOrganisme } from "shared/models/data/organismes.model";

import { DateFilters, TerritoireFilters } from "../../helpers/filters";
import { TerritoireFilters } from "../../helpers/filters";

export function buildOrganismePerimetreMongoFilters(perimetre: PermissionScope | boolean): Filter<IOrganisme> {
if (perimetre === false) {
Expand Down Expand Up @@ -40,19 +39,13 @@ export function buildOrganismePerimetreMongoFilters(perimetre: PermissionScope |
}, {});
}
export function buildOrganismeMongoFilters(
filters: TerritoireFilters & Partial<DateFilters>,
filters: TerritoireFilters,
perimetre: PermissionScope | boolean
): Filter<IOrganisme>[] {
const perimetreFilter = buildOrganismePerimetreMongoFilters(perimetre);

const requestedFilter = entries(filters).reduce((acc: Filter<IOrganisme>, [key, value]) => {
switch (key) {
case "date": {
if (!isToday(value)) {
acc["first_transmission_date"] = { $lte: value };
}
break;
}
case "organisme_regions":
acc["adresse.region"] = { $in: value };
break;
Expand Down

0 comments on commit 3694129

Please sign in to comment.