activerecord-peoplesoft_models 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dce9b6270234a91ace6d2eedd92aec2be9c65b32
4
+ data.tar.gz: 427bfc9074b0dc5bf9a0f45e6f5f2533cb53c471
5
+ SHA512:
6
+ metadata.gz: 86bf5ab3d3d37816f0fa55efcdbc74dc7d942d33942294d2ce6b52b2a5204dcce38b1b7adbf5b0cfad8c58a806203084b151a554b723a8c9ab8182f702ada870
7
+ data.tar.gz: b9383b8f2048c6b635e4be5a1a28256f5e4896731caa85bbd0d661417e0fc226b4abe3fa6d15d9bd9fb3a201c4cf710c4311e56a85305f239fcf7ce8b7cd2668
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ /test/config/database.yml
16
+ /vendor/bundle
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - "2.2.3"
4
+ - "2.1.7"
5
+ - "2.0"
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in activerecord-peoplesoft.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Chris Dinger
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,153 @@
1
+ # Peoplesoft Models for ActiveRecord ![Build Status](https://travis-ci.org/cdinger/activerecord-peoplesoft_models.svg)
2
+
3
+ This Rubygem provides an easy way to build ActiveRecord models for reading
4
+ data from a PeopleSoft database.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'activerecord-peoplesoft_models', '~> 1.0.0'
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install activerecord-peoplesoft_models
21
+
22
+ ## Versions
23
+
24
+ - Version 1.x works with ActiveRecord 4.2
25
+ - Version 0.x works with ActiveRecord 4.1
26
+
27
+ ## Usage
28
+
29
+ PeoplesoftModels works by dynamically constructing ActiveRecord classes for
30
+ accessing PeopleSoft tables. The model names are created under the
31
+ `PeoplesoftModels` namespace.
32
+
33
+ You can use these models directly:
34
+
35
+ ```ruby
36
+ PeoplesoftModels::AcadSubplnTbl.first
37
+ ```
38
+
39
+ Or subclass them to add your own associations, business logic, or just a more
40
+ meaningful name:
41
+
42
+ ```ruby
43
+ class Minor < PeoplesoftModels::AcadSubplnTbl
44
+ end
45
+ ```
46
+
47
+ These classes:
48
+
49
+ - set the table name
50
+ - set the primary keys
51
+ - include an `effective` scope (if the table is effective dated)
52
+
53
+ ```ruby
54
+ Minor.table_name
55
+ => "PS_ACAD_SUBPLN_TBL"
56
+
57
+ Minor.primary_keys
58
+ => ["institution", "acad_plan", "acad_sub_plan", "effdt"]
59
+
60
+ Minor.effective.to_sql
61
+ => "SELECT \"PS_ACAD_SUBPLN_TBL\".* FROM \"PS_ACAD_SUBPLN_TBL\" INNER JOIN (SELECT \"PS_ACAD_SUBPLN_TBL\".\"INSTITUTION\", \"PS_ACAD_SUBPLN_TBL\".\"ACAD_PLAN\", \"PS_ACAD_SUBPLN_TBL\".\"ACAD_SUB_PLAN\", MAX(\"PS_ACAD_SUBPLN_TBL\".\"EFFDT\") AS effdt FROM \"PS_ACAD_SUBPLN_TBL\" WHERE (\"PS_ACAD_SUBPLN_TBL\".\"EFFDT\" <= TO_DATE('2014-12-03','YYYY-MM-DD HH24:MI:SS')) GROUP BY institution, acad_plan, acad_sub_plan) EFF_KEYS_PS_ACAD_SUBPLN_TBL ON \"PS_ACAD_SUBPLN_TBL\".\"INSTITUTION\" = EFF_KEYS_PS_ACAD_SUBPLN_TBL.\"INSTITUTION\" AND \"PS_ACAD_SUBPLN_TBL\".\"ACAD_PLAN\" = EFF_KEYS_PS_ACAD_SUBPLN_TBL.\"ACAD_PLAN\" AND \"PS_ACAD_SUBPLN_TBL\".\"ACAD_SUB_PLAN\" = EFF_KEYS_PS_ACAD_SUBPLN_TBL.\"ACAD_SUB_PLAN\" AND \"PS_ACAD_SUBPLN_TBL\".\"EFFDT\" = EFF_KEYS_PS_ACAD_SUBPLN_TBL.\"EFFDT\""
62
+ ```
63
+
64
+ ## `effective` scope
65
+
66
+ The `effective` scope, without arguments, will return only rows that are
67
+ effective as of today. This scope also accepts a date, which will return rows
68
+ that are effective as of that date.
69
+
70
+ ## Example
71
+
72
+ ```ruby
73
+ class College < PeoplesoftModels::AcadProgTbl
74
+ end
75
+
76
+ class EnrolledCollege < PeoplesoftModels::AcadProg
77
+ belongs_to :college, -> { effective }, primary_key: College.primary_key, foreign_key: College.primary_key
78
+ end
79
+
80
+ class Student < PeoplesoftModels::Person
81
+ has_many :enrolled_colleges, -> { effective }, primary_key: self.primary_key, foreign_key: self.primary_key
82
+ has_many :colleges, through: :enrolled_colleges
83
+ end
84
+
85
+ student = Student.where(emplid: "1234567").first
86
+ student.colleges
87
+ ```
88
+
89
+ ## Using a different database connection
90
+
91
+ The `PeoplesoftModels::Base` class exists only as a convenient point for
92
+ changing the database connection used for accessing PeopleSoft tables. To use a
93
+ different connection, define an initializer in your app like this:
94
+
95
+ ```ruby
96
+ # config/initializers/peoplesoft_models.rb
97
+ PeoplesoftModels::Base.establish_connection :"peoplesoft_#{Rails.env}"
98
+ ```
99
+
100
+ ## Schema prefixing
101
+
102
+ The `PeoplesoftModels::Base` class can also be configured to prefix the
103
+ `table_name` of any its subclassed models with the defined schema.
104
+
105
+ If your database setup requires you to prefix your tables like, say
106
+ `HCM.PS_JOB`, you can do this in an intitializer:
107
+
108
+ ```ruby
109
+ # config/initializers/peoplesoft_models.rb
110
+ PeoplesoftModels::Base.schema_name = "HCM"
111
+ ```
112
+
113
+ That'll cause any of its models to automatically prepend `HCM` like so:
114
+
115
+ ```ruby
116
+ PeoplesoftModels::Job.table_name
117
+ => "HCM.PS_JOB"
118
+ ```
119
+
120
+ ## Required table permissions
121
+
122
+ This gem uses PeopleSoft's `PSRECDEFN` and `PSRECFIELD` tables to lookup up table
123
+ metadata. If access to your PeopleSoft instance is restricted, be sure to ask
124
+ for access to these tables.
125
+
126
+ ## Tests
127
+
128
+ `bundle exec rake test` runs the test suite. By default, tests that need
129
+ to hit a database run in an in-memory sqlite3 database.
130
+
131
+ You can optionally define other connections in `test/config/database.yml` and
132
+ use them by referencing a connection in the `DATABASE` environment variable.
133
+ Tests that alter the database are skipped if you specify a different
134
+ connection.
135
+
136
+ `DATABASE=peoplesoft_dev bundle exec rake test`
137
+
138
+ There's also a console available if you want to poke around a real instance of
139
+ PeopleSoft:
140
+
141
+ `DATABASE=peoplesoft_dev ./console`
142
+
143
+ ## Motivation and principles
144
+
145
+ This library is the third crack at trying to solve this problem. The first two
146
+ iterations where huge, complex, and difficult to maintain. They required
147
+ the explicit definition of each individual model/keys and they required the
148
+ understanding of a thick layer of configuration in order to use them.
149
+
150
+ This take aims for simplicity. This thing is less than 100 lines of code and it
151
+ shouldn't need to grow much bigger than that. There's no wild configuration and
152
+ minimal magic. The goal is to do one thing, do it well, and get out of the
153
+ developer's way.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task :test do
4
+ $LOAD_PATH.unshift('lib', 'test')
5
+ Dir.glob('./test/**/*_test.rb') { |f| require f }
6
+ end
7
+
8
+ task :default => [:test]
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'peoplesoft_models/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "activerecord-peoplesoft_models"
8
+ spec.version = PeoplesoftModels::VERSION
9
+ spec.authors = ["Chris Dinger"]
10
+ spec.email = ["ding0057@umn.edu"]
11
+ spec.summary = %q{ActiveRecord models for working with PeopleSoft tables}
12
+ spec.description = %q{}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "composite_primary_keys", "~> 8.0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.7"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "sqlite3", "~> 1.3.10"
26
+ spec.add_development_dependency "activerecord-oracle_enhanced-adapter", "~> 1.5"
27
+ spec.add_development_dependency "ruby-oci8", "~> 2.1" unless RUBY_PLATFORM == "java" || !ENV["SKIP_OCI8"].nil?
28
+ end
data/console ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ irb -Itest -rtest_helper
@@ -0,0 +1 @@
1
+ require 'peoplesoft_models'
@@ -0,0 +1,11 @@
1
+ # This base class exists to provide a point to alter the database connection
2
+ # that a developer is using to connect to PeopleSoft tables. All generated
3
+ # models inherit from this class instead of ActiveRecord::Base.
4
+ #
5
+ module PeoplesoftModels
6
+ class Base < ActiveRecord::Base
7
+ cattr_accessor :schema_name
8
+
9
+ self.abstract_class = true
10
+ end
11
+ end
@@ -0,0 +1,62 @@
1
+ module PeoplesoftModels
2
+ module EffectiveScope
3
+ COLUMNS = ["effdt", "effseq"]
4
+
5
+ def effective(as_of = Date.today)
6
+ table = self.arel_table
7
+ eff_keys = self.effective_key_values(as_of).as(eff_keys_relation_alias)
8
+ join_conditions = self.primary_keys.map { |key| table[key].eq(eff_keys[key]) }.reduce(:and)
9
+
10
+ self.joins("INNER JOIN #{eff_keys.to_sql} ON #{join_conditions.to_sql}")
11
+ end
12
+
13
+ def effective_key_values(as_of = Date.today)
14
+ if self.effective_keys.include?("effseq")
15
+ self.effseq_values
16
+ else
17
+ self.effdt_values
18
+ end
19
+ end
20
+
21
+ def effdt_values(as_of = Date.today)
22
+ table = self.arel_table
23
+ columns = self.non_effective_keys + [table[:effdt].maximum.as("effdt")]
24
+
25
+ self.unscoped
26
+ .select(columns)
27
+ .where(table[:effdt].lteq(as_of))
28
+ .group(self.non_effective_keys)
29
+ end
30
+
31
+ def effseq_values(as_of = Date.today)
32
+ table = self.arel_table
33
+ effdt_keys = self.effdt_values(as_of).as(effdt_relation_alias)
34
+ join_columns = self.primary_keys - ["effseq"]
35
+ columns = join_columns + [table[:effseq].maximum.as("effseq")]
36
+ join_conditions = join_columns.map { |key| table[key].eq(effdt_keys[key]) }.reduce(:and)
37
+
38
+ self.unscoped
39
+ .select(join_columns + [table[:effseq].maximum.as("effseq")])
40
+ .joins("INNER JOIN #{effdt_keys.to_sql} ON #{join_conditions.to_sql}")
41
+ .group(join_columns.map { |key| table[key] })
42
+ end
43
+
44
+ def effective_keys
45
+ self.primary_keys & COLUMNS
46
+ end
47
+
48
+ def non_effective_keys
49
+ self.primary_keys - COLUMNS
50
+ end
51
+
52
+ private
53
+
54
+ def eff_keys_relation_alias
55
+ "EFF_KEYS_#{self.table_name.gsub(/^.*\./, "")}"
56
+ end
57
+
58
+ def effdt_relation_alias
59
+ "EFFDT_#{self.table_name.gsub(/^.*\./, "")}"
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,9 @@
1
+ module PeoplesoftModels
2
+ class Field < Base
3
+ self.primary_keys = "recname", "fieldname"
4
+
5
+ def self.table_name
6
+ [self.schema_name, "PSRECFIELD"].compact.join(".")
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,55 @@
1
+ require_relative "effective_scope"
2
+
3
+ module PeoplesoftModels
4
+ class Record < Base
5
+ self.primary_key = "recname"
6
+
7
+ has_many :fields, class_name: "Field",
8
+ primary_key: self.primary_key,
9
+ foreign_key: self.primary_key
10
+
11
+ def self.table_name
12
+ [self.schema_name, "PSRECDEFN"].compact.join(".")
13
+ end
14
+
15
+ # A record's table name "PS_" + the record name unless it's specified in
16
+ # the `sqltablename` field.
17
+ # http://www.go-faster.co.uk/peopletools/psrecdefn.htm
18
+ #
19
+ def table_name
20
+ @table_name ||= begin
21
+ schema = self.class.schema_name
22
+ table = self.sqltablename.blank? ? "PS_#{self.recname}" : self.sqltablename
23
+ [schema, table].compact.join(".")
24
+ end
25
+ end
26
+
27
+ # The useedit field holds many values that you can get from the stored
28
+ # integer by applying bit masks. `useedit & 1` determines whether or not a
29
+ # field is part of the primary key. This operation would be marginally
30
+ # faster on the database, but doing it in Ruby let's us avoid handling
31
+ # different syntaxes for the bitwise AND.
32
+ # http://www.go-faster.co.uk/peopletools/useedit.htm
33
+ #
34
+ def keys
35
+ @keys ||= fields.order(:fieldnum).select do |field|
36
+ field.useedit & 1 == 1
37
+ end.map do |field|
38
+ field.fieldname.downcase
39
+ end
40
+ end
41
+
42
+ def effective_dated?
43
+ @effective_dated ||= self.keys.include?("effdt")
44
+ end
45
+
46
+ def to_model
47
+ return @model if defined? @model
48
+ @model = Class.new(Base)
49
+ @model.table_name = self.table_name
50
+ @model.primary_keys = self.keys
51
+ @model.extend(EffectiveScope) if self.effective_dated?
52
+ @model
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,3 @@
1
+ module PeoplesoftModels
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,17 @@
1
+ require "composite_primary_keys"
2
+ require "peoplesoft_models/base"
3
+ require "peoplesoft_models/version"
4
+ require "peoplesoft_models/record"
5
+ require "peoplesoft_models/field"
6
+
7
+ module PeoplesoftModels
8
+ def self.const_missing(name)
9
+ record_name = name.to_s.demodulize.underscore.upcase
10
+
11
+ begin
12
+ const_set(name, Record.find(record_name).to_model)
13
+ rescue ActiveRecord::RecordNotFound
14
+ super(name)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ some_poeoplesoft_instance:
2
+ adapter: oracle_enhanced
3
+ host: somehost.example.com
4
+ port: 1521
5
+ database: /somedatabase
6
+ username: someuser
7
+ password: somepassword
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ class EffectiveScopeTest < Minitest::Test
4
+ def test_no_effective_scope_on_non_effective_model
5
+ assert(!PeoplesoftModels::Person.methods.include?(:effective))
6
+ end
7
+
8
+ def test_effective_scope_on_effdt_model
9
+ skip_if_using_real_peoplsoft
10
+
11
+ model = PeoplesoftModels::AcadProgTbl
12
+ effdt = Date.today
13
+ attributes = {institution: 'ASDF', acad_prog: 'BLAH'}
14
+
15
+ assert_equal(0, model.count)
16
+
17
+ model.create(attributes.merge({effdt: effdt - 1.days}))
18
+ model.create(attributes.merge({effdt: effdt}))
19
+ model.create(attributes.merge({effdt: effdt + 1.day}))
20
+
21
+ assert_equal(1, model.effective.count)
22
+
23
+ effective_row = model.effective.first
24
+
25
+ assert_equal(effdt, effective_row.effdt)
26
+ end
27
+
28
+ def test_effective_scope_on_effseq_model
29
+ skip_if_using_real_peoplsoft
30
+
31
+ model = PeoplesoftModels::AcadProg
32
+ effdt = Date.today
33
+ attributes = {emplid: '123', acad_career: 'A', stdnt_car_nbr: 1, effseq: 0}
34
+
35
+ assert_equal(0, model.count)
36
+
37
+ model.create(attributes.merge({effdt: effdt - 3.days}))
38
+ model.create(attributes.merge({effdt: effdt - 3.days, effseq: 1}))
39
+ model.create(attributes.merge({effdt: effdt - 3.days, effseq: 2}))
40
+ model.create(attributes.merge({effdt: effdt}))
41
+ model.create(attributes.merge({effdt: effdt, effseq: 1}))
42
+ model.create(attributes.merge({effdt: effdt + 1.day}))
43
+
44
+ assert_equal(1, model.effective.count)
45
+
46
+ effective_row = model.effective.first
47
+
48
+ assert_equal(effdt, effective_row.effdt)
49
+ assert_equal(1, effective_row.effseq)
50
+ end
51
+
52
+ def test_generated_table_aliases_with_schema_prefix
53
+ model = PeoplesoftModels::AcadProg
54
+
55
+ model.stub(:table_name, "SOME_SCHEMA.PS_ACAD_PROG") do
56
+ refute(model.send(:eff_keys_relation_alias).include?("."))
57
+ refute(model.send(:effdt_relation_alias).include?("."))
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,12 @@
1
+ class FakePeoplesoft
2
+ def self.create!
3
+ create_tables
4
+ end
5
+
6
+ def self.create_tables
7
+ statements = IO.read(File.join(File.dirname(__FILE__), 'fake_peoplesoft.sql')).split(';')
8
+ statements.each do |statement|
9
+ PeoplesoftModels::Base.connection.execute(statement) unless statement.blank?
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,225 @@
1
+ create table PSRECDEFN (
2
+ recname varchar2(15),
3
+ sqltablename varchar2(18)
4
+ );
5
+ create table PSRECFIELD (
6
+ recname varchar2(15),
7
+ fieldname varchar2(18),
8
+ fieldnum integer,
9
+ edittable varchar2(15),
10
+ useedit integer
11
+ );
12
+ create table PS_ACAD_PROG (
13
+ emplid varchar2(11),
14
+ acad_career varchar2(4),
15
+ stdnt_car_nbr integer,
16
+ effdt date,
17
+ effseq integer,
18
+ institution varchar2(5),
19
+ acad_prog varchar2(5),
20
+ prog_status varchar2(4),
21
+ prog_action varchar2(4),
22
+ action_dt date,
23
+ prog_reason varchar2(4),
24
+ admit_term varchar2(4),
25
+ exp_grad_term varchar2(4),
26
+ req_term varchar2(4),
27
+ acad_load_appr varchar2(1),
28
+ campus varchar2(5),
29
+ degr_chkout_stat varchar2(2),
30
+ completion_term varchar2(4),
31
+ acad_prog_dual varchar2(5),
32
+ joint_prog_appr varchar2(1),
33
+ adm_appl_nbr varchar2(8),
34
+ appl_prog_nbr integer,
35
+ data_from_adm_appl varchar2(1)
36
+ );
37
+ create table PS_ACAD_PROG_TBL (
38
+ institution varchar2(5),
39
+ acad_prog varchar2(5),
40
+ effdt date,
41
+ eff_status varchar2(1),
42
+ descr varchar2(30),
43
+ descrshort varchar2(10),
44
+ acad_career varchar2(4),
45
+ acad_calendar_id varchar2(4),
46
+ advisor_edit varchar2(1),
47
+ level_load_rule varchar2(5),
48
+ acad_group varchar2(5),
49
+ acad_plan varchar2(10),
50
+ campus varchar2(5),
51
+ first_term_valid varchar2(4),
52
+ car_ptr_exc_rule varchar2(10),
53
+ car_ptr_exc_fg varchar2(1),
54
+ fa_primacy_nbr integer,
55
+ fa_eligibility varchar2(1),
56
+ prog_norm_compltn integer,
57
+ residency_req varchar2(1),
58
+ cip_code varchar2(13),
59
+ hegis_code varchar2(8),
60
+ crse_count_enrl varchar2(1),
61
+ crse_count_min integer,
62
+ acad_org varchar2(10),
63
+ split_owner varchar2(1),
64
+ acad_prog_dual varchar2(5),
65
+ grading_scheme varchar2(3),
66
+ grading_basis varchar2(3),
67
+ grade_transfer varchar2(3),
68
+ transcript_level varchar2(2),
69
+ acad_stdng_rule varchar2(10),
70
+ assoc_prog_as varchar2(1),
71
+ calc_as_batch_only varchar2(1),
72
+ obey_fully_grd_as varchar2(1),
73
+ excl_trm_cat_as_1 varchar2(1),
74
+ excl_trm_cat_as_2 varchar2(1),
75
+ excl_trm_cat_as_3 varchar2(1),
76
+ honor_award_rule varchar2(10),
77
+ assoc_prog_ha varchar2(1),
78
+ calc_ha_batch_only varchar2(1),
79
+ obey_fully_grd_ha varchar2(1),
80
+ excl_trm_cat_ha_1 varchar2(1),
81
+ excl_trm_cat_ha_2 varchar2(1),
82
+ excl_trm_cat_ha_3 varchar2(1),
83
+ honor_dt_fg varchar2(4),
84
+ incomplete_grade varchar2(3),
85
+ lapse_grade varchar2(1),
86
+ lapse_to_grade varchar2(3),
87
+ lapse_days integer,
88
+ lapse_note_id varchar2(4),
89
+ print_lapse_date varchar2(1),
90
+ cmpltd_note_id varchar2(4),
91
+ print_cmpltd_date varchar2(1),
92
+ repeat_rule varchar2(10),
93
+ repeat_grd_ck varchar2(1),
94
+ cancel_reason varchar2(4),
95
+ wd_wo_pen_reason varchar2(4),
96
+ wd_w_pen_grd_bas varchar2(3),
97
+ wd_w_pen_grade varchar2(3),
98
+ wd_w_pen2_grade varchar2(3),
99
+ wd_w_pen2_grd_bas varchar2(3),
100
+ drop_ret_rsn varchar2(4),
101
+ drop_pen_grade varchar2(3),
102
+ drop_pen_grade_2 varchar2(3),
103
+ drop_pen_grd_bas varchar2(3),
104
+ drop_pen_grd_bas_2 varchar2(3),
105
+ oee_ind varchar2(1),
106
+ repeat_enrl_ctl varchar2(1),
107
+ repeat_enrl_susp varchar2(1),
108
+ repeat_grd_susp varchar2(1),
109
+ repeat_crse_error varchar2(1)
110
+ );
111
+ create table PS_PERSON (
112
+ emplid varchar2(11),
113
+ birthdate date,
114
+ birthplace varchar2(30),
115
+ birthcountry varchar2(3),
116
+ birthstate varchar2(6),
117
+ dt_of_death date,
118
+ last_child_upddtm date
119
+ );
120
+
121
+ insert into PSRECDEFN (RECNAME,SQLTABLENAME) values ('ACAD_PROG',' ');
122
+ insert into PSRECDEFN (RECNAME,SQLTABLENAME) values ('ACAD_PROG_TBL',' ');
123
+ insert into PSRECDEFN (RECNAME,SQLTABLENAME) values ('PERSON',' ');
124
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','ACAD_CAREER',2,' ',8391457);
125
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','ACAD_LOAD_APPR',15,' ',8389376);
126
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','ACAD_PROG',7,'ACAD_PROG_SCTY',8405280);
127
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','ACAD_PROG_DUAL',19,'UM_ACADPROG_VW4',8404992);
128
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','ACTION_DT',10,' ',8388864);
129
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','ADMIT_TERM',12,'TERM_TBL',8405280);
130
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','ADM_APPL_NBR',21,' ',8388608);
131
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','APPL_PROG_NBR',22,' ',8388608);
132
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','CAMPUS',16,'HOME_CAMPUS_VW',8405248);
133
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','COMPLETION_TERM',18,'TERM_TBL',8404992);
134
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','DATA_FROM_ADM_APPL',23,' ',8397056);
135
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','DEGR_CHKOUT_STAT',17,' ',8389120);
136
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','EFFDT',4,' ',8388929);
137
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','EFFSEQ',5,' ',8388673);
138
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','EMPLID',1,'PEOPLE_SRCH',8407329);
139
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','EXP_GRAD_TERM',13,'TERM_TBL',8404992);
140
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','INSTITUTION',6,'UM_INST_CAR_VW',8405280);
141
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','JOINT_PROG_APPR',20,' ',8397056);
142
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','PROG_ACTION',9,'PROG_ACTN_SCTY',8405248);
143
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','PROG_REASON',11,'PROG_RSN_TBL',8404992);
144
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','PROG_STATUS',8,' ',8389376);
145
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','REQ_TERM',14,'TERM_TBL',8404992);
146
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG','STDNT_CAR_NBR',3,' ',8390753);
147
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_CALENDAR_ID',8,'ACAD_CAL_TABLE',8405248);
148
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_CAREER',7,'ACAD_CAR_TBL',8405248);
149
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_GROUP',11,'ACAD_GROUP_TBL',8405296);
150
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_ORG',25,'ACAD_ORG_TBL_VW',8404992);
151
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_PLAN',12,'ACAD_PLAN_TBLVW',8404992);
152
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_PROG',2,' ',8390945);
153
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_PROG_DUAL',27,'ACAD_PROG_TBLV2',8404992);
154
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ACAD_STDNG_RULE',32,'ACAD_STDG_RL_VW',8404992);
155
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ADVISOR_EDIT',9,' ',8389376);
156
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ASSOC_PROG_AS',33,' ',8396800);
157
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','ASSOC_PROG_HA',40,' ',8396800);
158
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CALC_AS_BATCH_ONLY',34,' ',8396800);
159
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CALC_HA_BATCH_ONLY',41,' ',8396800);
160
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CAMPUS',13,'HOME_CAMPUS_VW',8404992);
161
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CANCEL_REASON',57,'ENRL_RSN_TBL',8404992);
162
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CAR_PTR_EXC_FG',16,' ',8397056);
163
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CAR_PTR_EXC_RULE',15,'CAR_PTR_EXC',8404992);
164
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CIP_CODE',21,'CIP_CODE_TBL',8404992);
165
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CMPLTD_NOTE_ID',53,'TSCRPT_NOTE_TBL',8404992);
166
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CRSE_COUNT_ENRL',23,' ',8397056);
167
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','CRSE_COUNT_MIN',24,' ',8388608);
168
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','DESCR',5,' ',8388912);
169
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','DESCRSHORT',6,' ',8388912);
170
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','DROP_PEN_GRADE',64,'DROP_PEN_GRD_VW',8404992);
171
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','DROP_PEN_GRADE_2',65,'DRP_PEN_GRD2_VW',8404992);
172
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','DROP_PEN_GRD_BAS',66,'GRADE_BASE_E_VW',8404992);
173
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','DROP_PEN_GRD_BAS_2',67,'GRADE_BASE_E_VW',8404992);
174
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','DROP_RET_RSN',63,'ENRL_RSN_TBL',8404992);
175
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EFFDT',3,' ',8388929);
176
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EFF_STATUS',4,' ',8389376);
177
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EXCL_TRM_CAT_AS_1',36,'LS_XLAT_MC_VW',8404992);
178
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EXCL_TRM_CAT_AS_2',37,'LS_XLAT_MC_VW',8404992);
179
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EXCL_TRM_CAT_AS_3',38,'LS_XLAT_MC_VW',8404992);
180
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EXCL_TRM_CAT_HA_1',43,'LS_XLAT_MC_VW',8404992);
181
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EXCL_TRM_CAT_HA_2',44,'LS_XLAT_MC_VW',8404992);
182
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','EXCL_TRM_CAT_HA_3',45,'LS_XLAT_MC_VW',8404992);
183
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','FA_ELIGIBILITY',18,' ',8397056);
184
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','FA_PRIMACY_NBR',17,' ',8388608);
185
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','FIRST_TERM_VALID',14,'TERM_VAL_TBL',8404992);
186
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','GRADE_TRANSFER',30,'GRADE_TBL',8404992);
187
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','GRADING_BASIS',29,'GRADE_BASIS_TBL',8404992);
188
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','GRADING_SCHEME',28,'GRADESCHEME_TBL',8404992);
189
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','HEGIS_CODE',22,'HEGIS_CODE_TBL',8404992);
190
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','HONOR_AWARD_RULE',39,'HONOR_AWD_RL_VW',8404992);
191
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','HONOR_DT_FG',46,' ',8389120);
192
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','INCOMPLETE_GRADE',47,'GRADE_INCOMP_VW',8404992);
193
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','INSTITUTION',1,'INSTITUTION_TBL',8407329);
194
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','LAPSE_DAYS',50,' ',8388608);
195
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','LAPSE_GRADE',48,' ',8397056);
196
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','LAPSE_NOTE_ID',51,'TSCRPT_NOTE_TBL',8404992);
197
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','LAPSE_TO_GRADE',49,'GRADE_LAPSE_VW',8404992);
198
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','LEVEL_LOAD_RULE',10,'LVL_LD_RULE_TBL',8405248);
199
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','OBEY_FULLY_GRD_AS',35,' ',8397056);
200
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','OBEY_FULLY_GRD_HA',42,' ',8397056);
201
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','OEE_IND',68,' ',8396800);
202
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','PRINT_CMPLTD_DATE',54,' ',8397056);
203
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','PRINT_LAPSE_DATE',52,' ',8397056);
204
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','PROG_NORM_COMPLTN',19,' ',8388608);
205
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','REPEAT_CRSE_ERROR',72,' ',8389376);
206
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','REPEAT_ENRL_CTL',69,' ',8389120);
207
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','REPEAT_ENRL_SUSP',70,' ',8396800);
208
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','REPEAT_GRD_CK',56,' ',8389120);
209
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','REPEAT_GRD_SUSP',71,' ',8396800);
210
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','REPEAT_RULE',55,'REPEAT_RULE_VW',8404992);
211
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','RESIDENCY_REQ',20,' ',8389376);
212
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','SPLIT_OWNER',26,' ',8397056);
213
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','TRANSCRIPT_LEVEL',31,' ',8389376);
214
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','WD_WO_PEN_REASON',58,'ENRL_RSN_TBL',8404992);
215
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','WD_W_PEN2_GRADE',61,'WD_W_PEN2_GD_VW',8404992);
216
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','WD_W_PEN2_GRD_BAS',62,'GRADE_BASE_E_VW',8404992);
217
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','WD_W_PEN_GRADE',60,'WD_W_PEN_GRD_VW',8404992);
218
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('ACAD_PROG_TBL','WD_W_PEN_GRD_BAS',59,'GRADE_BASE_E_VW',8404992);
219
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('PERSON','BIRTHCOUNTRY',4,'COUNTRY_TBL',8404992);
220
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('PERSON','BIRTHDATE',2,' ',8388608);
221
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('PERSON','BIRTHPLACE',3,' ',8388608);
222
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('PERSON','BIRTHSTATE',5,'BIRTHSTATE_VW',8404992);
223
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('PERSON','DT_OF_DEATH',6,' ',8388608);
224
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('PERSON','EMPLID',1,' ',8390945);
225
+ insert into PSRECFIELD (RECNAME,FIELDNAME,FIELDNUM,EDITTABLE,USEEDIT) values ('PERSON','LAST_CHILD_UPDDTM',7,' ',8388608);
@@ -0,0 +1,10 @@
1
+ require 'test_helper'
2
+
3
+ class FieldText < Minitest::Test
4
+ def test_uses_schema_prefix
5
+ schema = "some_schema"
6
+ PeoplesoftModels::Base.stub(:schema_name, schema) do
7
+ assert(PeoplesoftModels::Field.table_name.match(%r(^#{schema}\.)))
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ class RecordKeysTest < Minitest::Test
4
+ def setup
5
+ @record = PeoplesoftModels::Record.new(recname: "BLAH")
6
+ @record.fields.build(fieldname: "a", useedit: 1)
7
+ @record.fields.build(fieldname: "b", useedit: 2)
8
+ @record.fields.build(fieldname: "c", useedit: 3)
9
+ @record.fields.build(fieldname: "d", useedit: 4)
10
+ @record.save
11
+ end
12
+
13
+ def teardown
14
+ @record.fields.delete_all
15
+ @record.destroy
16
+ end
17
+
18
+ def test_key_lookup
19
+ skip_if_using_real_peoplsoft
20
+
21
+ keys = @record.keys
22
+
23
+ assert(keys.include?("a"))
24
+ assert(keys.include?("c"))
25
+ end
26
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ class RecordTest < Minitest::Test
4
+ def setup
5
+ @record = PeoplesoftModels::Record.new(recname: "BLAH")
6
+ end
7
+
8
+ def test_blank_table_name
9
+ @record.stub(:sqltablename, " ") do
10
+ assert_equal("PS_BLAH", @record.table_name)
11
+ end
12
+
13
+ @record.stub(:sqltablename, nil) do
14
+ assert_equal("PS_BLAH", @record.table_name)
15
+ end
16
+ end
17
+
18
+ def test_nonblank_table_name
19
+ table = "ASDF"
20
+ @record.stub(:sqltablename, table) do
21
+ assert_equal(table, @record.table_name)
22
+ end
23
+ end
24
+
25
+ def test_effective_dated
26
+ @record.stub(:keys, ["blah", "meh", "effdt"]) do
27
+ assert(@record.effective_dated?)
28
+ end
29
+ end
30
+
31
+ def test_not_effective_dated
32
+ @record.stub(:keys, ["blah", "meh"]) do
33
+ assert(!@record.effective_dated?)
34
+ end
35
+ end
36
+
37
+ def test_not_effective_dated_model
38
+ @record.stub(:keys, ["blah", "meh"]) do
39
+ model = @record.to_model
40
+ assert(model.class != NilClass)
41
+ assert_equal(Class, model.class)
42
+ assert(PeoplesoftModels::Base, model.class.superclass)
43
+ end
44
+ end
45
+
46
+ def test_schema_prefix
47
+ schema = "campus_solutions"
48
+ recname = "blah"
49
+ PeoplesoftModels::Base.stub(:schema_name, schema) do
50
+ record = PeoplesoftModels::Record.new(recname: recname)
51
+ assert(record.table_name == "#{schema}.PS_#{recname}")
52
+ end
53
+ end
54
+
55
+ def test_uses_schema_prefix
56
+ schema = "some_schema"
57
+ PeoplesoftModels::Base.stub(:schema_name, schema) do
58
+ assert(PeoplesoftModels::Record.table_name.match(%r(^#{schema}\.)))
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,23 @@
1
+ require "bundler"
2
+ Bundler.setup
3
+ require 'activerecord-peoplesoft_models'
4
+ require 'minitest/autorun'
5
+
6
+ if ENV['DATABASE'].blank?
7
+ ActiveRecord::Base.establish_connection(adapter:"sqlite3", database: ":memory:")
8
+ require 'fake_peoplesoft'
9
+ FakePeoplesoft.create!
10
+ else
11
+ ActiveRecord::Base.configurations = YAML::load_file(File.join(File.dirname(__FILE__), 'config', 'database.yml'))
12
+ ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ENV['DATABASE']])
13
+ end
14
+
15
+ ActiveRecord::Base.logger = Logger.new(STDOUT )if $0 == "irb"
16
+
17
+ class Minitest::Test
18
+ def skip_if_using_real_peoplsoft
19
+ unless ENV['DATABASE'].blank?
20
+ skip "Not running this destructive test on a real PeopleSoft instance"
21
+ end
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activerecord-peoplesoft_models
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Dinger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-09-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: composite_primary_keys
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '8.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '8.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.10
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.10
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord-oracle_enhanced-adapter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ruby-oci8
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.1'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.1'
97
+ description: ''
98
+ email:
99
+ - ding0057@umn.edu
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - activerecord-peoplesoft_models.gemspec
111
+ - console
112
+ - lib/activerecord-peoplesoft_models.rb
113
+ - lib/peoplesoft_models.rb
114
+ - lib/peoplesoft_models/base.rb
115
+ - lib/peoplesoft_models/effective_scope.rb
116
+ - lib/peoplesoft_models/field.rb
117
+ - lib/peoplesoft_models/record.rb
118
+ - lib/peoplesoft_models/version.rb
119
+ - test/config/database.example.yml
120
+ - test/effective_scope_test.rb
121
+ - test/fake_peoplesoft.rb
122
+ - test/fake_peoplesoft.sql
123
+ - test/field_test.rb
124
+ - test/record_keys_test.rb
125
+ - test/record_test.rb
126
+ - test/test_helper.rb
127
+ homepage: ''
128
+ licenses:
129
+ - MIT
130
+ metadata: {}
131
+ post_install_message:
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubyforge_project:
147
+ rubygems_version: 2.4.5
148
+ signing_key:
149
+ specification_version: 4
150
+ summary: ActiveRecord models for working with PeopleSoft tables
151
+ test_files:
152
+ - test/config/database.example.yml
153
+ - test/effective_scope_test.rb
154
+ - test/fake_peoplesoft.rb
155
+ - test/fake_peoplesoft.sql
156
+ - test/field_test.rb
157
+ - test/record_keys_test.rb
158
+ - test/record_test.rb
159
+ - test/test_helper.rb