activerecord-peoplesoft_models 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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