Class: Periode

Inherits:
Object
  • Object
show all
Defined in:
lib/clir/data_manager/Periode.rb

Overview

require_relative ‘Date_utils’

Constant Summary collapse

REG_ANNEE =

Méthode qui reçoit les deux premiers arguments de l’initiation pour les interpréter au besoin. Par exemple, on peut fournir seulement une année (dans from_date) ou un mois (MM/AAAA)

N0001

Une année chiffrée (2022) peut avoir été donnée

/^[0-9]{4}$/
REG_MOIS =
/^[0-9]{1,2}\/[0-9]{4}$/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(from_date, to_date = nil, options = nil) ⇒ Periode

Returns a new instance of Periode.



97
98
99
100
101
# File 'lib/clir/data_manager/Periode.rb', line 97

def initialize(from_date, to_date = nil, options = nil)
  from_date, to_date = defaultize(from_date, to_date)
  @from_date = date_from(from_date)  
  @to_date   = date_from(to_date)
end

Instance Attribute Details

#from_dateObject (readonly)

Returns the value of attribute from_date.



95
96
97
# File 'lib/clir/data_manager/Periode.rb', line 95

def from_date
  @from_date
end

#to_dateObject (readonly)

Returns the value of attribute to_date.



95
96
97
# File 'lib/clir/data_manager/Periode.rb', line 95

def to_date
  @to_date
end

Class Method Details

.choose(params = nil) ⇒ Object

Pour définir une période (une date de départ et de fin)



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/clir/data_manager/Periode.rb', line 47

def self.choose(params = nil)
  params ||= {}
  params.merge!(from_date: params.delete(:default)) if params.key?(:default)
  params.key?(:from_date) || params.merge!(from_date: nil)
  params.key?(:to_date)   || params.merge!(to_date: nil)
  params[:from_date] = params[:from_date].to_s if params[:from_date].is_a?(Integer)
  while true
    date_default = params[:from_date] || Time.now
    if not date_default.is_a?(String)
      date_default = date_default.strftime('%d/%m/%Y')
    end
    params[:from_date]  = ask_for_a_date("De la date", date_default)
    if params[:from_date].is_a?(String) 
      if params[:from_date].match?(/^[0-9]{4}$/)
        params.merge!({
          from_date: "01/01/#{params[:from_date]}",
          to_date:   "01/01/#{params[:from_date].to_i + 1}"
        })
        break
      elsif params[:from_date].match?(/^[0-9]{1,2}\/[0-9]{4}$/)
        # 
        # Seulement le mois donné
        # 
        mois, annee = params[:from_date].split('/').collect{|n|n.to_i}
        fromdate, todate =
          if mois == 12
            ["01/12/#{annee}", "01/01/#{annee + 1}"]
          else
            ["01/#{mois.to_s.rjust(2,'0')}/#{annee}", "01/#{(mois + 1).to_s.rjust(2,'0')}/#{annee}"]
          end
        params.merge!(from_date:fromdate, to_date:todate)
        break
      end
    else
      params[:to_date] = ask_for_a_date("À la date", date_default)
      # --- Vérifications ---
      if params[:from_date] > params[:to_date]
        erreur "La date de début ne peut être supérieure à la date de fin…"
      else
        break
      end
    end
  end #/boucle

  return new(params[:from_date], params[:to_date], params[:options])
end

Instance Method Details

#as_du_auObject

Returns un texte comme “de l’année 2021”.

Returns:

  • un texte comme “de l’année 2021”



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
# File 'lib/clir/data_manager/Periode.rb', line 204

def as_du_au
  @as_du_au ||= begin
    if debut_et_fin_de_semaine?
      "de la #{as_human}"
    elsif premier_jour_mois?
      if debut_et_fin_de_mois?
        "du mois d#{human_month.match?(/^[ao]/) ? '' : 'e '}#{human_month} #{human_year}"
      elsif debut_et_fin_trimestre?
        "#{hindex_trimestre} trimestre #{human_year}"
      elsif debut_et_fin_annee?
        "de l’année #{human_year}"
      else
        "du #{human_period_jours}"
      end
    else
      "du #{human_period_jours}"
    end
  end
end

#as_hash_keyObject

  • clé pour table -



161
162
163
# File 'lib/clir/data_manager/Periode.rb', line 161

def as_hash_key
  @as_hash_key ||= "#{from.to_i}-#{to.to_i}"
end

#as_human_joursObject Also known as: du_au



