]> nos-oignons.net Git - gestion-adh.git/blob - lib/nos_oignons.rb
66116bf7a5f7ba41892d23c3fb37677a4bc219b3
[gestion-adh.git] / lib / nos_oignons.rb
1 #-*- coding: utf-8 -*-
2
3 require 'nos_oignons/git'
4 require 'nos_oignons/mailman'
5 require 'nos_oignons/member'
6 require 'nos_oignons/reminder'
7 require 'nos_oignons/reminder_db'
8
9 module NosOignons
10   BOARD_EMAIL = 'ca@nos-oignons.net'
11   ADVISORS_EMAIL = 'deontologie@nos-oignons.net'
12   MEMBER_MAILING_LIST = 'ag'
13   CONTACT_INFO = <<-EOT.gsub(/^    /, '')
14     https://nos-oignons.net/
15     contact@nos-oignons.net
16     Téléphone : +33 9 72 42 96 04
17     Fax : +33 9 72 42 96 06
18   EOT
19   POSTAL_ADDRESS = <<-EOT.gsub(/^    /, '')
20     Nos oignons
21     Centre UBIDOCA, 7585
22     105 route des Pommiers
23     74370 Saint Martin Bellevue
24     France
25   EOT
26
27   # The following class methods are all meant to be called as command-line scripts
28   class << self
29     def create_membership_fee_receipt!(member_id, amount)
30       member = NosOignons::Member.new(member_id)
31       member.create_receipt!(amount)
32     end
33
34     def list_emails!
35       NosOignons::Member.all.each do |member|
36         if member.up_to_date?
37           puts member.email
38         end
39       end
40     end
41
42     def update_ag_subscribers!
43       list = NosOignons::MEMBER_MAILING_LIST
44
45       current_emails = NosOignons::Mailman.list_members(list)
46       uptodate_emails = NosOignons::Member.all.select(&:up_to_date?).collect(&:email)
47
48       emails_to_add = uptodate_emails - current_emails
49       NosOignons::Mailman.add_members(list, emails_to_add) unless emails_to_add.empty?
50       emails_to_remove = current_emails - uptodate_emails
51       NosOignons::Mailman.remove_members(list, emails_to_remove) unless emails_to_remove.empty?
52     end
53
54     def send_membership_reminders!
55       today = Time.now.to_date
56       NosOignons::Member.all.select(&:up_to_date?).each do |member|
57         anniversary = Time.new(today.year, member.joined_on.month,
58                                member.joined_on.day).to_date
59         next if member.membership_fee_paid_on >= anniversary
60         next if member.reminded_on && member.reminded_on >= today
61         NosOignons::Reminder.all.sort_by(&:days).reverse.each do |reminder|
62           next if anniversary < today + reminder.days
63
64           member.remind(reminder)
65           break
66         end
67       end
68     end
69
70     def send_member_emails_to_advisors!
71       uptodate_emails = NosOignons::Member.all.select(&:up_to_date?).collect(&:email)
72       subject = 'Adresses email des membres à jour de cotisation'
73       body = <<-END_OF_BODY.gsub(/^        /, '')
74         Cher comité de déontologie de Nos oignons,
75
76         Comme le prévoient les statuts l'article 12 des statuts de
77         l'association, vous devez être en mesure de pouvoir convoquer une
78         assemblée générale extraordinaire. Pour ce faire, voici donc la liste
79         des emails à jour de cotisation à la date d'aujourd'hui :
80
81         #{uptodate_emails.join("\n")}
82
83         Et merci encore de votre engagement auprès de Nos oignons !
84
85         -- 
86         Le robot du conseil d'administration
87       END_OF_BODY
88       mail = Mail.new :charset => 'utf-8',
89                       :from => NosOignons::BOARD_EMAIL,
90                       :to => NosOignons::ADVISORS_EMAIL,
91                       :subject => subject,
92                       :body => body
93       mail.deliver
94     end
95
96     def pre_commit_hook!
97       if system('git rev-parse --quiet --verify HEAD >/dev/null')
98         against = 'HEAD'
99       else
100         # Initial commit: diff against an empty tree object
101         against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
102       end
103
104       IO.popen(['git', 'diff-index', '--cached', '--name-status', against]) do |io|
105         NosOignons::Git.handle_modified_files(io) do |file|
106           next unless file.start_with?("#{NosOignons::MEMBERS_DB_DIR}/")
107           begin
108             # Use empty ref to get the index
109             NosOignons::Member.read_from_git('', file)
110           rescue ArgumentError, Psych::SyntaxError
111             $stderr.puts "Désolé : #{file} n'a pas le bon format !"
112             exit 1
113           end
114         end
115       end
116     end
117
118     def pre_receive_hook!(stdin)
119       stdin.readlines.each do |ref_line|
120         old_value, new_value, ref_name = ref_line.rstrip.split(' ', 3)
121         IO.popen(['git', 'diff', '--name-status', "#{old_value}..#{new_value}"]) do |io|
122           NosOignons::Git.handle_modified_files(io) do |file|
123             next unless file.start_with?("#{NosOignons::MEMBERS_DB_DIR}/")
124             begin
125               NosOignons::Member.read_from_git(new_value, file)
126             rescue ArgumentError, Psych::SyntaxError
127               $stderr.puts "Désolé : #{file} n'a pas le bon format !"
128               exit 1
129             end
130           end
131         end
132       end
133     end
134   end
135 end