2019-03-04 17:44:48 +01:00
< ? php
namespace Grocy\Services ;
2020-08-31 20:40:31 +02:00
use Grocy\Helpers\UrlManager ;
2019-03-04 17:44:48 +01:00
class CalendarService extends BaseService
{
2021-07-16 17:32:08 +02:00
public function __construct ()
{
$this -> UrlManager = new UrlManager ( GROCY_BASE_URL );
}
private $UrlManager ;
2019-03-04 17:44:48 +01:00
public function GetEvents ()
{
2023-11-04 14:11:02 +01:00
$usersService = $this -> getUsersService ();
2020-08-31 20:40:31 +02:00
$stockEvents = [];
2020-02-09 10:22:54 -06:00
if ( GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING )
2019-03-04 17:44:48 +01:00
{
2020-03-01 23:47:47 +07:00
$products = $this -> getDatabase () -> products ();
2020-11-15 19:53:44 +01:00
$titlePrefix = $this -> getLocalizationService () -> __t ( 'Product due' ) . ': ' ;
2020-08-31 20:40:31 +02:00
foreach ( $this -> getStockService () -> GetCurrentStock () as $currentStockEntry )
2019-03-04 17:44:48 +01:00
{
2020-02-09 10:22:54 -06:00
if ( $currentStockEntry -> amount > 0 )
{
2020-08-31 20:40:31 +02:00
$stockEvents [] = [
2020-02-09 10:22:54 -06:00
'title' => $titlePrefix . FindObjectInArrayByPropertyValue ( $products , 'id' , $currentStockEntry -> product_id ) -> name ,
'start' => $currentStockEntry -> best_before_date ,
2020-04-22 12:03:05 -04:00
'date_format' => 'date' ,
2023-11-04 14:11:02 +01:00
'link' => $this -> UrlManager -> ConstructUrl ( '/stockoverview' ),
'color' => $usersService -> GetUserSettings ( GROCY_USER_ID )[ 'calendar_color_products' ]
2020-08-31 20:40:31 +02:00
];
2020-02-09 10:22:54 -06:00
}
2019-03-04 17:44:48 +01:00
}
}
2020-08-31 20:40:31 +02:00
$taskEvents = [];
2020-02-09 10:22:54 -06:00
if ( GROCY_FEATURE_FLAG_TASKS )
2019-03-04 17:44:48 +01:00
{
2020-03-01 23:47:47 +07:00
$titlePrefix = $this -> getLocalizationService () -> __t ( 'Task due' ) . ': ' ;
2020-08-31 20:40:31 +02:00
foreach ( $this -> getTasksService () -> GetCurrent () as $currentTaskEntry )
2020-02-09 10:22:54 -06:00
{
2020-08-31 20:40:31 +02:00
$taskEvents [] = [
2020-02-09 10:22:54 -06:00
'title' => $titlePrefix . $currentTaskEntry -> name ,
'start' => $currentTaskEntry -> due_date ,
2020-04-22 12:03:05 -04:00
'date_format' => 'date' ,
2023-11-04 14:11:02 +01:00
'link' => $this -> UrlManager -> ConstructUrl ( '/tasks' ),
'color' => $usersService -> GetUserSettings ( GROCY_USER_ID )[ 'calendar_color_tasks' ]
2020-08-31 20:40:31 +02:00
];
2020-02-09 10:22:54 -06:00
}
2019-03-04 17:44:48 +01:00
}
2020-08-31 20:40:31 +02:00
$choreEvents = [];
2020-02-09 10:22:54 -06:00
if ( GROCY_FEATURE_FLAG_CHORES )
2019-03-04 17:44:48 +01:00
{
2020-03-01 23:47:47 +07:00
$users = $this -> getUsersService () -> GetUsersAsDto ();
2020-12-20 10:19:44 +01:00
$chores = $this -> getDatabase () -> chores () -> where ( 'active = 1' );
2020-03-01 23:47:47 +07:00
$titlePrefix = $this -> getLocalizationService () -> __t ( 'Chore due' ) . ': ' ;
2020-08-31 20:40:31 +02:00
foreach ( $this -> getChoresService () -> GetCurrent () as $currentChoreEntry )
2019-09-17 16:28:11 +02:00
{
2020-02-09 10:22:54 -06:00
$chore = FindObjectInArrayByPropertyValue ( $chores , 'id' , $currentChoreEntry -> chore_id );
$assignedToText = '' ;
if ( ! empty ( $currentChoreEntry -> next_execution_assigned_to_user_id ))
{
2020-03-01 23:47:47 +07:00
$assignedToText = ' (' . $this -> getLocalizationService () -> __t ( 'assigned to %s' , FindObjectInArrayByPropertyValue ( $users , 'id' , $currentChoreEntry -> next_execution_assigned_to_user_id ) -> display_name ) . ')' ;
2020-02-09 10:22:54 -06:00
}
2019-09-17 16:28:11 +02:00
2020-08-31 20:40:31 +02:00
$choreEvents [] = [
2020-02-09 10:22:54 -06:00
'title' => $titlePrefix . $chore -> name . $assignedToText ,
'start' => $currentChoreEntry -> next_estimated_execution_time ,
2020-04-22 12:03:05 -04:00
'date_format' => 'datetime' ,
2020-08-24 18:27:40 +02:00
'link' => $this -> UrlManager -> ConstructUrl ( '/choresoverview' ),
2023-11-04 14:11:02 +01:00
'allDay' => $chore -> track_date_only == 1 ,
'color' => $usersService -> GetUserSettings ( GROCY_USER_ID )[ 'calendar_color_chores' ]
2020-08-31 20:40:31 +02:00
];
2020-02-09 10:22:54 -06:00
}
2019-03-04 17:44:48 +01:00
}
2020-08-31 20:40:31 +02:00
$batteryEvents = [];
2020-02-09 10:22:54 -06:00
if ( GROCY_FEATURE_FLAG_BATTERIES )
2019-03-04 17:44:48 +01:00
{
2020-12-20 10:19:44 +01:00
$batteries = $this -> getDatabase () -> batteries () -> where ( 'active = 1' );
2020-03-01 23:47:47 +07:00
$titlePrefix = $this -> getLocalizationService () -> __t ( 'Battery charge cycle due' ) . ': ' ;
2020-08-31 20:40:31 +02:00
foreach ( $this -> getBatteriesService () -> GetCurrent () as $currentBatteryEntry )
2020-02-09 10:22:54 -06:00
{
2020-08-31 20:40:31 +02:00
$batteryEvents [] = [
2020-02-09 10:22:54 -06:00
'title' => $titlePrefix . FindObjectInArrayByPropertyValue ( $batteries , 'id' , $currentBatteryEntry -> battery_id ) -> name ,
'start' => $currentBatteryEntry -> next_estimated_charge_time ,
2020-04-22 12:03:05 -04:00
'date_format' => 'datetime' ,
2023-11-04 14:11:02 +01:00
'link' => $this -> UrlManager -> ConstructUrl ( '/batteriesoverview' ),
'color' => $usersService -> GetUserSettings ( GROCY_USER_ID )[ 'calendar_color_batteries' ]
2020-08-31 20:40:31 +02:00
];
2020-02-09 10:22:54 -06:00
}
2019-03-04 17:44:48 +01:00
}
2020-08-31 20:40:31 +02:00
$mealPlanRecipeEvents = [];
2020-09-14 11:15:11 +02:00
$mealPlanNotesEvents = [];
$mealPlanProductEvents = [];
2023-11-04 14:11:02 +01:00
if ( GROCY_FEATURE_FLAG_RECIPES_MEALPLAN )
2019-09-24 09:40:56 +02:00
{
2022-02-08 18:08:26 +01:00
$mealPlanSections = $this -> getDatabase () -> meal_plan_sections ();
2020-02-09 17:27:46 +01:00
2022-02-08 18:08:26 +01:00
$recipes = $this -> getDatabase () -> recipes () -> where ( 'type' , 'normal' );
$mealPlanDayRecipes = $this -> getDatabase () -> meal_plan () -> where ( 'type' , 'recipe' );
$titlePrefix = $this -> getLocalizationService () -> __t ( 'Meal plan recipe' ) . ': ' ;
2020-08-31 20:40:31 +02:00
foreach ( $mealPlanDayRecipes as $mealPlanDayRecipe )
2019-09-24 09:40:56 +02:00
{
2022-02-08 18:08:26 +01:00
$start = $mealPlanDayRecipe -> day ;
$dateFormat = 'date' ;
$section = FindObjectInArrayByPropertyValue ( $mealPlanSections , 'id' , $mealPlanDayRecipe -> section_id );
if ( ! empty ( $section -> time_info ))
{
$start = $mealPlanDayRecipe -> day . ' ' . $section -> time_info . ':00' ;
$dateFormat = 'datetime' ;
}
2020-08-31 20:40:31 +02:00
2022-02-08 18:08:26 +01:00
$titlePrefix2 = '' ;
if ( ! empty ( $section -> name ))
2020-02-09 17:27:46 +01:00
{
2022-02-08 18:08:26 +01:00
$titlePrefix2 = $section -> name . ': ' ;
2020-02-09 17:27:46 +01:00
}
2022-02-08 18:08:26 +01:00
$mealPlanRecipeEvents [] = [
'title' => $titlePrefix . $titlePrefix2 . FindObjectInArrayByPropertyValue ( $recipes , 'id' , $mealPlanDayRecipe -> recipe_id ) -> name ,
'start' => $start ,
'date_format' => $dateFormat ,
'description' => $this -> UrlManager -> ConstructUrl ( '/mealplan' . '?week=' . $mealPlanDayRecipe -> day ),
2023-11-04 14:11:02 +01:00
'link' => $this -> UrlManager -> ConstructUrl ( '/recipes' . '?recipe=' . $mealPlanDayRecipe -> recipe_id . '#fullscreen' ),
'color' => $usersService -> GetUserSettings ( GROCY_USER_ID )[ 'calendar_color_meal_plan' ]
2022-02-08 18:08:26 +01:00
];
2019-09-24 09:40:56 +02:00
}
2020-03-01 23:47:47 +07:00
$mealPlanDayNotes = $this -> getDatabase () -> meal_plan () -> where ( 'type' , 'note' );
$titlePrefix = $this -> getLocalizationService () -> __t ( 'Meal plan note' ) . ': ' ;
2020-08-31 20:40:31 +02:00
foreach ( $mealPlanDayNotes as $mealPlanDayNote )
2020-02-09 17:27:46 +01:00
{
2022-02-08 18:08:26 +01:00
$start = $mealPlanDayNote -> day ;
$dateFormat = 'date' ;
$section = FindObjectInArrayByPropertyValue ( $mealPlanSections , 'id' , $mealPlanDayNote -> section_id );
if ( ! empty ( $section -> time_info ))
{
$start = $mealPlanDayNote -> day . ' ' . $section -> time_info . ':00' ;
$dateFormat = 'datetime' ;
}
2022-02-08 19:09:17 +01:00
$titlePrefix2 = '' ;
if ( ! empty ( $section -> name ))
{
$titlePrefix2 = $section -> name . ': ' ;
}
2020-08-31 20:40:31 +02:00
$mealPlanNotesEvents [] = [
2022-02-08 19:09:17 +01:00
'title' => $titlePrefix . $titlePrefix2 . $mealPlanDayNote -> note ,
2022-02-08 18:08:26 +01:00
'start' => $start ,
2022-05-23 22:28:45 +02:00
'date_format' => $dateFormat ,
2023-11-04 14:18:51 +01:00
'link' => $this -> UrlManager -> ConstructUrl ( '/mealplan' . '?start=' . $start ),
'color' => $usersService -> GetUserSettings ( GROCY_USER_ID )[ 'calendar_color_meal_plan' ]
2020-08-31 20:40:31 +02:00
];
2020-02-09 17:27:46 +01:00
}
2020-01-26 01:50:44 -06:00
2020-03-01 23:47:47 +07:00
$products = $this -> getDatabase () -> products ();
$mealPlanDayProducts = $this -> getDatabase () -> meal_plan () -> where ( 'type' , 'product' );
$titlePrefix = $this -> getLocalizationService () -> __t ( 'Meal plan product' ) . ': ' ;
2020-08-31 20:40:31 +02:00
foreach ( $mealPlanDayProducts as $mealPlanDayProduct )
2020-02-09 17:27:46 +01:00
{
2022-02-08 18:08:26 +01:00
$start = $mealPlanDayProduct -> day ;
$dateFormat = 'date' ;
$section = FindObjectInArrayByPropertyValue ( $mealPlanSections , 'id' , $mealPlanDayProduct -> section_id );
if ( ! empty ( $section -> time_info ))
{
$start = $mealPlanDayProduct -> day . ' ' . $section -> time_info . ':00' ;
$dateFormat = 'datetime' ;
}
2022-02-08 19:09:17 +01:00
$titlePrefix2 = '' ;
if ( ! empty ( $section -> name ))
{
$titlePrefix2 = $section -> name . ': ' ;
}
2020-08-31 20:40:31 +02:00
$mealPlanProductEvents [] = [
2022-02-08 19:09:17 +01:00
'title' => $titlePrefix . $titlePrefix2 . FindObjectInArrayByPropertyValue ( $products , 'id' , $mealPlanDayProduct -> product_id ) -> name ,
2022-02-08 18:08:26 +01:00
'start' => $start ,
2022-05-23 22:28:45 +02:00
'date_format' => $dateFormat ,
2023-11-04 14:18:51 +01:00
'link' => $this -> UrlManager -> ConstructUrl ( '/mealplan' . '?start=' . $start ),
'color' => $usersService -> GetUserSettings ( GROCY_USER_ID )[ 'calendar_color_meal_plan' ]
2020-08-31 20:40:31 +02:00
];
2020-02-09 17:27:46 +01:00
}
2020-01-26 01:50:44 -06:00
}
return array_merge ( $stockEvents , $taskEvents , $choreEvents , $batteryEvents , $mealPlanRecipeEvents , $mealPlanNotesEvents , $mealPlanProductEvents );
2019-03-04 17:44:48 +01:00
}
}