IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Simplification comptes bancaires


Sujet :

JavaScript

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut Simplification comptes bancaires
    Bonsoir,

    Je cherche à recréer une mini appli comme le site tricount.
    En gros, 4 amis (ou plus) partagent des dépenses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    toto a dépensé : 34€
    tata a dépensée : 3,5€
    titi a dépensé : 45€
    ...
    J'aimerai calculer en JS la somme que chaque personne devra à chaque personne, connaissez vous un algo ou quelque chose, car je ne vois pas du tout comment faire ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    ????

    Rembourser ?

    Tu veux dire une moyenne ? de sorte que chacun ait dépensé la même somme ?

    toto a dépensé : 34€
    tata a dépensée : 3,5€
    titi a dépensé : 45€

    dépenses totale :81.50
    chacun aurait du dépenser 27.17 ou 27.16 €

    donc en gros qui doit rembourser combien a qui pour arriver à cette moyenne ?

    c'est ça ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Oui voilà.
    En fait j'aimerai que la fonction que me sorte qui va devoir quoi à qui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    toto doit 20€ à tata
    titi doit 4€ à toto
    titi doit 5€ à tata

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    Il y a de multiples possibilités pour ce genre de remboursements...
    Tu veux juste une solution au hasard, ou que le script te retourne toutes les possibilités ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    En fait si possible celui qui retourne toutes les possibilités. Mais par dessus tout j'aimerai comprendre son fonctionnement, parce que la je prend un exemple pour 3 personnes, en vrai j'en aurai 14.

    Idéalement même,il faudrait que je puisse ajouter en gros des dettes :
    Qui a payé quoi et pour qui ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    user1 à payé 120€ pour user2, user10 et user12
    user8 a payé 40€ pour user3 et user4
    Et du coup qui doit quoi à qui ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    user2 doit 30€ à user1
    user10 doit 30€ à user1
    user12 doit 30€ à user1
    user3 doit 13.33€ à user8
    user4 doit 13.33€ à user8
    Bon la l'exemple est facile car y'a pas de user commun entre les dettes, mais voilà en gros ce que j'aimerai faire au final

  6. #6
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Salut,

    dans ma signature, un lien pour gérer ses comptes entre amis, qui ferait exactement ce que tu voudrais (un peu de réclame ça fait pas de mal...)

    Bon, pour sinon pour te dire un peu comment fonctionne mon algo à moi (c'est pas secret défense), mais comme l'a dit SpaceFrog il ya plein desolution possible : tu calcules la somme que chacun doit recevoir ou donné au total sur l'ensemble des dépenses (parce que tes sous que tu les donnes à machin ou truc, de toutes façons ils sortent de ta poche). Ensuite, pour aller au plus court, tu supprimes à chaque fois soit le plus gros donneur soit le plus gros receveur et faisant un transfert d'argent du donneur vers le receveur.
    Je m'explique : si le A (plus gros receveur) doit recevoir 3€, et B (plus gros donneur) doit 2€, tu dis que B doit donner 2€ à A. B ne doit plus rien et A doit encore recevoir 1€, de n'importe qui d'autre. Et tu recommences un tour de boucle.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Merci pour ta réponse, mais j'ai un doute sur un truc

    Si A paye 40€ d'essence, et que B,C,D sont présents dans la voiture.
    Du coup on a ça ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A => +40€
    B => -10€
    C => -10€
    D => -10

  8. #8
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Non, A doit prendre sa part aussi (d'ailleurs la somme du tableau doit toujours faire 0) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A => +30€
    B => -10€
    C => -10€
    D => -10
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    OK merci beaucoup.
    Bon maintenant, c'est quand même compliqué de faire la fameuse boucle qui regarde qui paye le plus et le moins, par exemple si ils sont plusieurs ?
    N'aurais tu pas un exemple ? Ou juste le début de l'idée parce que la je sèche un peu

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Bon voici ce que j'ai fait comme page : https://jsfiddle.net/w8x0pqtt/
    Je ne sais pas pourquoi, mais le fonction change du select ne fonctionne pas sous fiddle (elle est censée cacher le checkbox du payeur).
    Peut-être que pour la tester, mieux vaut faire un copier/coller du code et l’héberger chez soit.
    J'ai certaines erreur sous Firefox, à l'ajout de certaines dettes, ça plante carrément mon FF, dès fois j'ai une erreur dans firebug qui dit "too much recursion" au niveau du init dans la fonction max (cf code).

    Pouvez-vous m'aider ? Et surtout, est-ce que les résultats sont corrects ? En fait je permets à tout le monde de faire des dettes séparées : choisir qui est inclut dans la dette.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
     
    <html>
    	<head>
    		<script type="text/javascript" src="../includes/scripts/jquery.min.js"></script>
    		<script>
    			$(document).ready(function() {
    				reset(true);
    				$('#ok').live('click', function() {
    					total = 0;
    					entier = 0;
    					var debiteurs = '';
    					var user = new Array();
    					var solde = new Array();
    					var qui = $('#qui').val();
    					var quoi = $('#quoi').val();
    					var montant = $('#montant').val();
    					var classe = $('#montant').attr('class');
    					if (quoi != '') {
    						if (qui != '') {
    							if (montant != '') {
    								if (classe != 'wrong') {
    									$('input[type="checkbox"]').each(function() {
    										if (($(this).prop('checked')) || ($(this).prop('name') == qui)) {	
    											total++;
    										}
    									});
    									$('input[type="checkbox"]').each(function() {
    										if ($(this).prop('checked')) {
    											entier++;
    										}
    									});
    									if (entier > 0) {
    										$('#error').html('');
    										$('#equilibre').html('');
    										var part = arrondi(parseFloat(montant/total));
    										$('input[type="checkbox"]').each(function() {
    											var name = $(this).prop('name');
    											if ($(this).prop('checked')) {
    												if ($(this).prop('checked')) {
    													debiteurs += ' '+name+',';
    												}
    												var ecot = arrondi(parseFloat($('.'+name+' span').html()));
    												sous = parseFloat(ecot) - parseFloat(part);
    												sous = Math.round(sous * 100) / 100;
    												sous = (sous > 0) ? '+'+sous : sous;
    												$('.'+name+' span').html(sous);
    											} else if (name == qui) {
    												var ecot = arrondi(parseFloat($('.'+name+' span').html()));
    												sous = parseFloat(ecot) + (parseFloat(montant) - parseFloat(part));
    												sous = Math.round(sous * 100) / 100;
    												sous = (sous > 0) ? '+'+sous : sous;
    												$('.'+name+' span').html(sous);
    											}
    										});
    										debiteurs = debiteurs.replace(/,$/, '');
    										$('#comptes div').each(function() {
    											var fou = $(this).attr('class');
    											var value = $(this).children('span').html().replace('+','');
    											solde.push(value);
    											user.push(fou);
    										});
    										ancien = $('#total span').html();
    										nouveau = parseFloat(ancien) + parseFloat(montant);
    										$('#total span').html(nouveau);
    										$('#history').append('<div>'+montant+' € '+quoi+' > payé par '+qui+' (avec'+debiteurs+')</div>');
    										calcule(solde, user);
    										reset(true);
    									} else {
    										$('#error').html('ERREUR : Merci de cocher au moins un fou.');
    									}
    								} else {
    									$('#error').html('ERREUR : Montant invalide.');
    								}
    							} else {
    								clignote('montant');
    							}
    						} else {
    							clignote('qui');
    						}
    					} else {
    						clignote('quoi');
    					}
    				});
    				$('#montant').live('keyup', function(e) {
    					if (!isNumeric($(this).val())) {
    						$(this).addClass('wrong');
    					} else {
    						$(this).removeClass('wrong');
    						if (e.keyCode == 13) {
    							$('#ok').click();
    						}
    					}
    				});
    			});
    			function reset(tout) {
    				if (tout) {
    					$('#qui').val(0);
    					$('#quoi').val('');
    					$('#quoi').focus();
    					$('#montant').val('');
    				}
    				$('input[type=checkbox]').each(function() {
    					$(this).prop('checked', false);
    				});
    			}
    			function change() {
    				reset(false);
    				$('#montant').focus();
    				var qui = $('#qui').val();
    				if (qui != '') {
    					$('input[type="checkbox"]').each(function() {
    						var name = $(this).prop('name');
    						if (name == qui) {	
    							$('#'+name).hide();
    						} else {
    							$('#'+name).show();
    						}
    					});
    				}
    			}
    			function isNumeric(chiffre) {
    				var chiffre = chiffre.toString();
    				var regex = /^\d{0,6}(\.\d{0,2}){0,1}$/;
    				return (chiffre - 0) == chiffre && (''+chiffre).replace(/^\s+|\s+$/g, '').length > 0 && (regex.test(chiffre)) && ((chiffre.charAt( chiffre.length - 1) != '.') && (chiffre.charAt(0) != '.') && (chiffre != 0));
    			}
    			function clignote(id) {
    				$('#'+id).addClass('wrong').stop(true,true).delay(200).queue(function() {
    					$(this).removeClass('wrong');
    					$(this).dequeue();
    				});
    				$('#'+id).val('').focus();
    			}
    			function max(array, type) {
    				init = 0;//too much recursion
    				indice = 0;
    				for (i=0;i<array.length;i++) {
    					value = parseFloat(array[i]);
    					if (value > init) {
    						init = value;
    						indice = i;
    					}
    				}
    				return (type == 'indice') ? indice : init;
    			};
    			function min(array, type) {
    				init = 0;
    				indice = 0;
    				for (i=0;i<array.length;i++) {
    					value = parseFloat(array[i]);
    					if ((value != 0) && (value < init)) {
    						init = value;
    						indice = i;
    					}
    				}
    				return (type == 'indice') ? indice : init;
    			};
    			function somme(array) {
    				init = 0;
    				for (i=0;i<array.length;i++) {
    					init += parseFloat(array[i]);
    				}
    				return init;
    			}
    			function zero(array) {
    				init = false;
    				for (i=0;i<array.length;i++) {
    					if (array[i] != 0) {
    						init = true;
    					}
    				}
    				return init;
    			}
    			function calcule(solde, user) {
    				max_don = 0.5;
    				while (zero(solde)) {
    					max_solde = arrondi(parseFloat(max(solde)));
    					min_solde_indice = min(solde, 'indice');
    					max_solde_indice = max(solde, 'indice');
    					donner = Math.abs(solde[min_solde_indice]);
    					if (donner < max_solde) {
    						solde[min_solde_indice] = 0;
    						solde[max_solde_indice] = parseFloat(solde[max_solde_indice]) - parseFloat(donner);
    						if ((max_solde >= max_don) && (user[min_solde_indice] != user[max_solde_indice])) {
    							$('#equilibre').append(ucfirst(user[min_solde_indice])+' doit '+arrondi(donner)+' € à '+ucfirst(user[max_solde_indice])+'<br>');
    						}
    					} else {
    						solde[min_solde_indice] = parseFloat(solde[min_solde_indice]) + parseFloat(max_solde);
    						solde[max_solde_indice] = 0;
    						if ((max_solde >= max_don) && (user[min_solde_indice] != user[max_solde_indice])) {
    							$('#equilibre').append(ucfirst(user[min_solde_indice])+' doit '+arrondi(max_solde)+' € à '+ucfirst(user[max_solde_indice])+'<br>');
    						}
    					}
    					calcule(solde, user);
    				}
    			}
    			function ucfirst(string) {
    				return string.charAt(0).toUpperCase() + string.slice(1);
    			}
    			function arrondi(chiffre) {
    				decimal = 1;
    				round = 2;
    				for (i=0;i<round;i++) {
    					decimal *= 10;
    				}
    				return Math.round(chiffre * decimal) / decimal;
    			}
    		</script>
    	</head>
    	<body>
    		<table cellspacing="0" cellpadding="0">
    			<tr>
    				<td>Quoi ?</td>
    				<td>
    					<input id="quoi" type="text"></input>
    				</td>
    				<td></td>
    			</tr>
    			<tr>
    				<td>Qui a payé ?</td>
    				<td>
    					<select id="qui" onchange="change();">
    						<option value=""></option>
    						<option value="alex">Alex</option>
    						<option value="jean">Jean</option>
    						<option value="paul">Paul</option>
    						<option value="pierre">Pierre</option>
    						<option value="jacques">Jacques</option>
    					</select>
    				</td>
    				<td></td>
    			</tr>
    			<tr>
    				<td>Montant</td>
    				<td>
    					<input id="montant" type="text"></input>
    				</td>
    				<td>
    					EUR
    				</td>
    			</tr>
    			<tr>
    				<td></td>
    				<td>
    					<input id="ok" type="button" value="Ajouter"></input>
    				</td>
    				<td></td>
    			</tr>
    		</table>
    		<label id="alex"><input type="checkbox" name="alex">Alex</label>
    		<label id="jean"><input type="checkbox" name="jean">Jean</label>
    		<label id="paul"><input type="checkbox" name="paul">Paul</label>
    		<label id="pierre"><input type="checkbox" name="pierre">Pierre</label>
    		<label id="jacques"><input type="checkbox" name="jacques">Jacques</label>
    		<div id="total"><span>0</span> €</div>
    		<div id="history"></div>
    		<div id="comptes">
    			<div class="alex">Alex : <span>0</span> €</div>
    			<div class="jean">Jean : <span>0</span> €</div>
    			<div class="paul">Paul : <span>0</span> €</div>
    			<div class="pierre">Pierre : <span>0</span> €</div>
    			<div class="jacques">Jacques : <span>0</span> €</div>
    		</div>
    		<div id="equilibre"></div>
    		<div id="error"></div>
    	</body>
    </html>

Discussions similaires

  1. VCS - N° de compte bancaire
    Par Tragnee dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 01/03/2007, 15h48
  2. [VBA-E]Projet de compte bancaire personnel
    Par thibaut_chaps dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/12/2006, 23h41
  3. Réponses: 5
    Dernier message: 31/05/2006, 20h06
  4. Algorithme [Gestion d'un compte bancaire]
    Par Laeticia dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 04/02/2005, 10h57
  5. [Modèle Relationnel] Gestion de comptes bancaires.
    Par Elmilouse dans le forum Schéma
    Réponses: 3
    Dernier message: 31/08/2004, 16h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo