2018-07-14 18:23:41 +02:00
< ? php
namespace Grocy\Services ;
2020-09-01 19:59:40 +02:00
use LessQL\Result ;
2018-07-14 18:23:41 +02:00
class RecipesService extends BaseService
{
2021-07-10 12:32:29 +02:00
const RECIPE_TYPE_MEALPLAN_DAY = 'mealplan-day' ; // A recipe per meal plan day => name = YYYY-MM-DD
2018-08-11 11:48:25 +02:00
2021-07-10 12:32:29 +02:00
const RECIPE_TYPE_MEALPLAN_WEEK = 'mealplan-week' ; // A recipe per meal plan week => name = YYYY-WW (week number)
2018-07-14 18:23:41 +02:00
2021-07-10 12:32:29 +02:00
const RECIPE_TYPE_MEALPLAN_SHADOW = 'mealplan-shadow' ; // A recipe per meal plan recipe (for separated stock fulfillment checking) => name = YYYY-MM-DD#<meal_plan.id>
const RECIPE_TYPE_NORMAL = 'normal' ; // Normal / manually created recipes
2018-07-14 22:49:42 +02:00
2019-03-03 14:49:46 +01:00
public function AddNotFulfilledProductsToShoppingList ( $recipeId , $excludedProductIds = null )
2018-07-14 22:49:42 +02:00
{
2020-03-01 23:47:47 +07:00
$recipe = $this -> getDataBase () -> recipes ( $recipeId );
2019-03-05 23:45:04 +01:00
$recipePositions = $this -> GetRecipesPosResolved ();
2020-08-31 20:40:31 +02:00
2021-07-10 19:56:35 +02:00
if ( $excludedProductIds == null )
{
$excludedProductIds = [];
}
2018-07-14 22:49:42 +02:00
foreach ( $recipePositions as $recipePosition )
{
2020-08-31 20:40:31 +02:00
if ( $recipePosition -> recipe_id == $recipeId && ! in_array ( $recipePosition -> product_id , $excludedProductIds ))
2018-07-14 22:49:42 +02:00
{
2020-03-01 23:47:47 +07:00
$product = $this -> getDataBase () -> products ( $recipePosition -> product_id );
2020-11-13 17:30:57 +01:00
$toOrderAmount = round (( $recipePosition -> missing_amount - $recipePosition -> amount_on_shopping_list ), 2 );
2020-08-31 20:40:31 +02:00
2019-03-03 15:23:39 +01:00
if ( $recipe -> not_check_shoppinglist == 1 )
{
2020-11-13 17:30:57 +01:00
$toOrderAmount = round ( $recipePosition -> missing_amount , 2 );
2019-03-03 15:23:39 +01:00
}
2020-03-01 23:47:47 +07:00
2020-08-31 20:40:31 +02:00
if ( $toOrderAmount > 0 )
2018-07-14 22:49:42 +02:00
{
2021-07-06 20:19:50 +02:00
$note = $this -> getLocalizationService () -> __t ( 'Added for recipe %s' , $recipe -> name );
if ( ! empty ( $recipePosition -> note ))
{
$note .= " \n " . $recipePosition -> note ;
}
2020-08-31 20:40:31 +02:00
$shoppinglistRow = $this -> getDataBase () -> shopping_list () -> createRow ([
2018-07-14 22:49:42 +02:00
'product_id' => $recipePosition -> product_id ,
'amount' => $toOrderAmount ,
2021-07-06 20:19:50 +02:00
'note' => $note
2020-08-31 20:40:31 +02:00
]);
2018-07-14 22:49:42 +02:00
$shoppinglistRow -> save ();
}
}
}
}
2018-08-11 11:48:25 +02:00
public function ConsumeRecipe ( $recipeId )
{
if ( ! $this -> RecipeExists ( $recipeId ))
{
throw new \Exception ( 'Recipe does not exist' );
}
2020-01-27 22:14:11 +01:00
$transactionId = uniqid ();
2020-03-01 23:47:47 +07:00
$recipePositions = $this -> getDatabase () -> recipes_pos_resolved () -> where ( 'recipe_id' , $recipeId ) -> fetchAll ();
2020-08-31 20:40:31 +02:00
2018-08-11 11:48:25 +02:00
foreach ( $recipePositions as $recipePosition )
{
if ( $recipePosition -> only_check_single_unit_in_stock == 0 )
{
2020-10-14 17:48:37 +02:00
$this -> getStockService () -> ConsumeProduct ( $recipePosition -> product_id , $recipePosition -> recipe_amount , false , StockService :: TRANSACTION_TYPE_CONSUME , 'default' , $recipeId , null , $transactionId , true , true );
2018-08-11 11:48:25 +02:00
}
}
2020-01-21 20:45:34 +01:00
2020-03-01 23:47:47 +07:00
$recipeRow = $this -> getDatabase () -> recipes () -> where ( 'id = :1' , $recipeId ) -> fetch ();
2020-01-21 20:45:34 +01:00
if ( ! empty ( $recipeRow -> product_id ))
{
2020-03-01 23:47:47 +07:00
$recipeResolvedRow = $this -> getDatabase () -> recipes_resolved () -> where ( 'recipe_id = :1' , $recipeId ) -> fetch ();
2021-07-03 18:30:53 +02:00
$this -> getStockService () -> AddProduct ( $recipeRow -> product_id , floatval ( $recipeRow -> desired_servings ), null , StockService :: TRANSACTION_TYPE_SELF_PRODUCTION , date ( 'Y-m-d' ), floatval ( $recipeResolvedRow -> costs ), null , null , $dummyTransactionId , 0 , true );
2020-01-21 20:45:34 +01:00
}
2020-08-31 20:40:31 +02:00
}
public function GetRecipesPosResolved ()
{
$sql = 'SELECT * FROM recipes_pos_resolved' ;
return $this -> getDataBaseService () -> ExecuteDbQuery ( $sql ) -> fetchAll ( \PDO :: FETCH_OBJ );
}
2020-09-01 19:59:40 +02:00
public function GetRecipesResolved () : Result
2020-08-31 20:40:31 +02:00
{
2020-09-01 19:59:40 +02:00
return $this -> getDatabase () -> recipes_resolved ();
2020-08-31 20:40:31 +02:00
}
public function __construct ()
{
parent :: __construct ();
2018-08-11 11:48:25 +02:00
}
private function RecipeExists ( $recipeId )
{
2020-03-01 23:47:47 +07:00
$recipeRow = $this -> getDataBase () -> recipes () -> where ( 'id = :1' , $recipeId ) -> fetch ();
2018-08-11 11:48:25 +02:00
return $recipeRow !== null ;
}
2018-07-14 18:23:41 +02:00
}