Gérez vous de l'argent pour le compte d'autres personnes ? ou d'autres entreprises ? Vous souhaiteriez que chacun de vos clients possède son propre compte avec son propre historique de transactions ? Vous souhaiteriez également effectuer une séparation stricte entre votre argent d'une part et l'argent de vos clients d'autre part ? Vous voulez avoir la possibilité de fournir à chaque client un relevé des transactions survenues le concernant sur une période donnée ? 1 mois, 1 semaine ou 1 jour par exemple ?
Avec FPay, vous avez la possibilité de créer des Wallet
. Signifiant littéralement "portefeuille" en anglais, chaque Wallet
est comme un compte que vous pouvez alimenter et utiliser. Les transferts d'argent entre Wallet
que vous possédez sont gratuits.
Si vous gérez de l'argent pour plusieurs clients, vous devez créer un Wallet
pour chaque client, et lors de chaque opération vous devez préciser celui à utiliser pour la transaction en cours.
Ainsi, lorsque vous ajoutez de l'argent sur votre compte FPay avec un Deposit
ou une FundRequest
, vous avez la possibilité choisir quel sera le Wallet
sur lequel sera déposé l'argent ainsi ajouté.
C'est la manière idéale pour exprimer la chose suivante: Le client numéro 12 vient d'ajouter de l'argent sur son Wallet
. Si vous préférez, lors de l'entrée d'argent, vous pouvez déposer cet argent sur votre Wallet
principal puis éffectuer un transfer depuis ce Wallet
principal vers le Wallet
du client pour qui l'entrée d'argent a lieu en prenant au passage une commission si nécessaire.
Par exemple, vous initiez un Deposit pour recevoir 10 000₣ pour un client. Vous décidez de déposer cet argent sur votre portefeuille principal. Puis vous transférez 9 950 ₣ sur le Wallet de votre client en question en gardant votre commission de 50₣ au passage.
De même, lors de toute sortie d'argent avec un Transfer
ou un QuasiTransfer
, vous avez la possibilité de préciser de quel Wallet
l'argent sera prélevé.
C'est la manière idéale pour exprimer la chose suivante: Le client numéro 19 vient de retirer de l'argent de son Wallet
. Si vous préférez, vous pouvez retirer de l'argent de votre Wallet
principal puis éffectuer un transfer depuis le Wallet
de votre client vers le votre en prenant au passage une commission si nécessaire.
Par exemple, vous initiez un Transfer pour envoyer 10 000₣ à quelqu'un de la part de votre client. Vous pouvez décider de retirer cet argent de votre portefeuille principal pour le transférer puis vous retirez 10 050 ₣ du Wallet de votre client en question en gardant votre commission de 50₣ au passage.
À la fin du mois, il vous est possible de lister l'ensemble des Transaction
survenues sur un Wallet
donné pour présenter un récapitulatif.
money-in-only
, read/money-in
, ou read-write/no-money-out
comme expliqué sur la page d'Authentification.AuthAccess
comme expliqué sur la page d'Authentification.secretKey
de l'objet AuthAccess
doit voir sa valeur absolument tenue sécrète et utilisée sur vos serveurs uniquement. Il ne sera jamais transmis lors des échanges avec les server-urs de FPay.const fPay = sdk.FPayClient(sdk.Auth({token: '<token>', secretKey: '<secretKey>' }));
const walletPromise =
fPay.wallet.create({
name: "Magasin Yopougon"
});
const walletPromise =
fPay.wallet.create({
name: "Magasin Cocody"
});
const walletPromise =
fPay.wallet.create({
name: "Magasin San-Pedro"
});
const walletPromise =
fPay.wallet.create({
name: "Compte Entreprise #1"
});
const walletPromise =
fPay.wallet.create({
name: "Compte Entreprise #2"
});
const walletPromise =
fPay.wallet.create({
name: "Compte Entreprise #3"
});
Lors de toute entrée d'argent sur votre compte, les fonds recupérés seront déposés sur votre Wallet
principal par défaut. Parce qu'il vous est possible de créer plusieurs Wallet
additionnels, il vous est également possible choisir la destination des fonds une fois que l'utilisateur aura payé.
Ainsi, vous pouvez posséder un Wallet
pour votre épargne ou bien un Wallet
par magasin si vous avez plusieurs magasins et choisir où iront les fonds reçus.
Pour spécifier la destination des fonds, il vous faut le MARS
du Wallet
, accessible via le champ mars.alpha
Par exemple si le MARS du Wallet
est "CI FPay W09POT"
, alors vous devriez entrer le code suivant :
const depositPromise =
fPay.deposit.initiate({
destination: "CI FPay W09POT",
source: {
_type: "Single",
account: {
country: "CI",
identifier: "+2250100000000",
providerKey: "MoovMoney"
}
},
amount: {
currency: "XOF",
value: "10_000"
}
});
Vous avez la possibilité d'éffectuer des mouvements entre tout Wallet
que vous possédez. Ainsi, vous pouvez retirer de l'argent de votre Wallet
pour le déposer sur celui de votre utilisateur et inversement. Ces mouvements de comptes peuvent même correspondre à des utilisateurs que vous avez qui se payent entre eux.
Aussi, si dans le cadre de votre activité, vous êtes amené à recevoir des cautions de la part de vos utilisateurs, vous pouvez stocker cette caution sur leurs Wallet
respectifs. Plus tard, vous pouvez déduire de cette caution les montants correspondant à des infractions qu'ils ont eu à faire en effectuant un Transfer
vers votre Wallet
ou bien, si aucune infraction n'a été commise, vous pouvez initier un remboursement vers leurs portefeuille mobile money directement depuis leurs Wallet
: Les possibilités sont infinies et votre choix dépendra de votre activité.
Imaginons que vous possédez un Wallet
dont le MARS
est "CI FPay MPO099R"
et un autre Wallet
dont dont le MARS
est "CI FPay MOY67RT"
. Pour transférer de l'argent du premier Wallet
vers le second, vous devez faire le code suivant:
const transferPromise =
fPay.transfer.initiate({
amount: "10_000 XOF",
source: "CI FPay MPO099R",
destination: "CI FPay MOY67RT"
});
Lors de toute sortie d'argent, les fonds envoyés seront prélevés sur votre Wallet
principal par défaut. Si la sortie d'argent se fait pour un client spécifique, parce que vous avez la possibilité d'indiquer à FPay le Wallet
à partir duquel l'argent doit être prelevé pour cette sortie d'argent, vous pouvez spécifier le Wallet
du client concerné par cette sortie d'argent, peu importe si cette sortie d'argent est faite via un objet Transfer
ou un objet QuasiTransfer
.
Pour spécifier la source des fonds, il vous faut le MARS
du Wallet
, accessible via le champ mars.alpha
Par exemple si le MARS du Wallet
est "CI FPay W09POT"
, alors vous devriez entrer le code suivant :
const transferPromise =
fPay.transfer.initiate({
amount: {
currency: "XOF",
value: "10_000"
},
source: "CI FPay W09POT",
destination: {
_type: "Single",
account: {
country: "CI",
identifier: "+2250100000000",
providerKey: "MoovMoney"
}
}
});
const quasiTransferPromise =
fPay.quasiTransfer.initiate({
amount: {
currency: "XOF",
value: "10_000"
},
source: "CI FPay W09POT"
});
Supposons que nous sommes le 27 Octobre (27/10) et que nous souhaiterions établir pour un client un relevé des Transaction
survenues sur son Wallet
depuis le 1er du mois jusqu'à ce jour.
Le résultat pourrait se presenter comme sur la figure suivante :
DATE | DETAILS | DEBIT | CREDIT | SOLDE AVANT | SOLDE APRÈS |
---|---|---|---|---|---|
04/10 | Dépôt depuis le 07 00 00 00 00 | + 13 000 ₣ | 150 000 ₣ | 163 000 ₣ | |
05/10 | Dépôt depuis le 07 00 00 00 00 | + 7 000 ₣ | 163 000 ₣ | 170 000 ₣ | |
06/10 | Frais de gestion | - 500 ₣ | 170 000 ₣ | 169 500 ₣ | |
07/10 | Retrait vers le 05 00 00 00 00 | - 10 000 ₣ | 169 500 ₣ | 159 500 ₣ | |
20/10 | Bonus Fidélité | + 1 000 ₣ | 159 500 ₣ | 160 500 ₣ |
Nous allons voir comment construire ce tableau précédent pour chacun de vos clients
Transaction
Chaque fois qu'un changement intervient sur le solde d'un Wallet
, un objet Transaction
est créé pour matérialiser ce mouvement d'argent. Que ce changement de solde soit du à un Transfer
, à un Deposit
ou à tout autre objet, un objet Transaction
sera créé.
Ainsi, pour réaliser le tableau précédent, voici les champs de l'objet Transaction
qui vont nous être utile:
amount
Wallet
considéré.dc
Wallet
considéré."Debit"
ou "Credit"
. "Debit"
, alors le montant qui est toujours positif a été retiré du Wallet
. "Credit"
, alors le montant qui est toujours positif a été ajouté au Wallet
.wallet
Wallet
cible sur lequel la Transaction
à eu lieu. C'est notamment avec ce champ qu'il sera possible d'accéder au solde avant ainsi qu'au solde après la Transaction
.status
Successful
ou Failure
. string
, ce sont des objets. Par exemple l'objet Failure
possède un champ isCancelled
qui permet de savoir si la transaction a échoué parce qu'elle a été annulée.parent
Transaction
. Ce parent peut donc être un objet Transfer
, Deposit
, QuasiTransfer
etc...details
dc
, status
et parent
status
a comme valeur Successful
OU Failure
), dites vous qu'il existera des fonctions pour vous permettre d'utiliser ces valeurs de manière optimale.status
, vous aurez par exemple une fonction isSuccessful()
, une fonction isFailure()
, d'autres fonctions ainsi que la fonction fold .Maintenant que le décor est planté, nous allons :
Transaction
réussies durant le mois en cours pour le Wallet
de l'utilisateur concerné. Supposons que le Wallet
de l'utilisateur considéré possède comme id
la valeur 123456789
.Transaction
les informations requises pour construire le tableau.Transaction
réussies durant le mois en coursconst transactionsCollectionPromise =
fPay.transaction.list({
filter: "status = 'Successful'"
+ " AND createdTime in CurrentMonth"
+ " AND wallet.id = '123456789'",
sortBy: "createdTime:ASC"
});
// Access items in the returned collection, page per page
let transactionsCollection = await transactionsCollectionPromise;
let allTransactions = transactionsCollection.toArray();
while(transactionsCollection.hasNextPage()){
transactionsCollection =
await fPay.transaction.fetchPage(transactionsCollection.pagination.nextPage);
const transactions = transactionsCollection.toArray();
allTransactions = allTransactions.concat(transactions);
}
Transaction
les informations requises pour construire le tableaulet debitTransactionsAmount = [];
let creditTransactionsAmount= [];
for (const transaction of allTransactions) {
const date = new Date(transaction.createdTime.iso8601);
const dayOfMonth = date.getDate();
const month = date.getMonth();
const details = transaction.h1.fr;
const beforeBalance = transaction.wallet.before.balance.available;
const afterBalance = transaction.wallet.after.balance.available;
let debitAmount = null;
if(transaction.dc.isDebit()){
// amount is always positive so we have to negate the value for debit
debitAmount = -transaction.amount.value;
debitTransactionsAmount.push(debitAmount);
}
let creditAmount = null;
if(transaction.dc.isCredit()){
creditAmount = transaction.amount.value;
creditTransactionsAmount.push(creditAmount);
}
// Here we have extracted the most of required values, you can
// do the stuff with them inside the loop
}
const firstTransaction: Transaction = allTransactions[0];
const lastTransaction: Transaction = allTransactions[allTransactions.length-1];
// Finally the values for summary
const initialBalance = firstTransaction.wallet.before.balance.available
const endBalance = lastTransaction.wallet.after.balance.available
const totalDebits = debitTransactionsAmount.reduce((sum, el) => sum + el, 0);
const totalCredits = creditTransactionsAmount.reduce((sum, el) => sum + el, 0);
// Congratulation 🎉🥳👏
// At this point, you can create a beautiful PDF or HTML Table for your user 🥂👏🍾
Lors de la création de l'objet Wallet
, il vous est possible d'attacher votre propre ID interne à votre système. Ainsi, plus tard, lors de la recupération de l'objet Wallet
, vous pourrez utiliser votre propre ID au lieu de l' id
qui sera généré par FPay. L'ID que vous soumettez doit être unique pour chaque type d'objet.
Un des avantages de soumette votre propre identifiant unique est de pouvoir éffectuer des requêtes idempotentes. En effet, si votre foreignId
soumis est unique, alors vous êtes protegé contre les duplications dues au réseaux par exemple et vous contrôlerez les retry sans trembler ni risquer de répéter plusieurs fois la même opération.
const walletPromise =
fPay.wallet.create({
foreignId: "<my internal id>"
});
Avec le code précédent, vous avez désormais le droit de faire le code suivant lors de la recupérationde l'objet Wallet
.
const walletPromise = fPay.wallet.get("<my internal id>");
Lors de la création de l'objet Wallet
, il vous est possible d'ajouter des données qui vous sont propres et qui vous permettront de "tagguer" l'objet créé.
Vous pourrez par exemple ajouter les données suivantes :
{"myKey": 19, "myOtherKey": "myOtherValue"}
<xml><myKey>myValue</myKey></xml>
myValue1, myValue2, myValue3
const walletPromise =
fPay.wallet.create({
foreignData: "<xml><myKey>myValue</myKey></xml>"
});
const walletPromise = fPay.wallet.get("<wallet.id | foreignId>");
walletPromise.then(wallet => {
// Inspect the 'foreignData' field of the Wallet ...
const xmlData = wallet.foreignData;
// xmlData = "<xml><myKey>myValue</myKey></xml>"
});