3 # Système de gestion des adhésions de Nos oignons
4 # Copyright © 2013-2014 Nos oignons <contact@nos-oignons.net>
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as
8 # published by the Free Software Foundation, either version 3 of the
9 # License, or (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 require 'nos_oignons/git'
20 require 'nos_oignons/mailman'
21 require 'nos_oignons/member'
22 require 'nos_oignons/reminder'
23 require 'nos_oignons/reminder_db'
26 BOARD_EMAIL = 'ca@nos-oignons.net'
27 ADVISORS_EMAIL = 'deontologie@nos-oignons.net'
28 MEMBER_MAILING_LIST = 'ag'
29 CONTACT_INFO = <<-EOT.gsub(/^ /, '')
30 https://nos-oignons.net/
31 contact@nos-oignons.net
32 Téléphone : +33 9 72 42 96 04
33 Fax : +33 9 72 42 96 06
35 POSTAL_ADDRESS = <<-EOT.gsub(/^ /, '')
38 105 route des Pommiers
39 74370 Saint Martin Bellevue
43 # The following class methods are all meant to be called as command-line scripts
45 def create_membership_fee_receipt!(member_id, amount)
46 member = NosOignons::Member.new(member_id)
47 member.create_receipt!(amount)
51 NosOignons::Member.all.each do |member|
58 def update_ag_subscribers!
59 list = NosOignons::MEMBER_MAILING_LIST
61 current_emails = NosOignons::Mailman.list_members(list)
62 uptodate_emails = NosOignons::Member.all.select(&:up_to_date?).collect(&:email)
64 emails_to_add = uptodate_emails - current_emails
65 NosOignons::Mailman.add_members(list, emails_to_add) unless emails_to_add.empty?
66 emails_to_remove = current_emails - uptodate_emails
67 NosOignons::Mailman.remove_members(list, emails_to_remove) unless emails_to_remove.empty?
70 def send_membership_reminders!
71 today = Time.now.to_date
72 NosOignons::Member.all.select(&:up_to_date?).each do |member|
73 reminders = NosOignons::Reminder.all.sort_by(&:days)
74 anniversary = Time.new(today.year, member.joined_on.month,
75 member.joined_on.day).to_date
76 next if member.membership_fee_paid_on >= anniversary - reminders.last.days
77 reminders.each do |reminder|
78 next if (anniversary - today).to_i > reminder.days
79 next if member.reminded_on && (anniversary - member.reminded_on).to_i <= reminder.days
81 member.remind(reminder)
87 def send_member_emails_to_advisors!
88 uptodate_emails = NosOignons::Member.all.select(&:up_to_date?).collect(&:email)
89 subject = 'Adresses email des membres à jour de cotisation'
90 body = <<-END_OF_BODY.gsub(/^ /, '')
91 Cher comité de déontologie de Nos oignons,
93 Comme le prévoient les statuts l'article 12 des statuts de
94 l'association, vous devez être en mesure de pouvoir convoquer une
95 assemblée générale extraordinaire. Pour ce faire, voici donc la liste
96 des emails à jour de cotisation à la date d'aujourd'hui :
98 #{uptodate_emails.join("\n")}
100 Et merci encore de votre engagement auprès de Nos oignons !
103 Le robot du conseil d'administration
105 GNU AGPLv3 © Nos oignons <contact@nos-oignons.net>
106 git clone https://nos-oignons.net/gestion-adh.git
108 mail = Mail.new :charset => 'utf-8',
109 :from => NosOignons::BOARD_EMAIL,
110 :to => NosOignons::ADVISORS_EMAIL,
117 if system('git rev-parse --quiet --verify HEAD >/dev/null')
120 # Initial commit: diff against an empty tree object
121 against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
124 IO.popen(['git', 'diff-index', '--cached', '--name-status', against]) do |io|
125 NosOignons::Git.handle_modified_files(io) do |file|
126 next unless file.start_with?("#{NosOignons::MEMBERS_DB_DIR}/")
128 # Use empty ref to get the index
129 NosOignons::Member.read_from_git('', file)
130 rescue ArgumentError, Psych::SyntaxError
131 $stderr.puts "Désolé : #{file} n'a pas le bon format !"
138 def pre_receive_hook!(stdin)
139 stdin.readlines.each do |ref_line|
140 old_value, new_value, ref_name = ref_line.rstrip.split(' ', 3)
141 IO.popen(['git', 'diff', '--name-status', "#{old_value}..#{new_value}"]) do |io|
142 NosOignons::Git.handle_modified_files(io) do |file|
143 next unless file.start_with?("#{NosOignons::MEMBERS_DB_DIR}/")
145 NosOignons::Member.read_from_git(new_value, file)
146 rescue ArgumentError, Psych::SyntaxError
147 $stderr.puts "Désolé : #{file} n'a pas le bon format !"