После нескольких попыток получить тестовое задание от одной компании, получил приглашение на собеседование. Еще раз затребовал задания для теста, и вот свершилось чудо - получил. Тест состоял из нескольких блоков по 2-3 задачи в каждом. Вот одна из задач блока PHP, результат которой был принят специалистами компании, и обозначен как выполненный, на собеседовании.
Описание задачи:
Некоторые данные для задачи пришлось поискать. Так как было обозначено, что используется НДС для Российской Федерации, то необходимо было выяснить размер ставок НДС в различные периоды.
Ставки НДС в РФ по периодам:
- до 1992 года НДС в РФ не применялся, соответственно его значение было равно 0;
- в 1992 году ставка составляла 28%;
- с 1993 по 2003 год применялась ставка 20%;
- с 2004 по 2018 год ставка составляла 18%
- с 2019 года 20%
Размышления над реализацией:
- Ввод в действие ставок НДС происходил всегда с 1 января, поэтому достаточно оперировать годами из даты счета и непосредственно размером ставки.
- Для тестирования поступим просто, будем создавать объект класса, передавать туда данные (сумму с НДС из счета и дату выставления/создания счета), после чего будем выводить результат вызова метода класса, который производит очистку суммы от НДС (см. строки 16-17 кода реализации).
- Ставки НДС по годам являются ретроспективными, и в прошедшие периоды уже не изменятся никогда, поэтому обьявим их в константе TAX в виде массива - ключами будут являться годы ввода/изменения ставки, а значением их размер в процентах (см. строка 22).
- В конструкторе класса, при создании объекта, мы получаем передаваемые атрибуты счета и сохраняем их в свойствах - $fullsum - сумма счета с НДС, $year - год выставления счета (см.строки 23-24).
- Обработку даты счета вынесем в отдельный метод checkYear (см. строки 51-55), потому что даты могу поступать в разном формате, и возможно понадобится расширение этого метода для контроля и обработки входных данных.
- В методе, который производит очистку суммы от НДС зададим две переменные: $taxrate, в которой будет сохранятся определяемая для года счета ставка НДС, и $tax - массив из константы TAX, который в процессе обработки может трансформироваться. (см. строки 37-38)
- Запускаем цикл проверки, является ли указанный год выставления счета младше года (ключа) последнего элемента массива $tax (см. строка 39-45). Цикл выполнится минимум 1 раз, и в случае, если год меньше ключа последнего элемента, то из массива $tax будет удален последний элемент (см. строка 40). В противном случае, мы нашли искомый результат и присваиваем значение последнего элемента массива $tax переменной сохраняющей ставку - $taxrate (см. строка 42).
- Если не будет выполняться ни в одном цикле условие (см. строка 40 ), массив $tax избавится от всех элементов и станет пустым. Это завершит выполнение цикла по условию (см. строка 45) и значение ставки $taxrate останется равным 0, что соответствует году счета ранее 1992 года.
- После определения размера ставки возвращаем из метода значение очищенной суммы, которая вычисляется путем простых арифметических операций (см. строка 47).
Вот такой результат получился: