@churchsoln/dbms 1.0.47 → 1.0.49

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.
Files changed (145) hide show
  1. package/Dockerfile +21 -21
  2. package/Makefile +132 -132
  3. package/app.js +37 -37
  4. package/config/config.js +33 -33
  5. package/config/errorCodes.js +65 -65
  6. package/config/errorMsgs.js +82 -82
  7. package/constants/index.js +94 -94
  8. package/controllers/church.js +100 -100
  9. package/controllers/index.js +6 -6
  10. package/controllers/master.js +138 -138
  11. package/controllers/migration.js +24 -24
  12. package/controllers/seed.js +33 -33
  13. package/db-setup.js +87 -87
  14. package/deployment/docker-compose.local.yml +64 -64
  15. package/deployment/docker-compose.yml +62 -62
  16. package/deployment/nginx/nginx-certs/localhost.crt +22 -22
  17. package/deployment/nginx/nginx-certs/localhost.key +28 -28
  18. package/deployment/nginx/nginx.local.conf +72 -72
  19. package/middlewares/church-filter.js +16 -16
  20. package/migrations/church/20221226151615-create-province.js +27 -27
  21. package/migrations/church/20221226151616-create-city.js +41 -41
  22. package/migrations/church/20221226151617-create-subRole.js +25 -25
  23. package/migrations/church/20221226151618-create-membership.js +68 -68
  24. package/migrations/church/20221226151619-create-member.js +140 -140
  25. package/migrations/church/20221227151615-create-user.js +60 -60
  26. package/migrations/church/20230826140644-create-eventsUpdates.js +29 -29
  27. package/migrations/church/20230904143429-create-ministries.js +26 -26
  28. package/migrations/church/20231021160018-create-gallery.js +28 -28
  29. package/migrations/church/20231105074019-create-feedback.js +28 -28
  30. package/migrations/church/20231111113342-create-banner.js +29 -29
  31. package/migrations/church/20231216105640-create-directoryBoard.js +31 -31
  32. package/migrations/church/20240214160101-create-volunteer.js +31 -31
  33. package/migrations/church/20240330111437-create-download.js +29 -29
  34. package/migrations/church/20240427170617-create-links.js +26 -26
  35. package/migrations/church/20240815170617-create-userTransfer.js +63 -63
  36. package/migrations/church/20240815170620-create-subRolePermission.js +40 -40
  37. package/migrations/church/20240915170620-create-transferType.js +25 -25
  38. package/migrations/church/20240917170620-create-accounts.js +27 -27
  39. package/migrations/church/20240918170621-create-church.js +54 -54
  40. package/migrations/church/20240918170622-create-group.js +61 -61
  41. package/migrations/church/20240918170623-create-groupMembers.js +74 -74
  42. package/migrations/church/20240918170627-create-pledge.js +96 -96
  43. package/migrations/church/20240919170627-create-contributionBatch.js +42 -42
  44. package/migrations/church/20240919170628-create-contributionTransaction.js +82 -82
  45. package/migrations/church/20240919170629-create-contributionTransactionLine.js +74 -74
  46. package/migrations/church/20240919170630-update-groupMembers.js +77 -77
  47. package/migrations/church/20241204170631-create-pledgeAccount.js +55 -55
  48. package/migrations/church/20241204170632-create-memberStatus.js +26 -0
  49. package/migrations/church/20241204170633-update-member.js +33 -0
  50. package/migrations/church/20241204170634-update-membership.js +33 -0
  51. package/migrations/church/20241204170635-update-pledge.js +33 -0
  52. package/migrations/church/20241204170636-update-contributionTransactionLine.js +33 -0
  53. package/migrations/common/20221226140655-create-subscriptionPlan.js +31 -31
  54. package/migrations/common/20221226143006-create-role.js +25 -25
  55. package/migrations/common/20240815170619-create-permission.js +27 -27
  56. package/migrations/common/20240815170620-create-church.js +56 -56
  57. package/migrations/common/20240815170621-create-churchDomain.js +40 -40
  58. package/migrations/common/20240918170621-create-churchPermission.js +53 -53
  59. package/migrations/common/20240918170622-create-user.js +35 -35
  60. package/migrations/common/20240918170627-create-subscriptionPlanPermission.js +53 -53
  61. package/models/church/accounts.js +23 -27
  62. package/models/church/banner.js +29 -29
  63. package/models/church/church.js +62 -62
  64. package/models/church/city.js +23 -23
  65. package/models/church/contributionBatch.js +45 -45
  66. package/models/church/contributionTransaction.js +90 -90
  67. package/models/church/contributionTransactionLine.js +81 -80
  68. package/models/church/directoryBoard.js +33 -33
  69. package/models/church/download.js +35 -35
  70. package/models/church/eventsUpdates.js +29 -29
  71. package/models/church/feedback.js +27 -27
  72. package/models/church/gallery.js +33 -33
  73. package/models/church/group.js +78 -78
  74. package/models/church/groupMembers.js +73 -73
  75. package/models/church/index.js +30 -30
  76. package/models/church/links.js +22 -22
  77. package/models/church/member.js +161 -171
  78. package/models/church/memberStatus.js +22 -0
  79. package/models/church/membership.js +80 -81
  80. package/models/church/ministries.js +16 -16
  81. package/models/church/pledge.js +65 -65
  82. package/models/church/pledgeAccount.js +45 -37
  83. package/models/church/province.js +23 -23
  84. package/models/church/subRole.js +21 -21
  85. package/models/church/subRolePermission.js +22 -22
  86. package/models/church/transferType.js +15 -15
  87. package/models/church/user.js +78 -78
  88. package/models/church/userTransfer.js +45 -45
  89. package/models/church/volunteer.js +33 -33
  90. package/models/common/church.js +58 -58
  91. package/models/common/churchDomain.js +21 -21
  92. package/models/common/churchPermission.js +26 -26
  93. package/models/common/index.js +40 -40
  94. package/models/common/permission.js +17 -17
  95. package/models/common/role.js +15 -15
  96. package/models/common/subscriptionPlan.js +34 -34
  97. package/models/common/subscriptionPlanPermission.js +33 -33
  98. package/models/common/user.js +39 -39
  99. package/package.json +41 -41
  100. package/public/swagger/church.json +521 -521
  101. package/public/swagger/master.json +537 -537
  102. package/public/swagger/migration.json +83 -83
  103. package/public/swagger/seed.json +98 -98
  104. package/queues/db-create.js +9 -9
  105. package/queues/index.js +5 -5
  106. package/queues/master.js +9 -9
  107. package/queues/migration.js +9 -9
  108. package/queues/seed.js +9 -9
  109. package/redis/config.js +5 -5
  110. package/routes/index.js +30 -30
  111. package/routes/v1/church.js +45 -45
  112. package/routes/v1/index.js +7 -7
  113. package/routes/v1/master.js +68 -68
  114. package/routes/v1/migration.js +10 -10
  115. package/routes/v1/seed.js +12 -12
  116. package/seeders/church/20241005124245-province.js +101 -101
  117. package/seeders/church/20241005124547-city.js +87 -87
  118. package/seeders/church/20241005131418-transferType.js +40 -40
  119. package/seeders/church/20241005131419-memberStatus.js +34 -0
  120. package/seeders/common/20241005123516-subscriptionPlan.js +43 -43
  121. package/seeders/common/20241005124105-role.js +38 -38
  122. package/seeders/common/20241005153047-permission.js +252 -242
  123. package/seeders/common/20241005153048-user.js +48 -48
  124. package/services/church.js +312 -312
  125. package/services/index.js +6 -6
  126. package/services/master.js +344 -344
  127. package/services/migration.js +30 -30
  128. package/services/seed.js +39 -39
  129. package/utils/churchManager.js +98 -98
  130. package/utils/crypto.js +40 -40
  131. package/utils/docUpload.js +51 -51
  132. package/utils/encryptDecrypt.js +26 -26
  133. package/utils/index.js +33 -33
  134. package/utils/logger.js +104 -104
  135. package/utils/response.js +108 -108
  136. package/utils/swagger.js +25 -25
  137. package/utils/verifyToken.js +58 -58
  138. package/validators/church.js +154 -154
  139. package/validators/index.js +3 -3
  140. package/validators/master.js +152 -152
  141. package/workers/db-create.js +37 -37
  142. package/workers/index.js +4 -4
  143. package/workers/master.js +50 -50
  144. package/workers/migrations.js +63 -63
  145. package/workers/seed.js +85 -85
