adherent 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/images/adherent/icones/imputation-delete.png +0 -0
- data/app/assets/images/adherent/icones/imputation-edit.png +0 -0
- data/app/assets/images/images/Sorting icons.psd +0 -0
- data/app/assets/images/images/back_disabled.png +0 -0
- data/app/assets/images/images/back_enabled.png +0 -0
- data/app/assets/images/images/back_enabled_hover.png +0 -0
- data/app/assets/images/images/favicon.ico +0 -0
- data/app/assets/images/images/forward_disabled.png +0 -0
- data/app/assets/images/images/forward_enabled.png +0 -0
- data/app/assets/images/images/forward_enabled_hover.png +0 -0
- data/app/assets/images/images/sort_asc.png +0 -0
- data/app/assets/images/images/sort_asc_disabled.png +0 -0
- data/app/assets/images/images/sort_both.png +0 -0
- data/app/assets/images/images/sort_desc.png +0 -0
- data/app/assets/images/images/sort_desc_disabled.png +0 -0
- data/app/assets/javascripts/adherent/allpayments.js +7 -0
- data/app/assets/javascripts/adherent/jquery.dataTables.min.js +157 -0
- data/app/assets/javascripts/adherent/members.js +116 -0
- data/app/assets/stylesheets/adherent/allpayments.css +4 -0
- data/app/assets/stylesheets/adherent/demo_table.css +577 -0
- data/app/controllers/adherent/allpayments_controller.rb +9 -0
- data/app/controllers/adherent/payments_controller.rb +41 -4
- data/app/controllers/adherent/reglements_controller.rb +24 -0
- data/app/helpers/adherent/allpayments_helper.rb +5 -0
- data/app/helpers/adherent/application_helper.rb +24 -9
- data/app/helpers/adherent/payments_helper.rb +1 -10
- data/app/models/adherent/adhesion.rb +10 -6
- data/app/models/adherent/member.rb +2 -2
- data/app/models/adherent/payment.rb +27 -6
- data/app/views/adherent/allpayments/_payment.html.haml +14 -0
- data/app/views/adherent/allpayments/index.html.haml +22 -0
- data/app/views/adherent/members/index.html.erb +6 -5
- data/app/views/adherent/payments/_payment.html.haml +11 -0
- data/app/views/adherent/payments/edit.html.erb +13 -0
- data/app/views/adherent/payments/index.html.haml +1 -12
- data/app/views/adherent/payments/new.html.erb +1 -1
- data/app/views/adherent/payments/show.html.haml +33 -0
- data/app/views/adherent/reglements/show.html.haml +31 -0
- data/config/initializers/validators.rb +12 -0
- data/config/locales/fr.yml +1 -1
- data/config/routes.rb +3 -0
- data/lib/adherent/version.rb +1 -1
- data/test/dummy/app/models/organism.rb +1 -0
- data/test/dummy/log/development.log +14434 -0
- data/test/dummy/log/test.log +62947 -0
- data/test/dummy/tmp/cache/assets/BF0/070/sprockets%2F42b486109907c85c344e3428f5615140 +0 -0
- data/test/dummy/tmp/cache/assets/C2F/180/sprockets%2F24383c007af706866f9a978498308d01 +0 -0
- data/test/dummy/tmp/cache/assets/C44/670/sprockets%2Fe128312dd259094d00196a3f02f41819 +0 -0
- data/test/dummy/tmp/cache/assets/C4D/C10/sprockets%2Fe52bf847776498593423b635698c989c +0 -0
- data/test/dummy/tmp/cache/assets/C50/1E0/sprockets%2Fd687f61462083316a5947ccd9211605a +0 -0
- data/test/dummy/tmp/cache/assets/C53/BA0/sprockets%2F0701319e027b68d87b4d5727aa571973 +0 -0
- data/test/dummy/tmp/cache/assets/C7C/2A0/sprockets%2F451d3616d07ff0801851aecc85940392 +0 -0
- data/test/dummy/tmp/cache/assets/C8B/B50/sprockets%2F1bf0946089435ce76a87bd41668373c2 +0 -0
- data/test/dummy/tmp/cache/assets/C8C/C00/sprockets%2F25d88d6c610820a36668853eea17e359 +0 -0
- data/test/dummy/tmp/cache/assets/C91/5E0/sprockets%2F28a1436ca683918e98c79266d19d430e +0 -0
- data/test/dummy/tmp/cache/assets/CA4/6A0/sprockets%2F49b5803aaa253c1ffa5214311973e684 +0 -0
- data/test/dummy/tmp/cache/assets/CA6/0A0/sprockets%2F63a72244bdf73521f399e501b341d16d +0 -0
- data/test/dummy/tmp/cache/assets/CAA/020/sprockets%2Fa2032410860d92e63293c996d5fa3ac6 +0 -0
- data/test/dummy/tmp/cache/assets/CAA/DA0/sprockets%2Fc1d5b8783261726af51242f75d0034ef +0 -0
- data/test/dummy/tmp/cache/assets/CAD/BF0/sprockets%2Fd27d4e6bd84d0108fc54a21959181335 +0 -0
- data/test/dummy/tmp/cache/assets/CB3/3E0/sprockets%2Ff03d611409c3b2c45d75f97158197ee0 +0 -0
- data/test/dummy/tmp/cache/assets/CB7/310/sprockets%2F9d00a7c05c5990e797170e06dd5641d9 +0 -0
- data/test/dummy/tmp/cache/assets/CC5/430/sprockets%2F887b61f7cb339b94a85b7e721295493c +0 -0
- data/test/dummy/tmp/cache/assets/CC6/700/sprockets%2Fda996593aa3789391cab3d7762f13687 +0 -0
- data/test/dummy/tmp/cache/assets/CC7/410/sprockets%2Fc39062f6a04c41168a923ea22d701a5a +0 -0
- data/test/dummy/tmp/cache/assets/CCB/400/sprockets%2Fb211324ce679335840009b6a2aa45cfc +0 -0
- data/test/dummy/tmp/cache/assets/CD6/8A0/sprockets%2Fcb476833cd1a806e251da407a58d9520 +0 -0
- data/test/dummy/tmp/cache/assets/CDC/0B0/sprockets%2Ffef07c3c165353f861564ede180350a4 +0 -0
- data/test/dummy/tmp/cache/assets/CDD/EB0/sprockets%2F0e17703d917f6560e5c3b46ae85c09a2 +0 -0
- data/test/dummy/tmp/cache/assets/CE0/B90/sprockets%2F7baa8d092b9d409d47643521a8b55e62 +0 -0
- data/test/dummy/tmp/cache/assets/CE1/EB0/sprockets%2Fe2d34e55c19309ae4d1b8628d38514c6 +0 -0
- data/test/dummy/tmp/cache/assets/CE4/B80/sprockets%2Fdc146f8d1ff283ff045000f8349e3942 +0 -0
- data/test/dummy/tmp/cache/assets/CE8/950/sprockets%2Fd68548f1d6d12fe519aea39909520b36 +0 -0
- data/test/dummy/tmp/cache/assets/CEA/B70/sprockets%2F2cdb1061009b0d4430f4d073562b2cbc +0 -0
- data/test/dummy/tmp/cache/assets/CF6/590/sprockets%2F4904f8e3b4e2397b86f64f3549e3d63c +0 -0
- data/test/dummy/tmp/cache/assets/CF8/560/sprockets%2F7e8587b418f3496ca670f76e8b7423ea +0 -0
- data/test/dummy/tmp/cache/assets/CFA/700/sprockets%2Ff51725f304c66b6ed8ab01120cb1a593 +0 -0
- data/test/dummy/tmp/cache/assets/CFD/F60/sprockets%2Faac72c81c4f00133234e7d1bb46d7925 +0 -0
- data/test/dummy/tmp/cache/assets/CFE/380/sprockets%2F25b295cad423d26a3a334e3864cab085 +0 -0
- data/test/dummy/tmp/cache/assets/D04/640/sprockets%2F93cc6f780004fd5b09d1774c3bb0b802 +0 -0
- data/test/dummy/tmp/cache/assets/D0B/520/sprockets%2Fa659c61ab2078241e32ebaf671f87e41 +0 -0
- data/test/dummy/tmp/cache/assets/D0D/CC0/sprockets%2F90fc5652fe6161075680fcd4cd0c45d2 +0 -0
- data/test/dummy/tmp/cache/assets/D14/210/sprockets%2Fb5db5427cdef8d152ae598d461178026 +0 -0
- data/test/dummy/tmp/cache/assets/D15/960/sprockets%2F557c56f5b8b86ba772e07281f1f3a0c7 +0 -0
- data/test/dummy/tmp/cache/assets/D16/870/sprockets%2F3f2a439772fcd9cd0f434f723837ae51 +0 -0
- data/test/dummy/tmp/cache/assets/D16/D00/sprockets%2F52e940c5c1d8089bcdf984d4d27c5520 +0 -0
- data/test/dummy/tmp/cache/assets/D1A/390/sprockets%2F1d08a6978a059fa2494e078ec1ac7e93 +0 -0
- data/test/dummy/tmp/cache/assets/D1A/820/sprockets%2F20a218b05c2726d14bd025c36ba31ddd +0 -0
- data/test/dummy/tmp/cache/assets/D1A/D90/sprockets%2F6c459fd8844374d4aa166c64f544fae0 +0 -0
- data/test/dummy/tmp/cache/assets/D20/590/sprockets%2F22948c5cb4a59a4c252888f75cdf387a +0 -0
- data/test/dummy/tmp/cache/assets/D25/100/sprockets%2F4b9f1fdc6f9b86cc0624a7951766d926 +0 -0
- data/test/dummy/tmp/cache/assets/D26/A70/sprockets%2Fbb35e749193d15ad00bf0d04513a3bd6 +0 -0
- data/test/dummy/tmp/cache/assets/D27/980/sprockets%2F65718e7a65fd89199b02b7cd38b90be9 +0 -0
- data/test/dummy/tmp/cache/assets/D2A/220/sprockets%2Fb0d6ff4608e402650ca685bc013d5d0a +0 -0
- data/test/dummy/tmp/cache/assets/D2B/FA0/sprockets%2F32aa9ce8b2315cc01f8a2c27374215ce +0 -0
- data/test/dummy/tmp/cache/assets/D32/5D0/sprockets%2F3acc8697202c55974ff0122bcf20fa2b +0 -0
- data/test/dummy/tmp/cache/assets/D34/630/sprockets%2Fa259c79ff690848e93962f587da8f2ac +0 -0
- data/test/dummy/tmp/cache/assets/D34/E20/sprockets%2F3c0dfd7a47fb35af6a3ad88310713543 +0 -0
- data/test/dummy/tmp/cache/assets/D3E/7A0/sprockets%2Ff9a1dbe464c536a11de32284fbc89192 +0 -0
- data/test/dummy/tmp/cache/assets/D3F/640/sprockets%2F9b448668c4c3a12d6aaa017b94e69ed2 +0 -0
- data/test/dummy/tmp/cache/assets/D42/040/sprockets%2F3def97f4406db752008fa340f74a6e3f +0 -0
- data/test/dummy/tmp/cache/assets/D42/C40/sprockets%2F224cf987cad00c39ae3d39b971f8109b +0 -0
- data/test/dummy/tmp/cache/assets/D44/860/sprockets%2F9157a652853bd3cea861bd767fed0b08 +0 -0
- data/test/dummy/tmp/cache/assets/D44/BF0/sprockets%2Fcf34626c45538b36718fd50fa9bcb2e6 +0 -0
- data/test/dummy/tmp/cache/assets/D45/2A0/sprockets%2F9c55f3eca763e68ded31023b7f66543a +0 -0
- data/test/dummy/tmp/cache/assets/D46/650/sprockets%2F6ee2abb1888774ab7c549f15b50d615f +0 -0
- data/test/dummy/tmp/cache/assets/D48/B20/sprockets%2F5768e2da329c68c958acde5d26124de0 +0 -0
- data/test/dummy/tmp/cache/assets/D48/FD0/sprockets%2F4403ce85c7fe84fe60d426553aa99b1f +0 -0
- data/test/dummy/tmp/cache/assets/D49/2D0/sprockets%2F59e843295151ccde25afb2f9f6e7a605 +0 -0
- data/test/dummy/tmp/cache/assets/D4B/710/sprockets%2F41e4ac5488184198d7e33e18b7aece4f +0 -0
- data/test/dummy/tmp/cache/assets/D4B/C40/sprockets%2F2428f6c76bb4a5efb583e158681fb73d +0 -0
- data/test/dummy/tmp/cache/assets/D51/560/sprockets%2Ff6c8347aff37a4784ea82069ba176f5f +0 -0
- data/test/dummy/tmp/cache/assets/D52/250/sprockets%2F967f6481dd795af37e3a49be042f8e1b +0 -0
- data/test/dummy/tmp/cache/assets/D56/090/sprockets%2F4af17d268e2ffe72af8a78b78811f666 +0 -0
- data/test/dummy/tmp/cache/assets/D57/2C0/sprockets%2F57e8e5954196bd14468ff5db3ae99cd0 +0 -0
- data/test/dummy/tmp/cache/assets/D5F/600/sprockets%2F9c4623e57da4d15adb71bd1b04188b1d +0 -0
- data/test/dummy/tmp/cache/assets/D63/7A0/sprockets%2Fa0d549181d4ba25b5ed57b841efc2d14 +0 -0
- data/test/dummy/tmp/cache/assets/D65/0C0/sprockets%2F409bdde508f6197117fe0ab1344ca3de +0 -0
- data/test/dummy/tmp/cache/assets/D65/900/sprockets%2F4dd3fce32a54a0f8fb029c30f41d3487 +0 -0
- data/test/dummy/tmp/cache/assets/D68/100/sprockets%2F7d7522df5cd3ba1f22c81c653dd5d651 +0 -0
- data/test/dummy/tmp/cache/assets/D6A/5C0/sprockets%2F9b410af44867a4979d1aea0ab84ed24b +0 -0
- data/test/dummy/tmp/cache/assets/D6B/970/sprockets%2F214e29a7345faee9672bca1756e4aaf1 +0 -0
- data/test/dummy/tmp/cache/assets/D6B/D20/sprockets%2Fee6531726dfe6592fa84b42a420b6acd +0 -0
- data/test/dummy/tmp/cache/assets/D71/AF0/sprockets%2Fb289e7b3562dcfd42bd0957f27a2f52a +0 -0
- data/test/dummy/tmp/cache/assets/D73/0F0/sprockets%2F5ba6d2f108d33e64b84fc4dd91960d6e +0 -0
- data/test/dummy/tmp/cache/assets/D73/8B0/sprockets%2Fac0e6a1f5b87c2966f07864c89c0acc3 +0 -0
- data/test/dummy/tmp/cache/assets/D7A/3E0/sprockets%2F3dfc09dcfefff43d4680267d832149c3 +0 -0
- data/test/dummy/tmp/cache/assets/D7B/800/sprockets%2F850d92cf676cc2c2c662ee8dc328f82c +0 -0
- data/test/dummy/tmp/cache/assets/D7D/950/sprockets%2F8259f3fc885403b4eea8dd12964c2ffc +0 -0
- data/test/dummy/tmp/cache/assets/D7F/140/sprockets%2Fb6961cbff5838a917c93f2cb6185d6ae +0 -0
- data/test/dummy/tmp/cache/assets/D92/430/sprockets%2Fc55e2bbc3d3c5566893be021ec1c4ab7 +0 -0
- data/test/dummy/tmp/cache/assets/D9A/810/sprockets%2F53a9bd5325fcfa4148c273e3deb2d19d +0 -0
- data/test/dummy/tmp/cache/assets/D9D/BA0/sprockets%2Fa3a3f78f8e854339e32a5ab0638abbbf +0 -0
- data/test/dummy/tmp/cache/assets/DA7/930/sprockets%2F06db55d1b7d0c96a4ff1657e169e6ece +0 -0
- data/test/dummy/tmp/cache/assets/DA8/0D0/sprockets%2F74dcf71bbdf4ad56a3b4338b93d9866c +0 -0
- data/test/dummy/tmp/cache/assets/DAD/8E0/sprockets%2F498547cbaefbf040cfff05e9c6e53386 +0 -0
- data/test/dummy/tmp/cache/assets/DB0/A80/sprockets%2F9fdb8e951f975dae3836c2ccf0f65a34 +0 -0
- data/test/dummy/tmp/cache/assets/DBC/890/sprockets%2Fa6a1ac17a4326ab9f49d1a74de70f3aa +0 -0
- data/test/dummy/tmp/cache/assets/DC1/9E0/sprockets%2F4fdc113ba37308cc3d7d2dbbe1e9d625 +0 -0
- data/test/dummy/tmp/cache/assets/DCC/170/sprockets%2Fa2b9a6a717a82fc483c94abbe71aa95f +0 -0
- data/test/dummy/tmp/cache/assets/DCD/870/sprockets%2F26f53f256948ecabba69abf1e1dea282 +0 -0
- data/test/dummy/tmp/cache/assets/DD3/F60/sprockets%2Fde4fdc4d1f700596d5f2ce7077fbc32e +0 -0
- data/test/dummy/tmp/cache/assets/DD4/980/sprockets%2Fed1289bfd5270a38bd9adfcb8d0627c8 +0 -0
- data/test/dummy/tmp/cache/assets/DD7/110/sprockets%2Fa7626606dec6ffd4a8a4b76abb7f6a94 +0 -0
- data/test/dummy/tmp/cache/assets/DD7/2D0/sprockets%2F9f68c831ccc33f95a6b0a5d7aaf76d8a +0 -0
- data/test/dummy/tmp/cache/assets/DED/9A0/sprockets%2F1e96fab65eff8789cd8c76ffadf40814 +0 -0
- data/test/dummy/tmp/cache/assets/E12/820/sprockets%2Ff8ced48d293d9ae81be776bac3d3de86 +0 -0
- data/test/dummy/tmp/cache/assets/E2A/410/sprockets%2F73874a0edbd48f62ca7cad3c4a9e6aca +0 -0
- data/test/dummy/tmp/cache/assets/E3B/7A0/sprockets%2F3c7ac679f8c2cf31dec4ed6ee8064ece +0 -0
- data/test/dummy/tmp/cache/assets/E5A/2A0/sprockets%2Fed33dc2e47cddca2a7f3b9d850f01fef +0 -0
- data/test/dummy/tmp/cache/assets/E8E/C80/sprockets%2Fbcfe97b68b37db0b902decd4ea5ae8ea +0 -0
- data/test/dummy/tmp/pids/server.pid +1 -1
- metadata +78 -2
|
@@ -14,20 +14,35 @@ module Adherent
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
# Pour transformer un montant selon le format numérique français avec deux décimales
|
|
17
|
-
def
|
|
17
|
+
def two_decimals(montant)
|
|
18
18
|
ActionController::Base.helpers.number_with_precision(montant, precision:2) rescue '0,00'
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
# utilisé dans les vues qui demandent un montant
|
|
23
|
-
def two_decimals(montant)
|
|
24
|
-
sprintf('%0.02f',montant)
|
|
25
|
-
rescue
|
|
26
|
-
'0.00'
|
|
27
|
-
end
|
|
28
|
-
|
|
21
|
+
|
|
29
22
|
def icon_to_users
|
|
30
23
|
icon_to 'users.png', members_path, title:'Liste des membres'
|
|
31
24
|
end
|
|
25
|
+
|
|
26
|
+
def list_imputations(payment)
|
|
27
|
+
|
|
28
|
+
content_tag(:ul) do
|
|
29
|
+
payment.reglements.map do |r|
|
|
30
|
+
content_tag(:li) do
|
|
31
|
+
imputation_with_actions(payment, r)
|
|
32
|
+
end
|
|
33
|
+
end.join.html_safe
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def imputation_with_actions(pay, reglt)
|
|
38
|
+
html = ''
|
|
39
|
+
html << "Adhésion #{reglt.adhesion.member.to_s} pour #{number_to_currency(reglt.amount, locale: :fr)}"
|
|
40
|
+
html << " "
|
|
41
|
+
html << "#{icon_to 'detail.png', payment_reglement_path(pay, reglt)}"
|
|
42
|
+
# html << "#{icon_to 'imputation-edit.png', edit_payment_reglement_path(pay, reglt), title:'Modifier l\'imputation'}"
|
|
43
|
+
# html << "#{icon_to 'imputation-delete.png', payment_reglement_path(pay, reglt), title:'Supprimer l\'imputation'}"
|
|
44
|
+
html.html_safe
|
|
45
|
+
end
|
|
46
|
+
|
|
32
47
|
end
|
|
33
48
|
end
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
module Adherent
|
|
2
2
|
module PaymentsHelper
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
content_tag(:ul) do
|
|
6
|
-
payment.reglements.map do |r|
|
|
7
|
-
content_tag(:li) do
|
|
8
|
-
"Adhésion #{r.adhesion.member.to_s} pour #{number_to_currency(r.amount, locale: :fr)}"
|
|
9
|
-
end
|
|
10
|
-
end.join.html_safe
|
|
11
|
-
end
|
|
12
|
-
end
|
|
3
|
+
|
|
13
4
|
end
|
|
14
5
|
end
|
|
@@ -32,12 +32,15 @@ module Adherent
|
|
|
32
32
|
}
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
# liste toutes les adhésions qui ne sont pas payées
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
# liste toutes les adhésions qui ne sont pas payées.
|
|
36
|
+
# pour rappel un where ne fonctionne pas avec un aggrégat obligeant à utiliser la clause having
|
|
37
|
+
# reglements_amount.to_i donne le montant des règlements enregistrés
|
|
38
|
+
# to_i est nécessaire car le retour fait par Rails est un string
|
|
39
|
+
scope :unpaid, select('adherent_adhesions.*, sum(adherent_reglements.amount) as reglements_amount').
|
|
40
|
+
joins('left join adherent_reglements on adherent_reglements.adhesion_id = adherent_adhesions.id').
|
|
41
|
+
group('adherent_adhesions.id').
|
|
42
|
+
having('adherent_adhesions.amount > 0 AND (adherent_adhesions.amount > sum(adherent_reglements.amount) OR sum(adherent_reglements.amount) IS NULL)')
|
|
43
|
+
|
|
41
44
|
|
|
42
45
|
# méthode mise en place pour assurer une mise en forme lisible
|
|
43
46
|
# dans la sélection des imputations
|
|
@@ -67,6 +70,7 @@ module Adherent
|
|
|
67
70
|
imputation = [montant, due].min
|
|
68
71
|
r = reglements.new(amount:imputation)
|
|
69
72
|
r.payment_id = payment_id
|
|
73
|
+
puts r.errors.messages unless r.valid?
|
|
70
74
|
r.save!
|
|
71
75
|
r
|
|
72
76
|
|
|
@@ -12,9 +12,9 @@ module Adherent
|
|
|
12
12
|
validates :number, :name, :forname , :organism_id, :presence=>true
|
|
13
13
|
validates_uniqueness_of :number, :scope=>:organism_id
|
|
14
14
|
|
|
15
|
-
#
|
|
15
|
+
# arel des adhésions impayées par ordre de date
|
|
16
16
|
def unpaid_adhesions
|
|
17
|
-
adhesions.order(:to_date).
|
|
17
|
+
adhesions.order(:to_date).unpaid
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# indique s'il y a des adhésions impayées pour ce membre
|
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
module Adherent
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
# La classe Payment permet d'enregistrer les payments effectués par les adhérents
|
|
4
|
+
#
|
|
5
|
+
# Un callback after_create tente d'imputer le réglement sur une adhésion qui soit due.
|
|
6
|
+
#
|
|
7
|
+
# Comme il est possible qu'un adhérent fasse un réglement pour plusieurs personnes (les
|
|
8
|
+
# membres de sa famille par exemple), il est possible d'éclater des payments sur
|
|
9
|
+
# différents réglements. Un payment a donc plusieurs réglements.
|
|
10
|
+
#
|
|
11
|
+
# Des méthodes non_impute et imputation_on_adh(adhesion) permettent de savoir
|
|
12
|
+
# si la totalité du payment a été affectée à un réglement et d'imputer le montant
|
|
13
|
+
# sur une adhésion spécifiée.
|
|
14
|
+
#
|
|
15
|
+
# Un validator spécifique est mis en place pour interdire de diminuer le payment
|
|
16
|
+
# en dessous des montants déja imputés.
|
|
17
|
+
#
|
|
18
|
+
class Payment < ActiveRecord::Base
|
|
3
19
|
|
|
4
20
|
has_many :reglements, :dependent=>:destroy
|
|
5
21
|
belongs_to :member
|
|
@@ -7,11 +23,12 @@ module Adherent
|
|
|
7
23
|
attr_accessible :amount, :date, :mode
|
|
8
24
|
|
|
9
25
|
validates :amount, :date, :mode, :member_id, presence:true
|
|
26
|
+
validates :amount, :over_imputations=>true
|
|
10
27
|
|
|
11
|
-
pick_date_for :date
|
|
28
|
+
pick_date_for :date
|
|
12
29
|
|
|
13
|
-
|
|
14
|
-
validates_numericality_of :amount
|
|
30
|
+
|
|
31
|
+
validates_numericality_of :amount
|
|
15
32
|
# le mode doit être dans les MODES
|
|
16
33
|
validates_inclusion_of :mode, in: Adherent::MODES
|
|
17
34
|
|
|
@@ -29,7 +46,11 @@ module Adherent
|
|
|
29
46
|
# calcule le montant du paiement qui n'a pas été imputé, donc qui
|
|
30
47
|
# ne correspond pas à des réglements
|
|
31
48
|
def non_impute
|
|
32
|
-
amount -
|
|
49
|
+
amount - impute
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def impute
|
|
53
|
+
reglements(true).sum(:amount)
|
|
33
54
|
end
|
|
34
55
|
|
|
35
56
|
|
|
@@ -50,7 +71,7 @@ module Adherent
|
|
|
50
71
|
# on crée un réglement du montant dû dans la limité du montant du paiement.
|
|
51
72
|
a_imputer = amount
|
|
52
73
|
member.unpaid_adhesions.each do |adh|
|
|
53
|
-
if a_imputer > 0
|
|
74
|
+
if a_imputer > 0
|
|
54
75
|
reglemt = adh.add_reglement(id, a_imputer)
|
|
55
76
|
a_imputer -= reglemt.amount
|
|
56
77
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
%tr
|
|
2
|
+
%td
|
|
3
|
+
= payment.member.to_s
|
|
4
|
+
= icon_to 'payment.png', member_payments_path(payment.member), title:'Liste des paiements de cet adhérent'
|
|
5
|
+
%td= payment.date
|
|
6
|
+
%td.numeric= two_decimals payment.amount
|
|
7
|
+
%td= payment.mode
|
|
8
|
+
%td= list_imputations(payment)
|
|
9
|
+
%td.numeric= two_decimals payment.non_impute
|
|
10
|
+
|
|
11
|
+
%td
|
|
12
|
+
- if (payment.non_impute != 0.0)
|
|
13
|
+
= icon_to 'imputation.png', new_payment_reglement_path(payment), title: 'Imputer le solde sur une adhésion'
|
|
14
|
+
= icon_to 'detail.png', member_payment_path(payment.member, payment)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
= content_for :menu do
|
|
2
|
+
= icon_to_users
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
.champ
|
|
7
|
+
%h3 Table de tous les paiements
|
|
8
|
+
|
|
9
|
+
%table.table.display.table-striped.table-bordered.table-condensed#allpayments(cellpadding="0" cellspacing="0" border="0")
|
|
10
|
+
%thead
|
|
11
|
+
%tr
|
|
12
|
+
%th De
|
|
13
|
+
%th.date-euro Le
|
|
14
|
+
%th Montant (€)
|
|
15
|
+
%th Par
|
|
16
|
+
%th Imputé sur
|
|
17
|
+
%th Reste à imputer (€)
|
|
18
|
+
%th Actions
|
|
19
|
+
%tbody
|
|
20
|
+
= render partial:'adherent/allpayments/payment', collection:@payments
|
|
21
|
+
|
|
22
|
+
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<%= content_for :menu do %>
|
|
2
|
-
|
|
3
|
-
<%= icon_to '
|
|
2
|
+
|
|
3
|
+
<%= icon_to 'nouveau.png', new_member_path, title:'Ajouter un membre' %>
|
|
4
|
+
<%= icon_to 'payment.png', payments_path, title:'Table des paiements' %>
|
|
4
5
|
<% end -%>
|
|
5
6
|
|
|
6
7
|
|
|
@@ -8,7 +9,7 @@
|
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
<h3>Liste des <%= I18n::t('members') %></h3>
|
|
11
|
-
<table class="table table-striped table-bordered table-condensed" cellpadding="0" cellspacing="0" border="0">
|
|
12
|
+
<table class="table display table-striped table-bordered table-condensed" id='members' cellpadding="0" cellspacing="0" border="0">
|
|
12
13
|
<thead>
|
|
13
14
|
<tr>
|
|
14
15
|
|
|
@@ -18,12 +19,12 @@
|
|
|
18
19
|
|
|
19
20
|
<th><%= I18n::t('forname') %></th>
|
|
20
21
|
|
|
21
|
-
<th><%= I18n::t('birthdate') %></th>
|
|
22
|
+
<th class='date-euro'><%= I18n::t('birthdate') %></th>
|
|
22
23
|
|
|
23
24
|
<th><%= I18n::t('mail') %></th>
|
|
24
25
|
<th><%= I18n::t('tel') %></th>
|
|
25
26
|
|
|
26
|
-
<th>Actions</th>
|
|
27
|
+
<th class='actions'>Actions</th>
|
|
27
28
|
|
|
28
29
|
</tr>
|
|
29
30
|
</thead>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
%tr
|
|
2
|
+
%td= payment.date
|
|
3
|
+
%td.numeric= number_to_currency(payment.amount, locale: :fr)
|
|
4
|
+
%td= payment.mode
|
|
5
|
+
%td= list_imputations(payment)
|
|
6
|
+
%td.numeric= number_to_currency payment.non_impute, locale: :fr
|
|
7
|
+
|
|
8
|
+
%td
|
|
9
|
+
- if (payment.non_impute != 0.0)
|
|
10
|
+
= icon_to 'imputation.png', new_payment_reglement_path(payment), title: 'Imputer le solde sur une adhésion'
|
|
11
|
+
= icon_to 'detail.png', member_payment_path(payment.member, payment)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<%= content_for :menu do %>
|
|
2
|
+
|
|
3
|
+
<%= icon_to 'payment.png', member_payments_path(@member) %>
|
|
4
|
+
<% end -%>
|
|
5
|
+
|
|
6
|
+
<div class="champ">
|
|
7
|
+
<h3>Enregistrement d'un paiement de <%= @member.to_s %></h3>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="row-fluid inner-champ">
|
|
10
|
+
|
|
11
|
+
<%= render 'form' %>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
@@ -16,15 +16,4 @@
|
|
|
16
16
|
%th Reste à imputer
|
|
17
17
|
%th Actions
|
|
18
18
|
%tbody
|
|
19
|
-
|
|
20
|
-
%tr
|
|
21
|
-
%td= payment.date
|
|
22
|
-
%td= number_to_currency(payment.amount, locale: :fr)
|
|
23
|
-
%td= payment.mode
|
|
24
|
-
%td= list_imputations(payment)
|
|
25
|
-
%td= number_to_currency payment.non_impute, locale: :fr
|
|
26
|
-
|
|
27
|
-
%td
|
|
28
|
-
- if (payment.non_impute != 0.0)
|
|
29
|
-
= icon_to 'imputation.png', new_payment_reglement_path(payment), title: 'Imputer le solde sur une autre adhésion'
|
|
30
|
-
= icon_to 'supprimer.png', [@member,payment], method: :delete, confirm: 'Etes vous sûr ?'
|
|
19
|
+
= render @payments
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
= content_for :menu do
|
|
2
|
+
= icon_to 'payment.png', member_payments_path(@member), title:"Liste des paiements de #{@member.to_s}"
|
|
3
|
+
= icon_to 'money-plus.png', new_member_payment_path(@member), title:'Nouveau paiement'
|
|
4
|
+
- if (@payment.non_impute != 0.0)
|
|
5
|
+
= icon_to 'imputation.png', new_payment_reglement_path(@payment), title: 'Imputer le solde sur une autre adhésion'
|
|
6
|
+
= icon_to 'modifier.png', edit_member_payment_path(@payment.member, @payment)
|
|
7
|
+
= icon_to 'supprimer.png', [@member,@payment], method: :delete, confirm: 'Etes vous sûr ?'
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
.champ
|
|
11
|
+
%h3 Détail d'un paiement
|
|
12
|
+
|
|
13
|
+
.inner-champ
|
|
14
|
+
%p
|
|
15
|
+
%b Effectué par :
|
|
16
|
+
= @member.to_s
|
|
17
|
+
%p
|
|
18
|
+
%b Le :
|
|
19
|
+
= @payment.date
|
|
20
|
+
%p
|
|
21
|
+
%b Montant :
|
|
22
|
+
= number_to_currency(@payment.amount, locale: :fr)
|
|
23
|
+
%p
|
|
24
|
+
%b Par :
|
|
25
|
+
= @payment.mode
|
|
26
|
+
%p
|
|
27
|
+
%b Imputé sur :
|
|
28
|
+
= list_imputations(@payment)
|
|
29
|
+
%p
|
|
30
|
+
%b Reste à imputer :
|
|
31
|
+
= number_to_currency @payment.non_impute, locale: :fr
|
|
32
|
+
|
|
33
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
= content_for :menu do
|
|
2
|
+
= icon_to 'supprimer.png', [@payment, @reglement], method: :delete, confirm: 'Etes vous sûr ?'
|
|
3
|
+
= icon_to 'retour.png', :back
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
.champ
|
|
8
|
+
%h3 Détail d'un réglement
|
|
9
|
+
|
|
10
|
+
.inner-champ
|
|
11
|
+
%p
|
|
12
|
+
%b Imputé sur un payment effectué par :
|
|
13
|
+
= @payment.member.to_s
|
|
14
|
+
%p
|
|
15
|
+
%b Le :
|
|
16
|
+
= @payment.date
|
|
17
|
+
%p
|
|
18
|
+
%b d'un montant total de :
|
|
19
|
+
= number_to_currency(@payment.amount, locale: :fr)
|
|
20
|
+
%p
|
|
21
|
+
%b dont sur ce réglement :
|
|
22
|
+
= number_to_currency(@reglement.amount, locale: :fr)
|
|
23
|
+
%p
|
|
24
|
+
%b enregistré le :
|
|
25
|
+
= l @reglement.created_at
|
|
26
|
+
- if @reglement.created_at != @reglement.updated_at
|
|
27
|
+
%p
|
|
28
|
+
%b modifié le :
|
|
29
|
+
= l @reglement.updated_at
|
|
30
|
+
|
|
31
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# ce validator est utilisé par Payment pour s'assurer que
|
|
2
|
+
# le montant du Payment est effectivement supérieur aux réglements
|
|
3
|
+
# qui ont déjà été imputés sur ce paiement.
|
|
4
|
+
#
|
|
5
|
+
class OverImputationsValidator < ActiveModel::EachValidator
|
|
6
|
+
|
|
7
|
+
def validate_each(record, attribute, value)
|
|
8
|
+
if (record.reglements.any? && value < record.impute)
|
|
9
|
+
record.errors.add(attribute, :under_imputations)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
data/config/locales/fr.yml
CHANGED
data/config/routes.rb
CHANGED
data/lib/adherent/version.rb
CHANGED