Skip to content

Commit 9852212

Browse files
committed
add invoice payment, minor fixes in orders & docs
1 parent d2e6cd6 commit 9852212

23 files changed

Lines changed: 480 additions & 49 deletions

File tree

LICENSE.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
Код публикуется под открытой лицензией CC-BY-NC-SA.
2+
3+
Это означает, что вы можете свободно распространять, использовать и адаптировать этот код при выполнении следующих условий:
4+
5+
- Аттрибуция: дать ссылку на эту лицензию, указать автора и наличие изменений с вашей стороны.
6+
- Некоммерчески: вы не можете использовать этот код в коммерческих целях. Если есть такое желание -- свяжитесь с разработчиком: [email protected].
7+
- На тех же условиях: если вы перерабатываете, преобразовываете код или берёте его за основу для вашего, вы должны распространять переделанные вами части на условиях этой лицензии.
8+
9+
Это было совсем краткое изложение лицензии, более полный текст которой находится на https://creativecommons.org/licenses/by-nc-sa/3.0/, а юридически оформленный -- на https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode.
10+
11+
12+

client/head/trackLinks.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ document.addEventListener('click', function(e) {
1717
hitCallback: loadPage
1818
});
1919

20-
// redirect after one second if recording takes too long
20+
// redirect after half-second if recording takes too long
2121
setTimeout(loadPage, 500);
2222

2323
// redirect to outbound page

docs/payment.sketch

8 KB
Binary file not shown.

