<aside> ✅ Histoire de mappage en cascade

Il s’agit ici, à partir d’une base de données clients (Customers) et d’une base de données factures (Invoices), de récupérer pour chaque client le montant total des factures impayées, leur nombre et le détail de chaque d’entre elle (lien + montant).

La formule d’origine va rechercher les factures, les filtre selon leur status puis va rechercher le montant de chacune d’elle (map()) pour en afficher la somme sum().

prop("Invoices")
	.filter(current.prop("État")== "A PAYER")
	.map(current.prop("Amount"))
	
	**.sum()**

La même logique est appliquée pour récupérer le nombre de factures concernées.

Le filtre renvoyant une liste d’élément, on dénombre ces éléments avec length().

prop("Invoices")
	.filter(current.prop("État")=="A PAYER")

	**.length()**

Finalement, à partir des montants concernés, la dernière partie de la formule cherche à appliquer un deuxième map() pour lister les détails des factures.

Ce deuxième map() contient un let() qui sert à conserver la valeur de chaque montant dans une variable appelée amount (A ne pas confondre avec la propriété Amount). Via find(), la formule va rechercher parmi toutes les factures déjà filtrées, celle dont le montant correspond à la valeur sauvegardée. En somme, en partant des factures filtrées selon leur status, la formule va remonter aux montants pour ensuite redescendre aux factures pour rechercher à nouveau le montant. De plus, la fonction find() utilisée n’associera pas chaque montant à la bonne facture mais le premier montant trouvé correspondant aux critères, de sorte que lorsque deux factures du même montant seront concernées, seule la première de la liste apparaîtra (mais deux fois). On constate ainsi que pour le “Mauvais client”, la formule affiche deux fois “Invoice A: $666”.

join("\n") permet de transformer la liste en chaîne de caractères permettant un affichage ligne par ligne.

prop("Invoices")
	.filter(current.prop("État")=="A PAYER")
	.map(current.prop("Amount"))

	**.map(
			   let(
				    amount,
				    current,
				    prop("Invoices")
							 .find(current.prop("Amount")== amount) + ": $" + amount
		        )
		  )**
	.join("\n"),

Au total, la formule va filtrer les factures par 3 fois selon les mêmes critères.

La formule corrigée par un follower va directement placer les éléments répétitifs dans des variables via lets() ce qui évite la redondance des calculs et donne plus de clarté car désormais la formule employera simplement les variables invoices (A ne pas confondre avec propriété Invoices).

lets(

	invoices,prop("Invoices").filter(current.prop("État") == "A PAYER"),
	balance, invoices.map(current.prop("Amount")).sum(),

...)

Le reste du code est donc simplifié et beaucoup plus lisible, les styles sont notamment plus faciles à repérer. Sur le fond, ce qui va TOUT changer, c’est la troisième partie : La liste des détails des factures est récupérée à partir d’un seul map() appliquées aux factures filtrées. On part donc bien des factures pour les filtrer. On reste au même niveau pour les afficher (current) et on remonte aux montants des factures concernées (current.prop("Amount")). Il n’y a pas de va et vient comme dans la formule d’origine et chaque facture est bien associée à son montant (au lieu d’essayer d’associer un montant à une facture).

	invoices.map(**current** + ": $" + **current.prop("Amount")**).join("\n"),

La formule corrigée, avec sa simplification technique et visuelle permet de lui apporter des améliorations sans grand effort. Cest un peu comme une chambre bien rangée, il est facile de s’y retrouver et de bouger quelques meubles alors que c’est beaucoup moins évident dans une chambre en désordre.

La création de nouvelles variables permet par exemple de récupérer le montant total des factures par client (payées ou non), le nombre total de factures (régularisées ou non) ou encore la liste des factures régularisées. Le reste n’est que présentation…

**invoicesTotal, prop("Invoices").length(),
balanceTotal, prop("Invoices").map(current.prop("Amount")).sum(),
invoicesRégularisés,prop("Invoices").filter(current.prop("Status")!= "A PAYER"),**

</aside>

Untitled