@positivegrid/pg-mongoose-schema 27.8.5 → 28.0.0-beta.3

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.
package/models/partner.js DELETED
@@ -1,265 +0,0 @@
1
- 'use strict'
2
-
3
- module.exports = function (mongoose) {
4
- const Schema = mongoose.Schema
5
- const ObjectId = Schema.Types.ObjectId
6
- const _ = require('lodash')
7
- const debug = require('debug')('model:partner')
8
-
9
- const PartnerSalesMetaSchema = new Schema({
10
- partner_name: { type: String, required: true }, // thomann/b2b_redeem
11
- sales_product: { type: ObjectId, ref: 'Product', default: null },
12
- sales_bundle: { type: ObjectId, ref: 'Bundle', default: null },
13
- b2b_redeem_id: { type: Number, default: null }, // Map to b2b redeem code product ID on BigCommerce (NOT product!)
14
- pg_sales_price: { type: Number, default: 0, required: true }, // The price which the product we sell on BigCommerce
15
- purchase_price: { type: Number, default: 0, required: true }, // The price we gave to our partner
16
- status: { type: Number, default: 1, required: true }, // 1: active, 2: inactive
17
- created_on: { type: Date, default: Date.now }
18
- }, { collection: 'pg_partner_sales_meta' })
19
- PartnerSalesMetaSchema.index({ partner_name: 1, status: 1 })
20
- PartnerSalesMetaSchema.index({ sales_product: 1, sales_bundle: 1, status: 1 })
21
-
22
- const PURCHASE_ITEM_TYPE = ['license', 'bundle']
23
- const PartnerRedeemSchema = new Schema({
24
- partner_name: { type: String, required: true },
25
- sales_item_id: { type: ObjectId, ref: 'PartnerSalesMeta', required: true },
26
- purchase_price: { type: Number, default: 0, required: true },
27
- redeem_keycode: { type: String, required: true },
28
- buyer: { type: Schema.Types.Mixed, default: null },
29
- order_number: { type: String, default: null },
30
- status: { type: Number, required: true, default: 1 }, // 1: active 2: refund
31
- metadata: { type: Schema.Types.Mixed, default: null },
32
- created_on: { type: Date, default: Date.now },
33
- updated_on: { type: Date, default: Date.now }
34
- }, { collection: 'pg_partner_redeem' })
35
-
36
- const PartnerSalesHistorySchema = new Schema({
37
- partner_name: { type: String, required: true },
38
- sku: { type: String, required: true },
39
- title: { type: String, required: true },
40
- previous_price: { type: Number, required: true },
41
- current_price: { type: Number, required: true },
42
- updated_on: { type: Date, default: Date.now }
43
- }, { collection: 'pg_partner_sales_history' })
44
- PartnerSalesHistorySchema.index({ partner_name: 1, sku: 1 })
45
-
46
- /**
47
- * B2bRedeemSchema is the db table for B2B redeem purchase records.
48
- * Our dealer will purchase the redeem code they need and all detail will save in pg_b2b_redeem_order and pg_b2b_redeem
49
- * https://docs.google.com/document/d/1sYJ8iNocF6xipbcNA06MrL0Wt1m_kEzAHstVBfvZ4ng/edit?usp=sharing
50
- */
51
- const B2bRedeemOrderSchema = new Schema({
52
- dealer_id: { type: ObjectId, ref: 'auth_user', required: true }, // Dealer also need to signup a PG account first.
53
- order_id: { type: Number, default: null, required: true }, // we use BigCommerce system for now.
54
- order_detail: [{
55
- product_id: { type: ObjectId, ref: 'jamup_product', default: null },
56
- bundle_id: { type: ObjectId, ref: 'jamup_bundle', default: null },
57
- quantity: { type: Number, default: 0 }
58
- }],
59
- order_amount: { type: Number, default: 0, required: true },
60
- status: { type: Number, default: 0, required: true }, // 0:inactive/1:code_shipped/2:receive_order/3:refund
61
- created_on: { type: Date, default: Date.now }
62
- }, { collection: 'pg_b2b_redeem_order' })
63
- B2bRedeemOrderSchema.index({ dealer_id: 1, order_id: 1 })
64
-
65
- const B2bRedeemSchema = new Schema({
66
- redeem_code: { type: String, required: true },
67
- status: { type: Number, default: 1, required: true }, //1:active/2:refund/3:delete
68
- redeem_order_id: { type: ObjectId, ref: 'pg_b2b_redeem_order', required: true },
69
- apply_user_id: { type: ObjectId, ref: 'auth_user', default: null, required: true },
70
- created_on: { type: Date, default: Date.now }
71
- }, { collection: 'pg_b2b_redeem' })
72
-
73
- const B2bDealerSchema = new Schema({
74
- dealer_id: { type: ObjectId, ref: 'User', required: true },
75
- business_name: { type: String, required: true },
76
- business_address: { type: String, required: true },
77
- business_phone: { type: String, required: true },
78
- business_website: { type: String, default: null },
79
- business_tax_id: { type: String, default: null },
80
- business_vat_id: { type: String, default: null },
81
- members: [{ type: String }], // members' email which can receive purchased redeem code as well.
82
- created_on: { type: Date, default: Date.now }
83
- }, { collection: 'b2b_dealer_profile' })
84
-
85
- /**
86
- * This table is used for special redeem code promotion for our OEM partners.
87
- * The fields in this table will map to the redeem code metadata:
88
- * redeem_product -> product_name
89
- * product_type -> type
90
- * partner_name -> OEM_Name
91
- * https://docs.google.com/document/d/1wyJwGm6zHNLDVnJWV9FGxznqwBFZMpG8IcXUQCurjwI/edit?usp=sharing
92
- */
93
- const OEM_PROMOTION_TYPE = [
94
- 'discount_coupon'
95
- ]
96
- const OemRedeemPromotionSchema = new Schema({
97
- redeem_product: { type: String, required: true },
98
- product_type: { type: String, required: true },
99
- partner_name: { type: String, required: true },
100
- promotion_type: { type: String, enum: OEM_PROMOTION_TYPE, required: true },
101
- promotion_data: { type: Schema.Types.Mixed, required: true },
102
- status: { type: Number, default: 1, required: true }, // 0:disable/1:enable
103
- created_on: { type: Date, default: Date.now }
104
- }, { collection: 'pg_oem_redeem_promotion' })
105
-
106
- function _identifyItemTypeBySku (sku) {
107
- if (/^B(.*)/.test(sku)) {
108
- return 'bundle'
109
- } else if (/^(L|C|U)(.*)/.test(sku)) {
110
- return 'product'
111
- } else {
112
- return false
113
- }
114
- }
115
-
116
- PartnerSalesMetaSchema.static({
117
- getPartnerSalesMeta: function (partnerName) {
118
- const self = this
119
- return new Promise((resolve, reject) => {
120
- self.aggregate([
121
- {
122
- '$match': {
123
- 'partner_name': partnerName,
124
- 'status': 1
125
- }
126
- },
127
- {
128
- '$lookup': {
129
- 'from': 'jamup_bundle',
130
- 'foreignField': '_id',
131
- 'localField': 'sales_bundle',
132
- 'as': 'bundle'
133
- }
134
- },
135
- {
136
- '$lookup': {
137
- 'from': 'jamup_product',
138
- 'foreignField': '_id',
139
- 'localField': 'sales_product',
140
- 'as': 'product'
141
- }
142
- },
143
- ])
144
- .exec()
145
- .then(data => {
146
- if (!data) {
147
- return reject(Error(`Partner ${partnerName} are invalid.`))
148
- } else {
149
- return resolve(data)
150
- }
151
- })
152
- .catch(err => {
153
- return reject(err)
154
- })
155
- })
156
- },
157
- getSalesMetaWithSku: function (sku, partnerName) {
158
- const self = this
159
- return new Promise((resolve, reject) => {
160
- const skuType = _identifyItemTypeBySku(sku)
161
- if (skuType === 'bundle') {
162
- self.aggregate([
163
- {
164
- '$match': {
165
- 'partner_name': partnerName,
166
- 'status': 1
167
- }
168
- },
169
- {
170
- '$lookup': {
171
- 'from': 'jamup_bundle',
172
- 'foreignField': '_id',
173
- 'localField': 'sales_bundle',
174
- 'as': 'sales'
175
- }
176
- },
177
- { '$unwind': '$sales' },
178
- { '$match': { 'sales.sku': sku } }
179
- ])
180
- .exec()
181
- .then(data => {
182
- if (!data) {
183
- return reject(Error(`SKU ${sku} is not enabled sales bundle.`))
184
- } else if (Array.isArray(data) && data.length > 1) {
185
- return reject(Error(`Incorrect bundle sku settings: ${sku}.`))
186
- } else {
187
- return resolve(data[0])
188
- }
189
- })
190
- .catch(err => {
191
- return reject(err)
192
- })
193
- } else if (skuType === 'product') {
194
- self.aggregate([
195
- {
196
- '$match': {
197
- 'partner_name': partnerName,
198
- 'status': 1
199
- }
200
- },
201
- {
202
- '$lookup': {
203
- 'from': 'jamup_product',
204
- 'foreignField': '_id',
205
- 'localField': 'sales_product',
206
- 'as': 'sales'
207
- }
208
- },
209
- { '$unwind': '$sales' },
210
- { '$match': { 'sales.sku': sku } }
211
- ])
212
- .exec()
213
- .then(data => {
214
- if (!data) {
215
- return reject(Error(`SKU ${sku} is not enabled sales product.`))
216
- } else if (Array.isArray(data) && data.length > 1) {
217
- return reject(Error(`Incorrect product sku settings: ${sku}.`))
218
- } else {
219
- return resolve(data[0])
220
- }
221
- })
222
- .catch(err => {
223
- return reject(err)
224
- })
225
- } else {
226
- return reject(Error(`Invalid item sku: ${sku}`))
227
- }
228
- })
229
- }
230
- })
231
-
232
- OemRedeemPromotionSchema.static({
233
- findRedeemFullfillPromotion: async function (redeemData) {
234
- try {
235
- if (!_.has(redeemData, 'metadata.OEM_Name')) {
236
- throw new Error('This is not a OEM redeem code.')
237
- }
238
-
239
- if (!_.has(redeemData, 'metadata.product_name') || !_.has(redeemData, 'metadata.type')) {
240
- throw new Error('This is not a valid redeem code.')
241
- }
242
-
243
- const promoData = await this.find({
244
- 'redeem_product': redeemData.metadata.product_name,
245
- 'product_type': redeemData.metadata.type,
246
- 'partner_name': redeemData.metadata.OEM_Name,
247
- 'status': 1
248
- }).exec()
249
-
250
- return promoData
251
- } catch (err) {
252
- debug('ERR:findRedeemFullfillPromotion %o', err)
253
- throw err
254
- }
255
- }
256
- })
257
-
258
- mongoose.model('PartnerSalesMeta', PartnerSalesMetaSchema)
259
- mongoose.model('PartnerRedeem', PartnerRedeemSchema)
260
- mongoose.model('PartnerSalesHistory', PartnerSalesHistorySchema)
261
- mongoose.model('B2bRedeemOrder', B2bRedeemOrderSchema)
262
- mongoose.model('B2bRedeem', B2bRedeemSchema)
263
- mongoose.model('B2bDealer', B2bDealerSchema)
264
- mongoose.model('OemRedeemPromotion', OemRedeemPromotionSchema)
265
- }