Class: Stupidedi::Versions::FunctionalGroups::FiftyTen::ElementTypes::DateVal::Improper

Inherits:
Stupidedi::Versions::FunctionalGroups::FiftyTen::ElementTypes::DateVal show all
Defined in:
lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb

Overview

Date with a partially-specified year (two digits, missing century). Shouldn’t be directly instantiated – instead, use the constuctor method value

Instance Attribute Summary collapse

Attributes inherited from Stupidedi::Values::SimpleElementVal

#position, #usage

Instance Method Summary collapse

Methods inherited from Stupidedi::Versions::FunctionalGroups::FiftyTen::ElementTypes::DateVal

#date?, empty, value

Methods inherited from Stupidedi::Values::SimpleElementVal

#allowed?, #component?, #date?, #id?, #leaf?, #numeric?, #simple?, #string?, #time?

Methods inherited from Stupidedi::Values::AbstractElementVal

#element?, #size

Methods inherited from Stupidedi::Values::AbstractVal

#blank?, #characters, #component?, #composite?, #definition, #element?, #functional_group?, #interchange?, #invalid?, #loop?, #present?, #repeated?, #segment?, #separator?, #simple?, #size, #table?, #transaction_set?, #transmission?

Methods included from Color

ansi, #ansi

Constructor Details

#initialize(year, month, day, usage, position) ⇒ Improper

Returns a new instance of Improper.



330
331
332
333
334
335
336
337
338
339
340
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 330

def initialize(year, month, day, usage, position)
  @year, @month, @day = year, month, day

  # Check that date is reasonably valid
  unless @year.between?(0, 99) and @month.between?(1, 12) and @day.between?(1, 31)
    raise Exceptions::InvalidElementError,
      "invalid date year: #{year}, month: #{month}, day: #{day}"
  end

  super(usage, position)
end

Instance Attribute Details

#dayInteger (readonly)

Returns:

  • (Integer)


328
329
330
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 328

def day
  @day
end

#monthInteger (readonly)

Returns:

  • (Integer)


325
326
327
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 325

def month
  @month
end

#yearInteger (readonly)

Returns:

  • (Integer)


322
323
324
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 322

def year
  @year
end

Instance Method Details

#==(other) ⇒ Boolean

Note:

Not commutative

Returns:

  • (Boolean)


494
495
496
497
498
499
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 494

def ==(other)
  eql?(other) or
   (@day   == other.day  and
    @year  == other.year and
    @month == other.month)
end

#century(cc) ⇒ Proper

Create a proper date using the given century ‘cc`

Examples:

DateVal.value("501015").century(19) #=> DateVal.value("19501230")

Returns:



370
371
372
373
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 370

def century(cc)
  date = ::Date.civil(100 * cc + @year, @month, @day)
  Proper.new(date, usage, position)
end

#copy(changes = {}) ⇒ Improper

Returns:



343
344
345
346
347
348
349
350
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 343

def copy(changes = {})
  Improper.new \
    changes.fetch(:year, @year),
    changes.fetch(:month, @month),
    changes.fetch(:day, @day),
    changes.fetch(:usage, usage),
    changes.fetch(:position, position)
end

#empty?Boolean

Returns:

  • (Boolean)


356
357
358
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 356

def empty?
  false
end

#futureProper

Create a proper date which cannot be older than the current date

Returns:



447
448
449
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 447

def future
  oldest(Date.today)
end

#inspectString

Returns:

  • (String)


452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 452

def inspect
  id = definition.bind do |d|
    "[#{"% 5s" % d.id}: #{d.name}]".bind do |s|
      if usage.forbidden?
        ansi.forbidden(s)
      elsif usage.required?
        ansi.required(s)
      else
        ansi.optional(s)
      end
    end
  end

  ansi.element("DT.value#{id}") << "(XX#{"%02d-%02d-%02d" % [@year, @month, @day]})"
end

#newest(date) ⇒ Proper

Create a proper date which cannot be newer than the given ‘date` and cannot be older than one year before the given `date`.

Examples:

DateVal.value("501015").newest(Date.civil(1950, 10, 20)) #=> DateVal.value("19501015")
DateVal.value("501015").newest(Date.civil(1950, 10, 15)) #=> DateVal.value("19501015")
DateVal.value("501015").newest(Date.civil(1950, 10, 10)) #=> DateVal.value("18501015")

Returns:



415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 415

def newest(date)
  cc, yy = date.year.divmod(100)

  if @year < yy
    century(cc)
  elsif @year > yy
    century(cc - 1)
  else
    if @month < date.month
      century(cc)
    elsif @month > date.month
      century(cc - 1)
    else
      if @day <= date.day
        century(cc)
      else
        century(cc - 1)
      end
    end
  end
end

#oldest(date) ⇒ Proper

Create a proper date which cannot be older than the given ‘date` and cannot be newer than one year after the given `date`.

Examples:

DateVal.value("501015").oldest(Date.civil(1950, 10, 20)) #=> DateVal.value("20501015")
DateVal.value("501015").oldest(Date.civil(1950, 10, 15)) #=> DateVal.value("19501015")
DateVal.value("501015").oldest(Date.civil(1950, 10, 10)) #=> DateVal.value("19501015")

Returns:



384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 384

def oldest(date)
  cc, yy = date.year.divmod(100)

  if @year < yy
    century(cc + 1)
  elsif @year > yy
    century(cc)
  else
    if @month < date.month
      century(cc + 1)
    elsif @month > date.month
      century(cc)
    else
      if @day < date.day
        century(cc + 1)
      else
        century(cc)
      end
    end
  end
end

#pastProper

Create a proper date which cannot be newer than the current date

Returns:



440
441
442
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 440

def past
  newest(Date.today)
end

#proper?Boolean

Returns:

  • (Boolean)


360
361
362
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 360

def proper?
  false
end

#to_sString

Returns:

  • (String)


469
470
471
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 469

def to_s
  "XX%02d%02d%02d" % [@year, @month, @day]
end

#to_x12(truncate = true) ⇒ String

Returns:

  • (String)


474
475
476
477
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 474

def to_x12(truncate = true)
  x12 = "%02d%02d%02d" % [@year, @month, @day]
  truncate ? x12.slice(0, definition.max_length) : x12
end

#too_long?Boolean

Returns:

  • (Boolean)


485
486
487
488
489
490
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 485

def too_long?
  # We know month and day occupy four characters, but year *could*
  # occupy either three or two characters. If the max_length can't
  # accomodate a three-digit year, make sure we don't have one
  definition.max_length < 7 and @year > 99
end

#too_short?Boolean

Returns:

  • (Boolean)


479
480
481
482
483
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 479

def too_short?
  # Less than a 4-digit year means our max length is 7, but in
  # practice the definition min/max lengths are either 6 or 8
  definition.min_length > 6
end

#valid?Boolean

Returns:

  • (Boolean)


352
353
354
# File 'lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb', line 352

def valid?
  true
end