Интернет платформа для получения оперативной и сводной аналитики данных в сфере логистики общественного пассажирского транспорта и оптимизации пассажиропотока
Автоматизация данных WEB-платформа Статистика Транспортный проект Сводная аналитика Оптимизация
1.	Название программы для ЭВМ
Разработка платформы для получения оперативной и свободной аналитики в сфере логистики общественного пассажирского транспорта и оптимизации пассажиропотока.

2.	Назначение, область применения и функциональные возможности
Назначение: получение оперативной и сводной аналитики в сфере логистики общественного транспорта и оптимизации пассажиропотока.
Область применения: транспортная логистика, умный город, пассажирские перевозки.
Функциональные возможности: 
•	внесение новых сведений о водителях и о транспортных средствах;
•	получение таблиц рейтингов с балльными оценками водителей и транспортных средств;
•	внесение новых сведений о совершенных рейсах;
•	выгрузка отчетов различной сложности.

3.	Тип реализующей ЭВМ или другого компьютерного устройства, тип, версия ОС
Функционирование на базе распространенных программно-аппаратных платформ в средах Linux, macOS и Windows, мобильных устройствах.

4.	Программа для ЭВМ
4.1.	 Файл «api.js»
// Зависимости
const http = require('http');
const fs = require('fs');
const serverFunctions = require('./serverFunctions.js');
var url = require('url');

// Константы
const HOSTS = ['127.0.0.1', '143.198.41.228', 'bus-logistics.my'];
const PORT = 54458;
const LOG_FILE = 'log';

// Функция логирования
function log(data) {
    fs.appendFile(
        LOG_FILE,
        data.toString() + '\n',
        (e) => {
            if (e) console.log(e);
        });
}

// Объявление сервера
const requestListener = async function (req, res) {
    try {
        const pathParts = req.url.split('?');
        const path = pathParts[0];
        const bodyBuffer = [];
        for await (const chunk of req) {
            bodyBuffer.push(chunk);
        }
        const bodyText = Buffer.concat(bodyBuffer).toString();
        const body = bodyText ? JSON.parse(bodyText) : null;
        const serverMethodName = (req.method + path.replace('/', '')).toLowerCase();
        let searchParams = null;
        if (pathParts.length) {
            searchParams = new url.URLSearchParams(pathParts[1]);
        }
        if (req.url === '/') {
            res.setHeader('Content-Type', 'text/plain');
            res.statusCode = 200;
            res.end('status: online');
        }
        else if (serverFunctions.functions[serverMethodName]) {
            res.setHeader('Content-Type', 'application/json');
            res.setHeader('Access-Control-Allow-Origin', '*');
            res.statusCode = 200;
            res.end(await serverFunctions.functions[serverMethodName](searchParams, body));
        }
        else if (serverFunctions.csvFunctions[serverMethodName]) {
            res.setHeader('Content-Type', 'text/csv');
            res.setHeader('Access-Control-Allow-Origin', '*');
            res.statusCode = 200;
            const data = await serverFunctions.csvFunctions[serverMethodName](searchParams, body, res);
            const dataSize = Buffer.byteLength(data, 'windows-1251');
            res.setHeader('Content-Length', dataSize);
            res.end(data);
        }
        else {
            res.statusCode = 404;
            res.end();
        }
    }
    catch (e) {
        log(e);
        res.statusCode = 500;
        res.end();
    }
}

// Запуск сервера
const server = http.createServer(requestListener);
server.listen(
    PORT,
    HOSTS[0],
    () => console.log(`Server is running on http://${HOSTS[0]}:${PORT}`)
);

4.2.	 Файл «database.js»
const Pool = require('pg-pool');

const dbConnectionConfig = {
    host: '164.90.178.162',
    port: 5432,
    user: 'busadmin',
    password: '818vnxQLR',
    database: 'buslogistics',
};

exports.query = async function (query, arguments) {
    const pool = new Pool(dbConnectionConfig);
    return await pool.query(query, arguments);
}

4.3.	 Файл «serverFunctions.js»
const database = require('./database');
const { calculating_the_rating_of_drivers } = require('./calculating_the_rating_of_drivers');
const { calculating_the_rating_of_buses } = require('./calculating_the_rating_of_buses');
const { report_passenger_count } = require('./report_passenger_count');
const { report_proceeds } = require('./report_proceeds');
const path = require('path');
const fileSystem = require('fs');
const encoding = require("encoding");

async function gettest(arguments, body) {
    const id = arguments.get('id');
    const query = 'select value from test where id = $1;'
    const { rows } = await database.query(query, [id]);
    if (rows.length) {
        return `{value: "${rows[0].value}"}`;
    }
    return '{value: null}';
}

async function posttest(arguments, body) {
    const query = 'insert into test (value) values ($1)';
    await database.query(query, [body.value]);
    const checkHostagesQuery = 'select count(*) from test where value = \'Hostage\''
    const { rows } = await database.query(checkHostagesQuery);
    return `{result: "Hostages count: ${rows[0].count}"}`;
}

// Ввод данных в таблицу "Водители" (вкладка "Внесение изменений в данные о рейтингах водителей")
async function postdrivers(arguments, body) {
    console.log('postdrivers start');
    const query = 'INSERT INTO drivers (driver_personnel_number, name_driver, driving_experience, violatoins_of_traffic_rules, hids_in_road_accidents, negative_comments, attestation) VALUES ($1, $2, $3, $4, $5, $6, $7)';
    await database.query(query, [
        body.driver_personnel_number,
        body.name_driver,
        body.driving_experience,
        body.violatoins_of_traffic_rules,
        body.hids_in_road_accidents,
        body.negative_comments,
        body.attestation,
    ]);

    console.log(body);
    return `{"status": "success"}`;
}

// Ввод данных в таблицу "Транспортные средства" (вкладка "Внесение изменений в данные о рейтингах ТС")
async function postbuses(arguments, body) {
    console.log('postbuses start');
    const query = 'INSERT INTO buses (bus_number, lifetime, number_of_days_of_downtime, environmental_class, pasenger_safety, comfort, maintaining_temperature, transportation_of_passengers_with_disabilities, cashless_payment_terminal, notification_system) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)';
    await database.query(query, [
        body.bus_number,
        body.lifetime,
        body.number_of_days_of_downtime,
        body.environmental_class,
        body.pasenger_safety,
        body.comfort,
        body.maintaining_temperature,
        body.transportation_of_passengers_with_disabilities,
        body.cashless_payment_terminal,
        body.notification_system,
    ]);

    console.log(body);
    return `{"status": "success"}`;
}

// Ввод данных в таблицу "Рейсы" (вкладка "Внесение новых данных")
async function postrounds(arguments, body) {
    console.log('postrounds start');
    const query = 'INSERT INTO rounds (round_date, round_start_time, round_end_time, route_number, route_direction, driver_personnel_number, bus_number, cash_amount, bank_transfer_amount, amount_by_qr_codes) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)';
    await database.query(query, [
        body.round_date,
        body.round_start_time,
        body.round_end_time,
        body.route_number,
        body.route_direction,
        body.driver_personnel_number,
        body.bus_number,
        body.cash_amount,
        body.bank_transfer_amount,
        body.amount_by_qr_codes,
    ]);

    console.log(body);
    return `{"status": "success"}`;
}

// Вывод таблицы "Таблица с рейтингом водителей" (первые 20 строк, по убыванию) (вкладдка "Таблица с рейтингом водителей")
async function getdrivers(arguments, body) {
    const query = 'SELECT driver_personnel_number, name_driver, driving_experience, violatoins_of_traffic_rules, hids_in_road_accidents, negative_comments, attestation FROM drivers';
    const { rows } = await database.query(query);

    let result = rows.map(function (row) {
        return calculating_the_rating_of_drivers(row);
    });

    let sort_result = result.sort(function (a, b) {
        return b.score - a.score;
    });

    let sort_20_result = sort_result.slice(0, 20);
    let json = JSON.stringify(sort_20_result);

    return json;
}

