Михаил Воронов
Веб-разработчик №1*

Список оказываемых услуг

  • Автоматизация бизнес-процессов | API интеграции
  • Разработка [Chat Bots, Mini Apps] для Telegram
  • Разработка веб-приложений «под ключ»
  • Разработка микросервисов с RESTful API

Преимущества работы со мной

  • Индвидуально подхожу к работе с каждым клиентом
  • Строго соблюдаю оговоренные сроки
  • Пишу код согласно стандартам и лучшим практикам
  • При разработке тщательно продумываю архитектуру и логику
  • Оказываю последующую техническую поддержку своего кода

Список API с которыми я работал

  • Wildberries, OZON, Авито, Яндекс Маркет
  • МойСклад, Битрикс24, AmoCRM, RetailCRM, YClients
  • Google, Яндекс, VK, GetCourse, Unisender
  • ЮKassa, Robokassa, СберБанк, Т-Банк

Применяемый стек технологий

  • Нативные: PHP, HTML, CSS, JavaScript
  • Бэкенд: Laravel, Slim, Node.js, Strapi, Puppeteer
  • Фронтенд: Vue.js, Nuxt, Bootstrap, Tailwind, Vite
  • Шаблонизаторы: Blade, Twig
  • Базы данных: MySQL, PostgreSQL, SQLite, MongoDB
  • Интеграции: REST, SOAP, GraphQL, N8N
  • Прочее: WebSocket, Redis, Sphinx, FFmpeg

Отзывы

Остин Остап - 25.05.2025
за выполнение заказа Поправить верстку на Wordpress
Все отлично! Рекомендую!
Алексей Посысоев - 18.03.2025
за выполнение заказа Разработать автоматический опрос адресов из excel через API яндекс карт
Отлично выполненная работа. Быстро и профессионально. Большое спасибо.
Сергей Куваев - 11.02.2025
за выполнение заказа Очистить очень старую БД mysql + ruby + passenger
Отличная скорость и трезвая цена.
MOCTPECT - 13.01.2025
за выполнение заказа Wowonder. Изменить логику вывода рилсов.
Михаил выполнил задание быстро и профессионально. Рекомендую!
Артур - 06.12.2024
за выполнение заказа Разместить Капчу на Wordpress портале
Все сделано согласно ТЗ, так же спустя время устранил выявленные недочеты.
Читать все отзывы

Портфолио

Генератор путевых листов для водителей такси
Генератор путевых листов для водителей такси
Психологические тесты для Тильды
Психологические тесты для Тильды
Чекер зон по списку адресов
Чекер зон по списку адресов
Автоматизация действий в системе МойСклад
Автоматизация действий в системе МойСклад
Смотреть все работы

Примеры кода

HTML
CSS
JS
PHP
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Конвертер валют</title>
    <link rel="stylesheet" href="./style.css">
