@dhyasama/totem-models 1.10.0 → 1.12.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.
@@ -89,19 +89,37 @@ module.exports = function(mongoose, config) {
89
89
  aliases: [ { type: String, trim: true } ],
90
90
 
91
91
  foundedOn: { type: Date, default: null },
92
- closedOn: { type: Date, default: null },
93
92
 
94
- exit: {
93
+ ipo: {
94
+ ticker: {type: String, default: null, trim: true},
95
+ offeredOn: {type: Date, default: null}
96
+ },
95
97
 
96
- acquisition: {
97
- by: { type: Schema.ObjectId, ref: 'Organization' },
98
- year: { type: Date, default: null },
99
- amount: { type: Number, default: 0 }
98
+ operating: {
99
+
100
+ closed: {
101
+ public: {
102
+ closedOn: { type: Date, default: null }
103
+ },
104
+ private: [{
105
+ customer: { type: Schema.ObjectId, ref: 'Organization' },
106
+ closedOn: { type: Date, default: null },
107
+ hasZeroUnrealizedValue: { type: Boolean, default: false }
108
+ }]
100
109
  },
101
110
 
102
- ipo: {
103
- ticker: {type: String, default: null, trim: true},
104
- year: {type: Date, default: null}
111
+ acquired: {
112
+ public: {
113
+ by: { type: Schema.ObjectId, ref: 'Organization' },
114
+ acquiredOn: { type: Date, default: null },
115
+ amount: { type: Number, default: 0 }
116
+ },
117
+ private: [{
118
+ customer: { type: Schema.ObjectId, ref: 'Organization' },
119
+ by: { type: Schema.ObjectId, ref: 'Organization' },
120
+ acquiredOn: { type: Date, default: null },
121
+ amount: { type: Number, default: 0 }
122
+ }]
105
123
  }
106
124
 
107
125
  },
@@ -211,6 +229,51 @@ module.exports = function(mongoose, config) {
211
229
  // Properties that are not persisted to the database
212
230
  ///////////////////////////////////////////////////////////////////////////////////////
213
231
 
232
+ Organization.virtual('acquired.amount').get(function () {
233
+
234
+ var self = this;
235
+ var publicData = self.operating.acquired.public || {};
236
+ var privateData = self.operating.acquired.private || [];
237
+
238
+ if (publicData.amount) return publicData.amount;
239
+ else if (privateData.length == 1) {
240
+ if (privateData[0].amount) return privateData[0].amount;
241
+ else return 0;
242
+ }
243
+ else return 0;
244
+
245
+ });
246
+
247
+ Organization.virtual('acquired.by').get(function () {
248
+
249
+ var self = this;
250
+ var publicData = self.operating.acquired.public || {};
251
+ var privateData = self.operating.acquired.private || [];
252
+
253
+ if (publicData.by) return publicData.by;
254
+ else if (privateData.length == 1) {
255
+ if (privateData[0].by) return privateData[0].by;
256
+ else return null;
257
+ }
258
+ else return null;
259
+
260
+ });
261
+
262
+ Organization.virtual('acquired.on').get(function () {
263
+
264
+ var self = this;
265
+ var publicData = self.operating.acquired.public || {};
266
+ var privateData = self.operating.acquired.private || [];
267
+
268
+ if (publicData.acquiredOn) return publicData.acquiredOn;
269
+ else if (privateData.length == 1) {
270
+ if (privateData[0].acquiredOn) return privateData[0].acquiredOn;
271
+ else return null;
272
+ }
273
+ else return null;
274
+
275
+ });
276
+
214
277
  Organization.virtual('address.primary').get(function () {
215
278
  var primary = _.find(this.contact.address, function(address) {
216
279
  return address.primary;
@@ -275,6 +338,22 @@ module.exports = function(mongoose, config) {
275
338
 
276
339
  });
277
340
 
341
+ Organization.virtual('closed').get(function () {
342
+
343
+ var self = this;
344
+ var publicData = self.operating.closed.public || {};
345
+ var privateData = self.operating.closed.private || [];
346
+
347
+ if (publicData.closedOn) return true;
348
+ else if (privateData.length == 1) {
349
+ if (privateData[0].closedOn) return true;
350
+ if (privateData[0].hasZeroUnrealizedValue) return true;
351
+ else return false;
352
+ }
353
+ else return false;
354
+
355
+ });
356
+
278
357
  Organization.virtual('employees.all').get(function () {
279
358
 
280
359
  var self = this;
@@ -387,11 +466,9 @@ module.exports = function(mongoose, config) {
387
466
 
388
467
  var self = this;
389
468
 
390
- // infer from data
391
-
392
- if (self.closedOn) return 'Dead';
393
- else if (self.ipo && self.ipo.year) return 'IPO';
394
- else if (self.acquisition && self.acquisition.year) return 'Acquired';
469
+ if (self.closed) return 'Dead';
470
+ else if (self.ipo.ticker) return 'IPO';
471
+ else if (self.acquired.by) return 'Acquired';
395
472
  else return 'Active';
396
473
 
397
474
  });
@@ -647,6 +724,8 @@ module.exports = function(mongoose, config) {
647
724
  .populate('chairs.first', 'name avatarUrl title')
648
725
  .populate('chairs.second', 'name avatarUrl title')
649
726
  .populate('funds', 'name hexColorCode closeDate')
727
+ .populate('operating.acquired.public.by', 'name logoUrl')
728
+ .populate('operating.acquired.private.by', 'name logoUrl')
650
729
  .deepPopulate([
651
730
  'people.person.sources.person',
652
731
  'people.person.calendarEventSummaries.attendees.internal',
@@ -988,10 +1067,12 @@ module.exports = function(mongoose, config) {
988
1067
  // remove customer details if not viewing self
989
1068
  if (doc._id.toString() != CUSTOMER_ID) doc.customer = {};
990
1069
 
991
- doc.filters = _.reject(doc.filters, function(item) { return item.customer != CUSTOMER_ID; });
992
- doc.docs = _.reject(doc.docs, function(item) { return item.customer != CUSTOMER_ID; });
993
- doc.iLevel = _.reject(doc.iLevel, function(item) { return item.customer != CUSTOMER_ID; });
994
- doc.chairs = _.reject(doc.chairs, function(item) { return item.customer != CUSTOMER_ID; });
1070
+ doc.filters = _.reject(doc.filters, function(item) { return !item.customer || item.customer.toString() != CUSTOMER_ID; });
1071
+ doc.docs = _.reject(doc.docs, function(item) { return !item.customer || item.customer.toString() != CUSTOMER_ID; });
1072
+ doc.iLevel = _.reject(doc.iLevel, function(item) { return !item.customer || item.customer.toString() != CUSTOMER_ID; });
1073
+ doc.chairs = _.reject(doc.chairs, function(item) { return !item.customer || item.customer.toString() != CUSTOMER_ID; });
1074
+ doc.operating.acquired.private = _.find(doc.operating.acquired.private, function(item) { return !item.customer || item.customer.toString() == CUSTOMER_ID; });
1075
+ doc.operating.closed.private = _.find(doc.operating.closed.private, function(item) { return !item.customer || item.customer.toString() == CUSTOMER_ID; });
995
1076
 
996
1077
  // people
997
1078
  _.each(doc.people, function(person) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhyasama/totem-models",
3
- "version": "1.10.0",
3
+ "version": "1.12.0",
4
4
  "author": "Jason Reynolds",
5
5
  "license": "UNLICENSED",
6
6
  "description": "Models for Totem platform",
@@ -37,6 +37,15 @@ describe('Organization', function() {
37
37
  });
38
38
  });
39
39
 
40
+ before(function (done) {
41
+ Person.collection.dropIndexes(function (err, result) {
42
+ should.not.exist(err);
43
+ should.exist(result);
44
+ result.should.equal(true);
45
+ return done();
46
+ });
47
+ });
48
+
40
49
  before(function (done) {
41
50
 
42
51
  org2 = new Organization();
@@ -780,6 +789,150 @@ describe('Organization', function() {
780
789
 
781
790
  });
782
791
 
792
+ describe('State', function() {
793
+
794
+ it('gets ipo info', function(done) {
795
+
796
+ var org = new Organization();
797
+ org.name = 'Homerun';
798
+ org.slug = 'homerun';
799
+ org.ipo.ticker = 'HOME';
800
+
801
+ Organization.upsert(org, 'test-user', function(err, result) {
802
+ should.not.exist(err);
803
+ should.exist(result);
804
+ result.status.should.equal('IPO');
805
+ result.ipo.ticker.should.equal('HOME');
806
+ return done();
807
+ });
808
+
809
+ });
810
+
811
+ it('gets public acquisition info', function(done) {
812
+
813
+ var org = new Organization();
814
+ org.name = 'Publicks';
815
+ org.slug = 'publicks';
816
+ org.operating.acquired.public.by = new mongoose.Types.ObjectId();
817
+ org.operating.acquired.public.acquiredOn = new Date();
818
+ org.operating.acquired.public.amount = 1;
819
+ org.operating.acquired.private.push({
820
+ customer: new mongoose.Types.ObjectId(),
821
+ by: new mongoose.Types.ObjectId(),
822
+ acquiredOn: new Date(),
823
+ amount: 2
824
+ });
825
+
826
+ Organization.upsert(org, 'test-user', function(err, result) {
827
+ should.not.exist(err);
828
+ should.exist(result);
829
+ result.status.should.equal('Acquired');
830
+ result.acquired.amount.should.equal(1);
831
+ return done();
832
+ });
833
+
834
+ });
835
+
836
+ it('gets private acquisition info', function(done) {
837
+
838
+ var org = new Organization();
839
+ org.name = 'Stanky';
840
+ org.slug = 'stanky';
841
+ org.operating.acquired.public.by = null;
842
+ org.operating.acquired.public.acquiredOn = null;
843
+ org.operating.acquired.public.amount = 0;
844
+
845
+ org.operating.acquired.private.push({
846
+ customer: new mongoose.Types.ObjectId(),
847
+ by: new mongoose.Types.ObjectId(),
848
+ acquiredOn: new Date(),
849
+ amount: 2
850
+ });
851
+
852
+ org.operating.acquired.private.push({
853
+ customer: config.CUSTOMER_ID,
854
+ by: new mongoose.Types.ObjectId(),
855
+ acquiredOn: new Date(),
856
+ amount: 4
857
+ });
858
+
859
+ Organization.upsert(org, 'test-user', function(err, result) {
860
+
861
+ should.not.exist(err);
862
+ should.exist(result);
863
+
864
+ Organization.findById(result._id, function(err, org) {
865
+
866
+ should.not.exist(err);
867
+ should.exist(org);
868
+
869
+ org.status.should.equal('Acquired');
870
+ org.acquired.amount.should.equal(4);
871
+ return done();
872
+
873
+ });
874
+
875
+ });
876
+
877
+ });
878
+
879
+ it('gets public closed info', function(done) {
880
+
881
+ var org = new Organization();
882
+ org.name = 'The Copper Beaver';
883
+ org.slug = 'the-copper-beaver';
884
+ org.operating.closed.public.closedOn = new Date();
885
+ org.operating.closed.private.push({
886
+ customer: new mongoose.Types.ObjectId(),
887
+ hasZeroUnrealizedValue: false,
888
+ closedOn: null
889
+ });
890
+
891
+ Organization.upsert(org, 'test-user', function(err, result) {
892
+ should.not.exist(err);
893
+ should.exist(result);
894
+ result.status.should.equal('Dead');
895
+ return done();
896
+ });
897
+
898
+ });
899
+
900
+ it('gets private closed info', function(done) {
901
+
902
+ var org = new Organization();
903
+ org.name = 'Dam Hydraulics';
904
+ org.slug = 'dam-hydraulics';
905
+ org.operating.closed.public.closedOn = new Date();
906
+
907
+ org.operating.closed.private.push({
908
+ customer: new mongoose.Types.ObjectId(),
909
+ hasZeroUnrealizedValue: false,
910
+ closedOn: null
911
+ });
912
+
913
+ org.operating.closed.private.push({
914
+ customer: config.CUSTOMER_ID,
915
+ hasZeroUnrealizedValue: true,
916
+ closedOn: null
917
+ });
918
+
919
+ Organization.upsert(org, 'test-user', function(err, result) {
920
+
921
+ should.not.exist(err);
922
+ should.exist(result);
923
+
924
+ Organization.findById(result._id, function(err, org) {
925
+ should.not.exist(err);
926
+ should.exist(org);
927
+ org.status.should.equal('Dead');
928
+ return done();
929
+ });
930
+ });
931
+
932
+ });
933
+
934
+ });
935
+
783
936
  // not yet tested:
784
937
  // listAllFlagged
785
938
  // listPage