Skip to content

Commit d7ca2c4

Browse files
committed
implement discount on courses/ebooks
1 parent a205834 commit d7ca2c4

7 files changed

Lines changed: 89 additions & 6 deletions

File tree

fixture/init/payments.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ require('payments');
33

44
exports.Transaction = [];
55
exports.TransactionLog = [];
6+
exports.Discount = [{
7+
code: "DISCOUNT",
8+
discount: 1
9+
}];
610
exports.Order = [];
711

812
exports.OrderTemplate = [
@@ -12,7 +16,7 @@ exports.OrderTemplate = [
1216
slug: "js",
1317
module: 'ebook',
1418
weight: 1,
15-
amount: 1,
19+
amount: 2,
1620
data: {
1721
file: "tutorial/js.zip"
1822
}
@@ -23,7 +27,7 @@ exports.OrderTemplate = [
2327
slug: "ui",
2428
module: 'ebook',
2529
weight: 2,
26-
amount: 1,
30+
amount: 2,
2731
data: {
2832
file: "tutorial/ui.zip"
2933
}
@@ -34,7 +38,7 @@ exports.OrderTemplate = [
3438
slug: "js-ui",
3539
module: 'ebook',
3640
weight: 3,
37-
amount: 1,
41+
amount: 2,
3842
data: {
3943
file: "tutorial/js-ui.zip"
4044
}

handlers/courses/lib/createOrderFromTemplate.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var Order = require('payments').Order;
2+
var Discount = require('payments').Discount;
23
var OrderCreateError = require('payments').OrderCreateError;
34
var CourseGroup = require('../models/courseGroup');
45
var pluralize = require('textUtil/pluralize');
@@ -42,9 +43,17 @@ module.exports = function*(orderTemplate, user, requestBody) {
4243
throw new OrderCreateError("Вы не авторизованы.");
4344
}
4445

46+
47+
var price = group.price;
48+
if (requestBody.discountCode) {
49+
var discount = yield* Discount.findByCodeAndModule(requestBody.discountCode, 'courses');
50+
if (discount) price = discount.apply(price);
51+
}
52+
53+
4554
var order = new Order({
4655
title: group.title,
47-
amount: orderData.count * group.price,
56+
amount: orderData.count * price,
4857
module: orderTemplate.module,
4958
data: orderData,
5059
email: user.email,

handlers/ebook/client/orderForm.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class OrderForm {
1414

1515
this.elem.addEventListener('submit', (e) => this.onSubmit(e));
1616

17-
1817
this.delegate('[data-order-payment-change]', 'click', function(e) {
1918
e.preventDefault();
2019
this.elem.querySelector('[data-order-form-step-payment]').style.display = 'block';

handlers/ebook/lib/createOrderFromTemplate.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
var Order = require('payments').Order;
2+
var Discount = require('payments').Discount;
23

34
// middleware
45
// create order from template,
56
// use the incoming data if needed
67
module.exports = function* (orderTemplate, user, requestBody) {
78

9+
var amount = orderTemplate.amount;
10+
if (requestBody.discountCode) {
11+
var discount = yield* Discount.findByCodeAndModule(requestBody.discountCode, 'ebook');
12+
if (discount) amount = discount.apply(amount);
13+
}
14+
815
var order = new Order({
916
title: orderTemplate.title,
1017
description: orderTemplate.description,
11-
amount: orderTemplate.amount,
18+
amount: amount,
1219
module: orderTemplate.module,
1320
data: orderTemplate.data
1421
});

handlers/payments/common/client/formPayment.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ class FormPayment {
7676
orderData[key] = paymentData[key];
7777
}
7878

79+
var discountCode = window.location.search.match(/[?&]discountCode=(\w+)/);
80+
if (discountCode) {
81+
orderData.discountCode = discountCode[1];
82+
}
83+
7984
// response status must be 200
8085
var request = xhr({
8186
method: 'POST',

handlers/payments/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ exports.loadTransaction = require('./lib/loadTransaction');
99
exports.getOrderInfo = require('./lib/getOrderInfo');
1010

1111
var Order = exports.Order = require('./models/order');
12+
var Discount = exports.Discount = require('./models/discount');
1213
var OrderTemplate = exports.OrderTemplate = require('./models/orderTemplate');
1314
var Transaction = exports.Transaction = require('./models/transaction');
1415
var TransactionLog = exports.TransactionLog = require('./models/transactionLog');
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
var mongoose = require('mongoose');
2+
var Schema = mongoose.Schema;
3+
var autoIncrement = require('mongoose-auto-increment');
4+
var OrderTemplate = require('./orderTemplate');
5+
var Transaction = require('./transaction');
6+
var _ = require('lodash');
7+
8+
var schema = new Schema({
9+
discount: {
10+
type: Number,
11+
required: true
12+
},
13+
14+
15+
onlyModule: {
16+
type: String
17+
},
18+
19+
code: {
20+
type: String,
21+
required: true,
22+
unique: true,
23+
default: function() {
24+
return Math.random().toString(36).slice(2, 10);
25+
}
26+
},
27+
28+
isActive: {
29+
type: Boolean,
30+
default: true
31+
},
32+
33+
created: {
34+
type: Date,
35+
default: Date.now
36+
}
37+
38+
});
39+
40+
/**
41+
* find active discount with the code
42+
* if discount has onlyModule set, ensure the match
43+
* @param code
44+
* @param onlyModule
45+
* @returns {*}
46+
*/
47+
schema.statics.findByCodeAndModule = function*(code, onlyModule) {
48+
var discount = yield Discount.findOne({code: code, isActive: true}).exec();
49+
if (discount.onlyModule && discount.onlyModule != onlyModule) return null;
50+
return discount;
51+
};
52+
53+
schema.methods.apply = function(amount) {
54+
return this.discount < 1 ? amount * this.discount : this.discount;
55+
};
56+
57+
var Discount = module.exports = mongoose.model('Discount', schema);
58+

0 commit comments

Comments
 (0)