// Вывод таблицы "Таблица с рейтингом ТС" (первые 20 строк, по убыванию) (вкладка "Таблица с рейтингом водителей")
async function getbuses(arguments, body) {
    const query = 'SELECT bus_number, lifetime, number_of_days_of_downtime, environmental_class, pasenger_safety, comfort, maintaining_temperature, transportation_of_passengers_with_disabilities, cashless_payment_terminal, notification_system FROM buses';
    const { rows } = await database.query(query);

    let result = rows.map(function (row) {
        return calculating_the_rating_of_buses(row);
    });

    let sort_result = result.sort(function (a, b) {
        return b.score - a.score;
    });

    let sort_20_result = sort_result.slice(0, 20);
    let json = JSON.stringify(sort_20_result);

    return json;
}

// Вывод .csv (вкладка "Отчет о количестве пассажиров")
async function getrounds_csv_passengers(arguments, body, response) {
    const query =
        'SELECT round_date,' +
        'round_start_time,' +
        'round_end_time,' +
        'bus_number,' +
        'route_number,' +
        'route_direction,' +
        'cash_amount,' +
        'bank_transfer_amount,' +
        'amount_by_qr_codes,' +
        'number_of_passengers ' +
        'FROM rounds ' +
        'WHERE (round_date BETWEEN  $1 AND $2)' +
        'AND (round_start_time >= $3)' +
        'AND (round_end_time <= $4)' +
        'AND (route_number = $5)' +
        'AND (route_direction = $6)'
        ;
    const { rows } = await database.query(query, [
        arguments.get('from_date'),
        arguments.get('to_date'),
        arguments.get('round_start_time'),
        arguments.get('round_end_time'),
        arguments.get('route_number'),
        arguments.get('route_direction'),
    ]);

    let result = rows.map(function (row) {
        return report_passenger_count(row);
    });

    let fileContent = '';
    fileContent += 'Дата рейса' + ';';
    fileContent += 'Время начала рейса' + ';';
    fileContent += 'Время окончания рейса' + ';';
    fileContent += 'Транспортное средство' + ';';
    fileContent += 'Маршрут' + ';';
    fileContent += 'Направление маршрута' + ';';
    fileContent += 'Количество пассажиров' + ';';
    fileContent += '\n';

    for (let i = 0; i < result.length; i++) {
        fileContent += result[i].round_date + ';';
        fileContent += result[i].round_start_time + ';';
        fileContent += result[i].round_end_time + ';';
        fileContent += result[i].bus_number + ';';
        fileContent += result[i].route_number + ';';
        fileContent += result[i].route_direction + ';';
        fileContent += result[i].number_of_passengers + ';';
        fileContent += '\n';
    }

    return encoding.convert(fileContent, 'WINDOWS-1251', 'UTF-8');
}

// Вывод .csv (вкладка "Отчет о выручке")
async function getrounds_csv_proceeds(arguments, body, response) {
    const query =
    'SELECT round_date,' +
    'round_start_time,' +
    'round_end_time,' +
    'bus_number,' +
    'route_number,' +
    'route_direction,' +
    'cash_amount,' +
    'bank_transfer_amount,' +
    'amount_by_qr_codes,' +
    'total_amount ' +
    'FROM rounds ' +
    'WHERE (round_date BETWEEN  $1 AND $2)' +
    'AND (round_start_time >= $3)' +
    'AND (round_end_time <= $4)' +
    'AND (route_number = $5)' +
    'AND (route_direction = $6)'
    ;
    const { rows } = await database.query(query, [
        arguments.get('from_date'),
        arguments.get('to_date'),
        arguments.get('round_start_time'),
        arguments.get('round_end_time'),
        arguments.get('route_number'),
        arguments.get('route_direction'),
    ]);

    let result = rows.map(function (row) {
        return report_proceeds(row);
    });

    let fileContent = '';
    fileContent += 'Дата рейса' + ';';
    fileContent += 'Время начала рейса' + ';';
    fileContent += 'Время окончания рейса' + ';';
    fileContent += 'Транспортное средство' + ';';
    fileContent += 'Маршрут' + ';';
    fileContent += 'Направление маршрута' + ';';
    fileContent += 'Выручка, руб.' + ';';
    fileContent += 'в т.ч. оплата наличными, руб.' + ';';
    fileContent += 'б/н оплата, руб.' + ';';
    fileContent += 'оплата по QR-коду, руб.' + ';';
    fileContent += '\n';

    for (let i = 0; i < result.length; i++) {
        fileContent += result[i].round_date + ';';
        fileContent += result[i].round_start_time + ';';
        fileContent += result[i].round_end_time + ';';
        fileContent += result[i].bus_number + ';';
        fileContent += result[i].route_number + ';';
        fileContent += result[i].route_direction + ';';
        fileContent += result[i].total_amount + ';';
        fileContent += result[i].cash_amount + ';';
        fileContent += result[i].bank_transfer_amount + ';';
        fileContent += result[i].amount_by_qr_codes + ';';
        fileContent += '\n';
    }

    return encoding.convert(fileContent, 'WINDOWS-1251', 'UTF-8');
}

exports.functions = {
    'gettest': gettest,
    'posttest': posttest,
    'postdrivers': postdrivers,
    'postbuses': postbuses,
    'postrounds': postrounds,
    'getdrivers': getdrivers,
    'getbuses': getbuses,
};

exports.csvFunctions = {
    'getrounds_csv_passengers': getrounds_csv_passengers,
    'getrounds_csv_proceeds': getrounds_csv_proceeds,
}

