UNPKG

14.3 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11Object.defineProperty(exports, "__esModule", { value: true });
12exports.createRefundMessage = exports.createReturnOrderMessage = exports.createOrderItems = exports.createSendOrderMessage = void 0;
13/**
14 * Eメールメッセージビルダー
15 */
16const moment = require("moment-timezone");
17const pug = require("pug");
18const util = require("util");
19const factory = require("./factory");
20const templateDirectory = `${__dirname}/../emails`;
21const DEFAULT_SENDER_EMAIL = 'noreply@example.com';
22function createEmailMessageText(params) {
23 return __awaiter(this, void 0, void 0, function* () {
24 const emailTemplate = (params.email !== undefined) ? params.email.template : undefined;
25 const emailText = (params.email !== undefined) ? params.email.text : undefined;
26 let emailMessageText;
27 if (typeof emailText === 'string') {
28 emailMessageText = emailText;
29 }
30 else if (typeof emailTemplate === 'string') {
31 emailMessageText = yield new Promise((resolve, reject) => {
32 pug.render(emailTemplate, {
33 order: params.order
34 }, (err, message) => {
35 if (err instanceof Error) {
36 reject(new factory.errors.Argument('emailTemplate', err.message));
37 return;
38 }
39 resolve(message);
40 });
41 });
42 }
43 else {
44 emailMessageText = yield new Promise((resolve, reject) => {
45 pug.renderFile(params.renderFilePath, params.renderFileOptions, (err, message) => {
46 if (err instanceof Error) {
47 reject(err);
48 return;
49 }
50 resolve(message);
51 });
52 });
53 }
54 return emailMessageText;
55 });
56}
57function createEmailMessageAbout(params) {
58 return __awaiter(this, void 0, void 0, function* () {
59 let about;
60 if (params.email !== undefined && typeof params.email.about === 'string') {
61 about = params.email.about;
62 }
63 else {
64 about = yield new Promise((resolve, reject) => {
65 pug.renderFile(params.renderFilePath, params.renderFileOptions, (err, defaultSubject) => {
66 if (err instanceof Error) {
67 reject(err);
68 return;
69 }
70 resolve(defaultSubject);
71 });
72 });
73 }
74 return about;
75 });
76}
77function createEmailMessageSender(params) {
78 return {
79 typeOf: params.order.seller.typeOf,
80 name: (params.email !== undefined
81 && params.email.sender !== undefined
82 && typeof params.email.sender.name === 'string')
83 ? params.email.sender.name
84 : params.order.seller.name,
85 email: (params.email !== undefined
86 && params.email.sender !== undefined
87 && typeof params.email.sender.email === 'string')
88 ? params.email.sender.email
89 : DEFAULT_SENDER_EMAIL
90 };
91}
92/**
93 * 注文配送メッセージを作成する
94 */
95function createSendOrderMessage(params) {
96 return __awaiter(this, void 0, void 0, function* () {
97 const emailMessageText = yield createEmailMessageText({
98 order: params.order,
99 email: params.email,
100 renderFilePath: `${templateDirectory}/sendOrder/text.pug`,
101 renderFileOptions: {
102 order: params.order,
103 orderItems: createOrderItems({ order: params.order })
104 .join('\n')
105 }
106 });
107 const about = yield createEmailMessageAbout({
108 email: params.email,
109 renderFilePath: `${templateDirectory}/sendOrder/subject.pug`,
110 renderFileOptions: {
111 sellerName: params.order.seller.name
112 }
113 });
114 const defaultToRecipientEmail = params.order.customer.email;
115 if (defaultToRecipientEmail === undefined) {
116 throw new factory.errors.Argument('order', 'order.customer.email undefined');
117 }
118 const sender = createEmailMessageSender(params);
119 const toRecipient = {
120 typeOf: params.order.customer.typeOf,
121 name: (params.email !== undefined
122 && params.email.toRecipient !== undefined
123 && typeof params.email.toRecipient.name === 'string')
124 ? params.email.toRecipient.name
125 : `${params.order.customer.familyName} ${params.order.customer.givenName}`,
126 email: (params.email !== undefined
127 && params.email.toRecipient !== undefined
128 && typeof params.email.toRecipient.email === 'string')
129 ? params.email.toRecipient.email
130 : defaultToRecipientEmail
131 };
132 return {
133 typeOf: factory.creativeWorkType.EmailMessage,
134 identifier: `SendOrder-${params.order.orderNumber}`,
135 name: `SendOrder-${params.order.orderNumber}`,
136 sender: sender,
137 toRecipient: toRecipient,
138 about: about,
139 text: emailMessageText
140 };
141 });
142}
143exports.createSendOrderMessage = createSendOrderMessage;
144/**
145 * 注文データから注文アイテム文字列を作成する
146 */
147function createOrderItems(params) {
148 return params.order.acceptedOffers.map((o) => {
149 var _a, _b, _c;
150 if (o.itemOffered.typeOf === factory.chevre.reservationType.EventReservation) {
151 const reservation = o.itemOffered;
152 const event = reservation.reservationFor;
153 const eventStartDate = util.format('%s - %s', moment(event.startDate)
154 .toISOString(), moment(event.endDate)
155 .toISOString());
156 const locationName = util.format('%s %s%s', (_a = event.superEvent.location.name) === null || _a === void 0 ? void 0 : _a.ja, (_b = event.location.name) === null || _b === void 0 ? void 0 : _b.ja, (event.location.address !== undefined) ? `(${event.location.address.ja})` : '');
157 let option = '';
158 if (Array.isArray(reservation.reservationFor.superEvent.videoFormat)) {
159 option += reservation.reservationFor.superEvent.videoFormat.map((format) => format.typeOf)
160 .join(',');
161 }
162 let priceStr = '';
163 let reservationPriceSpec;
164 if (o.priceSpecification !== undefined && o.priceSpecification !== null) {
165 if (typeof o.priceSpecification === 'number') {
166 // priceが数字の場合単価仕様を含む複合価格仕様に変換
167 reservationPriceSpec = {
168 project: { typeOf: params.order.project.typeOf, id: params.order.project.id },
169 typeOf: factory.chevre.priceSpecificationType.CompoundPriceSpecification,
170 priceCurrency: factory.chevre.priceCurrency.JPY,
171 valueAddedTaxIncluded: true,
172 priceComponent: [
173 {
174 project: { typeOf: params.order.project.typeOf, id: params.order.project.id },
175 typeOf: factory.chevre.priceSpecificationType.UnitPriceSpecification,
176 price: o.priceSpecification,
177 priceCurrency: o.priceCurrency,
178 valueAddedTaxIncluded: true
179 }
180 ]
181 };
182 }
183 else {
184 reservationPriceSpec = o.priceSpecification;
185 }
186 }
187 // 予約の価格仕様が分かれば、priceStrに単価をセット
188 if (reservationPriceSpec !== undefined) {
189 const unitPriceSpec = reservationPriceSpec.priceComponent.find((spec) => spec.typeOf === factory.chevre.priceSpecificationType.UnitPriceSpecification);
190 if (unitPriceSpec !== undefined) {
191 priceStr = `${unitPriceSpec.price}/${unitPriceSpec.referenceQuantity.value}`;
192 }
193 }
194 return util.format('%s %s @%s %s %s %s %s (%s)', event.name.ja, eventStartDate, locationName, (reservation.reservedTicket.ticketedSeat !== undefined)
195 ? reservation.reservedTicket.ticketedSeat.seatNumber
196 : 'Non-reserved Seat', (typeof reservation.reservedTicket.ticketType.name === 'string')
197 ? reservation.reservedTicket.ticketType.name
198 : (_c = reservation.reservedTicket.ticketType.name) === null || _c === void 0 ? void 0 : _c.ja, priceStr, o.priceCurrency, option);
199 }
200 else {
201 return util.format('%s %s %s %s', o.itemOffered.typeOf, (typeof o.itemOffered.name === 'string') ? o.itemOffered.name : '', (typeof o.price === 'number') ? String(o.price) : '', o.priceCurrency);
202 }
203 });
204}
205exports.createOrderItems = createOrderItems;
206/**
207 * 注文返品メッセージを作成する
208 */
209function createReturnOrderMessage(params) {
210 return __awaiter(this, void 0, void 0, function* () {
211 const emailMessageText = yield createEmailMessageText({
212 order: params.order,
213 email: params.email,
214 renderFilePath: `${templateDirectory}/returnOrder/text.pug`,
215 renderFileOptions: {
216 order: params.order
217 }
218 });
219 const about = yield createEmailMessageAbout({
220 email: params.email,
221 renderFilePath: `${templateDirectory}/returnOrder/subject.pug`,
222 renderFileOptions: {
223 sellerName: params.order.seller.name
224 }
225 });
226 const defaultToRecipientEmail = params.order.customer.email;
227 if (defaultToRecipientEmail === undefined) {
228 throw new factory.errors.Argument('order', 'order.customer.email undefined');
229 }
230 const sender = createEmailMessageSender(params);
231 const toRecipient = {
232 typeOf: params.order.customer.typeOf,
233 name: (params.email !== undefined
234 && params.email.toRecipient !== undefined
235 && typeof params.email.toRecipient.name === 'string')
236 ? params.email.toRecipient.name
237 : `${params.order.customer.familyName} ${params.order.customer.givenName}`,
238 email: (params.email !== undefined
239 && params.email.toRecipient !== undefined
240 && typeof params.email.toRecipient.email === 'string')
241 ? params.email.toRecipient.email
242 : defaultToRecipientEmail
243 };
244 return {
245 typeOf: factory.creativeWorkType.EmailMessage,
246 identifier: `ReturnOrder-${params.order.orderNumber}`,
247 name: `ReturnOrder-${params.order.orderNumber}`,
248 sender: sender,
249 toRecipient: toRecipient,
250 about: about,
251 text: emailMessageText
252 };
253 });
254}
255exports.createReturnOrderMessage = createReturnOrderMessage;
256/**
257 * 返金メッセージを作成する
258 */
259function createRefundMessage(params) {
260 return __awaiter(this, void 0, void 0, function* () {
261 const emailMessageText = yield createEmailMessageText({
262 order: params.order,
263 email: params.email,
264 renderFilePath: `${templateDirectory}/refundOrder/text.pug`,
265 renderFileOptions: {
266 order: params.order,
267 paymentMethods: params.paymentMethods.map((p) => {
268 return util.format('%s\n%s\n%s\n', p.typeOf, (p.accountId !== undefined) ? p.accountId : '', (p.totalPaymentDue !== undefined) ? `${p.totalPaymentDue.value} ${p.totalPaymentDue.currency}` : '');
269 })
270 .join('\n')
271 }
272 });
273 const about = yield createEmailMessageAbout({
274 email: params.email,
275 renderFilePath: `${templateDirectory}/refundOrder/subject.pug`,
276 renderFileOptions: {
277 sellerName: params.order.seller.name
278 }
279 });
280 const defaultToRecipientEmail = params.order.customer.email;
281 if (defaultToRecipientEmail === undefined) {
282 throw new factory.errors.Argument('order', 'order.customer.email undefined');
283 }
284 const sender = createEmailMessageSender(params);
285 const toRecipient = {
286 typeOf: params.order.customer.typeOf,
287 name: (params.email !== undefined
288 && params.email.toRecipient !== undefined
289 && typeof params.email.toRecipient.name === 'string')
290 ? params.email.toRecipient.name
291 : `${params.order.customer.familyName} ${params.order.customer.givenName}`,
292 email: (params.email !== undefined
293 && params.email.toRecipient !== undefined
294 && typeof params.email.toRecipient.email === 'string')
295 ? params.email.toRecipient.email
296 : defaultToRecipientEmail
297 };
298 return {
299 typeOf: factory.creativeWorkType.EmailMessage,
300 identifier: `RefundOrder-${params.order.orderNumber}`,
301 name: `RefundOrder-${params.order.orderNumber}`,
302 sender: sender,
303 toRecipient: toRecipient,
304 about: about,
305 text: emailMessageText
306 };
307 });
308}
309exports.createRefundMessage = createRefundMessage;