/var/www/qr4y.com/server/delivery/services
Edit: /var/www/qr4y.com/server/delivery/services/delivery.service.js (12550B)
const logger = require('../logger')({ service: 'MailService' })
// const { Forbidden, Unauthorized, BadRequest, ApiError } = require('../api/responseModels/errors')
const https = require('https');
module.exports = class DeliveryService {
constructor({ db, config }) {
this.db = db
this.config = config
logger.child({ service: 'DeliveryService', method: 'Constructor' }).info('Success')
}
async Run() {
}
async getOrder(orderId, full) {
try {
let include = [
{ model: this.db.company, foreginKey: 'companyId' },
]
if (full) {
include = [
{ model: this.db.orderAddress },
{
model: this.db.branch,
include: [{ model: this.db.address }],
foreginKey: 'branchId'
},
{ model: this.db.company, foreginKey: 'companyId' },
]
}
let order = await this.db.order.findOne({
include: include,
where: {
id: orderId,
}
})
if (!order) {
return
}
return order
} catch (e) {
logger.child({ service: 'DeliveryService', method: 'getOrder' }).error(e)
}
}
async getDeliveryServer(deliveryServerId) {
try {
let deliveryServer = await this.db.deliveryServer.findOne({
where: {
id: deliveryServerId,
}
})
if (!deliveryServer) {
return
}
return deliveryServer
} catch (e) {
logger.child({ service: 'DeliveryService', method: 'getDeliveryServer' }).error(e)
}
}
getOrderComment(order) {
let comment = ''
let currency = order.company.currency // paid // not_paid
let pay_status_order = order.pay_status_order // paid // not_paid
let pay_status_delivery = order.pay_status_delivery // paid // not_paid
let status = order.status
let tips = parseFloat(order.tips) ?? 0
let order_cost = parseFloat(order.order_cost) ?? 0
let delivery_cost = parseFloat(order.delivery_cost) ?? 0 // only for client
let delivery_cost_calculated = parseFloat(order.delivery_cost_calculated) ?? 0
let status_text = ''
switch (status) {
case 'new': status_text = 'Новый'; break;
case 'pending': status_text = 'В ожидании'; break;
case 'confirmed': status_text = 'Подтвержден'; break;
case 'accept': status_text = 'Готовится'; break;
case 'ready': status_text = 'Готов'; break;
case 'delivery': status_text = 'Доставка'; break;
case 'arrived': status_text = 'Прибыл'; break;
case 'complete': status_text = 'Завершен'; break;
case 'cancel': status_text = 'Отменен'; break;
default: status_text = 'Неизвестный'; break;
}
comment = `Статус заказа: ${status_text}. `
comment += `Заказ: ${order_cost} ${currency} ` + (pay_status_order == 'paid' ? 'ОПЛАЧЕН' : 'НЕ ОПЛАЧЕН') + '. '
comment += `Доставка: ${delivery_cost_calculated} ${currency} ` + (pay_status_delivery == 'paid' ? 'ОПЛАЧЕНА' : 'НЕ ОПЛАЧЕНА') + '. '
if (tips > 0) {
comment += `Чаевые: ${tips} ${currency}. `
}
let summ = this.getSumm(order)
if (summ > 0) {
comment += `К оплате: ${summ} ${currency}. `
}
return comment
}
getSumm(order) {
let summ = 0;
summ = order.pay_status_order == 'not_paid' ? parseFloat(order.order_cost) : 0
summ += order.pay_status_delivery == 'not_paid' ? parseFloat(order.delivery_cost_calculated) : 0
summ += order.pay_status_delivery == 'not_paid' ? parseFloat(order.tips) : 0
return summ
}
getSummDeliveryAndTips(order) {
let summ = 0;
summ += parseFloat(order.delivery_cost_calculated)
summ += parseFloat(order.tips)
return summ
}
async AddOrder(orderId) {
try {
let order = await this.getOrder(orderId, true)
if (!order) {
logger.child({ service: 'DeliveryService', method: 'AddOrder' }).error('Order not found')
return
}
let deliveryServer = await this.getDeliveryServer(order.deliveryServerId)
if (!deliveryServer) {
logger.child({ service: 'DeliveryService', method: 'AddOrder' }).error('Delivery server not found')
return
}
if (deliveryServer.host) {
let comment = this.getOrderComment(order)
let summ = this.getSumm(order)
let summDeliveryAndTips = this.getSummDeliveryAndTips(order)
const data = JSON.stringify({
api_key: deliveryServer.key,
// remote_id: order.remoteNumber,
id: order.id,
phone: order.phone,
adres: order.branch.address.adres,
la: order.branch.address.latitude,
lo: order.branch.address.longtitude,
adres2: order.orderAddress.adres,
la2: order.orderAddress.latitude,
lo2: order.orderAddress.longtitude,
distance: order.delivery_distance,
time_road: order.delivery_time,
comm: comment,
thecity: 0,
delivery: 1,
cart: JSON.stringify({
company_name: order.company.name,
company_phone: order.branch.phone,
status: order.status,
order_num: order.number,
cost_order: order.order_cost,
pay_status_order: order.pay_status_order,
delivery_cost_calculated: order.delivery_cost_calculated,
delivery_cost: order.delivery_cost,
pay_status_delivery: order.pay_status_delivery,
tips: order.tips,
}),
bn: order.pay_status_delivery == 'paid' ? 1 : 0,
cost_bn: order.pay_status_delivery == 'paid' ? summDeliveryAndTips : 0,
cost: summ > 0 ? summ : summDeliveryAndTips,
})
const options = {
method: 'POST',
hostname: deliveryServer.host,
port: deliveryServer.port,
path: '/api/orders/delivery_create',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)
}
}
https.globalAgent.options.rejectUnauthorized = false;
const req = https.request(options, (res) => {
var body = '';
res.setEncoding('utf8');
res.on('end', () => {
if (res.statusCode == 200) {
let bodyArr = JSON.parse(body)
let json = {
error: bodyArr.error,
message: 'ok',
id: bodyArr.id,
status: bodyArr.status,
car_id: bodyArr.car_id,
car_la: bodyArr.car_la,
car_lo: bodyArr.car_lo,
}
order.deliveryServerJson = JSON.stringify(json)
order.remoteNumber = bodyArr.id
order.save()
} else {
let json = {
error: res.statusCode,
message: 'error',
}
order.deliveryServerJson = JSON.stringify(json)
order.save()
}
});
res.on('data', (r) => {
body = body + r;
});
});
req.on('error', (e) => {
let json = {
error: 500,
message: e.message,
}
order.deliveryServerJson = JSON.stringify(json)
order.save()
});
req.write(data);
req.end();
logger.child({ service: 'DeliveryService', method: 'AddOrder' }).info('Success')
}
} catch (e) {
logger.child({ service: 'DeliveryService', method: 'AddOrder' }).error(e)
}
}
async UpdateOrder(orderId) {
try {
let order = await this.getOrder(orderId, true)
if (!order) {
logger.child({ service: 'DeliveryService', method: 'UpdateOrder' }).error('Order not found')
return
}
let deliveryServer = await this.getDeliveryServer(order.deliveryServerId)
if (!deliveryServer) {
logger.child({ service: 'DeliveryService', method: 'UpdateOrder' }).error('Delivery server not found')
return
}
if (deliveryServer.host) {
let comment = this.getOrderComment(order)
let summ = this.getSumm(order)
let summDeliveryAndTips = this.getSummDeliveryAndTips(order)
const data = JSON.stringify({
api_key: deliveryServer.key,
remote_id: order.remoteNumber,
id: order.id,
phone: order.phone,
adres: order.branch.address.adres,
la: order.branch.address.latitude,
lo: order.branch.address.longtitude,
adres2: order.orderAddress.adres,
la2: order.orderAddress.latitude,
lo2: order.orderAddress.longtitude,
distance: order.delivery_distance,
time_road: order.delivery_time,
comm: comment,
thecity: 0,
bn: order.pay_status_delivery == 'paid' ? 1 : 0,
cost_bn: order.pay_status_delivery == 'paid' ? summDeliveryAndTips : 0,
cost: summ > 0 ? summ : summDeliveryAndTips,
cart: JSON.stringify({
company_name: order.company.name,
company_phone: order.branch.phone,
status: order.status,
order_num: order.number,
cost_order: order.order_cost,
pay_status_order: order.pay_status_order,
delivery_cost_calculated: order.delivery_cost_calculated,
delivery_cost: order.delivery_cost,
pay_status_delivery: order.pay_status_delivery,
tips: order.tips,
}),
})
const options = {
method: 'POST',
hostname: deliveryServer.host,
port: deliveryServer.port,
path: '/api/orders/delivery_update',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)
}
}
https.globalAgent.options.rejectUnauthorized = false;
const req = https.request(options, (res) => {
var body = '';
res.setEncoding('utf8');
res.on('end', () => {
if (res.statusCode == 200) {
let bodyArr = JSON.parse(body)
let json = {
error: bodyArr.error,
message: 'ok',
id: bodyArr.id,
status: bodyArr.status,
car_id: bodyArr.car_id,
car_la: bodyArr.car_la,
car_lo: bodyArr.car_lo,
}
order.deliveryServerJson = JSON.stringify(json)
order.remoteNumber = bodyArr.id
order.save()
} else {
let json = {
error: res.statusCode,
message: 'error',
}
order.deliveryServerJson = JSON.stringify(json)
order.save()
}
});
res.on('data', (r) => {
body = body + r;
});
});
req.on('error', (e) => {
let json = {
error: 500,
message: e.message,
}
order.deliveryServerJson = JSON.stringify(json)
order.save()
});
req.write(data);
req.end();
logger.child({ service: 'DeliveryService', method: 'UpdateOrder' }).info('Success')
}
} catch (e) {
logger.child({ service: 'DeliveryService', method: 'UpdateOrder' }).error(e)
}
}
async CancelOrder(orderId) {
try {
let order = await this.getOrder(orderId, false)
if (!order) {
logger.child({ service: 'DeliveryService', method: 'CancelOrder' }).error('Order not found')
return
}
let deliveryServer = await this.getDeliveryServer(order.deliveryServerId)
if (!deliveryServer) {
logger.child({ service: 'DeliveryService', method: 'CancelOrder' }).error('Delivery server not found')
return
}
if (deliveryServer.host) {
let comment = ''
const data = JSON.stringify({
api_key: deliveryServer.key,
remote_id: order.remoteNumber,
comm: comment,
})
const options = {
method: 'POST',
hostname: deliveryServer.host,
port: deliveryServer.port,
path: '/api/orders/delivery_cancel',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)
}
}
https.globalAgent.options.rejectUnauthorized = false;
const req = https.request(options, (res) => {
var body = '';
res.setEncoding('utf8');
res.on('end', () => {
let json
try {
json = JSON.parse(order.deliveryServerJson) ?? {}
} catch (e) {
json = {
error: 500,
message: e.message,
}
}
if (res.statusCode == 200) {
let bodyArr = JSON.parse(body)
json.error = bodyArr.error
json.message = 'ok'
json.id = bodyArr.id
json.status = bodyArr.status
} else {
json.error = res.statusCode
json.message = 'error'
}
order.deliveryServerJson = JSON.stringify(json)
order.save()
});
res.on('data', (r) => {
body = body + r;
});
});
req.on('error', (e) => {
let json
try {
json = JSON.parse(order.deliveryServerJson) ?? {}
} catch (e) {
json = {
error: 500,
message: e.message,
}
}
json.error = 500
json.message = e.message
order.deliveryServerJson = JSON.stringify(json)
order.save()
});
req.write(data);
req.end();
logger.child({ service: 'DeliveryService', method: 'CancelOrder' }).info('Success')
}
} catch (e) {
logger.child({ service: 'DeliveryService', method: 'CancelOrder' }).error(e)
}
}
}