Files
admin-php-module/web/controllers/shifts.js
miroman-afk c4dc6e02a0 v.2.30
Добавлен расширенный отчет по реализации
Добавлен монитор активности
2023-08-03 11:05:15 +03:00

784 lines
40 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function () {
'use strict';
angular
.module('app')
.filter('curr', function () { //maybe we should take it to the filter folder
return function (input) {
if (typeof input == 'string') {
input = parseFloat(input.replace(/,/g, '.'));
}
var outputValue = input;
if (typeof outputValue !== 'undefined') {
return outputValue.toFixed(2);
} else {
return 0.00;
}
};
})
.controller('ShiftsCtrl', ShiftsCtrl);
ShiftsCtrl.$inject = ['$scope', '$filter', 'smartRequest', 'Notification'];
function ShiftsCtrl($scope, $filter, smartRequest, Notification) {
Number.prototype.toDivide = function () {
var float = String(this.toFixed(2));
if (float.length <= 6) return float;
var space = 0;
var number = '';
for (var i = float.length - 1; i >= 0; i--) {
if (space == 3) {
number = ' ' + number;
space = 0;
}
number = float.charAt(i) + number;
space++;
}
return number;
};
var date = new Date();
var formatted = ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();
date.setDate(date.getDate() - 1);
var formatted_yesterday = ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();
$scope.start_date = formatted;
$scope.end_date = formatted_yesterday;
$scope.response = false;
$scope.shifts = [];
$scope.report_delete = [];
$scope.countOfPages = 1;
$scope.currentPage = 1;
$scope.statistic = {};
$scope.staffs = [];
$scope.parseFloat = parseFloat;
$scope.dataTableOpt = {
"aoSearchCols": [
null
],
"oLanguage": {
"sUrl": 'https://cdn.datatables.net/plug-ins/1.13.3/i18n/ru.json'
},
"searching": false,
"paging": false,
"info": false,
"order": [[1, 'desc']],
};
$scope.add = function () {
$scope.reImport = {};
$('#reImport').modal();
};
$scope.create = function () {
var start_date = document.getElementById("startDate").value;
var end_date = document.getElementById("endDate").value;
console.log(start_date, end_date);
smartRequest.get('v1/import?start_date=' + encodeURIComponent(start_date) + '&end_date=' + encodeURIComponent(end_date), function (data) {
$scope.response = data.message;
if (data.message == 'shifts not found') {
Notification.error('Смены не найдены');
} else {
Notification.success('Задача создана');
$scope.update();
}
});
$('#reImport').modal('toggle');
};
$scope.closeModal = function (modalName) {
$scope.modalName = '#' + modalName;
$($scope.modalName).modal('dispose');
};
$scope.update = function () {
smartRequest.get('shift/list?page=' + $scope.currentPage, function (data) {
$scope.shifts = data.shifts;
$scope.countOfPages = data.pages;
$scope.pages = $scope.makePages();
$('.modal-body').scrollTop(0);
});
smartRequest.get('v1/settings?code=11', function (data) {
$scope.delete_shift_value = data.value;
});
};
$scope.deleteShift = function (shift) {
$('#preload-modal').modal();
Notification.primary('Дождитесь удаления! Страница обновится автоматически.');
smartRequest.post('v1/deletedata', {
value: 'delete_shift',
shift_id: shift.id
}, function (data) {
$scope.status = data.status;
$scope.message = data.message;
if (data.status == 'success') {
Notification.success(data.message);
setTimeout(function () {
//location.reload();
$scope.update();
$('#preload-modal').modal('hide');
}, 1000);
}
if ($scope.status == 'error') {
Notification.error(data.message);
}
});
};
$scope.prevModal = function (modalFromName, modalToName) {
$scope.modal_from = '#' + modalFromName;
$scope.modal_to = '#' + modalToName;
$($scope.modal_from).modal('hide');
$($scope.modal_to).modal('toggle');
};
$scope.nextModal = function (modalFromName, modalToName) {
$scope.modal_from = '#' + modalFromName;
$scope.modal_to = '#' + modalToName;
$($scope.modal_from).modal('hide');
$($scope.modal_to).modal('toggle');
};
$scope.getOrders = function (discount_id, modalFromName, modalToName) {
$scope.discount_id = discount_id;
$scope.orders_list = $scope.orders_info[discount_id].orders;
$scope.nextModal(modalFromName, modalToName);
};
$scope.getItems = function (order_id, opened, closed, modalFromName, modalToName) {
smartRequest.get('v1/clientorderinfo?order_id=' + order_id + '&opened=' + opened + '&closed=' + closed, function (data) {
$scope.order_info = data.info;
$scope.nextModal(modalFromName, modalToName);
});
};
$scope.reportDiscounts = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=discounts&shift_id=' + shift.id, function (data) {
$scope.orders_info = data.orders_info;
$scope.orders_count = data.orders_count;
$scope.orders_full_sum = data.orders_full_sum;
$scope.orders_sale_sum = data.orders_sale_sum;
$scope.orders_order_sum = data.orders_order_sum;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-discounts').modal();
});
};
$scope.reportMerged = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=merge&shift_id=' + shift.id, function (data) {
$scope.report_merge = data.data;
$scope.report_merge.count = data.count;
$scope.report_merge.shift_id = data.shift_id;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-merge').modal();
});
};
$scope.reportMoved = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=move&shift_id=' + shift.id, function (data) {
$scope.report_move = data.data;
$scope.report_move.count = data.count;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-move').modal();
});
};
$scope.reportSliced = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=slice&shift_id=' + shift.id, function (data) {
$scope.report_slice = data.data;
$scope.report_slice.count = data.count;
$scope.report_slice.shift_id = data.shift_id;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-slice').modal();
});
};
$scope.reportDelete = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=deleted&shift_id=' + shift.id, function (data) {
if (data.totalCount > 0) {
$scope.report_delete = data.orders;
$scope.total_sum = data.totalSum;
$scope.total_count = data.totalCount;
$scope.shift_id = shift.id;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#shift-delete').modal();
} else {
Notification.error(data.message);
}
});
};
$scope.reportRealisation = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=realisation&shift_id=' + shift.id, function (data) {
$scope.report_realisation = data.printers;
$scope.return_printers = data.ret_prints;
$scope.report_realisation.total_count = data.total_count;
$scope.report_realisation.total_sum = data.total_sum;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-realisation').modal();
});
};
$scope.draw_counter = 0;
$scope.drawTable = function (data) {
var collapsedGroups = [];
var groupParent = [];
var counter = 1;
$.fn.dataTable.moment('YYYY-MM-DD HH:mm:ss');
$scope.table = $('#table_orders').DataTable({
data: data,
destroy: true,
columns: [
{data: 'shift_id', title: 'Смена'},//hide
{data: 'work_place', title: 'Раб.место'},//hide
{data: 'place_name', title: 'Зал'},//hide
{data: 'table_name', title: 'Стол'},//hide
{
data: 'staff_name',
title: 'Смена/Зал/Стол/Заказ/Персонал',
searchBuilderTitle: 'Персонал',
class: 'order_id'
},
{data: 'client_name', title: 'Клиент', class: 'order_id'},
{data: 'item_name', title: 'Товар'},
{data: 'order_code', title: 'Заказ'},//hide
{data: 'item_time', title: 'Время'},
{
data: 'printer_name',
title: 'МП',
searchBuilderTitle: 'Место приготовления',
class: 'order_id'
},
{
data: 'item_count',
title: 'Кол-во',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 3, '', '').display(data);
}
},
{data: 'item_real_price', title: 'Цена',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 2, '', '').display(data);
}
},
{data: 'item_sale_price', title: 'Сумма',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 2, '', '').display(data);
}
},
{data: 'item_special_price', title: 'Себест.', searchBuilderTitle: 'Себестоимость'},
{
data: 'item_cash',
title: 'Нал.', searchBuilderTitle: 'Оплата наличными',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 2, '', '').display(data);
}
},
{
data: 'item_credit',
title: 'Кред.карта', searchBuilderTitle: 'Оплата кредитной картой',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 2, '', '').display(data);
}
},
{
data: 'item_presale',
title: 'Аванс', searchBuilderTitle: 'Зачет аванса',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 2, '', '').display(data);
}
},
{data: 'item_clearing', title: 'Б/н', searchBuilderTitle: 'Оплата безналичными',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 2, '', '').display(data);
}
},
{data: 'item_discount_sum', title: 'Скидка, BYN', searchBuilderTitle: 'Сумма скидки',
render: function (data, type, row) {
return DataTable.render.number(' ', '.', 2, '', '').display(data);
}
},
{data: 'item_discount_value', title: 'Скидка, %', searchBuilderTitle: '% скидки'},
{data: 'order_opened', title: 'Время открытия заказа', searchBuilderTitle: 'Время открытия заказа'},//hide
{data: 'order_closed', title: 'Время закрытия заказа', searchBuilderTitle: 'Время закрытия заказа'},//hide
{data: 'order_check_number', searchBuilderTitle: 'Номер чека'},//hide
{data: 'shift_opened', title: 'Время открытия смены', searchBuilderTitle: 'Время открытия смены'},//hide
{data: 'shift_closed', title: 'Время закрытия смены', searchBuilderTitle: 'Время закрытия смены'},//hide
],
order: [[0, 'asc'], [1, 'asc'], [2, 'asc'], [3, 'asc'], [7, 'asc']],
columnDefs: [{
targets: [0, 1, 2, 3, 7, 20, 21, 22, 23, 24],
visible: false
}],
stripeClasses: [],
fixedHeader: true,
scrollCollapse: false,
paging: false,
searching: true,
responsive: false,
processing: true,
dom: 'QBfrtip',
searchBuilder: {
columns: [0, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
},
buttons: [{
text: 'Excel',
action: function (e, dt, node, conf) {
$scope.exportTableToExcel('table_orders', 'extend-realisation');
}
}],
language: {
url: "https://cdn.datatables.net/plug-ins/1.13.3/i18n/ru.json",
},
rowGroup: {
dataSrc: ['shift_id', 'place_name', 'table_name', 'order_code'],
startRender: function (rows, group, level) {
groupParent[level] = group;
var groupAll = '';
var name = '';
var check_text = '';
$scope.opened = '';
$scope.closed = '';
$scope.check_number = null;
$scope.total_item_count = 0;
$scope.total_item_real_price = 0;
$scope.total_item_sale_price = 0;
$scope.total_item_special_price = 0;
$scope.total_item_cash = 0;
$scope.total_item_credit = 0;
$scope.total_item_clearing = 0;
$scope.total_item_presale = 0;
$scope.total_item_discount_sum = 0;
for (var i = 0; i < level; i++) {
groupAll += groupParent[i];
if (collapsedGroups[groupAll]) {
return;
}
}
groupAll += group;
if ((typeof (collapsedGroups[groupAll]) == 'undefined') || (collapsedGroups[groupAll] === null)) {
if (level === 3) {
collapsedGroups[groupAll] = true;
} else {
collapsedGroups[groupAll] = false;
}
} //True = Start collapsed. False = Start expanded.
var collapsed = collapsedGroups[groupAll];
rows.nodes().each(function (r) {
r.style.display = (collapsed ? 'none' : '');
});
if (level === 0) {
name = 'Смена №';
rows.rows().data().filter(function (value, index) {
if (parseInt(value['shift_id']) === parseInt(groupAll)) {
$scope.opened = $scope.start_date;
$scope.closed = $scope.end_date;
if (rows.rows(index, {page: 'current'}).data()[0]) {
$scope.total_item_count += value['item_count'];
$scope.total_item_real_price += value['item_real_price'];
$scope.total_item_sale_price += value['item_sale_price'];
$scope.total_item_special_price += value['item_special_price'];
$scope.total_item_cash += value['item_cash'];
$scope.total_item_credit += value['item_credit'];
$scope.total_item_clearing += value['item_clearing'];
$scope.total_item_presale += value['item_presale'];
$scope.total_item_discount_sum += value['item_discount_sum'];
}
}
});
return $('<tr/>')
.append('<td colspan="5">' + name + group + ' ' + '<small>(Открыта: ' + $scope.opened + ' Закрыта: ' + $scope.closed + ')</small></td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 3, '', '').display($scope.total_item_count) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_real_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_sale_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_special_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_cash) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_credit) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_presale) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_clearing) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_discount_sum) + '</td>')
.append('<td colspan="1"/>')
.attr('data-name', groupAll)
.toggleClass('collapsed', collapsed);
}
if (level === 1) {
rows.rows().data().filter(function (value, index) {
if (value['shift_id'] + value['place_name'] === groupAll) {
if (rows.rows(index, {page: 'current'}).data()[0]) {
$scope.total_item_count += value['item_count'];
$scope.total_item_real_price += value['item_real_price'];
$scope.total_item_sale_price += value['item_sale_price'];
$scope.total_item_special_price += value['item_special_price'];
$scope.total_item_cash += value['item_cash'];
$scope.total_item_credit += value['item_credit'];
$scope.total_item_clearing += value['item_clearing'];
$scope.total_item_presale += value['item_presale'];
$scope.total_item_discount_sum += value['item_discount_sum'];
}
}
})
return $('<tr/>')
.append('<td colspan="5">' + name + group + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 3, '', '').display($scope.total_item_count) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_real_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_sale_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_special_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_cash) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_credit) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_presale) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_clearing) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_discount_sum) + '</td>')
.append('<td colspan="1"/>')
.attr('data-name', groupAll)
.toggleClass('collapsed', collapsed);
}
if (level === 2) {
name = 'Стол №';
rows.rows().data().filter(function (value, index) {
if (value['shift_id'] + value['place_name'] + value['table_name'] === groupAll) {
if (rows.rows(index, {page: 'current'}).data()[0]) {
$scope.total_item_count += value['item_count'];
$scope.total_item_real_price += value['item_real_price'];
$scope.total_item_sale_price += value['item_sale_price'];
$scope.total_item_special_price += value['item_special_price'];
$scope.total_item_cash += value['item_cash'];
$scope.total_item_credit += value['item_credit'];
$scope.total_item_clearing += value['item_clearing'];
$scope.total_item_presale += value['item_presale'];
$scope.total_item_discount_sum += value['item_discount_sum'];
}
}
});
return $('<tr/>')
.append('<td colspan="5">' + name + group + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 3, '', '').display($scope.total_item_count) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_real_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_sale_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_special_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_cash) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_credit) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_presale) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_clearing) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_discount_sum) + '</td>')
.append('<td colspan="1"/>')
.attr('data-name', groupAll)
.toggleClass('collapsed', collapsed);
}
if (level === 3) {
name = 'Заказ №';
check_text = ' Чек №'
rows.rows().data().filter(function (value, index) {
if (value['shift_id'] + value['place_name'] + value['table_name'] + value['order_code'] === groupAll) {
if (rows.rows(index, {page: 'current'}).data()[0]) {
$scope.opened = value['order_opened'];
$scope.closed = value['order_closed'];
$scope.check_number = value['order_check_number'];
$scope.total_item_count += value['item_count'];
$scope.total_item_real_price += value['item_real_price'];
$scope.total_item_sale_price += value['item_sale_price'];
$scope.total_item_special_price += value['item_special_price'];
$scope.total_item_cash += value['item_cash'];
$scope.total_item_credit += value['item_credit'];
$scope.total_item_clearing += value['item_clearing'];
$scope.total_item_presale += value['item_presale'];
$scope.total_item_discount_sum += value['item_discount_sum'];
}
}
});
return $('<tr/>')
.append('<td colspan="5">' + name + group + ' ' + '<small>(Открыт: ' + $scope.opened + ' Закрыт: ' + $scope.closed + ($scope.check_number === 0 ? '' : check_text + $scope.check_number) + ')</small></td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 3, '', '').display($scope.total_item_count) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_real_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_sale_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_special_price) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_cash) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_credit) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_presale) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_clearing) + '</td>')
.append('<td colspan="1">' + DataTable.render.number(' ', '.', 2, '', '').display($scope.total_item_discount_sum) + '</td>')
.append('<td colspan="1"/>')
.attr('data-name', groupAll)
.toggleClass('collapsed', collapsed);
}
},
initComplete: function () {
counter = 1;
}
}
}).on('draw', function () {
$('#preload-modal').modal('hide');
counter = 1;
});
$('#table_orders tbody').on('click', 'tr.dtrg-start', function () {
var name = $(this).data('name');
collapsedGroups[name] = !collapsedGroups[name];
$scope.table.draw(false);
});
};
$scope.reportRealisationConstruct = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=report_construct&shift_id=' + shift.id, function (data) {
$scope.construct_data = data.data;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$scope.drawTable($scope.construct_data);
$scope.update();
$('#report-construct').modal();
});
};
function getEndingDigit(inputString) {
const regex = /\d+$/;
if (regex.test(inputString)) {
const match = inputString.match(regex);
return match[0].replace(/\D/g, '');
}
return null;
}
function autofitColumns(worksheet) {
let objectMaxLength = [];
const letters = [];
const [startLetter, endLetter] = worksheet['!ref']?.replace(/\d/, '').split(':');
const startCode = startLetter.charCodeAt(0);
const endCode = endLetter.charCodeAt(0) + 1;
for (let code = startCode; code < endCode; code++) {
const letter = String.fromCharCode(code);
letters.push(letter);
}
letters.forEach((c) => {
const cellHeader = c;
const maxCellLengthForWholeColumn = Array.from(
{length: getEndingDigit(worksheet['!ref'])},
(_, i) => i
).reduce((acc, i) => {
const cell = worksheet[`${cellHeader}${i + 1}`];
if (!cell) return acc;
const charLength = cell.v.length + 1;
return acc > charLength ? acc : charLength;
}, 0);
objectMaxLength.push({width: maxCellLengthForWholeColumn + 2});
});
worksheet['!cols'] = objectMaxLength;
return worksheet;
}
$scope.exportTableToExcel = function (tableID, filename = 'table') {
const table = document.getElementById(tableID);
const wb = XLSX.utils.table_to_book(table, {raw: true, sheet: 'SheetJS'});
let ws = wb.Sheets['SheetJS'];
ws = autofitColumns(ws);
console.log(ws);
// Set date and time format for the 4th column (index 3)
const dateFormat = 'yyyy-mm-dd hh:mm:ss';
const range = XLSX.utils.decode_range(ws['!ref']);
for (let row = range.s.r; row <= range.e.r; row++) {
const cellRef = XLSX.utils.encode_cell({r: row, c: 3}); // 4th column (index 3)
const cell = ws[cellRef];
if (cell && cell.t === 'n' && isExcelDate(cell.v)) {
cell.z = dateFormat;
}
}
const firstRowRange = {s: {r: 0, c: range.s.c}, e: {r: 0, c: range.e.c}};
for (let rowNum = firstRowRange.s.r; rowNum <= firstRowRange.e.r; rowNum++) {
for (let colNum = firstRowRange.s.c; colNum <= firstRowRange.e.c; colNum++) {
const cellAddress = XLSX.utils.encode_cell({r: rowNum, c: colNum});
const cell = ws[cellAddress];
if (cell && cell.s) {
cell.s.fill = {
fgColor: {rgb: "FFFF00"}
};
}
}
}
const wbout = XLSX.write(wb, {bookType: 'xlsx', type: 'array', cellStyles: true});
const blob = new Blob([wbout], {type: 'application/octet-stream'});
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = `${filename}.xlsx`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
function isExcelDate(value) {
return value >= 0 && value < 2958466.99999999;
}
$scope.reportStatistic = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=statistic&shift_id=' + shift.id, function (data) {
$scope.fiscal = data.fiscal;
$scope.realisation = data.realisation;
$scope.returns = data.returns;
$scope.cancellations = data.cancellations;
$scope.statistic = data.statistic;
$scope.presales = data.presales;
$scope.payments = data.payments;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-statistic').modal();
});
};
$scope.reportStaff = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=staff&shift_id=' + shift.id, function (data) {
$scope.staffs = data.staffs;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-staff').modal();
});
};
$scope.reportPay = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/datareport?type=payment&shift_id=' + shift.id, function (data) {
$scope.printers = data.items;
$scope.start_date = shift.opened;
$scope.end_date = shift.closed;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-payment').modal();
});
};
$scope.reportOut = function (shift) {
$('#preload-modal').modal();
Notification.primary('Отчет формируется. Пожалуйста, дождитесь загрузки!');
smartRequest.get('v1/outorders?shift_id=' + shift.id, function (data) {
$scope.response = data.message;
if (data.message == 'false') {
Notification.error('Внешние заказы не найдены');
$('#preload-modal').modal('hide');
} else {
$scope.orders = data.orders;
$scope.shift = data.shift;
$scope.total = data.total;
$('#preload-modal').modal('hide');
$scope.update();
$('#report-out').modal();
}
});
};
$scope.restoreShift = function (shift) {
$('#preload-modal').modal();
Notification.primary('Дождитесь загрузки! Страница обновится автоматически.');
smartRequest.post('v1/restoreshift', {
shift_id: shift.id
}, function (data) {
$scope.status = data.status;
$scope.response = data.message;
if (data.status == 'success') {
Notification.success(data.message);
setTimeout(function () {
location.reload();
}, 1000);
}
if ($scope.status == 'error') {
Notification.error(data.message);
$('#preload-modal').modal('hide');
}
});
};
$scope.popup = function (data) {
var mywindow = window.open();
mywindow.document.write(data);
mywindow.print();
mywindow.close();
};
$scope.printElem = function (elem) {
$scope.popup($('<div/>').append($(elem).clone()).html());
};
$scope.makePages = function () {
return Array.from({length: $scope.countOfPages}, (v, k) => k + 1);
};
$scope.showPage = function (index) {
$scope.currentPage = index;
$scope.update();
};
$scope.nextPage = function () {
$scope.currentPage++;
$scope.update();
};
$scope.prevPage = function () {
$scope.currentPage--;
$scope.update();
};
$scope.update();
}
})();