Я думаю, что я застрял с этой проблемой, поэтому я надеюсь, что вы можете дать мне несколько идей, как я могу решить эту задачу.
Я работаю над приложением, которое позволяет вам получитьобзор ваших регулярных платежей (я знаю, этот материал уже существует, это всего лишь побочный проект) и ваших расходов.
API почти закончен, но я борюсь с этим разделом: мне нужно знать, еслипериодический платеж должен быть выполнен в течение заданного промежутка времени.
Периодические события (контракты) содержат среди прочих полей startDate, endDate, intervalType (enum [еженедельно, ежемесячно, ежеквартально, раз в два года, ежегодно])
В настоящее время у меня есть такой запрос для доктрины:
return $this->createQueryBuilder('e')
->andWhere('e.startDate >= :start')
->andWhere('e.endDate <= :end')
->andWhere('e.user = :user')
->setParameter('start', $start)
->setParameter('end', $end)
->setParameter('user', $user)
->getQuery()
->getResult();
, где параметры начало и конец - это интервал времени.
Но как я могу проверить, когда и как часто контракты должны выполняться в пределах выбранного фрейма?
Afaik это было бы возможно только путем перебора результата запроса и проверки, пересекается ли контрактс указанием сроков, а также обратите внимание, как часто и когда это происходит в течение этого времени.
Но я понятия не имею, как мне это сделать.
Пример данных:
[name, intervalType, startDate, endDate, amount]
rent, monthly, 2019-01-01, 2020-10-11, -500
utility, monthly, 2019-01-01, 2020-10-11, -150
salary, monthly, 2019-01-01, 2020-10-11, 1700
investment, biannually, 2019-02-10, null , 2500
food, weekly, 2019-01-01, null , -50
Если у меня есть временные рамки (2019-05-01 - 2019-05-31) этого месяца я получу эти контракты:
rent 2019-05-01
utility 2019-05-01
salary 2019-05-01
food 2019-05-01
food 2019-05-08
food 2019-05-15
food 2019-05-22
food 2019-05-29
Если бы я выбрал следующие 2 месяца (2019-07-01 - 2019-08-31), я получил бы это:
rent 2019-07-01
rent 2019-08-01
utility 2019-07-01
utility 2019-08-01
salary 2019-07-01
salary 2019-08-01
food 2019-07-01
food 2019-07-08
food 2019-07-15
food 2019-07-22
food 2019-07-29
food 2019-08-01
food 2019-08-08
food 2019-08-15
food 2019-08-22
food 2019-08-29
investment 2019-08-01
Возможно ли это с DateTime и DateInterval?