4.4.	 Файл «calculating_the_rating_of_buses.js»
exports.calculating_the_rating_of_buses = function(buses) {    
    let score = 0; // балльная оценка
    let rating_score = 0; // рейтинговая оценка

    let lifetime;
    if (buses.lifetime < 3){
        lifetime = 25;
    } else if (buses.lifetime >= 3 && buses.lifetime < 5) {
        lifetime = 18;
    } else if (buses.lifetime >= 5 && buses.lifetime < 10) {
        lifetime = 10;
    } else {
        lifetime = 0;
    } 

    let number_of_days_of_downtime;
    if (buses.number_of_days_of_downtime >= 0 && buses.number_of_days_of_downtime < 10){
        number_of_days_of_downtime = 0;
    } else if (buses.number_of_days_of_downtime >= 10 && buses.number_of_days_of_downtime < 20){
        number_of_days_of_downtime = -5;
    } else if (buses.number_of_days_of_downtime >= 20 && buses.number_of_days_of_downtime < 30){
        number_of_days_of_downtime = -10;
    } else if (buses.number_of_days_of_downtime >= 30 && buses.number_of_days_of_downtime < 40){
        number_of_days_of_downtime = -15;
    } else if (buses.number_of_days_of_downtime >= 40 && buses.number_of_days_of_downtime < 50){
        number_of_days_of_downtime = -20;
    } else {
        number_of_days_of_downtime = -30;
    }

    let environmental_class;
    if (buses.environmental_class == 0){
        environmental_class = 0;
    } else if (buses.environmental_class == 1){
        environmental_class = 2;
    } else if (buses.environmental_class == 2){
        environmental_class = 5;
    } else if (buses.environmental_class == 3){
        environmental_class = 10;
    } else if (buses.environmental_class == 4){
        environmental_class = 12;
    } else if (buses.environmental_class == 5){
        environmental_class = 15;
    } else {
        environmental_class = 20;
    }

    let pasenger_safety;
    if (buses.pasenger_safety =='TRUE'){
        pasenger_safety = 0;
    } else {
        pasenger_safety = -10;
    }

    let comfort;
    if (buses.comfort < 20){
        comfort = 0;
    } else if (buses.comfort >= 20 && buses.comfort < 40){
        comfort = 5;
    } else if (buses.comfort >= 40 && buses.comfort < 60){
        comfort = 15;
    } else {
        comfort = 25;
    }

    let maintaining_temperature;
    if (buses.maintaining_temperature == 'TRUE'){
        maintaining_temperature = 0;
    } else {
        maintaining_temperature = -10;
    }

    let transportation_of_passengers_with_disabilities;
    if (buses.transportation_of_passengers_with_disabilities == 'TRUE'){
        transportation_of_passengers_with_disabilities = 10;
    } else {
        transportation_of_passengers_with_disabilities = 0;
    }

    let cashless_payment_terminal;
    if (buses.cashless_payment_terminal == 'TRUE'){
        cashless_payment_terminal = 10;
    } else {
        cashless_payment_terminal = 0;
    }

    let notification_system;
    if (buses.notification_system == 'TRUE'){
        notification_system = 10;
    } else {
        notification_system = 0;
    }

    // Рассчет балльной оценки
    score = lifetime + number_of_days_of_downtime + environmental_class + pasenger_safety + comfort + maintaining_temperature + transportation_of_passengers_with_disabilities + cashless_payment_terminal + notification_system;
    
    // Расчет рейтинговой оценки
    if (score > 80){
        rating_score = 5;
    } else if (score > 60 && score <= 80){
        rating_score = 4;
    } else if (score > 30 && score <= 60){
        rating_score = 3;
    } else if (score > 10 && score <= 30){
        rating_score = 2;
    } else {
        rating_score = 1;
    }
      
    return {
        bus_number: buses.bus_number,
        score: score,
        rating_score: rating_score
    }
}
4.5.	 Файл «calculating_the_rating_of_drivers.js»
exports.calculating_the_rating_of_drivers = function (driver) {
    let score = 0; // балльная оценка
    let rating_score = 0; // рейтинговая оценка
    let model_result = 0; // результат модели
    let model_rating = 0; // рейтинговая оценка по модели

    let driving_experience;
    if (driver.driving_experience < 3) {
        driving_experience = 0;
    } else if (driver.driving_experience >= 3 && driver.driving_experience < 5) {
        driving_experience = 5;
    } else if (driver.driving_experience >= 5 && driver.driving_experience < 8) {
        driving_experience = 10;
    } else if (driver.driving_experience >= 8 && driver.driving_experience < 10) {
        driving_experience = 15;
    } else if (driver.driving_experience >= 10 && driver.driving_experience < 14) {
        driving_experience = 20;
    } else {
        driving_experience = 25;
    }

    let violatoins_of_traffic_rules;
    if (driver.violatoins_of_traffic_rules < 3) {
        violatoins_of_traffic_rules = 20;
    } else if (driver.violatoins_of_traffic_rules >= 3 && driver.violatoins_of_traffic_rules < 6) {
        violatoins_of_traffic_rules = 10;
    } else if (driver.violatoins_of_traffic_rules >= 6 && driver.violatoins_of_traffic_rules < 10) {
        violatoins_of_traffic_rules = 5;
    } else {
        violatoins_of_traffic_rules = 0;
    }

    let hids_in_road_accidents;
    if (driver.hids_in_road_accidents < 1) {
        hids_in_road_accidents = 15;
    } else if (driver.hids_in_road_accidents >= 1 && driver.hids_in_road_accidents < 3) {
        hids_in_road_accidents = 10;
    } else if (driver.hids_in_road_accidents >= 3 && driver.hids_in_road_accidents < 5) {
        hids_in_road_accidents = 5;
    } else {
        hids_in_road_accidents = 0;
    }

    let negative_comments;
    if (driver.negative_comments < 5) {
        negative_comments = 20;
    } else if (driver.negative_comments >= 5 && driver.negative_comments < 10) {
        negative_comments = 10;
    } else if (driver.negative_comments >= 10 && driver.negative_comments < 15) {
        negative_comments = 5;
    } else {
        negative_comments = 0;
    }

    let attestation;
    if (driver.attestation < 10) {
        attestation = 0;
    } else if (driver.attestation >= 10 && driver.attestation < 15) {
        attestation = 5;
    } else if (driver.attestation >= 15 && driver.attestation < 20) {
        attestation = 10;
    } else if (driver.attestation >= 20 && driver.attestation < 26) {
        attestation = 15;
    } else {
        attestation = 20;
    }

    // Рассчет балльной оценки
    score = driving_experience + violatoins_of_traffic_rules + hids_in_road_accidents + negative_comments + attestation;

    // Расчет рейтинговой оценки
    if (score > 80) {
        rating_score = 5;
    } else if (score > 60 && score <= 80) {
        rating_score = 4;
    } else if (score > 30 && score <= 60) {
        rating_score = 3;
    } else if (score > 10 && score <= 30) {
        rating_score = 2;
    } else {
        rating_score = 1;
    }

    // Расчет результата модели
    model_result = 1.84 * driving_experience - 0.5 * violatoins_of_traffic_rules - 4.01 * hids_in_road_accidents - 0.63 * negative_comments + 1.16 * attestation;
    let model_result2 = model_result.toFixed(2);

    // Расчет рейтинговой оценки по модели
    if (model_result > 37.45) {
        model_rating = 5;
    } else if (model_result > 28.36 && model_result <= 37.45) {
        model_rating = 4;
    } else if (model_result > 1.43 && model_result <= 28.36) {
        model_rating = 3;
    } else if (model_result > -10 && model_result <= 1.43) {
        model_rating = 2;
    } else {
        model_rating = 1;
    }

    return {
        driver_personnel_number: driver.driver_personnel_number,
        score: score,
        rating_score: rating_score,
        model_result: model_result2,
        model_rating: model_rating
    };
}

4.6.	 Файл «report_passenger_count.js»
exports.report_passenger_count = function (rounds) {
    rounds.total_amount = rounds.cash_amount + rounds.bank_transfer_amount + rounds.amount_by_qr_codes;

    rounds.number_of_passengers = (rounds.total_amount / 23).toFixed(0);

    let route_direction;
    if (rounds.route_direction) {
        route_direction = 'Прямое';
    } else {
        route_direction = 'Обратное';
    }

    const result = {
        round_date: rounds.round_date,
        round_start_time: rounds.round_start_time,
        round_end_time: rounds.round_end_time,
        bus_number: rounds.bus_number,
        route_number: rounds.route_number,
        route_direction: route_direction,
        number_of_passengers: rounds.number_of_passengers,
    }
    console.log(result);
    return result;
}

4.7.	 Файл «report_proceeds.js»
exports.report_proceeds = function(rounds) {
    rounds.total_amount = rounds.cash_amount + rounds.bank_transfer_amount + rounds.amount_by_qr_codes;

    let route_direction;
    if (rounds.route_direction == 'TRUE'){
        route_direction = 'Прямое';
    } else {
        route_direction = 'Обратное';
    }
      
    return {
        round_date: rounds.round_date,
        round_start_time: rounds.round_start_time,
        round_end_time: rounds.round_end_time,
        bus_number: rounds.bus_number,
        route_number: rounds.route_number,
        route_direction: route_direction,
        total_amount: rounds.total_amount,
    	cash_amount: rounds.cash_amount,
	    bank_transfer_amount: rounds.bank_transfer_amount,
	    amount_by_qr_codes: rounds.amount_by_qr_codes,
    }
}
4.8.	 Файл «index.html» (Вкладка «Главная»)
<!DOCTYPE-html>
<html lang="ru">
    <head>
        <title>Аналитика данных в сфере логистики общественного транспорта</title>
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8* /">
        <link rel="stylesheet" href="css/style.css">
        <script type="text/javascript"> 
            function pokaz(descr){
          var vid = document.getElementById(descr).style; 
          if (vid.display == "none") {vid.display = "inline"; }
          else {vid.display = "none";}
            }  
           </script>

    </head>
    <body>
        <div class="page_body">
        <header>
            
            <div class="composition_header">
                <!--Логотип-->
                <div class="logo">
                    <img class="logo_picture" src="img/logo.png" alt="" width="58" height="58">
                    <span class="logo_text">BusLogistics</span>
                </div>

                <div class="list_of_tabs">
                    <ul class="all_menu">
                        <li><a class="menu" href="/">Главная</a></li>
                        <li><a class="menu" href="/ratings/">Рейтинги</a></li>
                        <li><a class="menu" href="/analytics_and_reports/">Аналитика и отчеты</a></li>
                        <li><a class="menu" href="/about_service/">О сервисе</a></li>
                        <li><a class="menu" href="/contacts/">Контакты</a></li>
                    </ul>                      
                </div>
            </div>
        </header>

        <div class="main">
            <div>
                <h1>Аналитика данных в сфере логистики общественного транспорта</h1>
                <h2>Экспериментальный образец Web-платформы для получения оперативной и сводной аналитики в сфере логитики общественного транспорта и оптимизации пассажиропотока.</h2>    
            </div>                        
            <button>
                <a class="button_info" href="/about_service/">Посмотреть информацию о платформе</a>
            </button>
        </div>
        <footer>
            <img class="footer_picture" src="img/imgonline-com-ua-Transparent-backgr-UBI2RcaTK7Vh.png" alt="">
        </footer>    
    </div>
    </body>
</html>