fixture/init.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ exports.OrderTemplate = [
1010
description: "600+ стр, PDF + EPUB (10Mb)",
1111
slug: "js",
1212
module: 'ebook',
13+
weight: 1,
1314
amount: 10,
1415
data: {
1516
file: "tutorial/js.zip"
@@ -20,6 +21,7 @@ exports.OrderTemplate = [
2021
description: "380+ стр, PDF + EPUB (8Mb)",
2122
slug: "ui",
2223
module: 'ebook',
24+
weight: 2,
2325
amount: 10,
2426
data: {
2527
file: "tutorial/ui.zip"
@@ -30,10 +32,16 @@ exports.OrderTemplate = [
3032
description: "2xPDF + 2xEPUB, (18Mb)",
3133
slug: "js-ui",
3234
module: 'ebook',
35+
weight: 3,
3336
amount: 15,
3437
data: {
3538
file: "tutorial/js-ui.zip"
3639
}
40+
},
41+
{
42+
title: "Оплата счёта javascript.ru",
43+
module: 'invoice',
44+
slug: 'invoice'
3745
}
3846
];
3947

handlers/ebook/controller/newOrder.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ var OrderTemplate = payments.OrderTemplate;
44
exports.get = function*() {
55
this.nocache();
66

7-
var orderTemplates = yield OrderTemplate.find({}).exec();
7+
var orderTemplates = yield OrderTemplate.find({
8+
module: 'ebook'
9+
}).sort({weight: 1}).exec();
810

911
this.locals.orderTemplates = orderTemplates;
1012

handlers/ebook/lib/createOrderFromTemplate.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var Order = require('payments').Order;
33
// middleware
44
// create order from template,
55
// use the incoming data if needed
6-
module.exports = function(orderTemplate) {
6+
module.exports = function* (orderTemplate, user, requestBody) {
77

88
var order = new Order({
99
title: orderTemplate.title,
@@ -13,13 +13,15 @@ module.exports = function(orderTemplate) {
1313
data: orderTemplate.data
1414
});
1515

16-
if (this.req.user) {
17-
order.user = this.req.user._id;
18-
order.email = this.req.user.email;
16+
if (user) {
17+
order.user = user._id;
18+
order.email = user.email;
1919
} else {
20-
order.email = this.request.body.email;
20+
order.email = requestBody.email;
2121
}
2222

23+
yield order.persist();
24+
2325
return order;
2426

25-
};
27+
};

handlers/ebook/templates/blocks/transaction-status.jade

Lines changed: 0 additions & 21 deletions
This file was deleted.

handlers/invoice/client/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
var OrderForm = require('./orderForm');
2+
3+
exports.init = function() {
4+
5+
6+
var orderForm = document.querySelector('[data-order-form]');
7+
if (orderForm) {
8+
new OrderForm({
9+
elem: orderForm
10+
});
11+
}
12+
13+
};
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
var xhr = require('client/xhr');
2+
var notification = require('client/notification');
3+
var delegate = require('client/delegate');
4+
var FormPayment = require('payments/common/client').FormPayment;
5+
var Spinner = require('client/spinner');
6+
var Modal = require('client/head/modal');
7+
8+
class OrderForm {
9+
10+
constructor(options) {
11+
this.elem = options.elem;
12+
13+
this.product = 'invoice';
14+
15+
this.elem.addEventListener('submit', (e) => e.preventDefault());
16+
17+
// many buttons with paymentMethods, onSubmit doesn't give a way to learn which one is pressed
18+
// so I listen to onclick
19+
this.delegate('[name="paymentMethod"]', 'click', (e) => this.onPaymentMethodClick(e));
20+
21+
this.delegate('[data-order-payment-change]', 'click', function(e) {
22+
e.preventDefault();
23+
this.elem.querySelector('[data-order-form-step-payment]').style.display = 'block';
24+
this.elem.querySelector('[data-order-form-step-confirm]').style.display = 'none';
25+
this.elem.querySelector('[data-order-form-step-receipt]').style.display = 'none';
26+
});
27+
28+
}
29+
30+
// return orderData or nothing if validation failed
31+
getOrderData() {
32+
var orderData = { };
33+
34+
if (this.elem.elements.email) {
35+
if (!this.elem.elements.email.value) {
36+
new notification.Error("Введите email.");
37+
this.elem.elements.email.scrollIntoView();
38+
setTimeout(function() {
39+
window.scrollBy(0, -200);
40+
}, 0);
41+
this.elem.elements.email.focus();
42+
return;
43+
} else {
44+
orderData.email = this.elem.elements.email.value;
45+
}
46+
}
47+
48+
if (!this.elem.elements.invoiceNumber.value) {
49+
new notification.Error("Введите email.");
50+
this.elem.elements.invoiceNumber.scrollIntoView();
51+
setTimeout(function() {
52+
window.scrollBy(0, -200);
53+
}, 0);
54+
this.elem.elements.invoiceNumber.focus();
55+
return;
56+
} else {
57+
orderData.invoiceNumber = this.elem.elements.invoiceNumber.value;
58+
}
59+
60+
61+
if (window.orderNumber) {
62+
orderData.orderNumber = window.orderNumber;
63+
} else {
64+
orderData.orderTemplate = 'invoice';
65+
orderData.amount = this.elem.elements.amount.value;
66+
67+
if (!orderData.amount) {
68+
new notification.Error("Введите сумму.");
69+
this.elem.elements.amount.scrollIntoView();
70+
setTimeout(function() {
71+
window.scrollBy(0, -200);
72+
}, 0);
73+
this.elem.elements.amount.focus();
74+
return;
75+
}
76+
}
77+
78+
79+
return orderData;
80+
}
81+
82+
onPaymentMethodClick(e) {
83+
var paymentMethod = e.delegateTarget.value;
84+
85+
new FormPayment(paymentMethod, this).submit();
86+
}
87+
88+
request(options) {
89+
var request = xhr(options);
90+
91+
request.addEventListener('loadstart', function() {
92+
var onEnd = this.startRequestIndication();
93+
request.addEventListener('loadend', onEnd);
94+
}.bind(this));
95+
96+
return request;
97+
}
98+
99+
startRequestIndication() {
100+
101+
var paymentMethodElem = this.elem.querySelector('.pay-method');
102+
paymentMethodElem.classList.add('modal-overlay_light');
103+
104+
var spinner = new Spinner({
105+
elem: paymentMethodElem,
106+
size: 'medium',
107+
class: 'pay-method__spinner'
108+
});
109+
spinner.start();
110+
111+
return function onEnd() {
112+
paymentMethodElem.classList.remove('modal-overlay_light');
113+
if (spinner) spinner.stop();
114+
};
115+
116+
}
117+
118+
119+
}
120+
121+
122+
delegate.delegateMixin(OrderForm.prototype);
123+
124+
module.exports = OrderForm;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const payments = require('payments');
2+
var OrderTemplate = payments.OrderTemplate;
3+
4+
exports.get = function*() {
5+
this.nocache();
6+
7+
this.locals.sitetoolbar = true;
8+
this.locals.title = "Оплата заказа";
9+
10+
this.locals.paymentMethods = require('../lib/paymentMethods');
11+
12+
13+
this.body = this.render('new-order');
14+
};

0 commit comments

Comments
 (0)