261
262
263
# File 'lib/clir/data_manager/Periode.rb', line 261

def as_human_jours
  @as_human_jours ||= "du #{human_period_jours}"
end

#as_la_periodeObject Also known as: to_s



181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/clir/data_manager/Periode.rb', line 181

def as_la_periode
  @as_la_periode ||= begin
    if debut_et_fin_de_semaine?
      "la #{as_human}"
    elsif premier_jour_mois?
      if debut_et_fin_de_mois?
        "le mois d#{human_month.match?(/^[ao]/) ? '' : 'e '}#{human_month} #{human_year}"
      elsif debut_et_fin_trimestre?
        "#{hindex_trimestre} trimestre #{human_year}"
      elsif debut_et_fin_annee?
        "l’année #{human_year}"
      else
        "le #{human_period_jours}"
      end
    else
      "le #{human_period_jours}"
    end
  end    
end

#debut_et_fin_annee?Boolean

Returns TRUE is la période correspond à une année.

Returns:

  • (Boolean)

    TRUE is la période correspond à une année



307
308
309
310
311
312
313
314
# File 'lib/clir/data_manager/Periode.rb', line 307

def debut_et_fin_annee?
  from_date.day == 1    || return
  from_date.month == 1  || return
  :TRUE == @is_debut_et_fin_annee ||= begin
    dcomp = Time.new(from_date.year + 1, 1, 1)
    to_date.proche?(dcomp) ? :TRUE : :FALSE
  end
end

#debut_et_fin_de_mois?Boolean

Returns TRUE si la période correspond à un mois.

Returns:

  • (Boolean)

    TRUE si la période correspond à un mois



284
285
286
287
288
289
290
# File 'lib/clir/data_manager/Periode.rb', line 284

def debut_et_fin_de_mois?
  from_date.day == 1 || return
  :TRUE == @is_debut_et_fin_de_mois ||= begin
    d = (from_date.to_date >> 1).to_time
    to_date.proche?(d) ? :TRUE : :FALSE
  end
end

#debut_et_fin_de_semaine?Boolean

semaine

Returns:

  • (Boolean)

    TRUE si la période correspond à un début et une fin de



269
270
271
272
273
# File 'lib/clir/data_manager/Periode.rb', line 269

def debut_et_fin_de_semaine?
  :TRUE == @is_debut_et_fin_de_semaine ||= begin
    from_date.wday == 1 && duration.proche?(7.days) ? :TRUE : :FALSE
  end
end

#debut_et_fin_trimestre?Boolean

Returns TRUE si la période correspond à un trimestre.

Returns:

  • (Boolean)

    TRUE si la période correspond à un trimestre



295
296
297
298
299
300
301
302
# File 'lib/clir/data_manager/Periode.rb', line 295

def debut_et_fin_trimestre?
  from_date.day == 1 || return
  :TRUE == @is_debut_et_fin_trimestre ||= begin
    d = from_date.to_date >> 3
    d = Date.new(d.year, d.month, 1).to_time
    to_date.proche?(d) ? :TRUE : :FALSE
  end
end

#defaultize(from_date, to_date) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/clir/data_manager/Periode.rb', line 130

def defaultize(from_date, to_date)
  return [from_date, to_date] if to_date.is_a?(Time) || to_date.is_a?(Date)
  from_date = from_date.to_s # cf. [N0001]
  if to_date.nil?
    if from_date.match?(REG_ANNEE)
      # 
      # Période d'une année
      #
      annee = from_date.to_i
      from_date = "01/01/#{annee}"
      to_date   = "01/01/#{annee + 1}" 
    elsif from_date.match?(REG_MOIS)
      # 
      # Période d'un mois
      # 
      mois, annee = from_date.split('/')
      from_date = "01/#{mois.rjust(2,'0')}/#{annee}"
      if mois.to_i == 12
        mois, annee = [0, annee.to_i + 1]
      end
      to_date = "01/#{(mois.to_i+1).to_s.rjust(2,'0')}/#{annee}"
    end
  end
  return [from_date, to_date]
end

#durationObject

Returns la durée en secondes de la période.

Returns:

  • la durée en secondes de la période



167
168
169
# File 'lib/clir/data_manager/Periode.rb', line 167

def duration
  @duration ||= to_timestamp - from_timestamp
end

#fromObject

  • raccourcis -



157
# File 'lib/clir/data_manager/Periode.rb', line 157

def from; from_date end

#from_moisObject



341
342
343
# File 'lib/clir/data_manager/Periode.rb', line 341