4.9.	 Файл «…\ratings\index.html» (Вкладка «Рейтинги»)
<!DOCTYPE-html>
    <html lang="ru">
    <head>
        <title>Рейтинги</title>
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8* /">
        <link rel="stylesheet" href="css/style.css">

        <script type="text/javascript">
            function pokaz(descr) {
                var vid = document.getElementById(descr).style;
                if (vid.display == "none") { vid.display = "inline"; }
                else { vid.display = "none"; }
            }
        </script>

        <script type="text/javascript">
            function setScrollIntoViewOptions(top) {
                const deteils = document.querySelector('.deteils');
                deteils.scrollIntoView({
                    block: "center",
                    inline: "center",
                    behavior: "smooth"
                });
            }

            function post_drivers(event) {
                var data = {
                    name_driver: document.getElementById("d0").value,
                    driver_personnel_number: document.getElementById("d1").value,
                    driving_experience: document.getElementById("d2").value,
                    violatoins_of_traffic_rules: document.getElementById("d3").value,
                    hids_in_road_accidents: document.getElementById("d4").value,
                    negative_comments: document.getElementById("d5").value,
                    attestation: document.getElementById("d6").value,
                }
                var json = JSON.stringify(data);

                var xhr = new XMLHttpRequest();
                xhr.open("POST",'http://127.0.0.1:54458/drivers', true);
                xhr.setRequestHeader('Content-Type', 'text/plain');
                xhr.send(json);
            }

            function post_buses() {
                var data = {
                    bus_number: document.getElementById("b1").value,
                    lifetime: document.getElementById("b2").value,
                    number_of_days_of_downtime: document.getElementById("b3").value,
                    environmental_class: document.getElementById("b4").value,
                    pasenger_safety: document.getElementById("b5").value,
                    comfort: document.getElementById("b6").value,
                    maintaining_temperature: document.getElementById("b7").value,
                    transportation_of_passengers_with_disabilities: document.getElementById("b8").value,
                    cashless_payment_terminal: document.getElementById("b9").value,
                    notification_system: document.getElementById("b10").value,
                }
                var json = JSON.stringify(data);
                var xhr = new XMLHttpRequest();
                xhr.open("POST",'http://127.0.0.1:54458/buses', true);
                xhr.setRequestHeader('Content-Type', 'text/plain');
                xhr.send(json);            
            }

            function get_drivers(){
                let xhr = new XMLHttpRequest();
                xhr.open("GET",'http://127.0.0.1:54458/drivers', true);   
                xhr.onload  = function() {
                    let rows = JSON.parse(xhr.response);
                    console.log(rows);
                    let drivers_rating = document.getElementById('drivers_rating');
                    for(var i = 0; i< rows.length; i++){
                        console.log(rows[i]);
                        let new_row = document.createElement('tr');
                        let col1 = document.createElement('td');
                        col1.innerHTML = rows[i].driver_personnel_number;
                        new_row.appendChild(col1);
                        let col2 = document.createElement('td');
                        col2.innerHTML = rows[i].score;
                        new_row.appendChild(col2);
                        let col3 = document.createElement('td');
                        col3.innerHTML = rows[i].rating_score;
                        new_row.appendChild(col3);
                        let col4 = document.createElement('td');
                        col4.innerHTML = rows[i].model_result;
                        new_row.appendChild(col4);
                        let col5 = document.createElement('td');
                        col5.innerHTML = rows[i].model_rating;
                        new_row.appendChild(col5);

                        drivers_rating.appendChild(new_row);
                    };
                };

                xhr.send();
            }
            function get_buses(){
                let xhr = new XMLHttpRequest();
                xhr.open("GET",'http://127.0.0.1:54458/buses', true);
                
                xhr.onload  = function() {
                    let rows = JSON.parse(xhr.response);
                    console.log(rows);
                    let buses_rating = document.getElementById('buses_rating');
                    for(var i = 0; i < rows.length; i++){
                        console.log(rows[i]);
                        let new_row = document.createElement('tr');
                        let col1 = document.createElement('td');
                        col1.innerHTML = rows[i].bus_number;
                        new_row.appendChild(col1);
                        let col2 = document.createElement('td');
                        col2.innerHTML = rows[i].score;
                        new_row.appendChild(col2);
                        let col3 = document.createElement('td');
                        col3.innerHTML = rows[i].rating_score;
                        new_row.appendChild(col3);

                        buses_rating.appendChild(new_row);
                    };
                };
                xhr.send();
            }
        </script>

    </head>

    <body>
        <header>
            <div class="composition_header">
                <div class="logo">
                    <img class="logo_picture" src="img/logo.png" alt="" width="58" height="58">
                    <span class="logo_text">BusLogistics</span>
                </div>
                <div class="list_of_tabs">
                    <ul class="all_menu">
                        <li><a class="menu" href="/">Главная</a></li>
                        <li><a class="menu" href="/ratings/">Рейтинги</a></li>
                        <li><a class="menu" href="/analytics_and_reports/">Аналитика и отчеты</a></li>
                        <li><a class="menu" href="/about_service/">О сервисе</a></li>
                        <li><a class="menu" href="/contacts/">Контакты</a></li>
                    </ul>
                </div>
            </div>
        </header>

        <div class="main">
            <h1>Рейтинг водителей</h1>
            <div>
                <h3>
                    <a class="deteils" href="#" onClick="pokaz('deteils_1')">Информация о рейтинге водителей</a>
                </h3>
                <div id="deteils_1" style="display: none">
                    <p class="text">Городской общественный транспорт включает в себя системы, которые доступны для
                        использования всем лицам, оплатившим установленный тариф (фиксированную плату). Эти режимы,
                        которые работают на фиксированных маршрутах и с фиксированным расписанием, включают автобусы,
                        легко рельсовый транспорт, метро, региональные железные дороги и несколько других систем.</p>
                    <p class="text">В результате исследования предметной области городского транспорта, были выделены
                        показатели, которые могут влиять на рейтинг водителей. Исследовано, что при анализе определенных
                        показателей по водителям можно сказать в целом о рейтинге водителей среди подобных.</p>
                    <p class="text">Для построения модели рейтингов водителей выберем 5 основных показателей: Стаж
                        водителя пассажирских перевозок, Количество нарушений правил ПДД за последние 60 смен,
                        Количество попаданий в ДТП (по вине водителя) за последние 60 смен, Количество негативных
                        комментариев (жалоб) на водителя от пассажиров за последние 3 месяца, Аттестация. В таблице 1 по
                        каждому показателю приведено описание, а также возможные значения показателя и советующие им
                        оценки в виде баллов, где максимальное значение в сумме составляет 100 баллов. </p>
                    <p class="table">Таблица 1 - Показатели для оценки водителей</p>
                    <table border="1">
                        <tr>
                            <th>№</th>
                            <th>Наименование показателя</th>
                            <th>Описание показателя</th>
                            <th>Значение показателя</th>
                            <th>Балльная оценка</th>
                        </tr>
                        <tr>
                            <td>1</td>
                            <td>Стаж вождения водителя пассажирских перевозок</td>
                            <td>Стаж вождения водителя с начала осуществления пассажирских перевозок до настоящего
                                момента времени</td>
                            <td>
                                <p>Стаж</p>
                                <p>До 3 лет</p>
                                <p>От 3 до 5 лет</p>
                                <p>От 5 до 8 лет</p>
                                <p>От 8 до 10 лет</p>
                                <p>От 10 до 14 лет</p>
                                <p>Более 14 лет</p>
                            </td>
                            <td>
                                <br>
                                <p>0</p>
                                <p>5</p>
                                <p>10</p>
                                <p>15</p>
                                <p>20</p>
                                <p>25</p>
                            </td>
                        </tr>
                        <tr>
                            <td>2</td>
                            <td>Количество нарушений правил ПДД за последние 60 смен</td>
                            <td>Количество зафиксированных нарушений правил ПДД за последние 60 смен от настоящего
                                момента времени</td>
                            <td>
                                <p>До 3 раз</p>
                                <p>От 3 до 6 раз</p>
                                <p>От 6 до 10 раз</p>
                                <p>Более 10 раз</p>
                            </td>
                            <td>
                                <p>20</p>
                                <p>10</p>
                                <p>5</p>
                                <p>0</p>
                            </td>
                        </tr>
                        <tr>
                            <td>3</td>
                            <td>Количество попаданий в ДТП (по вине водителя) за последние 60 смен</td>
                            <td>Количество зафиксированных попаданий в ДТП (по вине водителя) за последние 60 смен от
                                настоящего момента времени</td>
                            <td>
                                <p>До 1 раза</p>
                                <p>От 1 до 3 раз</p>
                                <p>От 3 до 5 раз</p>
                                <p>Более 5 раз</p>
                            </td>
                            <td>
                                <p>15</p>
                                <p>10</p>
                                <p>5</p>
                                <p>0</p>
                            </td>
                        </tr>
                        <tr>
                            <td>4</td>
                            <td>Количество негативных комментариев (жалоб) на водителя от пассажиров за последние 3
                                месяца</td>
                            <td>Комментарии, отзывы, жалобы, которые поступают через различные каналы связи на
                                конкретных водителей</td>
                            <td>
                                <p>До 5</p>
                                <p>От 5 до 10</p>
                                <p>От 10 до 15</p>
                                <p>Более 15</p>
                            </td>
                            <td>
                                <p>20</p>
                                <p>10</p>
                                <p>5</p>
                                <p>0</p>
                            </td>
                        </tr>
                        <tr>
                            <td>5</td>
                            <td>Аттестация</td>
                            <td>Аттестация, проводимая раз в 3 месяца, для оценки знаний водителями правил дорожного
                                движения, устройства транспортного средства и т.д.. Значение показателя соответствует
                                количеству правильных ответов из 30 вопросов.</td>
                            <td>
                                <p>Правильных ответов</p>
                                <p>До 10</p>
                                <p>От 10 до 15</p>
                                <p>От 15 до 20</p>
                                <p>От 20 до 26</p>
                                <p>Более 26</p>
                            </td>
                            <td>
                                <br>
                                <br>
                                <p>0</p>
                                <p>5</p>
                                <p>10</p>
                                <p>15</p>
                                <p>20</p>
                            </td>
                        </tr>
                    </table>
                </div>
            </div>


            <div>
                <h3>
                    <a class="deteils" href="#" onClick="(pokaz('deteils_2'), get_drivers())">Таблица с рейтингом водителей</a>
                </h3>
                <div id="deteils_2" style="display: none">
                    <table id="drivers_rating" border="1">
                        <tr>
                            <th>Табельный номер водителя</th>
                            <th>Балльная оценка</th>
                            <th>Рейтинговая оценка</th>
                            <th>Результат модели</th>
                            <th>Рейтинговая оценка (по модели)</th>
                        </tr>
                    </table>
                </div>
            </div>

            <div>
                <h3>
                    <a class="deteils" href="#" onClick="pokaz('deteils_3')">Внесение изменений в данные о рейтингах
                        водителей</a>
                </h3>
                <div id="deteils_3" style="display: none">    
                        <div>
                            <p class="index">ФИО водителя</p>
                            <input id="d0" class="data_values" placeholder="Значение показателя" type="text" name="name_driver">
                        </div>
                        <div>
                            <p class="index">Табельный номер водителя</p>
                            <input id="d1" class="data_values" placeholder="Значение показателя" type="text" name="driver_personnel_number">
                        </div>
                        <div>
                            <p class="index">Стаж вождения</p>
                            <input id="d2" class="data_values" placeholder="Значение показателя" type="number" name="driving_experience">
                        </div>
                        <div>
                            <p class="index">Количество нарушений правил ПДД за последние 60 смен</p>
                            <input id="d3" class="data_values" placeholder="Значение показателя" type="number"
                                name="violatoins_of_traffic_rules">
                        </div>
                        <div>
                            <p class="index">Количество попаданий в ДТП (по вине водителя) за последние 60 смен</p>
                            <input id="d4" class="data_values" placeholder="Значение показателя" type="number"
                                name="hids_in_road_accidents">
                        </div>
                        <div>
                            <p class="index">Количество негативных комментариев (жалоб) на водителя от пассажиров за
                                последние 3 месяца</p>
                            <input id="d5" class="data_values" placeholder="Значение показателя" type="number" name="negative_comments">
                        </div>
                        <div>
                            <p class="index">Аттестация</p>
                            <input id="d6" class="data_values" placeholder="Значение показателя" type="number" name="attestation">
                        </div>
                        <div>
                            <button class="send" onclick="post_drivers()">Внести изменения</button>
                        </div>
                </div>
            </div>
            <br>

            <h2>Рейтинг транспортных средств</h2>

            <div>
                <h3>
                    <a class="deteils" href="#" onClick="pokaz('deteils_4')">Информация о рейтинге транспортных
                        средств</a>
                </h3>
                <div id="deteils_4" style="display: none">
                    <p class="text">Городской общественный транспорт включает в себя системы, которые доступны для
                        использования всем лицам, оплатившим установленный тариф (фиксированную плату). Эти режимы,
                        которые работают на фиксированных маршрутах и с фиксированным расписанием, включают автобусы,
                        легко рельсовый транспорт, метро, региональные железные дороги и несколько других систем.</p>
                    <p class="text">В результате исследования предметной области городского транспорта, были выделены
                        показатели, которые могут влиять на рейтинг транспортных средств. Исследовано, что при анализе
                        определенных показателей по транспортным средствам можно сказать в целом о рейтинге
                        транспортного средства среди подобных.</p>
                    <p class="text">Для рейтинга транспортных средств (автобусов) были выбраны 9 показателей: Срок
                        эксплуатации ТИ, Количество дней простоя ТС, Экологический класс ТС, Обеспечение безопасности
                        пассажиров, Комфортность проезда пассажиров, Средства поддержания комфортного температурного
                        режима в салоне, Условия для перевозки пассажиров с ограниченными возможностями, Наличие
                        терминала безналичной оплаты, система оповещения. В таблице 2 по каждому показателю приведено
                        описание, а также возможные значения показателя и соответствующие им оценки в виде баллов, где
                        максимальное значение в сумме составляет 100 баллов.</p>
                    <p class="table">Таблица 2 - Показатели для оценки транспортных средств</p>
                    <table border="1">
                        <tr>
                            <th>№</th>
                            <th>Наименование показателя</th>
                            <th>Описание показателя</th>
                            <th>Значение показателя</th>
                            <th>Балльная оценка</th>
                        </tr>
                        <tr>
                            <td>1</td>
                            <td>Срок эксплуатации транспортного средства (ТС)</td>
                            <td>Срок эксплуатации транспортного средства (автобуса) со дня его изготовления, указанного
                                в паспорте транспортного средства (ПТС)</td>
                            <td>
                                <p>Срок эксплуатации</p>
                                <p>До 3 лет</p>
                                <p>От 3 до 5 лет</p>
                                <p>От 5 до 10 лет</p>
                                <p>Более 10 лет</p>
                            </td>
                            <td>
                                <br>
                                <br>
                                <p>25</p>
                                <p>18</p>
                                <p>10</p>
                                <p>0</p>
                            </td>
                        </tr>
                        <tr>
                            <td>2</td>
                            <td>Количество дней простоя ТС</td>
                            <td>Количество дней простоя ТС в общем количестве дней осуществления перевозок</td>
                            <td>
                                <p>От 0 до 10</p>
                                <p>От 10 до 20</p>
                                <p>От 20 до 30</p>
                                <p>От 30 до 40</p>
                                <p>От 40 до 50</p>
                                <p>Более 50</p>
                            </td>
                            <td>
                                <p>0</p>
                                <p>-5</p>
                                <p>-10</p>
                                <p>-15</p>
                                <p>-20</p>
                                <p>-30</p>
                            </td>
                        </tr>
                        <tr>
                            <td>3</td>
                            <td>Экологический класс ТС</td>
                            <td>Экологический класс указывается в ПТС</td>
                            <td>
                                <p>0 класс</p>
                                <p>1 класс</p>
                                <p>2 класс</p>
                                <p>3 класс</p>
                                <p>4 класс</p>
                                <p>5 класс</p>
                                <p>6 класс и выше</p>
                            </td>
                            <td>
                                <p>0</p>
                                <p>2</p>
                                <p>5</p>
                                <p>10</p>
                                <p>12</p>
                                <p>15</p>
                                <p>20</p>
                            </td>
                        </tr>
                        <tr>
                            <td>4</td>
                            <td>Обеспечение безопасности пассажиров</td>
                            <td>Обеспечение безопасности пассажиров осуществляется путем наличия системы антизажима
                                пассажиров дверями</td>
                            <td>
                                <p>Наличие</p>
                                <p>Отсутствие</p>
                            </td>
                            <td>
                                <p>0</p>
                                <p>-10</p>
                            </td>
                        </tr>
                        <tr>
                            <td>5</td>
                            <td>Комфортность проезда пассажиров</td>
                            <td>Обеспечение безопасности пассажиров осуществляется путем наличия системы антизажима
                                пассажиров дверями</td>
                            <td>
                                <p>До 20%</p>
                                <p>От 20% до 40%</p>
                                <p>От 40% до 60%</p>
                                <p>От 60% и выше</p>
                            </td>
                            <td>
                                <p>0</p>
                                <p>5</p>
                                <p>15</p>
                                <p>25</p>
                            </td>
                        </tr>
                        <tr>
                            <td>6</td>
                            <td>Средства поддержания комфортного температурного режима в салоне</td>
                            <td>Поддержание комфортного температурного режима в салоне характеризуется наличием в
                                автобусе кондиционера, отопления, а так же их исправность</td>
                            <td>
                                <p>Наличие</p>
                                <p>Отсутствие</p>
                            </td>
                            <td>
                                <p>0</p>
                                <p>-10</p>
                            </td>
                        </tr>
                        <tr>
                            <td>7</td>
                            <td>Условия для перевозки пассажиров с ограниченными возможностями</td>
                            <td>Наличие оборудования для перевозки пассажиров с ограниченными физическими возможностями
                            </td>
                            <td>
                                <p>Наличие</p>
                                <p>Отсутствие</p>
                            </td>
                            <td>
                                <p>10</p>
                                <p>0</p>
                            </td>
                        </tr>
                        <tr>
                            <td>8</td>
                            <td>Наличие терминала безналичной оплаты</td>
                            <td>Наличия оборудования для произведения безналичной оплаты по средствам банковской карты
                            </td>
                            <td>
                                <p>Наличие</p>
                                <p>Отсутствие</p>
                            </td>
                            <td>
                                <p>10</p>
                                <p>0</p>
                            </td>
                        </tr>
                        <tr>
                            <td>9</td>
                            <td>Система оповещения</td>
                            <td>Наличия оборудования для оповещения пассажиров (табло, средства вещания, динамики)</td>
                            <td>
                                <p>Наличие</p>
                                <p>Отсутствие</p>
                            </td>
                            <td>
                                <p>10</p>
                                <p>0</p>
                            </td>
                        </tr>
                    </table>
                </div>
            </div>

            <div>
                <h3><a class="deteils" href="#" onClick="(pokaz('deteils_5'), get_buses())">Таблица с рейтингом транспортных
                        средств</a></h3>
                <div id="deteils_5" style="display: none">
                    <table id="buses_rating" border="1">
                        <tr>
                            <th>Транспортное средство</th>
                            <th>Балльная оценка</th>
                            <th>Рейтинговая оценка</th>
                        </tr>
                    </table>
                </div>
            </div>

            <div>
                <h3><a class="deteils" href="#" onclick="(pokaz('deteils_6'), setScrollIntoViewOptions())">Внесение
                        изменений в данные о рейтингах транспортных средств</a></h3>
                <div id="deteils_6" style="display: none">
                    <form action="#" method="post" enctype="multipart/form-data">
                        <div>
                            <p class="index">Номер транспортного средства</p>
                            <input id="b1" placeholder="Значение показателя" type="text" name="bus_number">
                        </div>
                        <div>
                            <p class="index">Срок эксплуатации ТС</p>
                            <input id="b2" placeholder="Значение показателя" type="number" name="lifetime">
                        </div>
                        <div>
                            <p class="index">Количество дней простоя ТС</p>
                            <input id="b3" placeholder="Значение показателя" type="number"
                                name="number_of_days_of_downtime">
                        </div>
                        <div>
                            <p class="index">Экологический класс ТС</p>
                            <input id="b4" placeholder="Значение показателя" type="number" name="environmental_class">
                        </div>
                        <div>
                            <p class="index">Обеспечение безопасности пассажиров</p>
                            <select id="b5" name="pasenger_safety">
                                <option selected value=TRUE>Наличие</option>
                                <option value=FALSE>Отсутствие</option>
                            </select>
                        </div>
                        <div>
                            <p class="index">Комфорность проезда пассажиров</p>
                            <input id="b6" placeholder="Значение показателя" type="number" name="comfort">
                        </div>
                        <div>
                            <p class="index">Средства поддержания комфортного температурного режима в салоне</p>
                            <select id="b7" name="maintaining_temperature">
                                <option selected value=TRUE>Наличие</option>
                                <option value=FALSE>Отсутствие</option>
                            </select>
                        </div>
                        <div>
                            <p class="index">Условия перевозки пассажиров с ограниченными возможностями</p>
                            <select id="b8" name="transportation_of_passengers_with_disabilities">
                                <option selected value=TRUE>Наличие</option>
                                <option value=FALSE>Отсутствие</option>
                            </select>
                        </div>
                        <div>
                            <p class="index">Наличие терминала безналичной оплаты</p>
                            <select id="b9" name="cashless_payment_terminal">
                                <option selected value=TRUE>Наличие</option>
                                <option value=FALSE>Отсутствие</option>
                            </select>
                        </div>
                        <div>
                            <p class="index">Система оповещения</p>
                            <select id="b10" name="notification_system">
                                <option selected value=TRUE>Наличие</option>
                                <option value=FALSE>Отсутствие</option>
                            </select>
                        </div>
                        <div>
                            <button class="send" onclick="post_buses()">Внести изменения</button>
                        </div>
                    </form>
                </div>
            </div>
            <br>
        </div>

        <footer>
            <img class="footer_picture" src="img/imgonline-com-ua-Transparent-backgr-UBI2RcaTK7Vh.png" alt="">
        </footer>

    </body>

    </html>