</head>
<body>
    <div class="converter">
        <h1>Конвертер валют</h1>
        <input type="number" id="amount" placeholder="Введите сумму" min="0" value="1">
        <select id="fromCurrency">
            <option value="RUB">Российский рубль</option>
            <option value="AUD">Австралийский доллар</option>
            <option value="AZN">Азербайджанский манат</option>
            <option value="GBP">Фунт стерлингов Соединенного королевства</option>
            <option value="AMD">Армянских драмов</option>
            <option value="BYN">Белорусский рубль</option>
            <option value="BGN">Болгарский лев</option>
            <option value="BRL">Бразильский реал</option>
            <option value="HUF">Венгерских форинтов</option>
            <option value="HKD">Гонконгских долларов</option>
            <option value="DKK">Датских крон</option>
            <option value="USD" selected>Доллар США</option>
            <option value="EUR">Евро</option>
            <option value="INR">Индийских рупий</option>
            <option value="KZT">Казахстанских тенге</option>
            <option value="CAD">Канадский доллар</option>
            <option value="KGS">Киргизских сомов</option>
            <option value="CNY">Китайских юаней</option>
            <option value="MDL">Молдавских леев</option>
            <option value="NOK">Норвежских крон</option>
            <option value="PLN">Польский злотый</option>
            <option value="RON">Румынский лей</option>
            <option value="XDR">СДР (специальные права заимствования)</option>
            <option value="SGD">Сингапурский доллар</option>
            <option value="TJS">Таджикских сомони</option>
            <option value="TRY">Турецкая лира</option>
            <option value="TMT">Новый туркменский манат</option>
            <option value="UZS">Узбекских сумов</option>
            <option value="UAH">Украинских гривен</option>
            <option value="CZK">Чешских крон</option>
            <option value="SEK">Шведских крон</option>
            <option value="CHF">Швейцарский франк</option>
            <option value="ZAR">Южноафриканских рэндов</option>
            <option value="KRW">Вон Республики Корея</option>
            <option value="JPY">Японских иен</option>
        </select>
        <select id="toCurrency">
            <option value="RUB" selected>Российский рубль</option>
            <option value="AUD">Австралийский доллар</option>
            <option value="AZN">Азербайджанский манат</option>
            <option value="GBP">Фунт стерлингов Соединенного королевства</option>
            <option value="AMD">Армянских драмов</option>
            <option value="BYN">Белорусский рубль</option>
            <option value="BGN">Болгарский лев</option>
            <option value="BRL">Бразильский реал</option>
            <option value="HUF">Венгерских форинтов</option>
            <option value="HKD">Гонконгских долларов</option>
            <option value="DKK">Датских крон</option>
            <option value="USD">Доллар США</option>
            <option value="EUR">Евро</option>
            <option value="INR">Индийских рупий</option>
            <option value="KZT">Казахстанских тенге</option>
            <option value="CAD">Канадский доллар</option>
            <option value="KGS">Киргизских сомов</option>
            <option value="CNY">Китайских юаней</option>
            <option value="MDL">Молдавских леев</option>
            <option value="NOK">Норвежских крон</option>
            <option value="PLN">Польский злотый</option>
            <option value="RON">Румынский лей</option>
            <option value="XDR">СДР (специальные права заимствования)</option>
            <option value="SGD">Сингапурский доллар</option>
            <option value="TJS">Таджикских сомони</option>
            <option value="TRY">Турецкая лира</option>
            <option value="TMT">Новый туркменский манат</option>
            <option value="UZS">Узбекских сумов</option>
            <option value="UAH">Украинских гривен</option>
            <option value="CZK">Чешских крон</option>
            <option value="SEK">Шведских крон</option>
            <option value="CHF">Швейцарский франк</option>
            <option value="ZAR">Южноафриканских рэндов</option>
            <option value="KRW">Вон Республики Корея</option>
            <option value="JPY">Японских иен</option>
        </select>
        <button onclick="convertCurrency();">Конвертировать</button>
        <div id="result"></div>
    </div>

    <script src="./script.js"></script>
</body>
</html>
body {
    font-family: 'Trebuchet MS', Helvetica, sans-serif; 
    font-size: 17px;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: #333;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
}
.converter {
    background: white;
    padding: 15px;
    border-radius: 5px;
    box-shadow: 0 4px 20px rgba(0,0,0,0.1);
    max-width: 400px;
    width: 100%;
}
h1 {
    text-align: center;
    color: #667eea;
    margin: 10px 0;
    font-size: 27px;
}
input, select, button {
    width: 100%;
    padding: 8px;
    margin: 10px 0;
    border: 1px solid #ddd;
    border-radius: 5px;
    box-sizing: border-box;
    font-family: Verdana, Geneva, sans-serif;
    font-size: 14px;
}
button {
    background: #667eea;
    color: white;
    cursor: pointer;
    margin-bottom: 0;
}
button:hover {
    background: #5a67d8;
}
#result {
    font-weight: bold;
    text-align: center;
    margin-top: 15px;
}
// Функция для загрузки курсов валют с сервера
async function loadExchangeRates() {
    try {
        const response = await fetch('converter.php');
        if (! response.ok) {
            throw new Error('Ошибка загрузки курсов');
        }
        const rates = await response.json();
        window.exchangeRates = rates;
    } catch (error) {
        console.error('Ошибка:', error);
        document.getElementById('result').innerHTML =
        	`<p style="color: red;">Не удалось загрузить курсы. Проверьте соединение.</p>`;
    }
}