@@ -1,73 +1,73 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- const groupMembers = sequelize.define(
3
- "GroupMembers",
4
- {
5
- id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
6
- memberId: {
7
- type: DataTypes.INTEGER,
8
- set(memberId) {
9
- this.setDataValue("memberId", memberId?.id || memberId);
10
- },
11
- },
12
- groupId: {
13
- type: DataTypes.INTEGER,
14
- set(groupId) {
15
- this.setDataValue("groupId", groupId?.id || groupId);
16
- },
17
- },
18
- isAdmin: { type: DataTypes.BOOLEAN, defaultValue: false },
19
- status: { type: DataTypes.BOOLEAN, defaultValue: true },
20
- createdAt: {
21
- type: DataTypes.DATE,
22
- defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
23
- },
24
- updatedAt: {
25
- type: DataTypes.DATE,
26
- defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
27
- },
28
- createdBy: {
29
- type: DataTypes.INTEGER,
30
- set(createdBy) {
31
- this.setDataValue("createdBy", createdBy?.id || createdBy);
32
- },
33
- },
34
- updatedBy: {
35
- type: DataTypes.INTEGER,
36
- set(updatedBy) {
37
- this.setDataValue("updatedBy", updatedBy?.id || updatedBy);
38
- },
39
- },
40
- },
41
- { freezeTableName: true, timestamps: false }
42
- );
43
- groupMembers.associate = function (models) {
44
- groupMembers.belongsTo(models.member, {
45
- foreignKey: "memberId",
46
- as: "member",
47
- });
48
- groupMembers.belongsTo(models.group, {
49
- foreignKey: "groupId",
50
- as: "group",
51
- });
52
- groupMembers.belongsTo(models.user, {
53
- foreignKey: "createdBy",
54
- as: "createdByUser",
55
- });
56
- groupMembers.belongsTo(models.user, {
57
- foreignKey: "updatedBy",
58
- as: "updatedByUser",
59
- });
60
- };
61
- groupMembers.selectedFields = [
62
- "id",
63
- "memberId",
64
- "groupId",
65
- "isAdmin",
66
- "status",
67
- "createdAt",
68
- "updatedAt",
69
- "createdBy",
70
- "updatedBy",
71
- ];
72
- return groupMembers;
73
- };
1
+ module.exports = (sequelize, DataTypes) => {
2
+ const groupMembers = sequelize.define(
3
+ "GroupMembers",
4
+ {
5
+ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
6
+ memberId: {
7
+ type: DataTypes.INTEGER,
8
+ set(memberId) {
9
+ this.setDataValue("memberId", memberId?.id || memberId);
10
+ },
11
+ },
12
+ groupId: {
13
+ type: DataTypes.INTEGER,
14
+ set(groupId) {
15
+ this.setDataValue("groupId", groupId?.id || groupId);
16
+ },
17
+ },
18
+ isAdmin: { type: DataTypes.BOOLEAN, defaultValue: false },
19
+ status: { type: DataTypes.BOOLEAN, defaultValue: true },
20
+ createdAt: {
21
+ type: DataTypes.DATE,
22
+ defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
23
+ },
24
+ updatedAt: {
25
+ type: DataTypes.DATE,
26
+ defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
27
+ },
28
+ createdBy: {
29
+ type: DataTypes.INTEGER,
30
+ set(createdBy) {
31
+ this.setDataValue("createdBy", createdBy?.id || createdBy);
32
+ },
33
+ },
34
+ updatedBy: {
35
+ type: DataTypes.INTEGER,
36
+ set(updatedBy) {
37
+ this.setDataValue("updatedBy", updatedBy?.id || updatedBy);
38
+ },
39
+ },
40
+ },
41
+ { freezeTableName: true, timestamps: false }
42
+ );
43
+ groupMembers.associate = function (models) {
44
+ groupMembers.belongsTo(models.member, {
45
+ foreignKey: "memberId",
46
+ as: "member",
47
+ });
48
+ groupMembers.belongsTo(models.group, {
49
+ foreignKey: "groupId",
50
+ as: "group",
51
+ });
52
+ groupMembers.belongsTo(models.user, {
53
+ foreignKey: "createdBy",
54
+ as: "createdByUser",
55
+ });
56
+ groupMembers.belongsTo(models.user, {
57
+ foreignKey: "updatedBy",
58
+ as: "updatedByUser",
59
+ });
60
+ };
61
+ groupMembers.selectedFields = [
62
+ "id",
63
+ "memberId",
64
+ "groupId",
65
+ "isAdmin",
66
+ "status",
67
+ "createdAt",
68
+ "updatedAt",
69
+ "createdBy",
70
+ "updatedBy",
71
+ ];
72
+ return groupMembers;
73
+ };
@@ -1,30 +1,30 @@
1
- "use strict";
2
-
3
- const fs = require("fs");
4
- const path = require("path");
5
- const Sequelize = require("sequelize");
6
- const basename = path.basename(__filename);
7
-
8
- const getDbConnection = async (connectionUrl) => {
9
- const db = {};
10
- const sequelize = new Sequelize(connectionUrl, {
11
- dialectOptions: { multipleStatements: true },
12
- logging: false,
13
- });
14
- db.Sequelize = Sequelize;
15
- db.sequelize = sequelize;
16
- db.sequelize.dialect.supports.schemas = true;
17
- await sequelize.authenticate();
18
- fs.readdirSync(__dirname)
19
- .filter((file) => file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js")
20
- .forEach((file) => {
21
- db[file.split(".")[0]] = require("./" + file)(sequelize, Sequelize);
22
- });
23
- Object.keys(db).forEach((modelName) => {
24
- if (db[modelName].associate) {
25
- db[modelName].associate(db);
26
- }
27
- });
28
- return db;
29
- };
30
- module.exports = { getDbConnection };
1
+ "use strict";
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const Sequelize = require("sequelize");
6
+ const basename = path.basename(__filename);
7
+
8
+ const getDbConnection = async (connectionUrl) => {
9
+ const db = {};
10
+ const sequelize = new Sequelize(connectionUrl, {
11
+ dialectOptions: { multipleStatements: true },
12
+ logging: false,
13
+ });
14
+ db.Sequelize = Sequelize;
15
+ db.sequelize = sequelize;
16
+ db.sequelize.dialect.supports.schemas = true;
17
+ await sequelize.authenticate();
18
+ fs.readdirSync(__dirname)
19
+ .filter((file) => file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js")
20
+ .forEach((file) => {
21
+ db[file.split(".")[0]] = require("./" + file)(sequelize, Sequelize);
22
+ });
23
+ Object.keys(db).forEach((modelName) => {
24
+ if (db[modelName].associate) {
25
+ db[modelName].associate(db);
26
+ }
27
+ });
28
+ return db;
29
+ };
30
+ module.exports = { getDbConnection };
@@ -1,22 +1,22 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- const links = sequelize.define(
3
- "Links",
4
- {
5
- id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
6
- url: { type: DataTypes.TEXT },
7
- order: { type: DataTypes.INTEGER },
8
- status: { type: DataTypes.BOOLEAN, defaultValue: true },
9
- createdAt: {
10
- type: DataTypes.DATE,
11
- defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
12
- },
13
- updatedAt: {
14
- type: DataTypes.DATE,
15
- defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
16
- },
17
- },
18
- { freezeTableName: true, timestamps: false }
19
- );
20
- links.selectedFields = ["id", "url", "order", "status", "createdAt", "updatedAt"];
21
- return links;
22
- };
1
+ module.exports = (sequelize, DataTypes) => {
2
+ const links = sequelize.define(
3
+ "Links",
4
+ {
5
+ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
6
+ url: { type: DataTypes.TEXT },
7
+ order: { type: DataTypes.INTEGER },
8
+ status: { type: DataTypes.BOOLEAN, defaultValue: true },
9
+ createdAt: {
10
+ type: DataTypes.DATE,
11
+ defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
12
+ },
13
+ updatedAt: {
14
+ type: DataTypes.DATE,
15
+ defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
16
+ },
17
+ },
18
+ { freezeTableName: true, timestamps: false }
19
+ );
20
+ links.selectedFields = ["id", "url", "order", "status", "createdAt", "updatedAt"];
21
+ return links;
22
+ };
@@ -1,172 +1,162 @@
1
- const { MEMBER_STATUS, GENDER, RELATIONSHIP } = require("../../constants");
2
-
3
- module.exports = (sequelize, DataTypes) => {
4
- const member = sequelize.define(
5
- "Member",
6
- {
7
- id: {
8
- type: DataTypes.INTEGER,
9
- primaryKey: true,
10
- autoIncrement: true,
11
- },
12
-
13
- // Foreign Key to memberships
14
- membershipId: {
15
- type: DataTypes.INTEGER,
16
- set(membershipId) {
17
- this.setDataValue("membershipId", membershipId?.id || membershipId);
18
- },
19
- },
20
-
21
- // Basic Identity
22
- title: { type: DataTypes.STRING },
23
- firstName: { type: DataTypes.STRING, allowNull: false },
24
- middleName: { type: DataTypes.STRING },
25
- lastName: { type: DataTypes.STRING, allowNull: false },
26
- maidenName: { type: DataTypes.STRING },
27
- suffix: { type: DataTypes.STRING },
28
- salutation: { type: DataTypes.STRING },
29
- preferredName: { type: DataTypes.STRING },
30
- profileImage: { type: DataTypes.STRING },
31
-
32
- // Contact Info
33
- address: { type: DataTypes.TEXT },
34
- cityId: {
35
- type: DataTypes.INTEGER,
36
- set(cityId) {
37
- this.setDataValue("cityId", cityId?.id || cityId);
38
- },
39
- },
40
- provinceId: {
41
- type: DataTypes.INTEGER,
42
- set(provinceId) {
43
- this.setDataValue("provinceId", provinceId?.id || provinceId);
44
- },
45
- },
46
- zipCode: { type: DataTypes.STRING },
47
- homePhone: { type: DataTypes.STRING },
48
- cellPhone: { type: DataTypes.STRING },
49
- workPhone: { type: DataTypes.STRING },
50
- email: { type: DataTypes.STRING, validate: { isEmail: true } },
51
-
52
- // Other Personal Info
53
- occupation: { type: DataTypes.STRING },
54
- employer: { type: DataTypes.STRING },
55
- schoolGrade: { type: DataTypes.STRING },
56
- emergencyContact: { type: DataTypes.STRING },
57
- emergencyPhone: { type: DataTypes.STRING },
58
- geographicArea: { type: DataTypes.STRING },
59
-
60
- // Membership Status
61
- memberStatus: {
62
- type: DataTypes.STRING,
63
- defaultValue: MEMBER_STATUS.ACTIVE,
64
- validate: {
65
- isIn: [
66
- [
67
- MEMBER_STATUS.ACTIVE,
68
- MEMBER_STATUS.INACTIVE,
69
- MEMBER_STATUS.DECEASED,
70
- MEMBER_STATUS.PROSPECT,
71
- MEMBER_STATUS.REGULAR_ATTENDEE,
72
- MEMBER_STATUS.SINGLE_MEMBER,
73
- MEMBER_STATUS.VISITOR,
74
- ],
75
- ],
76
- },
77
- },
78
-
79
- envNumber: { type: DataTypes.STRING },
80
- gender: {
81
- type: DataTypes.STRING,
82
- validate: {
83
- isIn: [Object.values(GENDER)],
84
- },
85
- },
86
- relationship: {
87
- type: DataTypes.STRING,
88
- validate: {
89
- isIn: [Object.values(RELATIONSHIP)],
90
- },
91
- },
92
-
93
- // Dates
94
- birthDate: { type: DataTypes.DATE },
95
- weddingDate: { type: DataTypes.DATE },
96
- baptizedDate: { type: DataTypes.DATE },
97
- confessionDate: { type: DataTypes.DATE },
98
-
99
- // Additional
100
- notes: { type: DataTypes.TEXT },
101
- otp: { type: DataTypes.INTEGER },
102
-
103
- // Flags
104
- enabledProfile: {
105
- type: DataTypes.BOOLEAN,
106
- defaultValue: true,
107
- },
108
- includeInDirectory: {
109
- type: DataTypes.BOOLEAN,
110
- defaultValue: true,
111
- },
112
- emailStatement: {
113
- type: DataTypes.BOOLEAN,
114
- defaultValue: false,
115
- },
116
-
117
- // Metadata
118
- createdAt: { type: DataTypes.DATE },
119
- updatedAt: { type: DataTypes.DATE },
120
- },
121
- { freezeTableName: true, timestamps: false }
122
- );
123
- member.associate = function (models) {
124
- member.hasOne(models.user, { foreignKey: "memberId", as: "user" });
125
- member.belongsTo(models.membership, { foreignKey: "membershipId", as: "membership" });
126
- member.belongsTo(models.province, { foreignKey: "provinceId", as: "province" });
127
- member.belongsTo(models.city, { foreignKey: "cityId", as: "city" });
128
- }
129
- member.selectedFields = [
130
- "id",
131
- "membershipId",
132
- "title",
133
- "firstName",
134
- "middleName",
135
- "lastName",
136
- "maidenName",
137
- "suffix",
138
- "salutation",
139
- "preferredName",
140
- "profileImage",
141
- "address",
142
- "cityId",
143
- "provinceId",
144
- "zipCode",
145
- "homePhone",
146
- "cellPhone",
147
- "workPhone",
148
- "email",
149
- "occupation",
150
- "employer",
151
- "schoolGrade",
152
- "emergencyContact",
153
- "emergencyPhone",
154
- "geographicArea",
155
- "memberStatus",
156
- "envNumber",
157
- "gender",
158
- "relationship",
159
- "birthDate",
160
- "weddingDate",
161
- "baptizedDate",
162
- "confessionDate",
163
- "notes",
164
- "otp",
165
- "enabledProfile",
166
- "includeInDirectory",
167
- "emailStatement",
168
- "createdAt",
169
- "updatedAt",
170
- ];
171
- return member;
1
+ const { GENDER, RELATIONSHIP } = require("../../constants");
2
+
3
+ module.exports = (sequelize, DataTypes) => {
4
+ const member = sequelize.define(
5
+ "Member",
6
+ {
7
+ id: {
8
+ type: DataTypes.INTEGER,
9
+ primaryKey: true,
10
+ autoIncrement: true,
11
+ },
12
+
13
+ // Foreign Key to memberships
14
+ membershipId: {
15
+ type: DataTypes.INTEGER,
16
+ set(membershipId) {
17
+ this.setDataValue("membershipId", membershipId?.id || membershipId);
18
+ },
19
+ },
20
+
21
+ // Basic Identity
22
+ title: { type: DataTypes.STRING },
23
+ firstName: { type: DataTypes.STRING, allowNull: false },
24
+ middleName: { type: DataTypes.STRING },
25
+ lastName: { type: DataTypes.STRING, allowNull: false },
26
+ maidenName: { type: DataTypes.STRING },
27
+ suffix: { type: DataTypes.STRING },
28
+ salutation: { type: DataTypes.STRING },
29
+ preferredName: { type: DataTypes.STRING },
30
+ profileImage: { type: DataTypes.STRING },
31
+
32
+ // Contact Info
33
+ address: { type: DataTypes.TEXT },
34
+ cityId: {
35
+ type: DataTypes.INTEGER,
36
+ set(cityId) {
37
+ this.setDataValue("cityId", cityId?.id || cityId);
38
+ },
39
+ },
40
+ provinceId: {
41
+ type: DataTypes.INTEGER,
42
+ set(provinceId) {
43
+ this.setDataValue("provinceId", provinceId?.id || provinceId);
44
+ },
45
+ },
46
+ zipCode: { type: DataTypes.STRING },
47
+ homePhone: { type: DataTypes.STRING },
48
+ cellPhone: { type: DataTypes.STRING },
49
+ workPhone: { type: DataTypes.STRING },
50
+ email: { type: DataTypes.STRING, validate: { isEmail: true } },
51
+
52
+ // Other Personal Info
53
+ occupation: { type: DataTypes.STRING },
54
+ employer: { type: DataTypes.STRING },
55
+ schoolGrade: { type: DataTypes.STRING },
56
+ emergencyContact: { type: DataTypes.STRING },
57
+ emergencyPhone: { type: DataTypes.STRING },
58
+ geographicArea: { type: DataTypes.STRING },
59
+
60
+ // Membership Status
61
+ memberStatusId: {
62
+ type: DataTypes.INTEGER,
63
+ set(memberStatusId) {
64
+ this.setDataValue("memberStatusId", memberStatusId?.id || memberStatusId);
65
+ },
66
+ },
67
+
68
+ envNumber: { type: DataTypes.STRING },
69
+ gender: {
70
+ type: DataTypes.STRING,
71
+ validate: {
72
+ isIn: [Object.values(GENDER)],
73
+ },
74
+ },
75
+ relationship: {
76
+ type: DataTypes.STRING,
77
+ validate: {
78
+ isIn: [Object.values(RELATIONSHIP)],
79
+ },
80
+ },
81
+
82
+ // Dates
83
+ birthDate: { type: DataTypes.DATE },
84
+ weddingDate: { type: DataTypes.DATE },
85
+ baptizedDate: { type: DataTypes.DATE },
86
+ confessionDate: { type: DataTypes.DATE },
87
+
88
+ // Additional
89
+ notes: { type: DataTypes.TEXT },
90
+ otp: { type: DataTypes.INTEGER },
91
+
92
+ // Flags
93
+ enabledProfile: {
94
+ type: DataTypes.BOOLEAN,
95
+ defaultValue: true,
96
+ },
97
+ includeInDirectory: {
98
+ type: DataTypes.BOOLEAN,
99
+ defaultValue: true,
100
+ },
101
+ emailStatement: {
102
+ type: DataTypes.BOOLEAN,
103
+ defaultValue: false,
104
+ },
105
+
106
+ // Metadata
107
+ createdAt: { type: DataTypes.DATE },
108
+ updatedAt: { type: DataTypes.DATE },
109
+ },
110
+ { freezeTableName: true, timestamps: false }
111
+ );
112
+ member.associate = function (models) {
113
+ member.hasOne(models.user, { foreignKey: "memberId", as: "user" });
114
+ member.belongsTo(models.membership, { foreignKey: "membershipId", as: "membership" });
115
+ member.belongsTo(models.memberStatus, { foreignKey: "memberStatusId", as: "memberStatus" });
116
+ member.belongsTo(models.province, { foreignKey: "provinceId", as: "province" });
117
+ member.belongsTo(models.city, { foreignKey: "cityId", as: "city" });
118
+ }
119
+ member.selectedFields = [
120
+ "id",
121
+ "membershipId",
122
+ "title",
123
+ "firstName",
124
+ "middleName",
125
+ "lastName",
126
+ "maidenName",
127
+ "suffix",
128
+ "salutation",
129
+ "preferredName",
130
+ "profileImage",
131
+ "address",
132
+ "cityId",
133
+ "provinceId",
134
+ "zipCode",
135
+ "homePhone",
136
+ "cellPhone",
137
+ "workPhone",
138
+ "email",
139
+ "occupation",
140
+ "employer",
141
+ "schoolGrade",
142
+ "emergencyContact",
143
+ "emergencyPhone",
144
+ "geographicArea",
145
+ "memberStatusId",
146
+ "envNumber",
147
+ "gender",
148
+ "relationship",
149
+ "birthDate",
150
+ "weddingDate",
151
+ "baptizedDate",
152
+ "confessionDate",
153
+ "notes",
154
+ "otp",
155
+ "enabledProfile",
156
+ "includeInDirectory",
157
+ "emailStatement",
158
+ "createdAt",
159
+ "updatedAt",
160
+ ];
161
+ return member;
172
162
  }
@@ -0,0 +1,22 @@
1
+ module.exports = (sequelize, DataTypes) => {
2
+ const memberStatus = sequelize.define(
3
+ "MemberStatus",
4
+ {
5
+ id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
6
+ name: { type: DataTypes.STRING },
7
+ isEditable: { type: DataTypes.BOOLEAN, defaultValue: true },
8
+ status: { type: DataTypes.BOOLEAN, defaultValue: true },
9
+ createdAt: {
10
+ type: DataTypes.DATE,
11
+ defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
12
+ },
13
+ updatedAt: {
14
+ type: DataTypes.DATE,
15
+ defaultValue: DataTypes.literal("CURRENT_TIMESTAMP"),
16
+ },
17
+ },
18
+ { freezeTableName: true, timestamps: false }
19
+ );
20
+ memberStatus.selectedFields = ["id", "name", "isEditable", "status", "createdAt", "updatedAt"];
21
+ return memberStatus;
22
+ };