4.10.	Файл «…\analytics_and_reports\index.html» (Вкладка «Аналитика и отчеты»)
<!DOCTYPE-html>
<html lang="ru">
    <head>
        <title>Аналитика и отчеты</title>
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8* /">
        <link rel="stylesheet" href="css/style.css">
        <script type="text/javascript"> 
        function pokaz(descr){
            var vid = document.getElementById(descr).style; 
            if (vid.display == "none") {
                vid.display = "inline";
            } else {
                vid.display = "none";
            }
        }  
        function post_rounds() {
            var data = {
                round_date: document.getElementById("r1").value,
                round_start_time: document.getElementById("r2").value,
                round_end_time: document.getElementById("r3").value,
                route_number: document.getElementById("r4").value,
                route_direction: document.getElementById("r5").value,
                driver_personnel_number: document.getElementById("r6").value,
                bus_number: document.getElementById("r7").value,
                cash_amount: document.getElementById("r8").value,
                bank_transfer_amount: document.getElementById("r9").value,
                amount_by_qr_codes: document.getElementById("r10").value,
            }
            var json = JSON.stringify(data);
            var xhr = new XMLHttpRequest();
            xhr.open("POST",'http://127.0.0.1:54458/rounds', true);
            xhr.setRequestHeader('Content-Type', 'text/plain');
            xhr.send(json);            
        }
        
        function post_rounds_csv(){
            var data = {
                from_date: document.getElementById("report_1").value,
                to_date: document.getElementById("report_2").value,
                round_start_time: document.getElementById("report_3").value,
                round_end_time: document.getElementById("report_4").value,
                route_number: document.getElementById("report_5").value,
                route_direction: document.getElementById("report_6").value,
            }
            var json = JSON.stringify(data);
            let arguments = `?from_date=${data.from_date}&to_date=${data.to_date}&round_start_time=${data.round_start_time}&round_end_time=${data.round_end_time}&route_number=${data.route_number}&route_direction=${data.route_direction}`;
            window.open('http://127.0.0.1:54458/rounds_csv_passengers' + arguments, '_blank').focus();
        }

        function post_rounds_csv2(){
            var data = {
                from_date: document.getElementById("report_10").value,
                to_date: document.getElementById("report_20").value,
                round_start_time: document.getElementById("report_30").value,
                round_end_time: document.getElementById("report_40").value,
                route_number: document.getElementById("report_50").value,
                route_direction: document.getElementById("report_60").value,
            }
            var json = JSON.stringify(data);
            let arguments = `?from_date=${data.from_date}&to_date=${data.to_date}&round_start_time=${data.round_start_time}&round_end_time=${data.round_end_time}&route_number=${data.route_number}&route_direction=${data.route_direction}`;
            window.open('http://127.0.0.1:54458/rounds_csv_proceeds' + arguments, '_blank').focus();
        }
        </script>

    </head>
    <body>

        <header>
            <div class="composition_header">
                <div class="logo">
                    <img class="logo_picture" src="img/logo.png" alt="" width="58" height="58">
                    <span class="logo_text">BusLogistics</span>
                </div>
                <div class="list_of_tabs">
                    <ul class="all_menu">
                        <li><a class="menu" href="/">Главная</a></li>
                        <li><a class="menu" href="/ratings/">Рейтинги</a></li>
                        <li><a class="menu" href="/analytics_and_reports/">Аналитика и отчеты</a></li>
                        <li><a class="menu" href="/about_service/">О сервисе</a></li>
                        <li><a class="menu" href="/contacts/">Контакты</a></li>
                    </ul>                      
                </div>
            </div>
        </header>

        <div class="main">
        <h2>Аналитика и отчеты</h2>
        
        <div>
            <h3>
                <a class="deteils" href="#" onClick="pokaz('deteils_1')">Внесение новых данных</a>
            </h3>
            <div id="deteils_1" style="display: none">
                <div>
                    <p class="text">Дата рейса</p>
                    <input id="r1" placeholder="Значение показателя" type="date" name="round_date">
                </div>
                <div>
                    <p class="text">Время начала рейса</p>
                    <input id="r2" placeholder="Значение показателя" type="time" name="round_start_time">
                </div>
                <div>
                    <p class="text">Время окончания рейса</p>
                    <input id="r3" placeholder="Значение показателя" type="time" name="round_end_time">
                </div>

                <div>
                    <p class="text">Номер маршрута</p>
                    <input id="r4" placeholder="Значение показателя" type="text" name="route_number">
                </div>
                <div>
                    <p class="text">Направление маршрута</p>
                        <select id="r5" name="route_direction">
                            <option selected value=TRUE>Прямое</option>
                            <option value=FALSE>Обратное</option>
                        </select>
                </div>
                <div>
                    <p class="text">Табельный номер водителя</p>
                    <input id="r6" placeholder="Значение показателя" type="text" name="driver_personnel_number">
                </div>                                                
                <div>
                    <p class="text">Номер транпортного средства</p>
                    <input id="r7" placeholder="Значение показателя" type="text" name="bus_number">
                </div>
                <p class="text">Выручка</p>
                <br>
                <div>
                    <p class="text">Оплата наличными</p>
                    <input id="r8" placeholder="Значение показателя" type="tel" name="payment_cash">
                </div>
                <div>
                    <p class="text">Оплата по QR-коду</p>
                    <input id="r9" placeholder="Значение показателя" type="tel" name="payment_qr">
                </div>
                <div>
                    <p class="text">Б/н оплата</p>
                    <input id="r10" placeholder="Значение показателя" type="tel" name="payment_cashless">
                </div>
                <br>
                <button class="send" onclick="post_rounds()">Внести изменения</button>
            </div>
        </div>


        <div>
            <h3>
                <a class="deteils" href="#" onClick="pokaz('deteils_2')">Отчет о количестве пассажиров</a>
            </h3>
            <div id="deteils_2" style="display: none">
                    <div>
                        <p class="text">От даты</p>
                        <input id="report_1" placeholder="Значение показателя" type="date" name="from_date">
                    </div>
                    <div>
                        <p class="text">До даты</p>
                        <input id="report_2" placeholder="Значение показателя" type="date" name="to_date">
                    </div>                    
                    <div>
                        <p class="text">Время начала рейса</p>
                        <input id="report_3" placeholder="Значение показателя" type="time" name="round_start_time">
                    </div>
                    <div>
                        <p class="text">Время окончания рейса</p>
                        <input id="report_4" placeholder="Значение показателя" type="time" name="round_end_time">
                    </div>
                    <div>
                        <p class="text">Номер маршрута</p>
                        <input id="report_5" placeholder="Значение показателя" type="text" name="route_number">
                    </div>
                    <div>
                        <p class="text">Направление маршрута</p>
                            <select id="report_6" name="route_direction">
                                <option selected value=TRUE>Прямое</option>
                                <option value=FALSE>Обратное</option>
                            </select>
                    </div>                    
                    <br>
                    <button class="report" type="submit" onclick="(post_rounds_csv())">Скачать отчет</button>
            </div>                    
        </div>

        <div>
            <h3>
                <a class="deteils" href="#" onClick="pokaz('deteils_3')">Отчет о выручке</a>
            </h3>
            <div id="deteils_3" style="display: none">    
                    <div>
                        <p class="text">От даты</p>
                        <input id="report_10" placeholder="Значение показателя" type="date" name="from_date">
                    </div>
                    <div>
                        <p class="text">До даты</p>
                        <input id="report_20" placeholder="Значение показателя" type="date" name="to_date">
                    </div>                    
                    <div>
                        <p class="text">Время начала рейса</p>
                        <input id="report_30" placeholder="Значение показателя" type="time" name="round_start_time">
                    </div>
                    <div>
                        <p class="text">Время окончания рейса</p>
                        <input id="report_40" placeholder="Значение показателя" type="time" name="round_end_time">
                    </div>
                    <div>
                        <p class="text">Номер маршрута</p>
                        <input id="report_50" placeholder="Значение показателя" type="text" name="route_number">
                    </div>
                    <div>
                        <p class="text">Направление маршрута</p>
                            <select id="report_60" name="route_direction">
                                <option selected value=TRUE>Прямое</option>
                                <option value=FALSE>Обратное</option>
                            </select>
                    </div>                    
                    <br>
                    <button class="report" type="submit" onclick="(post_rounds_csv2())">Скачать отчет</button>
            </div>    
        </div>

        <div>
            <h3>
                <a class="deteils" href="#" onClick="pokaz('deteils_4')">Конструктор отчетов</a>
            </h3>
            <div id="deteils_4" style="display: none">
                <p class="text">Этот раздел находится в разработке.</p>
            </div>    
        </div>
    </div>

        <br>
        <footer>
            <img class="footer_picture" src="img/imgonline-com-ua-Transparent-backgr-UBI2RcaTK7Vh.png" alt="">
        </footer>        
               
    </body>
