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 Identifiant SIREN 842 479 313
31 https://nos-oignons.net/
32 contact@nos-oignons.net
33 Téléphone : +33 9 72 42 96 04
35 POSTAL_ADDRESS = <<-EOT.gsub(/^ /, '')
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 reminders = NosOignons::Reminder.all.sort_by(&:days)
73 NosOignons::Member.all.select(&:up_to_date?).each do |member|
74 next if member.membership_fee_paid_on.year == (today + reminders.last.days).year
75 anniversary = Time.new(today.next_month.year, member.joined_on.month,
76 member.joined_on.day).to_date
77 next if member.membership_fee_paid_on >= anniversary - reminders.last.days
78 reminders.each do |reminder|
79 next if (anniversary - today).to_i > reminder.days
80 next if member.reminded_on && (anniversary - member.reminded_on).to_i <= reminder.days
82 member.remind(reminder)
88 def send_member_emails_to_advisors!
89 uptodate_emails = NosOignons::Member.all.select(&:up_to_date?).collect(&:email)
90 subject = 'Adresses email des membres à jour de cotisation'
91 body = <<-END_OF_BODY.gsub(/^ /, '')
92 Cher comité de déontologie de Nos oignons,
94 Comme le prévoient les statuts l'article 12 des statuts de
95 l'association, vous devez être en mesure de pouvoir convoquer une
96 assemblée générale extraordinaire. Pour ce faire, voici donc la liste
97 des emails à jour de cotisation à la date d'aujourd'hui :
99 #{uptodate_emails.join("\n")}
101 Et merci encore de votre engagement auprès de Nos oignons !
104 Le robot du conseil d'administration
106 GNU AGPLv3 © Nos oignons <contact@nos-oignons.net>
107 git clone https://nos-oignons.net/gestion-adh.git
109 mail = Mail.new :charset => 'utf-8',
110 :from => NosOignons::BOARD_EMAIL,
111 :to => NosOignons::ADVISORS_EMAIL,
118 if system('git rev-parse --quiet --verify HEAD >/dev/null')
121 # Initial commit: diff against an empty tree object
122 against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
125 IO.popen(['git', 'diff-index', '--cached', '--name-status', against]) do |io|
126 NosOignons::Git.handle_modified_files(io) do |file|
127 next unless file.start_with?("#{NosOignons::MEMBERS_DB_DIR}/")
129 # Use empty ref to get the index
130 NosOignons::Member.read_from_git('', file)
131 rescue ArgumentError, Psych::SyntaxError
132 $stderr.puts "Désolé : #{file} n'a pas le bon format !"
139 def pre_receive_hook!(stdin)
140 stdin.readlines.each do |ref_line|
141 old_value, new_value, ref_name = ref_line.rstrip.split(' ', 3)
142 IO.popen(['git', 'diff', '--name-status', "#{old_value}..#{new_value}"]) do |io|
143 NosOignons::Git.handle_modified_files(io) do |file|
144 next unless file.start_with?("#{NosOignons::MEMBERS_DB_DIR}/")
146 NosOignons::Member.read_from_git(new_value, file)
147 rescue ArgumentError, Psych::SyntaxError
148 $stderr.puts "Désolé : #{file} n'a pas le bon format !"