Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const verifyTokenPelanggan = require('../../helpers/verifyTokenPelanggan')
- const cariAdaOutletApaSajaDalamDataOrders = require('../../helpers/cariAdaOutletApaSajaDalamDataOrders')
- const hitungTotalPriceDariOrders = require('../../helpers/hitungTotalPriceOrders')
- const tanggalanConverter = require('../../helpers/tanggalanConverter')
- const rupiahConverter = require('../../helpers/rupiahConverter')
- const autoGenerateIdTransaksi = require('../../helpers/autoGenerateIdTransaksi')
- const Fawn = require('fawn')
- const sequelize = require('sequelize')
- const mongoose = require('mongoose')
- const mongoModel = require('../../mongoModels')
- const model = require('../../models')
- const moment = require('moment-timezone')
- moment.locale('id')
- mongoose.Promise = global.Promise
- mongoose.connect(
- 'mongodb://' +
- process.env.DATABASE_USER +
- ':' +
- process.env.DATABASE_PASSWORD +
- '@' +
- process.env.DATABASE_URI
- )
- Fawn.init(mongoose)
- var task = Fawn.Task()
- async function addNewOrdersPelanggan(req, res, next) {
- let kode_pelanggan = ''
- let isKasir = true
- // data Orderan dari client
- let orders = req.body.orders
- if (req.body.kode_pelanggan) {
- kode_pelanggan = req.body.kode_pelanggan
- } else {
- // data pelanggan user, nanti convert nya dari token
- kode_pelanggan = verifyTokenPelanggan(req.body.token)
- isKasir = false
- }
- // split dulu ada kantin apa saja, ada hari apa aja
- let listKantinYgMauDibuatTransaksi = cariAdaOutletApaSajaDalamDataOrders(
- orders
- )
- // variable untuk nampung listOrder hasil filter berdasarkan tanggal dan kantin
- let listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi = []
- for (let i = 0; i < listKantinYgMauDibuatTransaksi.length; i++) {
- // looping pertama, loop terus sampai list kantin yg ada habis
- for (let j = 0; j < orders.length; j++) {
- // looping kedua, loop sebanyak jumlah Orderan dari client
- let hasilFilterOrderBerdasarkanKodeOutlet = []
- for (let k = 1; k < 4; k++) {
- // looping ketiga, loop sebanyak 3 kali untuk loop istirahatnya
- let hasilFilterBerdasarkanIstirahat = orders[j]['istirahat' + k].filter(
- order => {
- // filter data orderan untuk istirahat ke-k
- if (order.kode_outlet == listKantinYgMauDibuatTransaksi[i]) {
- return order
- }
- }
- )
- if (hasilFilterBerdasarkanIstirahat.length > 0) {
- // ubah structure menjadi sesuai dengan kebutuhan di mongodb
- let generateToTransaksiDetailStructure = hasilFilterBerdasarkanIstirahat.map(
- detail => {
- let jam_ambil = null
- let obj = {
- kode_menu: detail.id,
- nama_menu: detail.menuName,
- jam_istirahat: k,
- jam_ambil: jam_ambil,
- jumlah_pesan: detail.qty,
- jumlah_ambil: 0,
- jumlah_kembali: 0,
- harga_beli: detail.price
- }
- return obj
- }
- )
- // gabungkan dengan variable penampung
- hasilFilterOrderBerdasarkanKodeOutlet = [
- ...hasilFilterOrderBerdasarkanKodeOutlet,
- ...generateToTransaksiDetailStructure
- ]
- }
- }
- // gabungkan dengan variable penampung per kantin dan per tanggal
- if (hasilFilterOrderBerdasarkanKodeOutlet.length > 0) {
- // hitung total dari order berdasarkan tanggal dan kantin
- let total = hitungTotalPriceDariOrders(
- hasilFilterOrderBerdasarkanKodeOutlet
- )
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi.push({
- date: orders[j].date,
- kode_outlet: listKantinYgMauDibuatTransaksi[i],
- orders: [...hasilFilterOrderBerdasarkanKodeOutlet],
- total: total
- })
- }
- }
- }
- // variable penampung data transaksi yg sudah tersimpan, untuk di rollback jika terjadi error / masuk catch
- let newTransaksiTersimpan = []
- let newUpdateOutletId = listKantinYgMauDibuatTransaksi
- let newUpdateOutletTotal = []
- let newUpdatePelangganTotal = 0
- let newMutasiOutlet = []
- let newMutasiPelanggan = []
- for (let i = 0; i < listKantinYgMauDibuatTransaksi.length; i++) {
- newUpdateOutletTotal.push(0)
- newUpdatePelangganTotal = 0
- for (
- let j = 0;
- j < listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi.length;
- j++
- ) {
- newUpdatePelangganTotal +=
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[j].total
- if (
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[j].kode_outlet ===
- listKantinYgMauDibuatTransaksi[i]
- ) {
- newUpdateOutletTotal[i] +=
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[j].total
- }
- }
- // task.update(mongoModel.Outlet, {
- // "_id": newUpdateOutletId[i]
- // }, {
- // $inc: {
- // saldo: newUpdateOutletTotal[i]
- // }
- // })
- }
- task.update(
- mongoModel.Pelanggan,
- {
- _id: kode_pelanggan
- },
- {
- $inc: {
- saldo: newUpdatePelangganTotal * -1
- }
- }
- )
- if (isKasir) {
- let tanggalUntukNotif = moment().tz('Asia/Jakarta')
- task.update(
- mongoModel.Pelanggan,
- {
- _id: kode_pelanggan
- },
- {
- $push: {
- notifikasi: {
- tanggal_waktu: tanggalUntukNotif,
- notifikasi:
- 'Kamu melakukan pemesanan via kasir pada ' +
- tanggalanConverter(
- new Date(
- tanggalUntukNotif.year(),
- tanggalUntukNotif.month(),
- tanggalUntukNotif.date(),
- tanggalUntukNotif.hour(),
- tanggalUntukNotif.minute()
- ),
- true
- ) +
- ' sejumlah ' +
- rupiahConverter(newUpdatePelangganTotal),
- baca: 0
- }
- }
- }
- )
- }
- if (!isKasir) {
- let tanggalUntukNotif = moment().tz('Asia/Jakarta')
- let a = tanggalanConverter(
- new Date(
- tanggalUntukNotif.year(),
- tanggalUntukNotif.month(),
- tanggalUntukNotif.date(),
- tanggalUntukNotif.hour(),
- tanggalUntukNotif.minute()
- ),
- true
- )
- let b = rupiahConverter(newUpdatePelangganTotal)
- task.update(
- mongoModel.Pelanggan,
- {
- _id: kode_pelanggan
- },
- {
- $push: {
- notifikasi: {
- tanggal_waktu: tanggalUntukNotif,
- notifikasi:
- 'Transaksi pemesanan via aplikasi pada ' +
- a +
- ' telah berhasil dilakukan ' +
- b,
- baca: 0
- }
- }
- }
- )
- }
- for (
- let i = 0;
- i < listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi.length;
- i++
- ) {
- // looping sejumlah list orderan yg sudah di filter
- let kode_kantin =
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].kode_outlet[0] +
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].kode_outlet[1] +
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].kode_outlet[2] +
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].kode_outlet[3] +
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].kode_outlet[4]
- // generate object lagi supaya sesuai untuk di simpan di mongodb
- let jenis_transaksi = 0
- if (isKasir) {
- jenis_transaksi = 1
- }
- let obj = {
- _id: await autoGenerateIdTransaksi(kode_kantin),
- kode_pelanggan: kode_pelanggan,
- kode_outlet:
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].kode_outlet,
- tanggal_ambil: new Date(
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].date
- ),
- jenis_transaksi: jenis_transaksi,
- transaksi_detail:
- listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].orders
- }
- try {
- // proses pertama, menyimpan ke collection transaksi
- newTransaksiTersimpan.push({
- _id: obj._id,
- kode_outlet: obj.kode_outlet,
- kode_pelanggan: obj.kode_pelanggan,
- total: listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi[i].total
- })
- task.save(mongoModel.Transaksi, obj)
- } catch (e) {
- // lakukan rollback jika terjadi error
- console.log(e)
- // hentikan looping
- break
- }
- try {
- let runTask = await task.run({ useMongoose: true })
- let Sequelize = new sequelize(
- process.env.POSTGRE_DB,
- process.env.POSTGRE_USER,
- process.env.POSTGRE_PASSWORD,
- {
- isolationLevel:
- sequelize.Transaction.ISOLATION_LEVELS.SERIALIZABLE ||
- 'SERIALIZABLE',
- host: process.env.POSTGRE_HOST,
- dialect: process.env.POSTGRE_DIALECT
- }
- )
- Sequelize.transaction().then(function(t) {
- return Sequelize.Promise.map(newTransaksiTersimpan, function(ababi) {
- return model.Wallet.findOne({
- where: { kode_user: 'kotakmakan' },
- transaction: t
- }).then(function(walletEscrowKotakMakan) {
- return model.Wallet.findOne({
- where: { kode_user: ababi.kode_pelanggan },
- transaction: t
- }).then(function(walletPelanggan) {
- return walletEscrowKotakMakan
- .increment({ saldo: ababi.total }, { transaction: t })
- .then(function(walletEscrowKotakMakanBaru) {
- let saldoBaruEscrow =
- walletEscrowKotakMakanBaru.dataValues.saldo
- let saldoLamaEscrow =
- walletEscrowKotakMakanBaru._previousDataValues.saldo
- return model.MutasiWallet.create(
- {
- kode_wallet: walletEscrowKotakMakan.kode_wallet,
- tanggal_mutasi: moment(),
- jenis_mutasi: 1,
- saldo_awal: saldoLamaEscrow,
- saldo_akhir: saldoBaruEscrow,
- jumlah: ababi.total,
- keterangan:
- 'Pembayaran transaksi ' +
- ababi._id +
- ' tanggal ' +
- new Date(moment())
- },
- { transaction: t }
- ).then(function(mutasiWallet) {
- return walletPelanggan
- .decrement({ saldo: ababi.total }, { transaction: t })
- .then(function(walletPelangganBaru) {
- let saldoBaruPelanggan =
- walletPelangganBaru.dataValues.saldo
- let saldoLamaPelanggan =
- walletPelangganBaru._previousDataValues.saldo
- return model.MutasiWallet.create(
- {
- kode_wallet: walletPelanggan.kode_wallet,
- tanggal_mutasi: moment(),
- jenis_mutasi: 0,
- saldo_awal: saldoLamaPelanggan,
- saldo_akhir: saldoBaruPelanggan,
- jumlah: ababi.total,
- keterangan:
- 'Pembayaran transaksi ' +
- ababi._id +
- ' tanggal ' +
- new Date(moment())
- },
- { transaction: t }
- )
- })
- })
- })
- })
- })
- })
- .then(function(apada) {
- t.commit()
- res.send({
- statusCode: 200,
- body: {
- data: listOrderPerKantinDanPerTanggalYgMauDibuatTransaksi
- },
- status: 'Request Success'
- })
- })
- .catch(err => {
- res.status(500).send({
- statusCode: 500,
- status: 'Request Failed',
- body: {
- error: err.message
- }
- })
- t.rollback()
- doRollback(
- newTransaksiTersimpan,
- newUpdateOutletId,
- newUpdateOutletTotal,
- kode_pelanggan,
- newUpdatePelangganTotal,
- newMutasiOutlet,
- newMutasiPelanggan
- )
- })
- })
- } catch (e) {
- doRollback(
- newTransaksiTersimpan,
- newUpdateOutletId,
- newUpdateOutletTotal,
- kode_pelanggan,
- newUpdatePelangganTotal,
- newMutasiOutlet,
- newMutasiPelanggan
- )
- res.status(500).send({
- statusCode: 500,
- status: 'Request Failed',
- body: {
- error: e.message
- }
- })
- console.log(e)
- }
- }
- }
- function doRollback(
- newTransaksiTersimpan,
- newUpdateOutletId,
- newUpdateOutletTotal,
- kode_pelanggan,
- newUpdatePelangganTotal,
- newMutasiOutlet,
- newMutasiPelanggan
- ) {
- // proses pertama, delete collection transaksi
- for (let i = 0; i < newTransaksiTersimpan.length; i++) {
- mongoModel.Transaksi.remove({
- _id: newTransaksiTersimpan[i]._id
- })
- .then(data => {
- console.log(i, 'transaksi')
- })
- .catch(e => {
- console.log(e)
- })
- }
- // proses kedua, update lagi saldo ke collection outlet
- for (let i = 0; i < newUpdateOutletId.length; i++) {
- let dataOutlet = mongoModel.Outlet.findByIdAndUpdate(newUpdateOutletId[i], {
- $inc: {
- saldo: newUpdateOutletTotal[i] * -1
- }
- })
- .then(data => {
- console.log(i, 'outlet')
- })
- .catch(e => {
- console.log(e)
- })
- }
- // proses ketiga, update lagi saldo ke collection pelanggan
- let dataPelanggan = mongoModel.Pelanggan.findByIdAndUpdate(kode_pelanggan, {
- $inc: {
- saldo: newUpdatePelangganTotal
- }
- })
- .then(data => {
- console.log('0', 'pelanggan')
- })
- .catch(e => {
- console.log(e)
- })
- // // proses keempat, delete dari table mutasi wallet
- // for (let i = 0; i < newMutasiOutlet.length; i++) {
- // let dataMutasiOutlet = model.MutasiWallet.destroy({where: {id: newMutasiOutlet[i].id}}).then((data) => {
- // console.log(data);
- // }).catch((e) => {
- // console.log(e);
- // })
- // }
- // for (let i = 0; i < newMutasiPelanggan.length; i++) {
- // let dataMutasiPelanggan = model.MutasiWallet.destroy({where: {id: newMutasiPelanggan[i].id}}).then((data) => {
- // console.log(data);
- // }).catch((e) => {
- // console.log(e);
- // })
- // }
- }
- module.exports = addNewOrdersPelanggan
Advertisement
Add Comment
Please, Sign In to add comment