</html>

4.11.	Файл «…\about_service\index.html» (Вкладка «О сервисе»)
<!DOCTYPE-html>
<html lang="ru">
    <head>
        <title>О сервисе</title>
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8* /">
        <link rel="stylesheet" href="css/style.css">
    </head>
    <body>
        <header>
            <div class="composition_header">
                <div class="logo">
                    <img class="logo_picture" src="img/logo.png" alt="" width="58" height="58">
                    <span class="logo_text">BusLogistics</span>
                </div>
                <div class="list_of_tabs">
                    <ul class="all_menu">
                        <li><a class="menu" href="/">Главная</a></li>
                        <li><a class="menu" href="/ratings/">Рейтинги</a></li>
                        <li><a class="menu" href="/analytics_and_reports/">Аналитика и отчеты</a></li>
                        <li><a class="menu" href="/about_service/">О сервисе</a></li>
                        <li><a class="menu" href="/contacts/">Контакты</a></li>
                    </ul>                      
               </div>
            </div>
        </header>
        <div class="main">
        <h1>Аналитика данных в сфере логистики общественного транспорта и оптимизации пассажиропотока</h1>
        
        <p class="text">WEB-платформа для получения оперативной и сводной аналитики данных в сфере логистики общественного пассажирского транспорта и оптимизации пассажиропотока.</p>
        <p class="text">Область применения: Транспортная область в Томске и Томской области.</p>
        <p class="text">Целевая аудитория: Организации, которые осуществляют пассажирские перевозки</p>
        <p class="text">Функции:</p>
        <ol>
            <li>Показать движение денежных средств: наличные, безналичные, по транспортной карте, социальные (льготные) карты и т.д.; </li>
            <li>Показать пассажиропоток и распределение пассажиров по остановкам и транспорту;</li>
            <li>Распределение пассажиров по полу, возрасту и т.д.;</li>
            <li>Показать местонахождение транспорта в реальном времени; </li>
            <li>Вывод отчетов в разном виде для предоставления контролирующим органам.</li>
        </ol>

        <p class="text">Результат будет использован:</p>
        <ol>
            <li>Перевозчиками - для получения полноценной картины получателей услуги перевозок;</li>
            <li>Водителями и кондукторами - для получения информации по данному рейсу (маршруту) по количеству и сумме оплат пассажиров; </li>
            <li>Администрацией города - для получения данных по транспорту в городе и области;</li>
            <li>Инвесторами и т.д. - для получения какой-либо информации по требованию.</li>
        </ol>
        </div>
        <br>
        <footer>
            <img class="footer_picture" src="img/imgonline-com-ua-Transparent-backgr-UBI2RcaTK7Vh.png" alt="">
        </footer>

    </body>