def from_mois
  @from_mois ||= from_date.month
end

#from_timestampObject



171
172
173
# File 'lib/clir/data_manager/Periode.rb', line 171

def from_timestamp
  @from_timestamp ||= from_date.to_i
end

#hindex_trimestreObject



331
332
333
334
335
# File 'lib/clir/data_manager/Periode.rb', line 331

def hindex_trimestre
  @hindex_trimestre ||= begin
    "#{index_trimestre}e#{index_trimestre > 1 ? '' : 'r'}"
  end
end

#human_monthObject

Mois humain (en prenant le mois de from_date)



317
318
319
# File 'lib/clir/data_manager/Periode.rb', line 317

def human_month
  @human_month ||= MOIS[from_date.month][:long]
end

#human_periodObject Also known as: as_human



224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/clir/data_manager/Periode.rb', line 224

def human_period
  @human_period ||= begin
    # Est-ce une semaine ?
    if debut_et_fin_de_semaine?
      "semaine #{from_date.to_date.cweek} de l’année #{human_year}"
    elsif premier_jour_mois?
      if debut_et_fin_de_mois?
        "mois d#{human_month.match?(/^[ao]/) ? '' : 'e '}#{human_month} #{human_year}"
      elsif debut_et_fin_trimestre?
        "#{hindex_trimestre} trimestre #{human_year}"
      elsif debut_et_fin_annee?
        "Année #{human_year}"
      else
        human_period_jours
      end
    else
      human_period_jours
    end
  end
end

#human_period_joursObject

Returns la période simple en jour (lorsqu’aucun période humaine n’a été trouvée).

Returns:

  • la période simple en jour (lorsqu’aucun période humaine n’a été trouvée)



250
251
252
253
254
255
256
257
258
259
# File 'lib/clir/data_manager/Periode.rb', line 250

def human_period_jours
  @human_period_jours ||= begin
    formated_from = formate_date(from_date, **{no_time: true, update_format:true, verbal: true})
    if from_date.year == to_date.year
      # Les années sont identiques, on les rassemble à la fin
      formated_from = formated_from[0..-6]
    end
    "#{formated_from} au #{formate_date(to_date, **{no_time: true, update_format:true, verbal: true})}"
  end
end

#human_yearObject

Année (en prenant l’année de from_date)



321
322
323
# File 'lib/clir/data_manager/Periode.rb', line 321

def human_year
  @human_year ||= from_date.year
end

#index_trimestreObject

Index du trimestre (de from_date)



327
328
329
# File 'lib/clir/data_manager/Periode.rb', line 327

def index_trimestre
  @index_trimestre ||= (from_date.month.to_f / 3).ceil
end

#inspectObject



103
104
105
# File 'lib/clir/data_manager/Periode.rb', line 103

def inspect
  @inspect ||= "#<Periode #{as_la_periode}>"
end

#last_day_of_the_monthObject

dernier jour du mois (en prenant le mois de to_date)



338
339
340
# File 'lib/clir/data_manager/Periode.rb', line 338

def last_day_of_the_month
  @last_day_of_the_month ||= Date.civil(to_date.year, to_date.month, -1).day
end

#premier_jour_mois?Boolean

Returns TRUE si la période commence le premier jour d’un mois.

Returns:

  • (Boolean)

    TRUE si la période commence le premier jour d’un mois



277
278
279
# File 'lib/clir/data_manager/Periode.rb', line 277

def premier_jour_mois?
  from_date.day == 1
end

#time_in?(time) ⇒ Boolean

une multitude de choses) se trouve dans la période courante

Parameters:

  • time (Any)

    Le temps à tester, qui doit pouvoir être évalué par ‘date_from’

    String

    “JJ/MM/AAAA”

    Integer

Returns:

  • (Boolean)

    Si le temps time (qui peut être exprimé par



114
115
116
117
118
# File 'lib/clir/data_manager/Periode.rb', line 114

def time_in?(time)
  return false if time.nil?
  time = date_from(time)
  return time >= from_date && time <= to_date
end

#toObject



158
# File 'lib/clir/data_manager/Periode.rb', line 158

def to; to_date end

#to_moisObject



344
345
346
# File 'lib/clir/data_manager/Periode.rb', line 344

def to_mois
  @to_mois ||= to_mois
end

#to_timestampObject



174
175
176
# File 'lib/clir/data_manager/Periode.rb', line 174

def to_timestamp
  @to_timestamp ||= to_date.to_i
end