]> nos-oignons.net Git - gestion-adh.git/blob - lib/nos_oignons.rb
ef1ac5eed892449be0367bd66d300a873ace762c
[gestion-adh.git] / lib / nos_oignons.rb
1 #-*- coding: utf-8 -*-
2 #
3 # Système de gestion des adhésions de Nos oignons
4 # Copyright © 2013-2014 Nos oignons <contact@nos-oignons.net>
5 #
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.
10 #
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.
15 #
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/>.
18
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'
24
25 module NosOignons
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
34   EOT
35   POSTAL_ADDRESS = <<-EOT.gsub(/^    /, '')
36     Nos oignons
37     Centre UBIDOCA, 7585
38     78 allée Primavera
39     74370 Annecy
40     France
41   EOT
42
43   # The following class methods are all meant to be called as command-line scripts
44   class << self
45     def create_membership_fee_receipt!(member_id, amount)
46       member = NosOignons::Member.new(member_id)
47       member.create_receipt!(amount)
48     end
49
50     def list_emails!
51       NosOignons::Member.all.each do |member|
52         if member.up_to_date?
53           puts member.email
54         end
55       end
56     end
57
58     def update_ag_subscribers!
59       list = NosOignons::MEMBER_MAILING_LIST
60
61       current_emails = NosOignons::Mailman.list_members(list)
62       uptodate_emails = NosOignons::Member.all.select(&:up_to_date?).collect(&:email)
63
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?
68     end
69
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
81
82           member.remind(reminder)
83           break
84         end
85       end
86     end
87
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,
93
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 :
98
99         #{uptodate_emails.join("\n")}
100
101         Et merci encore de votre engagement auprès de Nos oignons !
102
103         -- 
104         Le robot du conseil d'administration
105
106                               GNU AGPLv3 © Nos oignons <contact@nos-oignons.net>
107                                git clone https://nos-oignons.net/gestion-adh.git
108       END_OF_BODY
109       mail = Mail.new :charset => 'utf-8',
110                       :from => NosOignons::BOARD_EMAIL,
111                       :to => NosOignons::ADVISORS_EMAIL,
112                       :subject => subject,
113                       :body => body
114       mail.deliver
115     end
116
117     def pre_commit_hook!
118       if system('git rev-parse --quiet --verify HEAD >/dev/null')
119         against = 'HEAD'
120       else
121         # Initial commit: diff against an empty tree object
122         against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
123       end
124
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}/")
128           begin
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 !"
133             exit 1
134           end
135         end
136       end
137     end
138
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}/")
145             begin
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 !"
149               exit 1
150             end
151           end
152         end
153       end
154     end
155   end
156 end