</html>

4.12.	Файл «…\contacts\index.html» (Вкладка «Контакты»)
<!DOCTYPE-html>
<html lang="ru">
    <head>
        <title>Контакты</title>
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8* /">
        <link rel="stylesheet" href="css/style.css">
        <script src="/BusLogistic. Контакты/js/scroll_bar.js"></script>

    </head>
    <body>

        <header>
            <div class="composition_header">
                <div class="logo">
                    <img class="logo_picture" src="img/logo.png" alt="" width="58" height="58">
                    <span class="logo_text">BusLogistics</span>
                </div>
                <div class="list_of_tabs">
                    <ul class="all_menu">
                        <li><a class="menu" href="/">Главная</a></li>
                        <li><a class="menu" href="/ratings/">Рейтинги</a></li>
                        <li><a class="menu" href="/analytics_and_reports/">Аналитика и отчеты</a></li>
                        <li><a class="menu" href="/about_service/">О сервисе</a></li>
                        <li><a class="menu" href="/contacts/">Контакты</a></li>
                    </ul>                      
                </div>
            </div>
        </header>
        <div class="main">
            <h1>Контактная информация</h1>
            <p class="text">Чумаченко Анжелика Павловна</p>
            <p class="text">E-mail: lica.ru8@gmail.com</p>
        </div>
     
        <footer>
            <img class="footer_picture" src="img/imgonline-com-ua-Transparent-backgr-UBI2RcaTK7Vh.png" alt="">
        </footer>        
        
        <script src="/BusLogistic. Контакты/js/scroll_bar.js"></script>
    </body>
</html>

5.	Язык программирования
JavaScript, HTML

6.	Объема программы в машиночитаемых единицах кратных числу байт
8 274 310 байт
Полученные результаты исследования могут быть использованы различными организациями, сотрудниками, которые осуществляют пассажирские перевозки.
Анжелика
Чумаченко
Павловна
-
Отсутствует
Отсутствует
-
-
-
РОССИЯ
Анжелика
Чумаченко
Павловна
-
РОССИЯ
73.43.11
Городские транспортные пути и сети
02.03.IU
ENGINEERING, MECHANICAL
Анжелика
Чумаченко
Павловна
Исследование качественных и количественных показателей данных маршрутов и пассажиропотока общественного транспорта в городе Томск; разработка математической модели рейтингов для транспортных средств и водителей; front-end разработка; back-end разработка; разработка и настройка базы данных
РОССИЯ
ФОНД СОДЕЙСТВИЯ ИННОВАЦИЯМ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ УЧРЕЖДЕНИЕ "ФОНД СОДЕЙСТВИЯ РАЗВИТИЮ МАЛЫХ ФОРМ ПРЕДПРИЯТИЙ В НАУЧНО-ТЕХНИЧЕСКОЙ СФЕРЕ"
1027739479734
Организация
Федеральное государственное бюджетное учреждение "Фонд содействия развитию малых форм предприятий в научно-технической сфере"
Федеральные государственные бюджетные учреждения
Анжелика
Чумаченко
Павловна
Физическое лицо
РОССИЯ