// Функция конвертации
function convertCurrency() {
    const amount = parseFloat(document.getElementById('amount').value);
    const fromCurrency = document.getElementById('fromCurrency').value;
    const toCurrency = document.getElementById('toCurrency').value;
    const resultDiv = document.getElementById('result');

    if (! amount || ! fromCurrency || ! toCurrency) {
        resultDiv.innerHTML = `<p style="color: orange;">Введите сумму и выберите валюты!</p>`;
        return;
    }

    if (! window.exchangeRates) {
        resultDiv.innerHTML = `<p style="color: red;">Курсы ещё не загружены. Подождите...</p>`;
        loadExchangeRates();
        return;
    }

    // Курс RUB к RUB = 1
    const rubRate = 1;
    let fromRate = window.exchangeRates[fromCurrency] || rubRate; // Если RUB, то 1
    let toRate = window.exchangeRates[toCurrency] || rubRate;

    // Если валюта не RUB, берём курс из API (он уже относительно RUB)
    if (fromCurrency !== 'RUB') {
        fromRate = window.exchangeRates[fromCurrency];
    }
    if (toCurrency !== 'RUB') {
        toRate = window.exchangeRates[toCurrency];
    }

    // Конверсия: amount * (fromRate / toRate)
    const convertedAmount = amount * (fromRate / toRate);

    resultDiv.innerHTML =
    	`<p>
    		Результат: ${amount.toLocaleString()} ${fromCurrency} =
    		${convertedAmount.toLocaleString('ru-RU', { minimumFractionDigits: 2, maximumFractionDigits: 2 })} ${toCurrency}
    	</p>`;
}

// Автозагрузка курсов при загрузке страницы
document.addEventListener('DOMContentLoaded', function() {
    loadExchangeRates();
});

// Обработчики для селектов
document.getElementById('fromCurrency').addEventListener('change', function() {
    if (this.value === document.getElementById('toCurrency').value) {
        document.getElementById('toCurrency').value = '';
    }
});
document.getElementById('toCurrency').addEventListener('change', function() {
    if (this.value === document.getElementById('fromCurrency').value) {
        document.getElementById('fromCurrency').value = '';
    }
});
<?php

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');

date_default_timezone_set('Europe/Moscow');
$cacheFile = __DIR__ . '/rates.json';

// Получаем время полуночи сегодняшнего дня (00:00 МСК)
$now = time();
$midnight = mktime(0, 0, 0, date('m', $now), date('d', $now) + 1, date('Y', $now));

$cachedData = null;
if (file_exists($cacheFile)) {
    $fileTime = filemtime($cacheFile);
    if ($fileTime >= $midnight - 86400) {
        $cachedData = json_decode(file_get_contents($cacheFile), true);
    }
}

if ($cachedData !== null) {
    echo json_encode($cachedData);
    exit;
}

$url = 'https://www.cbr.ru/scripts/XML_daily.asp';

// Загружаем XML
$xml = simplexml_load_file($url);
if (! $xml) {
    echo json_encode(['error' => 'Не удалось загрузить курсы от ЦБ РФ']);
    exit;
}

// Парсим курсы (курсы к RUB)
$rates = ['RUB' => 1.0]; // RUB как базовая валюта
foreach ($xml->Valute as $valute) {
    $charCode = (string) $valute->CharCode;
    $nominal = (float) $valute->Nominal;
    $value = (float) str_replace(',', '.', $valute->Value);
    $rates[$charCode] = $value / $nominal; // Курс за 1 единицу валюты в RUB
}

// Сохраняем в кэш
$result = file_put_contents($cacheFile, json_encode($rates));

// Возвращаем JSON
echo json_encode($rates);
В этом небольшом примере я использовал только нативный код, чтобы вы смогли оценить синтаксис и стиль его написания.
Данный код конвертирует одну валюту в другую по курсу ЦБ РФ на текущую дату, подгружая курсы через XML API.
Код полностью рабочий, демо-версия примера доступна по ссылке https://voronoff.dev/demo/index.html