mirror of
				https://github.com/grocy/grocy.git
				synced 2025-10-31 10:46:36 +00:00 
			
		
		
		
	Compare commits
	
		
			67 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | c2b675eb06 | ||
|  | e552f4b730 | ||
|  | 12f6296c75 | ||
|  | 3842f05ce9 | ||
|  | 4d21668265 | ||
|  | 693dcc1020 | ||
|  | f5562602f0 | ||
|  | 86aa8f19f7 | ||
|  | 43ba3b4920 | ||
|  | 6070507b04 | ||
|  | fc413a05d1 | ||
|  | 89b87156de | ||
|  | a7f3f64d89 | ||
|  | 10bd5ce900 | ||
|  | a6ffe8480a | ||
|  | 2a2335c8f4 | ||
|  | 4338ccc132 | ||
|  | f2bef554a4 | ||
|  | ab53a157e4 | ||
|  | beae32ef23 | ||
|  | 787c885ccf | ||
|  | 286351b6d2 | ||
|  | 29371163ad | ||
|  | 3f88b8dfa2 | ||
|  | 1c161b2b29 | ||
|  | 5ea8ec2dda | ||
|  | eb8c9848eb | ||
|  | 2b97ac7c1c | ||
|  | 3c656ba618 | ||
|  | edddfe234c | ||
|  | 8105dea17f | ||
|  | dc1954cb05 | ||
|  | ea63246a12 | ||
|  | 196bdbe246 | ||
|  | 01ddeb4dfd | ||
|  | 282168f92c | ||
|  | 3c74d92eb0 | ||
|  | fe622cacb2 | ||
|  | 5ddb438134 | ||
|  | 35469c3d98 | ||
|  | b32a26cf7e | ||
|  | bed7965989 | ||
|  | 19ff782c00 | ||
|  | cebb368a28 | ||
|  | 038917b030 | ||
|  | 04d826943c | ||
|  | e0735ce2e4 | ||
|  | 849c281912 | ||
|  | c06bb7784a | ||
|  | b9fff4954a | ||
|  | 7aa9e5748e | ||
|  | 6175afa6be | ||
|  | 5563e7ed4c | ||
|  | 305f846dbf | ||
|  | 3f850c540b | ||
|  | 2c3af45f5c | ||
|  | 230901a28a | ||
|  | 30e1a5c9b0 | ||
|  | 616e1dd5d7 | ||
|  | a323bca9ec | ||
|  | 14bb04d285 | ||
|  | edd372f8c4 | ||
|  | b4a7642af5 | ||
|  | 580f49e69f | ||
|  | 22db124624 | ||
|  | e88294eb40 | ||
|  | ae3bacf8fe | 
							
								
								
									
										27
									
								
								.devtools/data_generation_scripts/9999_big_stock.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								.devtools/data_generation_scripts/9999_big_stock.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| <?php | ||||
|  | ||||
| // This is executed inside DatabaseMigrationService class/context | ||||
|  | ||||
| use Grocy\Services\StockService; | ||||
|  | ||||
| $PRODUCTS = [3, 4, 5, 6, 7, 8]; | ||||
|  | ||||
| $i = 1; | ||||
| $days = -1; | ||||
| while ($i <= 500) | ||||
| { | ||||
| 	$productId = $PRODUCTS[array_rand($PRODUCTS)]; | ||||
| 	$transactionId1 = $this->getStockService()->AddProduct($productId, 1, date('Y-m-d', strtotime('+180 days')), StockService::TRANSACTION_TYPE_PURCHASE, date('Y-m-d', strtotime("$days days")), XRandomPrice()); | ||||
| 	$transactionId2 = $this->getStockService()->ConsumeProduct($productId, 1, false, StockService::TRANSACTION_TYPE_CONSUME); | ||||
|  | ||||
| 	$this->getDatabaseService()->ExecuteDbStatement("UPDATE stock_log SET row_created_timestamp = DATETIME(row_created_timestamp, '$days days') WHERE transaction_id = '$transactionId1'"); | ||||
| 	$this->getDatabaseService()->ExecuteDbStatement("UPDATE stock_log SET row_created_timestamp = DATETIME(row_created_timestamp, '$days days') WHERE transaction_id = '$transactionId2'"); | ||||
|  | ||||
| 	$days--; | ||||
| 	$i++; | ||||
| } | ||||
|  | ||||
| function XRandomPrice() | ||||
| { | ||||
| 	return mt_rand(2 * 100, 25 * 100) / 100 / 4; | ||||
| } | ||||
							
								
								
									
										16
									
								
								.devtools/data_generation_scripts/9999_lots_recipes.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								.devtools/data_generation_scripts/9999_lots_recipes.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| <?php | ||||
|  | ||||
| // This is executed inside DatabaseMigrationService class/context | ||||
|  | ||||
| use Grocy\Services\RecipesService; | ||||
|  | ||||
| $recipesService = RecipesService::getInstance(); | ||||
|  | ||||
| for ($i = 1; $i <= 87; $i++) | ||||
| { | ||||
| 	$recipesService->CopyRecipe(1); | ||||
| 	$recipesService->CopyRecipe(2); | ||||
| 	$recipesService->CopyRecipe(3); | ||||
| 	$recipesService->CopyRecipe(4); | ||||
| 	$recipesService->CopyRecipe(5); | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								.devtools/data_generation_scripts/big_meal_plan.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.devtools/data_generation_scripts/big_meal_plan.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1,5 +1,5 @@ | ||||
| --- | ||||
| name: Bug report | ||||
| name: Bug Report | ||||
| about: If you've found something that does not work, please report it to help improve | ||||
|   grocy | ||||
| title: 'Bug: ' | ||||
| @@ -11,3 +11,5 @@ assignees: '' | ||||
| Please describe the bug as detailed as possible, provide the steps how to reproduce it and maybe attach screenshots where useful. | ||||
| 
 | ||||
| Please also check if your bug was maybe already fixed by searching closed issues here or by trying to reproduce your problem on the [pre-release demo](https://demo-prerelease.grocy.info/) (use a *private demo instance* if you want to make your example persistent). | ||||
| 
 | ||||
| If your problem is not reproducible, it's most likely not a bug - please use the [r/grocy subreddit](https://www.reddit.com/r/grocy) for general questions / help. | ||||
| @@ -1,8 +1,8 @@ | ||||
| --- | ||||
| name: Feature request | ||||
| name: Feature Request | ||||
| about: Ideas for improvements or new things which you would find useful are always | ||||
|   welcome | ||||
| title: 'Feature request: ' | ||||
| title: 'Feature Request: ' | ||||
| labels: enhancement | ||||
| assignees: '' | ||||
| 
 | ||||
							
								
								
									
										6
									
								
								.github/SECURITY.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.github/SECURITY.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| grocy is not an enterprise application and neither one you (should) host publicly (means without authentication) on the internet. | ||||
|  | ||||
| So unless something really bad can be abused _unauthenticated_, | ||||
| please just open a regular issue on the [GitHub issue tracker](https://github.com/grocy/grocy/issues/new/choose). | ||||
|  | ||||
| You can also contact me directly, please see [berrnd.de](https://berrnd.de) for any contact information. | ||||
| @@ -37,9 +37,8 @@ grocy is technically a pretty simple PHP application, so the basic notes to get | ||||
| - The webserver root should point to the `public` directory | ||||
| - Include `try_files $uri /index.php$is_args$query_string;` in your location block if you use nginx | ||||
|   - Or disable URL rewriting (see the option `DISABLE_URL_REWRITING` in `data/config.php`) | ||||
| - Based on user reports, the minmimum required/working runtime is PHP 7.2 with SQLite 3.9.0 | ||||
|   - However, I don't really care about supporting old runtime stuff, currently everything is only tested against (means 100 % works with) PHP 8.0 with SQLite 3.27.2 | ||||
| - → Default login is user `admin` with password `admin`, please change the password immediately (user menu at the top right corner) | ||||
| - _Currently everything is only tested against (means 100 % works with) PHP 8.0 with SQLite 3.27.2_ | ||||
|  | ||||
| Alternatively clone this repository (the `release` branch always references the latest released version, or checkout the latest tagged revision) and install Composer and Yarn dependencies manually. | ||||
|  | ||||
| @@ -58,7 +57,7 @@ If you run grocy on Linux, there is also `update.sh` (remember to make the scrip | ||||
| ## Localization | ||||
| grocy is fully localizable - the default language is English (integrated into code), a German localization is always maintained by me. | ||||
|  | ||||
| You can easily help translating grocy on [Transfifex](https://www.transifex.com/grocy/grocy/dashboard/) if your language is incomplete or not available yet. | ||||
| You can easily help translating grocy on [Transifex](https://www.transifex.com/grocy/grocy/dashboard/) if your language is incomplete or not available yet. | ||||
|  | ||||
| The default language can be set in `data/config.php`, e. g. `Setting('DEFAULT_LOCALE', 'it');` and there is also a user setting (see the user settings page) to set a different language per user. | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| - Fixed that the "X products are already expired" count on the stock overview page was wrong | ||||
| - Fixed that after product actions (consume/purchase/etc.) on the stock overview page the highlighting of the row was maybe wrong | ||||
| - After product actions (consume/purchase/etc.) on the stock overview page on a sub product, now also the parent product (row) is refreshed | ||||
| - It's now possible to accumulate min. stock amounts on parent product level (new option per product, means the sub product will never be "missing" then, only the parent product) | ||||
| - It's now possible to accumulate min. stock amounts on parent product level (new option per product, means the sub product will never be missing then, only the parent product) | ||||
| - On the purchase page there is now an option to select that the price is the total price (for the whole amount) - below the price field, defaults to "Unit price" (as it was until now), when set to "Total price", the entered price will be divided by the amount before posting | ||||
| - "Average shelf life" on the product card now displays just "Unlimited" when the resulting value would be > 200 years (for products which never expire, as they have a best before date of 2999-12-31) | ||||
|  | ||||
|   | ||||
| @@ -113,7 +113,7 @@ | ||||
| - Fixed that the "Manage users" and "Manage API keys" menu was not shown when using reverse proxy authentication | ||||
|  | ||||
| ### API improvements/fixes | ||||
| > ❗ Numbers are now returned as numbers (so technically without quotes around them, were strings for nearly all endpoints before - should practically be no real difference) | ||||
| > ~~❗ Numbers are now returned as numbers (so technically without quotes around them, were strings for nearly all endpoints before - should practically be no real difference)~~ | ||||
| > | ||||
| > => ❗❗❗ This has been reverted after this (v3.1.0) release since it had unintended side effects | ||||
| - Added a new endpoint `/system/localization-strings` to get the localization strings (gettext JSON representation; in the by the user desired language) | ||||
|   | ||||
| @@ -9,8 +9,8 @@ | ||||
|  | ||||
| ### API | ||||
| > ❗ The release before (v3.1.0) introduced that "numbers are now returned as numbers": **This was reverted** since it had unintended side effects (so all fields are technically strings now again, just like before - sorry for that) | ||||
| - Fixed that `missing_products` of the `/stock/volatile` endpoint also contained incactive products | ||||
| - Fixed that `missing_products` of the `/stock/volatile` endpoint also contained inactive products | ||||
| - Fixed that when having multiple Userfields for an entity, the `/objects/{entity}` endpoint returned wrong Userfield values | ||||
| - Fixed that the `/stock/products/by-barcode/{barcode}/consume` and `/stock/products/by-barcode/{barcode}/transfer` endpoint haven't used the stock entry given by a stock entry grocycode (thanks @lowlee for the initial work on this) | ||||
| - Fixed that the `/stock/products/by-barcode/{barcode}/consume` and `/stock/products/by-barcode/{barcode}/transfer` endpoints haven't used the stock entry given by a stock entry grocycode (thanks @lowlee for the initial work on this) | ||||
| - Fixed that the "Stock by-barcode" API routes were broken for normal barcodes (only grocycodes were accepted) (thanks @larsverp) | ||||
| - Fixed that the "Stock by-barcode" API routes also accepted chore or battery grocycodes (thanks @lowlee) | ||||
|   | ||||
							
								
								
									
										12
									
								
								changelog/64_3.1.2_2021-09-27.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								changelog/64_3.1.2_2021-09-27.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| - Fixed that the "Add all list items to stock" shopping list workflow did not work for more than ~6 items (thanks @tjhowse) | ||||
| - Fixed that plural form handling (e.g. for quantity units) was wrong for negative numbers | ||||
| - Fixed that the context menu entries `Consume` and `Transfer` on the stock overview page were disabled when the amount in stock was < 1 | ||||
| - Fixed that on consuming a product from not the products default location, the products default location was recorded in the stock journal | ||||
| - Fixed that when undoing a stock consume transaction from not the products default location, the corresponding amount was always added back to to the products defaullt location | ||||
| - Fixed that when having multiple quantity unit conversions for a products default QU purchase, on purchase was potentially a wrong conversion factor picked | ||||
| - Fixed that when there was any chore with a schedule, but without a "next estimated tracking" date/time, the iCal export was broken | ||||
| - The product and chore edit pages now have bottom-sticky save buttons | ||||
| - A product picture can now be added when creating a product (was currently only possible when editing a product) | ||||
|  | ||||
| ### API | ||||
| - Fixed that international characters and spaces were not allowed in API query filters | ||||
							
								
								
									
										19
									
								
								changelog/65_3.1.3_2021-11-14.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								changelog/65_3.1.3_2021-11-14.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| - The "Below min. stock amount" filter on the stock overview page now also includes due-soon, overdue or already expired products | ||||
| - The default shopping list (named "Shopping list"; localized) can now be renamed | ||||
| - Added the products average price as a (hidden by default) column on the stock overview page | ||||
| - Added a new "Presets for new products" stock setting for the "Default due days" option of new products | ||||
| - When adding (purchase) a product with "Default due days after freezing" set directly to a freezer location, the due date is now prefilled by that (instead of the normal "Default due days") (thanks @grahamc for the initial work on this) | ||||
| - Chores can now be merged (new item in the context-/more-menu on the chores list page) | ||||
| - Fixed that "Label per unit" stock entry labels (on purchase) weren't unique per unit | ||||
| - Fixed that the "Add as new product" productpicker workflow, started from the shopping list item form, always selected the default shopping list after finishing the flow | ||||
| - Fixed that when undoing a product opened transaction and when the product has "Default due days after opened" set, the original due date wasn't restored | ||||
| - Fixed that "Track date only"-chores were shown as overdue on the due day on the chores overview page | ||||
| - Fixed that dropdown filters for tables maybe did not work after reordering columns | ||||
| - Fixed that auto night mode over midnight did not always work | ||||
| - Fixed that the labels of context-/more-menu items were not readable in Night Mode (thanks @corbolais) | ||||
| - Fixed that the "Stay logged in permanently" checkbox on the login page had no effect (thanks @0) | ||||
|  | ||||
| ### API | ||||
| - New endpoint `/chores/{choreIdToKeep}/merge/{choreIdToRemove}` for merging chores | ||||
| - Endpoint `/stock/products/{productId}/add` API endpoint`: The (optional) request body parameter `print_stock_label` was renamed to `stock_label_type` | ||||
| - Fixed that backslashes were not allowed in API query filters | ||||
							
								
								
									
										483
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										483
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -146,6 +146,7 @@ DefaultUserSetting('keep_screen_on_when_fullscreen_card', false); // Keep the sc | ||||
| DefaultUserSetting('product_presets_location_id', -1); // Default location id for new products (-1 means no location is preset) | ||||
| DefaultUserSetting('product_presets_product_group_id', -1); // Default product group id for new products (-1 means no product group is preset) | ||||
| DefaultUserSetting('product_presets_qu_id', -1); // Default quantity unit id for new products (-1 means no quantity unit is preset) | ||||
| DefaultUserSetting('product_presets_default_due_days', 0); // Default due days for new products (-1 means that the product will be never overdue) | ||||
| DefaultUserSetting('stock_decimal_places_amounts', 4); // Default decimal places allowed for amounts | ||||
| DefaultUserSetting('stock_decimal_places_prices', 2); // Default decimal places allowed for prices | ||||
| DefaultUserSetting('stock_auto_decimal_separator_prices', false); | ||||
|   | ||||
| @@ -10,7 +10,7 @@ class BaseApiController extends BaseController | ||||
|  | ||||
| 	const PATTERN_OPERATOR = '!?(=|~|<|>|(>=)|(<=)|(§))'; | ||||
|  | ||||
| 	const PATTERN_VALUE = '[A-Za-z\x{0400}-\x{04FF}_0-9.$#^|-]+'; | ||||
| 	const PATTERN_VALUE = '[A-Za-z\p{L}\p{M}0-9*_.$#^| -\\\]+'; | ||||
|  | ||||
| 	protected $OpenApiSpec = null; | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,7 @@ namespace Grocy\Controllers; | ||||
|  | ||||
| use Eluceo\iCal\Domain\Entity\Calendar; | ||||
| use Eluceo\iCal\Domain\Entity\Event; | ||||
| use Eluceo\iCal\Domain\Entity\TimeZone; | ||||
| use Eluceo\iCal\Domain\ValueObject\Date; | ||||
| use Eluceo\iCal\Domain\ValueObject\DateTime; | ||||
| use Eluceo\iCal\Domain\ValueObject\SingleDay; | ||||
| @@ -17,10 +18,19 @@ class CalendarApiController extends BaseApiController | ||||
| 		try | ||||
| 		{ | ||||
| 			$events = $this->getCalendarService()->GetEvents(); | ||||
| 			$minDate = null; | ||||
| 			$maxDate = null; | ||||
|  | ||||
| 			$vCalendar = new Calendar(); | ||||
| 			$vCalendar->setProductIdentifier('grocy'); | ||||
|  | ||||
| 			foreach ($events as $event) | ||||
| 			{ | ||||
| 				if (!isset($event['start'])) | ||||
| 				{ | ||||
| 					continue; | ||||
| 				} | ||||
|  | ||||
| 				$description = ''; | ||||
| 				if (isset($event['description'])) | ||||
| 				{ | ||||
| @@ -32,13 +42,17 @@ class CalendarApiController extends BaseApiController | ||||
| 					// All-day event | ||||
| 					$date = new Date(\DateTimeImmutable::createFromFormat('Y-m-d', substr($event['start'], 0, 10))); | ||||
| 					$vEventOccurrence = new SingleDay($date); | ||||
|  | ||||
| 					$compareDate = \DateTimeImmutable::createFromFormat('Y-m-d', substr($event['start'], 0, 10)); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					// Time-point event | ||||
| 					$start = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), false); | ||||
| 					$end = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), false); | ||||
| 					$start = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), true); | ||||
| 					$end = new DateTime(\DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']), true); | ||||
| 					$vEventOccurrence = new TimeSpan($start, $end); | ||||
|  | ||||
| 					$compareDate = \DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $event['start']); | ||||
| 				} | ||||
|  | ||||
| 				$vEvent = new Event(); | ||||
| @@ -47,6 +61,20 @@ class CalendarApiController extends BaseApiController | ||||
| 					->setDescription($description); | ||||
|  | ||||
| 				$vCalendar->addEvent($vEvent); | ||||
|  | ||||
| 				if ($minDate == null || $compareDate < $minDate) | ||||
| 				{ | ||||
| 					$minDate = $compareDate; | ||||
| 				} | ||||
| 				if ($maxDate == null || $compareDate > $maxDate) | ||||
| 				{ | ||||
| 					$maxDate = $compareDate; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if ($minDate != null && $maxDate != null) | ||||
| 			{ | ||||
| 				$vCalendar->addTimeZone(TimeZone::createFromPhpDateTimeZone(new \DateTimeZone(date_default_timezone_get()), $minDate, $maxDate)); | ||||
| 			} | ||||
|  | ||||
| 			$response->write((new CalendarFactory())->createCalendar($vCalendar)); | ||||
|   | ||||
| @@ -131,4 +131,24 @@ class ChoresApiController extends BaseApiController | ||||
| 			return $this->GenericErrorResponse($response, $ex->getMessage()); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	public function MergeChores(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args) | ||||
| 	{ | ||||
| 		User::checkPermission($request, User::PERMISSION_MASTER_DATA_EDIT); | ||||
|  | ||||
| 		try | ||||
| 		{ | ||||
| 			if (filter_var($args['choreIdToKeep'], FILTER_VALIDATE_INT) === false || filter_var($args['choreIdToRemove'], FILTER_VALIDATE_INT) === false) | ||||
| 			{ | ||||
| 				throw new \Exception('Provided {choreIdToKeep} or {choreIdToRemove} is not a valid integer'); | ||||
| 			} | ||||
|  | ||||
| 			$this->ApiResponse($response, $this->getChoresService()->MergeChores($args['choreIdToKeep'], $args['choreIdToRemove'])); | ||||
| 			return $this->EmptyApiResponse($response); | ||||
| 		} | ||||
| 		catch (\Exception $ex) | ||||
| 		{ | ||||
| 			return $this->GenericErrorResponse($response, $ex->getMessage()); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -77,7 +77,8 @@ class ExceptionController extends BaseApiController | ||||
| 		} | ||||
|  | ||||
| 		return $this->renderPage($response->withStatus(500), 'errors/500', [ | ||||
| 			'exception' => $exception | ||||
| 			'exception' => $exception, | ||||
| 			'system_info' => $this->getApplicationService()->GetSystemInfo() | ||||
| 		]); | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -140,13 +140,14 @@ class StockApiController extends BaseApiController | ||||
| 			{ | ||||
| 				$transactionType = $requestBody['transactiontype']; | ||||
| 			} | ||||
| 			$runPrinterWebhook = false; | ||||
| 			if (array_key_exists('print_stock_label', $requestBody) && intval($requestBody['print_stock_label'])) | ||||
|  | ||||
| 			$stockLabelType = 0; | ||||
| 			if (array_key_exists('stock_label_type', $requestBody) && is_numeric($requestBody['stock_label_type'])) | ||||
| 			{ | ||||
| 				$runPrinterWebhook = intval($requestBody['print_stock_label']); | ||||
| 				$stockLabelType = intval($requestBody['stock_label_type']); | ||||
| 			} | ||||
|  | ||||
| 			$transactionId = $this->getStockService()->AddProduct($args['productId'], $requestBody['amount'], $bestBeforeDate, $transactionType, $purchasedDate, $price, $locationId, $shoppingLocationId, $unusedTransactionId, $runPrinterWebhook); | ||||
| 			$transactionId = $this->getStockService()->AddProduct($args['productId'], $requestBody['amount'], $bestBeforeDate, $transactionType, $purchasedDate, $price, $locationId, $shoppingLocationId, $unusedTransactionId, $stockLabelType); | ||||
|  | ||||
| 			$args['transactionId'] = $transactionId; | ||||
| 			return $this->StockTransactions($request, $response, $args); | ||||
|   | ||||
| @@ -60,7 +60,7 @@ | ||||
| 	"paths": { | ||||
| 		"/system/info": { | ||||
| 			"get": { | ||||
| 				"summary": "Returns information about the installed grocy, PHP and SQLite version", | ||||
| 				"summary": "Returns information about the installed grocy version, PHP runtime and OS", | ||||
| 				"tags": [ | ||||
| 					"System" | ||||
| 				], | ||||
| @@ -1917,9 +1917,10 @@ | ||||
| 										"format": "integer", | ||||
| 										"description": "If omitted, no store will be affected" | ||||
| 									}, | ||||
| 									"print_stock_label": { | ||||
| 										"type": "boolean", | ||||
| 										"description": "True when the stock entry label should be printed" | ||||
| 									"stock_label_type": { | ||||
| 										"type": "number", | ||||
| 										"format": "integer", | ||||
| 										"description": "`1` = No label, `2` = Single label, `3` = Label per unit" | ||||
| 									} | ||||
| 								}, | ||||
| 								"example": { | ||||
| @@ -3778,6 +3779,49 @@ | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"/chores/{choreIdToKeep}/merge/{choreIdToRemove}": { | ||||
| 			"post": { | ||||
| 				"summary": "Merges two chores into one", | ||||
| 				"tags": [ | ||||
| 					"Chores" | ||||
| 				], | ||||
| 				"parameters": [ | ||||
| 					{ | ||||
| 						"in": "path", | ||||
| 						"name": "choreIdToKeep", | ||||
| 						"required": true, | ||||
| 						"description": "A valid chore id of the chore to keep", | ||||
| 						"schema": { | ||||
| 							"type": "integer" | ||||
| 						} | ||||
| 					}, | ||||
| 					{ | ||||
| 						"in": "path", | ||||
| 						"name": "choreIdToRemove", | ||||
| 						"required": true, | ||||
| 						"description": "A valid chore id of the chore to remove", | ||||
| 						"schema": { | ||||
| 							"type": "integer" | ||||
| 						} | ||||
| 					} | ||||
| 				], | ||||
| 				"responses": { | ||||
| 					"204": { | ||||
| 						"description": "The operation was successful" | ||||
| 					}, | ||||
| 					"400": { | ||||
| 						"description": "The operation was not successful (possible errors are: Invalid chore id)", | ||||
| 						"content": { | ||||
| 							"application/json": { | ||||
| 								"schema": { | ||||
| 									"$ref": "#/components/schemas/Error400" | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"/batteries": { | ||||
| 			"get": { | ||||
| 				"summary": "Returns all batteries incl. the next estimated charge time per battery", | ||||
| @@ -5120,7 +5164,7 @@ | ||||
| 					}, | ||||
| 					"used_date": { | ||||
| 						"type": "string", | ||||
| 						"format": "date-time" | ||||
| 						"format": "date" | ||||
| 					}, | ||||
| 					"spoiled": { | ||||
| 						"type": "boolean", | ||||
|   | ||||
| @@ -4,7 +4,7 @@ class ERequirementNotMet extends Exception | ||||
| { | ||||
| } | ||||
|  | ||||
| const REQUIRED_PHP_EXTENSIONS = ['fileinfo', 'pdo_sqlite', 'gd', 'ctype', 'json', 'intl', 'zlib', | ||||
| const REQUIRED_PHP_EXTENSIONS = ['fileinfo', 'pdo_sqlite', 'gd', 'ctype', 'json', 'intl', 'zlib', 'mbstring', | ||||
| 	// These are core extensions, so normally can't be missing, but seems to be the case, however, on FreeBSD | ||||
| 	'filter', 'iconv', 'tokenizer' | ||||
| ]; | ||||
|   | ||||
| @@ -1271,9 +1271,6 @@ msgstr "Nikdy" | ||||
| msgid "Today" | ||||
| msgstr "Dnes" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Spotřebovat %1$s z %2$s jako zkažené" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "Nejsou všechny suroviny z receptu \"%s\" v zásobě, nic nebude odebráno" | ||||
|  | ||||
| @@ -1549,12 +1546,8 @@ msgstr "Sčítat minimální počet skladových zásob podřízených produktů" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Pokud je povoleno, minimální množství zásob podřízených produktů bude " | ||||
| "akumulováno do tohoto produktu. To znamená že podřízené produkty nikdy " | ||||
| "nebudou chybět, ale pouze tento produkt." | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Opravdu chcete odstranit tento převod?" | ||||
| @@ -2287,8 +2280,8 @@ msgstr "Zachovat produkt" | ||||
| msgid "Product to remove" | ||||
| msgstr "Produkt k odstranění" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Chyba při slučování produktů" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Po sloučení bude tento produkt zachován" | ||||
| @@ -2343,6 +2336,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2355,14 +2351,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2503,3 +2491,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1245,9 +1245,6 @@ msgstr "Aldrig" | ||||
| msgid "Today" | ||||
| msgstr "Idag" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Forbrug %1$s af %2$s som har overskredet holdbarhedsdatoen" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Ikke alle ingredienser til opskrift \"%s\" er i beholdningen, intet fjernet" | ||||
| @@ -1528,12 +1525,8 @@ msgstr "Akkumuler underordnede varers minimumbeholdning" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Hvis aktiveret bliver minimumsbeholdning for underordnede varer akkumuleret " | ||||
| "ind i denne vare så det kun er denne vare der \"mangler\" og ikke de " | ||||
| "underordnede" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Er du sikker på at du vil fjerne denne konvertering" | ||||
| @@ -2286,8 +2279,8 @@ msgstr "Vare der beholdes" | ||||
| msgid "Product to remove" | ||||
| msgstr "Vare der slettes" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Fejl under sammenlægning af varer" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Efter sammenlægning bibeholdes denne vare" | ||||
| @@ -2345,6 +2338,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2357,14 +2353,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2501,3 +2489,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Er du sikker på du vil tømme indkøbslisten?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1258,9 +1258,6 @@ msgstr "Nie" | ||||
| msgid "Today" | ||||
| msgstr "Heute" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Verbrauche %1$s %2$s als verdorben" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Nicht alle Zutaten, die vom Rezept \"%s\" benötigt werden, sind vorrätig, es" | ||||
| @@ -1546,12 +1543,10 @@ msgstr "Mindestbestände von untergeordneten Produkten aufsummieren" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Wenn aktiviert, werden die Mindestbestände von untergeordneten Produkten " | ||||
| "aufsummiert, heißt das untergeordnete Produkt wird nie \"fehlen\", nur " | ||||
| "dieses" | ||||
| "aufsummiert, heißt das untergeordnete Produkt wird nie fehlen, nur dieses" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Diese Umrechnung wirklich löschen?" | ||||
| @@ -2339,8 +2334,8 @@ msgstr "Produkt, das behalten werden soll" | ||||
| msgid "Product to remove" | ||||
| msgstr "Produkt, das entfernt werden soll" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Fehler beim Zusammenführen der Produkte" | ||||
| msgid "Error while merging" | ||||
| msgstr "Fehler beim Zusammenführen" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Nach der Zusammenführung wird dieses Produkt erhalten bleiben" | ||||
| @@ -2401,6 +2396,9 @@ msgstr "MHD" | ||||
| msgid "Print on label printer" | ||||
| msgstr "Auf Etikettendrucker drucken" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "Standard Bestandseintrag-Etikett" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "Bestandseintrag-Etikett" | ||||
|  | ||||
| @@ -2413,16 +2411,6 @@ msgstr "Ein Etikett pro Einkauf" | ||||
| msgid "Label per unit" | ||||
| msgstr "Ein Etikett pro Einheit" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "Erlaube Etikettendruck pro Einheit" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
| "Erlaube Etikettendruck pro Einheit nach Umrechnung - Beispiel: 1 gekaufte " | ||||
| "Packung, die 10 Einheiten hinzufügt, druckt 10 Etiketten" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "Fehler bei WebHook-Ausführung" | ||||
|  | ||||
| @@ -2565,3 +2553,26 @@ msgstr "Abschnitt" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Sicher, dass der Einkaufszettel geleert werden soll?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "Dies ist die Standardeinstellung, die beim Einkauf vorbelegt wird" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "Hausarbeiten zusammenführen" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "Hausarbeit, die behalten werden soll" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "Nach der Zusammenführung wird diese Hausarbeit erhalten bleiben" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "Hausarbeit, die entfernt werden soll" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
| "Nach dem Zusammenführen werden alle Referenzen auf diese Hausarbeit durch " | ||||
| "die zu behaltende Hausarbeit ersetzt (d. h. diese Hausarbeit existiert dann " | ||||
| "nicht mehr)" | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| # Translators: | ||||
| # datablitz7 <plant7@gmail.com>, 2019 | ||||
| # ByteGet, 2020 | ||||
| # Thodoris Kalatzis <teo.kal@hotmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -9,7 +10,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: ByteGet, 2020\n" | ||||
| "Last-Translator: Thodoris Kalatzis <teo.kal@hotmail.com>, 2021\n" | ||||
| "Language-Team: Greek (Greece) (https://www.transifex.com/grocy/teams/93189/el_GR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -374,22 +375,22 @@ msgid "Korean" | ||||
| msgstr "Κορεάτικα" | ||||
|  | ||||
| msgid "Chinese (China)" | ||||
| msgstr "" | ||||
| msgstr "Κινεζικά (Κίνα)" | ||||
|  | ||||
| msgid "Hebrew (Israel)" | ||||
| msgstr "" | ||||
| msgstr "Εβραϊκά (Ισραήλ)" | ||||
|  | ||||
| msgid "Tamil" | ||||
| msgstr "" | ||||
| msgstr "Ταμίλ" | ||||
|  | ||||
| msgid "Finnish" | ||||
| msgstr "" | ||||
| msgstr "Φινλανδικά" | ||||
|  | ||||
| msgid "Breakfast" | ||||
| msgstr "" | ||||
| msgstr "Πρωϊνό" | ||||
|  | ||||
| msgid "Lunch" | ||||
| msgstr "" | ||||
| msgstr "Γεύμα" | ||||
|  | ||||
| msgid "Dinner" | ||||
| msgstr "" | ||||
| msgstr "Δείπνο" | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| #  | ||||
| # Translators: | ||||
| # ByteGet, 2020 | ||||
| # Thodoris Kalatzis <teo.kal@hotmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -8,7 +9,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2020-08-31 19:11+0000\n" | ||||
| "Last-Translator: ByteGet, 2020\n" | ||||
| "Last-Translator: Thodoris Kalatzis <teo.kal@hotmail.com>, 2021\n" | ||||
| "Language-Team: Greek (Greece) (https://www.transifex.com/grocy/teams/93189/el_GR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -107,16 +108,16 @@ msgstr "zh_TW" | ||||
|  | ||||
| # Chinese (China) | ||||
| msgid "zh_CN" | ||||
| msgstr "" | ||||
| msgstr "zh_CN" | ||||
|  | ||||
| # Hebrew (Israel) | ||||
| msgid "he_IL" | ||||
| msgstr "" | ||||
| msgstr "he_IL" | ||||
|  | ||||
| # Tamil | ||||
| msgid "ta" | ||||
| msgstr "" | ||||
| msgstr "ta" | ||||
|  | ||||
| # Finnish | ||||
| msgid "fi" | ||||
| msgstr "" | ||||
| msgstr "fi" | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| # Stathis Stamoulis <sstamoulis2010@gmail.com>, 2020 | ||||
| # Dionysios Gkotsis <bloodsak4@yahoo.gr>, 2020 | ||||
| # ByteGet, 2020 | ||||
| # Thodoris Kalatzis <teo.kal@hotmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -10,7 +11,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: ByteGet, 2020\n" | ||||
| "Last-Translator: Thodoris Kalatzis <teo.kal@hotmail.com>, 2021\n" | ||||
| "Language-Team: Greek (Greece) (https://www.transifex.com/grocy/teams/93189/el_GR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -784,7 +785,7 @@ msgid "Image of product %s" | ||||
| msgstr "Εικόνα του προϊόντος% s" | ||||
|  | ||||
| msgid "Deletion not possible" | ||||
| msgstr "" | ||||
| msgstr "Δεν είναι δυνατή η διαγραφή" | ||||
|  | ||||
| msgid "Equipment" | ||||
| msgstr "Εξοπλισμός" | ||||
| @@ -1253,9 +1254,6 @@ msgstr "Ποτέ" | ||||
| msgid "Today" | ||||
| msgstr "Σήμερα" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Καταναλώστε% 1 $ s από% 2 $ s ως χαλασμένο" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "Δεν υπάρχουν όλα τα συστατικά της συνταγής \"% s\", τίποτα δεν αφαιρείται" | ||||
|  | ||||
| @@ -1541,12 +1539,8 @@ msgstr "Συσσώρευση υποπροϊόντων ελάχ. ποσό απο | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "ΠαρακολούθησηΕάν είναι ενεργοποιημένο, το ελάχιστο το απόθεμα των υπο-" | ||||
| "προϊόντων θα συσσωρευτεί σε αυτό το προϊόν, σημαίνει ότι το υπο-προϊόν δεν " | ||||
| "θα \"λείπει\" ποτέ, μόνο αυτό το προϊόν" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Είστε βέβαιοι ότι θα καταργήσετε αυτήν τη μετατροπή;" | ||||
| @@ -1924,10 +1918,10 @@ msgid "If you think this is a bug, please report it" | ||||
| msgstr "Επεξεργασία τοποθεσίας" | ||||
|  | ||||
| msgid "Language" | ||||
| msgstr "" | ||||
| msgstr "Γλώσσα" | ||||
|  | ||||
| msgid "User settings" | ||||
| msgstr "" | ||||
| msgstr "Ρυθμίσεις χρήστη" | ||||
|  | ||||
| msgid "Default" | ||||
| msgstr "" | ||||
| @@ -1945,10 +1939,10 @@ msgid "Consume exact amount" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Value" | ||||
| msgstr "" | ||||
| msgstr "Αξία" | ||||
|  | ||||
| msgid "%s total value" | ||||
| msgstr "" | ||||
| msgstr "%s συνολική αξία" | ||||
|  | ||||
| msgid "" | ||||
| "Show purchased date on purchase and inventory page (otherwise the purchased " | ||||
| @@ -1974,7 +1968,7 @@ msgid "Save & continue to add quantity unit conversions & barcodes" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Save & return to products" | ||||
| msgstr "" | ||||
| msgstr "Αποθήκευση & επιστροφή στα προϊόντα" | ||||
|  | ||||
| msgid "Save & continue to add conversions" | ||||
| msgstr "" | ||||
| @@ -1983,7 +1977,7 @@ msgid "Save & return to quantity units" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "price" | ||||
| msgstr "" | ||||
| msgstr "τιμή" | ||||
|  | ||||
| msgid "New stock amount" | ||||
| msgstr "" | ||||
| @@ -1998,13 +1992,13 @@ msgid "This product is currently on a shopping list" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Undo transaction" | ||||
| msgstr "" | ||||
| msgstr "Αναίρεση συναλλαγής" | ||||
|  | ||||
| msgid "Transaction type" | ||||
| msgstr "" | ||||
| msgstr "Τύπος συναλλαγής" | ||||
|  | ||||
| msgid "Transaction time" | ||||
| msgstr "" | ||||
| msgstr "Χρόνος συναλλαγής" | ||||
|  | ||||
| msgid "Chore journal" | ||||
| msgstr "" | ||||
| @@ -2022,7 +2016,7 @@ msgid "Battery journal" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This product has a picture" | ||||
| msgstr "" | ||||
| msgstr "Αυτό το προϊόν έχει φωτογραφία" | ||||
|  | ||||
| msgid "Consume this stock entry as spoiled" | ||||
| msgstr "" | ||||
| @@ -2061,7 +2055,7 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Copy" | ||||
| msgstr "" | ||||
| msgstr "Αντιγραφή" | ||||
|  | ||||
| msgid "Are you sure to remove this barcode?" | ||||
| msgstr "" | ||||
| @@ -2198,7 +2192,7 @@ msgid "Sort number" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Download file" | ||||
| msgstr "" | ||||
| msgstr "Λήψη αρχείου" | ||||
|  | ||||
| msgid "Use the products \"Quick consume amount\"" | ||||
| msgstr "" | ||||
| @@ -2271,7 +2265,7 @@ msgstr "" | ||||
| msgid "Product to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| @@ -2283,13 +2277,13 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge" | ||||
| msgstr "" | ||||
| msgstr "Συγχώνευση" | ||||
|  | ||||
| msgid "Title" | ||||
| msgstr "" | ||||
| msgstr "Τίτλος" | ||||
|  | ||||
| msgid "Link" | ||||
| msgstr "" | ||||
| msgstr "Σύνδεση" | ||||
|  | ||||
| msgid "" | ||||
| "The stock overview page lists all products which are currently in-stock or " | ||||
| @@ -2298,20 +2292,20 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Print options" | ||||
| msgstr "" | ||||
| msgstr "Επιλογές εκτύπωσης" | ||||
|  | ||||
| msgid "A product or a note is required" | ||||
| msgstr "" | ||||
| msgstr "Ένα προϊόν ή μία σημείωση απατείται" | ||||
|  | ||||
| msgid "grocycode" | ||||
| msgstr "" | ||||
| msgstr "grocycode" | ||||
|  | ||||
| msgid "Download" | ||||
| msgstr "" | ||||
| msgstr "Λήψη" | ||||
|  | ||||
| # Example: Download *Product* grocycode | ||||
| msgid "Download %s grocycode" | ||||
| msgstr "" | ||||
| msgstr "Λήψη %sgrocycode" | ||||
|  | ||||
| msgid "" | ||||
| "grocycode is a unique referer to this %s in your grocy instance - print it " | ||||
| @@ -2323,6 +2317,9 @@ msgid "DD" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Print on label printer" | ||||
| msgstr "Εκτύπωση σε εκτυπωτή ετικετών" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| @@ -2337,14 +2334,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2356,16 +2345,16 @@ msgid "Open stock entry label in new window" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Thermal printer" | ||||
| msgstr "" | ||||
| msgstr "Θερμικός εκτυπωτής" | ||||
|  | ||||
| msgid "Printing" | ||||
| msgstr "" | ||||
| msgstr "Εκτυπώνεται" | ||||
|  | ||||
| msgid "Connecting to printer..." | ||||
| msgstr "" | ||||
| msgstr "Σύνδεση με τον εκτυπωτή..." | ||||
|  | ||||
| msgid "Unable to print" | ||||
| msgstr "" | ||||
| msgstr "Η εκτύπωση δεν είναι δυνατή" | ||||
|  | ||||
| msgid "Only done items" | ||||
| msgstr "" | ||||
| @@ -2374,17 +2363,17 @@ msgid "Show only in-stock products" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Product description" | ||||
| msgstr "" | ||||
| msgstr "Περιγραφή προϊόντος" | ||||
|  | ||||
| # Example: *3.21 USD* per *Pack* | ||||
| msgid "%1$s per %2$s" | ||||
| msgstr "" | ||||
| msgstr "%1$s ανά %2$s" | ||||
|  | ||||
| msgid "Mark this item as undone" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Mandatory" | ||||
| msgstr "" | ||||
| msgstr "Υποχρεωτικό" | ||||
|  | ||||
| msgid "Mandatory Userfield" | ||||
| msgstr "" | ||||
| @@ -2396,10 +2385,10 @@ msgid "In-stock products" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Timestamp" | ||||
| msgstr "" | ||||
| msgstr "Χρονοσήμανση" | ||||
|  | ||||
| msgid "Should not be frozen" | ||||
| msgstr "" | ||||
| msgstr "Δεν πρέπει να καταψύχεται" | ||||
|  | ||||
| msgid "" | ||||
| "When enabled, on moving this product to a freezer location (so when freezing" | ||||
| @@ -2407,7 +2396,7 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This product shouldn't be frozen" | ||||
| msgstr "" | ||||
| msgstr "Το προϊόν δεν πρέπει να καταψύχεται" | ||||
|  | ||||
| msgid "Copy all meal plan entries of %s" | ||||
| msgstr "" | ||||
| @@ -2416,32 +2405,32 @@ msgid "A date is required" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Day" | ||||
| msgstr "" | ||||
| msgstr "Ημέρα" | ||||
|  | ||||
| msgid "Add recipe" | ||||
| msgstr "" | ||||
| msgstr "Προσθήκη συνταγής" | ||||
|  | ||||
| msgid "Copy this day" | ||||
| msgstr "" | ||||
| msgstr "Αντιγραφή της ημέρας" | ||||
|  | ||||
| msgid "Date range" | ||||
| msgstr "" | ||||
| msgstr "Εύρος ημερομηνίας" | ||||
|  | ||||
| msgid "%s month" | ||||
| msgid_plural "%s months" | ||||
| msgstr[0] "" | ||||
| msgstr[1] "" | ||||
| msgstr[0] "%s μήνας" | ||||
| msgstr[1] "%s μήνες" | ||||
|  | ||||
| msgid "%s year" | ||||
| msgid_plural "%s years" | ||||
| msgstr[0] "" | ||||
| msgstr[1] "" | ||||
| msgstr[0] "%s χρόνος" | ||||
| msgstr[1] "%sχρόνια" | ||||
|  | ||||
| msgid "Display product" | ||||
| msgstr "" | ||||
| msgstr "Προβολή προϊόντος" | ||||
|  | ||||
| msgid "Copy recipe" | ||||
| msgstr "" | ||||
| msgstr "Αντιγραφή συνταγής" | ||||
|  | ||||
| msgid "Copy of %s" | ||||
| msgstr "" | ||||
| @@ -2477,7 +2466,27 @@ msgid "Are you sure to delete meal plan section \"%s\"?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Section" | ||||
| msgstr "" | ||||
| msgstr "Τμήμα" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| # Translators: | ||||
| # Dionysios Gkotsis <bloodsak4@yahoo.gr>, 2020 | ||||
| # ByteGet, 2020 | ||||
| # Thodoris Kalatzis <teo.kal@hotmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -9,7 +10,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:43+0000\n" | ||||
| "Last-Translator: ByteGet, 2020\n" | ||||
| "Last-Translator: Thodoris Kalatzis <teo.kal@hotmail.com>, 2021\n" | ||||
| "Language-Team: Greek (Greece) (https://www.transifex.com/grocy/teams/93189/el_GR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -60,12 +61,12 @@ msgstr "σύνδεσμος" | ||||
|  | ||||
| # Link (with title) | ||||
| msgid "link-with-title" | ||||
| msgstr "" | ||||
| msgstr "σύνδεσμος με τίτλο" | ||||
|  | ||||
| # File | ||||
| msgid "file" | ||||
| msgstr "" | ||||
| msgstr "αρχείο" | ||||
|  | ||||
| # Image | ||||
| msgid "image" | ||||
| msgstr "" | ||||
| msgstr "εικόνα" | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
| # duck. <me@duck.me.uk>, 2020 | ||||
| # John Coles <john@johncoles.com>, 2020 | ||||
| # Chris H <cjh861@outlook.com>, 2021 | ||||
| # David Knapman <dai.knapz@gmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -11,7 +12,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Chris H <cjh861@outlook.com>, 2021\n" | ||||
| "Last-Translator: David Knapman <dai.knapz@gmail.com>, 2021\n" | ||||
| "Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -387,10 +388,10 @@ msgid "Finnish" | ||||
| msgstr "Finnish" | ||||
|  | ||||
| msgid "Breakfast" | ||||
| msgstr "" | ||||
| msgstr "Breakfast" | ||||
|  | ||||
| msgid "Lunch" | ||||
| msgstr "" | ||||
| msgstr "Lunch" | ||||
|  | ||||
| msgid "Dinner" | ||||
| msgstr "" | ||||
| msgstr "Dinner" | ||||
|   | ||||
| @@ -5,6 +5,7 @@ | ||||
| # duck. <me@duck.me.uk>, 2020 | ||||
| # John Coles <john@johncoles.com>, 2020 | ||||
| # w ralb <g.frcy.trnsfx@barlowhome.org>, 2021 | ||||
| # David Knapman <dai.knapz@gmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -12,7 +13,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: w ralb <g.frcy.trnsfx@barlowhome.org>, 2021\n" | ||||
| "Last-Translator: David Knapman <dai.knapz@gmail.com>, 2021\n" | ||||
| "Language-Team: English (United Kingdom) (https://www.transifex.com/grocy/teams/93189/en_GB/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -1236,9 +1237,6 @@ msgstr "Never" | ||||
| msgid "Today" | ||||
| msgstr "Today" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Consume %1$s of %2$s as spoiled" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
|  | ||||
| @@ -1516,12 +1514,8 @@ msgstr "Accumulate sub products min. stock amount" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Are you sure to remove this conversion?" | ||||
| @@ -2287,8 +2281,8 @@ msgstr "Product to keep" | ||||
| msgid "Product to remove" | ||||
| msgstr "Product to remove" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "After merging, this product will be kept" | ||||
| @@ -2348,6 +2342,9 @@ msgstr "DD" | ||||
| msgid "Print on label printer" | ||||
| msgstr "Print on label printer" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "Stock entry label" | ||||
|  | ||||
| @@ -2360,16 +2357,6 @@ msgstr "Single label" | ||||
| msgid "Label per unit" | ||||
| msgstr "Label per unit" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "Allow label printing per unit" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "Error while executing WebHook" | ||||
|  | ||||
| @@ -2510,4 +2497,24 @@ msgid "Section" | ||||
| msgstr "Section" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Are you sure to empty the shopping list?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1264,9 +1264,6 @@ msgstr "Nunca" | ||||
| msgid "Today" | ||||
| msgstr "Hoy" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Consumir %1$s de %2$s como dañado" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "No todos los ingredientes de la receta \"%s\" están en el inventario, nada " | ||||
| @@ -1553,12 +1550,8 @@ msgstr "Acumular mínimos de existencias de subproductos" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Si está activado, los mínimos de existencias de los subproductos se " | ||||
| "acumularán en este producto. Los subproductos nunca faltarán, solo este " | ||||
| "producto" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "¿Está seguro de querer eliminar esta conversión?" | ||||
| @@ -2343,8 +2336,8 @@ msgstr "Productos a mantener" | ||||
| msgid "Product to remove" | ||||
| msgstr "Productos a eliminar" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Error al combinar productos" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Después de combinar, este producto se mantendrá" | ||||
| @@ -2402,6 +2395,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2414,14 +2410,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2558,3 +2546,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "¿Estás seguro de querer borrar la lista de la compra?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1239,9 +1239,6 @@ msgstr "Ei koskaan" | ||||
| msgid "Today" | ||||
| msgstr "Tänään" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Kuluta %1$s tuotteesta %2$s pilaantuneena" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "Reseptin \"%s\"  kaikkia ainesosia ei ole varastossa, ei poistettu mitään" | ||||
|  | ||||
| @@ -1521,12 +1518,8 @@ msgstr "Lisää alatuotteiden varaston minimimäärät" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Jos tämä valitaan, niin alatuotteiden minimivarastömäärät lisätään tähän " | ||||
| "tuotteeseen, jolloin alatuote ei koskaan ole \"lopussa\", vaan vain tämä " | ||||
| "tuote." | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Haluatko varmasti poistaa tämän muunnoksen?" | ||||
| @@ -2292,8 +2285,8 @@ msgstr "Säilytettävä tuote" | ||||
| msgid "Product to remove" | ||||
| msgstr "Poistettava tuote" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Virhe yhdistettäessä tuotteita" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Yhdistämisen jälkeen tämä tuote säilytetään" | ||||
| @@ -2351,6 +2344,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "Tulosta tarratulostimella" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2363,14 +2359,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2510,3 +2498,23 @@ msgstr "Osio" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #  | ||||
| # Translators: | ||||
| # Mathieu Fortin <mathieugfortin@gmail.com>, 2019 | ||||
| # Juan RODRIGUEZ <juansero29@gmail.com>, 2020 | ||||
| # Pierre Penninckx <ibizapeanut@gmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -9,7 +9,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-09-17 10:45+0000\n" | ||||
| "Last-Translator: Juan RODRIGUEZ <juansero29@gmail.com>, 2020\n" | ||||
| "Last-Translator: Pierre Penninckx <ibizapeanut@gmail.com>, 2021\n" | ||||
| "Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -19,13 +19,13 @@ msgstr "" | ||||
| "X-Domain: grocy/chore_assignment_types\n" | ||||
|  | ||||
| msgid "no-assignment" | ||||
| msgstr "pas-assigné" | ||||
| msgstr "non assigné" | ||||
|  | ||||
| msgid "who-least-did-first" | ||||
| msgstr "celui-qui-a-fait-le-moins-d'abord" | ||||
| msgstr "d'abord celui qui a fait le moins" | ||||
|  | ||||
| msgid "random" | ||||
| msgstr "aléatoire" | ||||
|  | ||||
| msgid "in-alphabetical-order" | ||||
| msgstr "ordre-alphabétique" | ||||
| msgstr "par ordre alphabétique" | ||||
|   | ||||
| @@ -1,8 +1,6 @@ | ||||
| #  | ||||
| # Translators: | ||||
| # Bernd Bestel <bernd@berrnd.de>, 2019 | ||||
| # Alex Deneuvillers <alex.deneuvillers@gmail.com>, 2019 | ||||
| # Antonin DESFONTAINES <antonin.desfontaines@outlook.com>, 2019 | ||||
| # Pierre Penninckx <ibizapeanut@gmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -10,7 +8,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Antonin DESFONTAINES <antonin.desfontaines@outlook.com>, 2019\n" | ||||
| "Last-Translator: Pierre Penninckx <ibizapeanut@gmail.com>, 2021\n" | ||||
| "Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -20,19 +18,19 @@ msgstr "" | ||||
| "X-Domain: grocy/chore_types\n" | ||||
|  | ||||
| msgid "manually" | ||||
| msgstr "Manuelle" | ||||
| msgstr "manuellement" | ||||
|  | ||||
| msgid "dynamic-regular" | ||||
| msgstr "Régulière-dynamique" | ||||
| msgstr "dynamique normal" | ||||
|  | ||||
| msgid "daily" | ||||
| msgstr "Journalière" | ||||
| msgstr "journalier" | ||||
|  | ||||
| msgid "weekly" | ||||
| msgstr "Hebdomadaire" | ||||
| msgstr "hebdomadaire" | ||||
|  | ||||
| msgid "monthly" | ||||
| msgstr "Mensuelle" | ||||
| msgstr "mensuel" | ||||
|  | ||||
| msgid "yearly" | ||||
| msgstr "Annuelle" | ||||
| msgstr "annuel" | ||||
|   | ||||
| @@ -9,6 +9,7 @@ | ||||
| # patate douce <poubel125@gmail.com>, 2020 | ||||
| # nerdinator <florian.dupret@gmail.com>, 2020 | ||||
| # C P <anoxy78@gmail.com>, 2020 | ||||
| # Barthelemy Drabczuk, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -16,7 +17,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: C P <anoxy78@gmail.com>, 2020\n" | ||||
| "Last-Translator: Barthelemy Drabczuk, 2021\n" | ||||
| "Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -394,10 +395,10 @@ msgid "Finnish" | ||||
| msgstr "Finnois" | ||||
|  | ||||
| msgid "Breakfast" | ||||
| msgstr "" | ||||
| msgstr "Petit-déjeuner" | ||||
|  | ||||
| msgid "Lunch" | ||||
| msgstr "" | ||||
| msgstr "Déjeuner" | ||||
|  | ||||
| msgid "Dinner" | ||||
| msgstr "" | ||||
| msgstr "Dîner" | ||||
|   | ||||
| @@ -33,6 +33,8 @@ | ||||
| # Zkryvix <angelo.frangione@gmail.com>, 2021 | ||||
| # patate douce <poubel125@gmail.com>, 2021 | ||||
| # Cedric Octave <transifex@octvcdrc.fr>, 2021 | ||||
| # Alexandre Mechineau <admin@alexsaphir.com>, 2021 | ||||
| # Pierre Penninckx <ibizapeanut@gmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -40,7 +42,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Cedric Octave <transifex@octvcdrc.fr>, 2021\n" | ||||
| "Last-Translator: Pierre Penninckx <ibizapeanut@gmail.com>, 2021\n" | ||||
| "Language-Team: French (https://www.transifex.com/grocy/teams/93189/fr/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -89,7 +91,7 @@ msgid "Amount" | ||||
| msgstr "Quantité" | ||||
|  | ||||
| msgid "Logout" | ||||
| msgstr "Déconnexion" | ||||
| msgstr "Déconnecter" | ||||
|  | ||||
| msgid "Chores overview" | ||||
| msgstr "Aperçu des corvées" | ||||
| @@ -367,7 +369,7 @@ msgid "Manage API keys" | ||||
| msgstr "Gérer les clefs API" | ||||
|  | ||||
| msgid "REST API browser" | ||||
| msgstr "" | ||||
| msgstr "Navigateur d'API REST" | ||||
|  | ||||
| msgid "API keys" | ||||
| msgstr "Clefs API" | ||||
| @@ -1277,9 +1279,6 @@ msgstr "Jamais" | ||||
| msgid "Today" | ||||
| msgstr "Aujourd'hui" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Consommer %1$s de %2$s comme périmée" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Des ingrédients de la recette \"%s\" sont manquants,\n" | ||||
| @@ -1561,12 +1560,8 @@ msgstr "Accumuler le stock minimal des sous produits" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Si activé, la somme du stock minimal des sous produits sera accumulé sur ce " | ||||
| "produit, signifiant que le sous produit ne sera jamais \"en manque\", " | ||||
| "seulement ce produit" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Êtes-vous sûr de vouloir supprimer cette conversion ?" | ||||
| @@ -2146,6 +2141,10 @@ msgid "" | ||||
| "today + this amount of days, but only if the resulting date is not after the" | ||||
| " original due date (a value of 0 disables this)" | ||||
| msgstr "" | ||||
| "Quand ce produit est marqué comme ouvert, la date d'échéance sera remplacée " | ||||
| "par la date d'aujourd'hui plus ce nombre de jour, mais seulement si la " | ||||
| "nouvelle date ne se trouve pas après la date d'échéance originale (une " | ||||
| "valeur de 0 désactive ce comportement)" | ||||
|  | ||||
| msgid "Default due days after opened" | ||||
| msgstr "Date de péremption après ouverture par défaut" | ||||
| @@ -2340,8 +2339,8 @@ msgstr "Garder ce produit" | ||||
| msgid "Product to remove" | ||||
| msgstr "Retirer ce produit" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Erreur lors de la fusion des produits" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Après fusion, ce produit sera conservé" | ||||
| @@ -2385,175 +2384,195 @@ msgstr "Télécharger" | ||||
|  | ||||
| # Example: Download *Product* grocycode | ||||
| msgid "Download %s grocycode" | ||||
| msgstr "" | ||||
| msgstr "Télécharger les grocycode %s " | ||||
|  | ||||
| msgid "" | ||||
| "grocycode is a unique referer to this %s in your grocy instance - print it " | ||||
| "onto a label and scan it like any other barcode" | ||||
| msgstr "" | ||||
| "grocycode est une référence unique à ce %s dans grocy. Imprimez-le sur une " | ||||
| "étiquette et scannez-le comme tout autre code barre" | ||||
|  | ||||
| # Abbreviation for "due date" | ||||
| msgid "DD" | ||||
| msgstr "" | ||||
| msgstr "dp." | ||||
|  | ||||
| msgid "Print on label printer" | ||||
| msgstr "Imprimer sur une imprimante d'étiquette" | ||||
| msgstr "Imprimer sur une étiquette" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
| msgstr "Étiquette d'élément en stock" | ||||
|  | ||||
| msgid "No label" | ||||
| msgstr "Pas d'étiquette" | ||||
|  | ||||
| msgid "Single label" | ||||
| msgstr "Etiquette unique" | ||||
| msgstr "Étiquette unique" | ||||
|  | ||||
| msgid "Label per unit" | ||||
| msgstr "Etiquette par unité" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "Permettre l'impression d'étiquette par unité" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
| "Permettre l'impression d'une étiquette par unité (après conversion). 1 achat" | ||||
| " qui ajoute 10 produits imprime 10 étiquettes" | ||||
| msgstr "Étiquette par unité" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "Erreur lors de l'exécution de WebHook" | ||||
| msgstr "Erreur lors de l'exécution du WebHook" | ||||
|  | ||||
| # Example: Print *Product* grocycode on label printer | ||||
| msgid "Print %s grocycode on label printer" | ||||
| msgstr "" | ||||
| msgstr "Imprimer %s grocycode sur l'étiquette" | ||||
|  | ||||
| msgid "Open stock entry label in new window" | ||||
| msgstr "" | ||||
| msgstr "Ouvrir le label du stock dans une nouvelle fenêtre" | ||||
|  | ||||
| msgid "Thermal printer" | ||||
| msgstr "" | ||||
| msgstr "Imprimante thermique" | ||||
|  | ||||
| msgid "Printing" | ||||
| msgstr "" | ||||
| msgstr "Impression en cours" | ||||
|  | ||||
| msgid "Connecting to printer..." | ||||
| msgstr "" | ||||
| msgstr "Connexion à l'imprimante..." | ||||
|  | ||||
| msgid "Unable to print" | ||||
| msgstr "" | ||||
| msgstr "Impossible d'imprimer" | ||||
|  | ||||
| msgid "Only done items" | ||||
| msgstr "" | ||||
| msgstr "Seulement les éléments faits" | ||||
|  | ||||
| msgid "Show only in-stock products" | ||||
| msgstr "" | ||||
| msgstr "Ne montrer que les produits en stock" | ||||
|  | ||||
| msgid "Product description" | ||||
| msgstr "" | ||||
| msgstr "Description du produit" | ||||
|  | ||||
| # Example: *3.21 USD* per *Pack* | ||||
| msgid "%1$s per %2$s" | ||||
| msgstr "" | ||||
| msgstr "%1$s par %2$s" | ||||
|  | ||||
| msgid "Mark this item as undone" | ||||
| msgstr "" | ||||
| msgstr "Marquer l'élément comme défait" | ||||
|  | ||||
| msgid "Mandatory" | ||||
| msgstr "" | ||||
| msgstr "Requis" | ||||
|  | ||||
| msgid "Mandatory Userfield" | ||||
| msgstr "" | ||||
| msgstr "Champ utilisateur requis" | ||||
|  | ||||
| msgid "When enabled, then this field must be filled on the destination form" | ||||
| msgstr "" | ||||
| msgstr "Lorsque activé, ce champ est requis dans le formulaire de destination" | ||||
|  | ||||
| msgid "In-stock products" | ||||
| msgstr "" | ||||
| msgstr "Produits en stock" | ||||
|  | ||||
| msgid "Timestamp" | ||||
| msgstr "" | ||||
| msgstr "Horodatage" | ||||
|  | ||||
| msgid "Should not be frozen" | ||||
| msgstr "" | ||||
| msgstr "Ne doit pas être congelé" | ||||
|  | ||||
| msgid "" | ||||
| "When enabled, on moving this product to a freezer location (so when freezing" | ||||
| " it), a warning will be shown" | ||||
| msgstr "" | ||||
| "Lorsque activé, une alerte sera émise lorsque ce produit sera placé dans le " | ||||
| "congélateur" | ||||
|  | ||||
| msgid "This product shouldn't be frozen" | ||||
| msgstr "" | ||||
| msgstr "Ce produit ne doit pas être congelé" | ||||
|  | ||||
| msgid "Copy all meal plan entries of %s" | ||||
| msgstr "" | ||||
| msgstr "Copier toutes les entrées du régime %s" | ||||
|  | ||||
| msgid "A date is required" | ||||
| msgstr "" | ||||
| msgstr "Une date est requise" | ||||
|  | ||||
| msgid "Day" | ||||
| msgstr "" | ||||
| msgstr "Jour" | ||||
|  | ||||
| msgid "Add recipe" | ||||
| msgstr "" | ||||
| msgstr "Ajouter recette" | ||||
|  | ||||
| msgid "Copy this day" | ||||
| msgstr "" | ||||
| msgstr "Copier ce jour" | ||||
|  | ||||
| msgid "Date range" | ||||
| msgstr "" | ||||
| msgstr "Période" | ||||
|  | ||||
| msgid "%s month" | ||||
| msgid_plural "%s months" | ||||
| msgstr[0] "" | ||||
| msgstr[1] "" | ||||
| msgstr[0] "%s mois" | ||||
| msgstr[1] "%s mois" | ||||
|  | ||||
| msgid "%s year" | ||||
| msgid_plural "%s years" | ||||
| msgstr[0] "" | ||||
| msgstr[1] "" | ||||
| msgstr[0] "%s an" | ||||
| msgstr[1] "%s ans" | ||||
|  | ||||
| msgid "Display product" | ||||
| msgstr "" | ||||
| msgstr "Afficher le produit" | ||||
|  | ||||
| msgid "Copy recipe" | ||||
| msgstr "" | ||||
| msgstr "Copier la recette" | ||||
|  | ||||
| msgid "Copy of %s" | ||||
| msgstr "" | ||||
| msgstr "Copie de %s" | ||||
|  | ||||
| msgid "Add decimal separator automatically for price inputs" | ||||
| msgstr "" | ||||
| msgstr "Ajout automatique du séparateur de décimales pour les prix" | ||||
|  | ||||
| msgid "" | ||||
| "When enabled, you always have to enter the value including decimal places, " | ||||
| "the decimal separator will be automatically added based on the amount of " | ||||
| "allowed decimal places" | ||||
| msgstr "" | ||||
| "Lorsque activé, vous devez toujours entrer les valeurs en incluant les " | ||||
| "décimales, le séparateur de décimal sera automatiquement ajouté après le " | ||||
| "nombre requis de décimales" | ||||
|  | ||||
| msgid "Stock entry" | ||||
| msgstr "" | ||||
| msgstr "Entrée dans le stock" | ||||
|  | ||||
| msgid "Configure sections" | ||||
| msgstr "" | ||||
| msgstr "Configurer les sections" | ||||
|  | ||||
| msgid "Meal plan sections" | ||||
| msgstr "" | ||||
| msgstr "Sections du régime" | ||||
|  | ||||
| msgid "Create meal plan section" | ||||
| msgstr "" | ||||
| msgstr "Créer un section de régime" | ||||
|  | ||||
| msgid "Sections will be ordered by that number on the meal plan" | ||||
| msgstr "" | ||||
| msgstr "Les sections seront triées par ce numéro dans le régime" | ||||
|  | ||||
| msgid "Edit meal plan section" | ||||
| msgstr "" | ||||
| msgstr "Modifier la section du régime" | ||||
|  | ||||
| msgid "Are you sure to delete meal plan section \"%s\"?" | ||||
| msgstr "" | ||||
| msgstr "Êtes-vous sûr de supprimer la section \"%s\" du régime?" | ||||
|  | ||||
| msgid "Section" | ||||
| msgstr "" | ||||
| msgstr "Section" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Voulez-vous vraiment vider la liste de courses ?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1256,9 +1256,6 @@ msgstr "אף פעם" | ||||
| msgid "Today" | ||||
| msgstr "היום" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "%1$s מתוך %2$s נצרכו כמקולקלים" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "לא כל הרכיבים של המתכון „%s” נמצאים במלאי, לא הוסר דבר" | ||||
|  | ||||
| @@ -1532,11 +1529,10 @@ msgstr "צבירת תת־מוצרים עם כמות מלאי מזערית" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "אם האפשרות פעילה, הכמות המזערית במלאי של תת־מוצרים תצטבר לכדי המוצר הזה, " | ||||
| "משמעות הדבר היא שתת־המוצר הזה אף פעם לא „יחסר”, רק המוצר הזה" | ||||
| "משמעות הדבר היא שתת־המוצר הזה אף פעם לא יחסר, רק המוצר הזה" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "להסיר את ההמרה הזאת?" | ||||
| @@ -2279,8 +2275,8 @@ msgstr "מוצר להשאיר" | ||||
| msgid "Product to remove" | ||||
| msgstr "מוצר להסיר" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "שגיאה במיזוג מוצרים" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "לאחר המיזוג, המוצר הזה יישאר" | ||||
| @@ -2339,6 +2335,9 @@ msgstr "פג" | ||||
| msgid "Print on label printer" | ||||
| msgstr "הדפסה במדפסת מדבקות" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "תווית רשומת מלאי כבררת מחדל" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "תווית רשומת מלאי" | ||||
|  | ||||
| @@ -2351,16 +2350,6 @@ msgstr "תווית בודדה" | ||||
| msgid "Label per unit" | ||||
| msgstr "תווית לכל יחידה" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "לאפשר הדפסת תוויות ליחידה" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
| "לאפשר הדפסה של תווית אחת ליחידה ברכישה (לאחר המרה) - למשל: אריזה אחת שנרכשה " | ||||
| "ומוסיפה 10 יחידות למלאי תוביל להדפסת 10 תוויות" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "שגיאה בהפעלת התליית רשת" | ||||
|  | ||||
| @@ -2503,3 +2492,23 @@ msgstr "סעיף" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "לרוקן את רשימת הקניות?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "זו בררת המחדש שתמולא מראש בעת הרכישה" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| #  | ||||
| # Translators: | ||||
| # Ádám Kovács <kovacsadam07@outlook.hu>, 2019 | ||||
| # Tallyrald Tallyrald, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -8,7 +9,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Ádám Kovács <kovacsadam07@outlook.hu>, 2019\n" | ||||
| "Last-Translator: Tallyrald Tallyrald, 2021\n" | ||||
| "Language-Team: Hungarian (https://www.transifex.com/grocy/teams/93189/hu/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -21,7 +22,7 @@ msgid "manually" | ||||
| msgstr "manuálisan" | ||||
|  | ||||
| msgid "dynamic-regular" | ||||
| msgstr "változó gyakorisággal" | ||||
| msgstr "egyéni gyakorisággal" | ||||
|  | ||||
| msgid "daily" | ||||
| msgstr "naponta" | ||||
|   | ||||
| @@ -5,6 +5,7 @@ | ||||
| # Bernd Bestel <bernd@berrnd.de>, 2020 | ||||
| # Gabor Pilsits <gabor.pilsits@gmail.com>, 2020 | ||||
| # Gábor Szellő <gabor.szello@gmail.com>, 2020 | ||||
| # Vad Laszlo, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -12,7 +13,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Gábor Szellő <gabor.szello@gmail.com>, 2020\n" | ||||
| "Last-Translator: Vad Laszlo, 2021\n" | ||||
| "Language-Team: Hungarian (https://www.transifex.com/grocy/teams/93189/hu/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -388,10 +389,10 @@ msgid "Finnish" | ||||
| msgstr "Finn" | ||||
|  | ||||
| msgid "Breakfast" | ||||
| msgstr "" | ||||
| msgstr "Reggeli" | ||||
|  | ||||
| msgid "Lunch" | ||||
| msgstr "" | ||||
| msgstr "Ebéd" | ||||
|  | ||||
| msgid "Dinner" | ||||
| msgstr "" | ||||
| msgstr "Vacsora" | ||||
|   | ||||
| @@ -8,6 +8,7 @@ | ||||
| # Gábor Szellő <gabor.szello@gmail.com>, 2020 | ||||
| # rozgonik <rozgonik1@gmail.com>, 2021 | ||||
| # Peter Gyetvai <gyetpet@mailbox.org>, 2021 | ||||
| # Vad Laszlo, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -15,7 +16,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Peter Gyetvai <gyetpet@mailbox.org>, 2021\n" | ||||
| "Last-Translator: Vad Laszlo, 2021\n" | ||||
| "Language-Team: Hungarian (https://www.transifex.com/grocy/teams/93189/hu/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -342,7 +343,7 @@ msgid "Manage API keys" | ||||
| msgstr "API kulcsok kezelése" | ||||
|  | ||||
| msgid "REST API browser" | ||||
| msgstr "" | ||||
| msgstr "REST API böngésző" | ||||
|  | ||||
| msgid "API keys" | ||||
| msgstr "API kulcsok" | ||||
| @@ -1218,7 +1219,7 @@ msgid "Meal plan" | ||||
| msgstr "Menü terv" | ||||
|  | ||||
| msgid "Add recipe on %s" | ||||
| msgstr "" | ||||
| msgstr "Recept hozzáadása ehhez: \"%s\"" | ||||
|  | ||||
| msgid "%s serving" | ||||
| msgid_plural "%s servings" | ||||
| @@ -1252,9 +1253,6 @@ msgstr "Soha" | ||||
| msgid "Today" | ||||
| msgstr "Ma" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "%1$s %2$s felhasználása romlottként" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Nincs a \"%s\" recept összes hozzávalója készleten, így nem használtunk fel " | ||||
| @@ -1536,12 +1534,8 @@ msgstr "Al-termékek minimális készlet mennyiségének halmozása" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Bekapcsolva az al-termékek minimális készlet mennyisége ebbe a termékbe lesz" | ||||
| " halmozva, vagyis az al-termék sose fog hiányozni, a hiány ennél a terméknél" | ||||
| " követhető" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Biztosan törölni szeretnéd ezt az átváltást?" | ||||
| @@ -2308,8 +2302,8 @@ msgstr "Megtartandó termék" | ||||
| msgid "Product to remove" | ||||
| msgstr "Eltávolítandó termék" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Hiba a termékek összevonása során" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Összevonás után, ez a termék megmarad" | ||||
| @@ -2367,6 +2361,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2379,14 +2376,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2523,3 +2512,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1258,9 +1258,6 @@ msgstr "Mai" | ||||
| msgid "Today" | ||||
| msgstr "Oggi" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Consumare %1$s di %2$s come avariato" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Non tutti gli ingredienti della ricetta \"%s\" sono disponibili in dispensa," | ||||
| @@ -1549,12 +1546,8 @@ msgstr "Quantità in dispensa minima di sottoprodotti accumulati" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Se abilitato,. la quantità  min. di sottoprodotti sarà accumulata in questo " | ||||
| "prodotto, il che significa che il sottoprodotto non sarà mai \"mancante\", " | ||||
| "solo questo prodotto" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Sei sicuro di rimuovere questa conversione?" | ||||
| @@ -2346,8 +2339,8 @@ msgstr "Prodotto da conservare" | ||||
| msgid "Product to remove" | ||||
| msgstr "Prodotto da rimuovere" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Errore durante l'unione dei prodotti" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Dopo l'unione, questo prodotto verrà mantenuto" | ||||
| @@ -2407,6 +2400,9 @@ msgstr "Scad." | ||||
| msgid "Print on label printer" | ||||
| msgstr "Stampa su stampante per etichette" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "Etichetta della voce di dispensa" | ||||
|  | ||||
| @@ -2419,17 +2415,6 @@ msgstr "Etichetta singola" | ||||
| msgid "Label per unit" | ||||
| msgstr "Etichetta per unità" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "Consenti la stampa di etichette per unità" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
| "Consenti la stampa di un'etichetta per unità al momento dell'acquisto (dopo " | ||||
| "la conversione) - ad es. 1 confezione acquistata aggiungendo 10 pezzi in " | ||||
| "dispensa stamperebbe 10 etichette" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "Errore durante l'esecuzione di WebHook" | ||||
|  | ||||
| @@ -2573,3 +2558,23 @@ msgstr "Sezione" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Sei sicuro di svuotare la lista della spesa?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1205,9 +1205,6 @@ msgstr "Never" | ||||
| msgid "Today" | ||||
| msgstr "오늘" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "상한제품 %2$s%1$s을 소비" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
|  | ||||
| @@ -1474,12 +1471,8 @@ msgstr "Accumulate sub products min. stock amount" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "이 변환을 제거하시겠습니까?" | ||||
| @@ -2190,7 +2183,7 @@ msgstr "" | ||||
| msgid "Product to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| @@ -2244,6 +2237,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2256,14 +2252,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2398,3 +2386,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -26,6 +26,7 @@ | ||||
| # Mark Peters <forkless@gmail.com>, 2021 | ||||
| # Daan Breur <daanbreur@gmail.com>, 2021 | ||||
| # Grocy NL, 2021 | ||||
| # mc bloch <transifex@mcbloch.dev>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -33,7 +34,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Grocy NL, 2021\n" | ||||
| "Last-Translator: mc bloch <transifex@mcbloch.dev>, 2021\n" | ||||
| "Language-Team: Dutch (https://www.transifex.com/grocy/teams/93189/nl/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -1274,9 +1275,6 @@ msgstr "Nooit" | ||||
| msgid "Today" | ||||
| msgstr "Vandaag" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Verbruik %1$s %2$s als bedorven" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Niet alle ingrediënten van het recept \"%s\" zijn op voorraad, er is niets " | ||||
| @@ -1563,12 +1561,8 @@ msgstr "Verzamel minimale voorraad sub producten" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Indien ingeschakeld zal de minimale voorraad van subproducten worden " | ||||
| "verzameld in dit product. Dat wil zeggen: het subproduct zal nooit " | ||||
| "\"ontbreken\", alleen dit product" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Weet u zeker dat u deze conversie wilt verwijderen." | ||||
| @@ -2152,6 +2146,9 @@ msgid "" | ||||
| "today + this amount of days, but only if the resulting date is not after the" | ||||
| " original due date (a value of 0 disables this)" | ||||
| msgstr "" | ||||
| "Toen dit product als geopend werd gemarkeerd, wordt de vervaldatum vervangen" | ||||
| " door vandaag + dit aantal dagen, maar alleen als de resulterende datum niet" | ||||
| " na de originele vervaldatum valt (een waarde van 0 schakelt dit uit) " | ||||
|  | ||||
| msgid "Default due days after opened" | ||||
| msgstr "Standaard houdbaarheidsdatum na openen" | ||||
| @@ -2349,8 +2346,8 @@ msgstr "Product te behouden" | ||||
| msgid "Product to remove" | ||||
| msgstr "Product te verwijderen" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Fout tijdens het samenvoegen van producten" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Na samenvoegen wordt dit product bewaard" | ||||
| @@ -2406,6 +2403,9 @@ msgid "DD" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Print on label printer" | ||||
| msgstr "Print op een label printer" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| @@ -2420,14 +2420,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "Fout tijdens het uitvoeren van WebHook" | ||||
|  | ||||
| @@ -2496,7 +2488,7 @@ msgid "Copy all meal plan entries of %s" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "A date is required" | ||||
| msgstr "" | ||||
| msgstr "Een datum is vereist" | ||||
|  | ||||
| msgid "Day" | ||||
| msgstr "Dag" | ||||
| @@ -2505,10 +2497,10 @@ msgid "Add recipe" | ||||
| msgstr "Voeg recept toe" | ||||
|  | ||||
| msgid "Copy this day" | ||||
| msgstr "" | ||||
| msgstr "Kopieer deze dag" | ||||
|  | ||||
| msgid "Date range" | ||||
| msgstr "" | ||||
| msgstr "Datumbereik" | ||||
|  | ||||
| msgid "%s month" | ||||
| msgid_plural "%s months" | ||||
| @@ -2527,7 +2519,7 @@ msgid "Copy recipe" | ||||
| msgstr "Kopieer recept" | ||||
|  | ||||
| msgid "Copy of %s" | ||||
| msgstr "" | ||||
| msgstr "Kopie van %s" | ||||
|  | ||||
| msgid "Add decimal separator automatically for price inputs" | ||||
| msgstr "" | ||||
| @@ -2539,28 +2531,49 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry" | ||||
| msgstr "" | ||||
| msgstr "Voorraad item" | ||||
|  | ||||
| msgid "Configure sections" | ||||
| msgstr "" | ||||
| msgstr "Secties configureren" | ||||
|  | ||||
| msgid "Meal plan sections" | ||||
| msgstr "" | ||||
| msgstr "Maaltijdplan secties" | ||||
|  | ||||
| msgid "Create meal plan section" | ||||
| msgstr "" | ||||
| msgstr "Maak een maaltijdplan-sectie" | ||||
|  | ||||
| msgid "Sections will be ordered by that number on the meal plan" | ||||
| msgstr "" | ||||
| "Secties zullen gesorteerd worden door het nummer bij het maaltijdplan." | ||||
|  | ||||
| msgid "Edit meal plan section" | ||||
| msgstr "" | ||||
| msgstr "Sectie maaltijdplan bewerken" | ||||
|  | ||||
| msgid "Are you sure to delete meal plan section \"%s\"?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Section" | ||||
| msgstr "" | ||||
| msgstr "Sectie" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Ben je zeker dat je de boodschappenlijst leeg wilt maken?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
| # Bernd Bestel <bernd@berrnd.de>, 2019 | ||||
| # Ruben Sperre <ruben@rsperre.net>, 2020 | ||||
| # Marius Borø <blizzwave@gmail.com>, 2021 | ||||
| # Tor Eirik Trandal <teitrand@hotmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -10,7 +11,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Marius Borø <blizzwave@gmail.com>, 2021\n" | ||||
| "Last-Translator: Tor Eirik Trandal <teitrand@hotmail.com>, 2021\n" | ||||
| "Language-Team: Norwegian (https://www.transifex.com/grocy/teams/93189/no/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -386,10 +387,10 @@ msgid "Finnish" | ||||
| msgstr "Finsk" | ||||
|  | ||||
| msgid "Breakfast" | ||||
| msgstr "" | ||||
| msgstr "Frokost" | ||||
|  | ||||
| msgid "Lunch" | ||||
| msgstr "" | ||||
| msgstr "Lunsj" | ||||
|  | ||||
| msgid "Dinner" | ||||
| msgstr "" | ||||
| msgstr "Middag" | ||||
|   | ||||
| @@ -3,8 +3,8 @@ | ||||
| # Andreas Henden <chairman2s.ah@gmail.com>, 2019 | ||||
| # Ruben Sperre <ruben@rsperre.net>, 2020 | ||||
| # Marius Borø <blizzwave@gmail.com>, 2021 | ||||
| # Tor Eirik Trandal <teitrand@hotmail.com>, 2021 | ||||
| # Bernd Bestel <bernd@berrnd.de>, 2021 | ||||
| # Tor Eirik Trandal <teitrand@hotmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -12,7 +12,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Bernd Bestel <bernd@berrnd.de>, 2021\n" | ||||
| "Last-Translator: Tor Eirik Trandal <teitrand@hotmail.com>, 2021\n" | ||||
| "Language-Team: Norwegian (https://www.transifex.com/grocy/teams/93189/no/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -336,7 +336,7 @@ msgid "Manage API keys" | ||||
| msgstr "Administrer API-Keys" | ||||
|  | ||||
| msgid "REST API browser" | ||||
| msgstr "" | ||||
| msgstr "REST API nettleser" | ||||
|  | ||||
| msgid "API keys" | ||||
| msgstr "API-Keys" | ||||
| @@ -1242,9 +1242,6 @@ msgstr "Aldri" | ||||
| msgid "Today" | ||||
| msgstr "I dag" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Forbruk %1$s av %2$s som har gått ut på dato" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Ikke alle ingrediensene i oppskriften \"%s\" er på lager, så ingenting er " | ||||
| @@ -1524,12 +1521,8 @@ msgstr "Akkumuler underordnede produkter i minimum beholdningsnivå" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Hvis aktivert vil minimum beholdningsnivå av underordnede produkter bli " | ||||
| "akkumulert inn i dette produktet. Dette betyr at det underordnede produktet " | ||||
| "aldri vil \"mangle\", kunne dette produktet." | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Er du sikker på at du ønsker å fjerne denne konverteringen?" | ||||
| @@ -2102,6 +2095,9 @@ msgid "" | ||||
| "today + this amount of days, but only if the resulting date is not after the" | ||||
| " original due date (a value of 0 disables this)" | ||||
| msgstr "" | ||||
| "Når dette produktet blir merket som åpnet, vil utløpsdato bli erstattet med " | ||||
| "dagens dato + dette antall dager, men bare dersom datoen ikke ender etter " | ||||
| "original utløpsdato (sett verdien til 0 for å deaktivere dette)" | ||||
|  | ||||
| msgid "Default due days after opened" | ||||
| msgstr "Standard forfallsdager etter åpning" | ||||
| @@ -2292,8 +2288,8 @@ msgstr "Produkt som skal beholdes" | ||||
| msgid "Product to remove" | ||||
| msgstr "Produkt som skal fjernes" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Feil under sammenslåing av produkter" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Etter sammenslåing så vil dette produktet bli beholdt" | ||||
| @@ -2329,180 +2325,204 @@ msgid "A product or a note is required" | ||||
| msgstr "Et produkt eller en merknad kreves" | ||||
|  | ||||
| msgid "grocycode" | ||||
| msgstr "" | ||||
| msgstr "grocykode" | ||||
|  | ||||
| msgid "Download" | ||||
| msgstr "" | ||||
| msgstr "Last ned" | ||||
|  | ||||
| # Example: Download *Product* grocycode | ||||
| msgid "Download %s grocycode" | ||||
| msgstr "" | ||||
| msgstr "Last ned %s grocykode" | ||||
|  | ||||
| msgid "" | ||||
| "grocycode is a unique referer to this %s in your grocy instance - print it " | ||||
| "onto a label and scan it like any other barcode" | ||||
| msgstr "" | ||||
| "grocykode er en unik referanse til denne %s i din grocy forekomst - print " | ||||
| "den på en etikett og bruk den som en hvilken som helst annen strekkode" | ||||
|  | ||||
| # Abbreviation for "due date" | ||||
| msgid "DD" | ||||
| msgstr "" | ||||
| msgstr "UD" | ||||
|  | ||||
| msgid "Print on label printer" | ||||
| msgstr "Skriv ut på etikettskriver" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
| msgstr "Lageroppføringsetikett" | ||||
|  | ||||
| msgid "No label" | ||||
| msgstr "" | ||||
| msgstr "Ingen etikett" | ||||
|  | ||||
| msgid "Single label" | ||||
| msgstr "" | ||||
| msgstr "Enkelt etikett" | ||||
|  | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
| msgstr "Etikett per enhet" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
| msgstr "Feil ved kjøring av WebHook" | ||||
|  | ||||
| # Example: Print *Product* grocycode on label printer | ||||
| msgid "Print %s grocycode on label printer" | ||||
| msgstr "" | ||||
| msgstr "Print %s grocykode på etikettskriver" | ||||
|  | ||||
| msgid "Open stock entry label in new window" | ||||
| msgstr "" | ||||
| msgstr "Åpne lageroppføringsetikett i nytt vindu" | ||||
|  | ||||
| msgid "Thermal printer" | ||||
| msgstr "" | ||||
| msgstr "Termisk skriver" | ||||
|  | ||||
| msgid "Printing" | ||||
| msgstr "" | ||||
| msgstr "Skriver ut" | ||||
|  | ||||
| msgid "Connecting to printer..." | ||||
| msgstr "" | ||||
| msgstr "Kobler til skriver..." | ||||
|  | ||||
| msgid "Unable to print" | ||||
| msgstr "" | ||||
| msgstr "Kan ikke skrive ut" | ||||
|  | ||||
| msgid "Only done items" | ||||
| msgstr "" | ||||
| msgstr "Bare ferdige elementer" | ||||
|  | ||||
| msgid "Show only in-stock products" | ||||
| msgstr "" | ||||
| msgstr "Vis bare produkter på lager" | ||||
|  | ||||
| msgid "Product description" | ||||
| msgstr "" | ||||
| msgstr "Produktbeskrivelse" | ||||
|  | ||||
| # Example: *3.21 USD* per *Pack* | ||||
| msgid "%1$s per %2$s" | ||||
| msgstr "" | ||||
| msgstr "%1$s per %2$s" | ||||
|  | ||||
| msgid "Mark this item as undone" | ||||
| msgstr "" | ||||
| msgstr "Merk dette elementet som ferdig" | ||||
|  | ||||
| msgid "Mandatory" | ||||
| msgstr "" | ||||
| msgstr "Påkrevd" | ||||
|  | ||||
| msgid "Mandatory Userfield" | ||||
| msgstr "" | ||||
| msgstr "Påkrevd brukerfelt" | ||||
|  | ||||
| msgid "When enabled, then this field must be filled on the destination form" | ||||
| msgstr "" | ||||
| "Når dette feltet er aktivert, må dette feltet fylles ut på " | ||||
| "destinasjonsskjemaet" | ||||
|  | ||||
| msgid "In-stock products" | ||||
| msgstr "" | ||||
| msgstr "Produkter på lager" | ||||
|  | ||||
| msgid "Timestamp" | ||||
| msgstr "" | ||||
| msgstr "Tidsstempel" | ||||
|  | ||||
| msgid "Should not be frozen" | ||||
| msgstr "" | ||||
| msgstr "Bør ikke fryses" | ||||
|  | ||||
| msgid "" | ||||
| "When enabled, on moving this product to a freezer location (so when freezing" | ||||
| " it), a warning will be shown" | ||||
| msgstr "" | ||||
| "Når aktivert, vises en advarsel når du flytter dette produktet til en " | ||||
| "fryserlokasjon (når du fryser det)" | ||||
|  | ||||
| msgid "This product shouldn't be frozen" | ||||
| msgstr "" | ||||
| msgstr "Dette produktet bør ikke fryses" | ||||
|  | ||||
| msgid "Copy all meal plan entries of %s" | ||||
| msgstr "" | ||||
| msgstr "Kopier alle måltidsoppføringer av %s" | ||||
|  | ||||
| msgid "A date is required" | ||||
| msgstr "" | ||||
| msgstr "En dato er nødvendig" | ||||
|  | ||||
| msgid "Day" | ||||
| msgstr "" | ||||
| msgstr "Dag" | ||||
|  | ||||
| msgid "Add recipe" | ||||
| msgstr "" | ||||
| msgstr "Legg til oppskrift" | ||||
|  | ||||
| msgid "Copy this day" | ||||
| msgstr "" | ||||
| msgstr "Kopier denne dagen" | ||||
|  | ||||
| msgid "Date range" | ||||
| msgstr "" | ||||
| msgstr "Datointervall" | ||||
|  | ||||
| msgid "%s month" | ||||
| msgid_plural "%s months" | ||||
| msgstr[0] "" | ||||
| msgstr[1] "" | ||||
| msgstr[0] "%s måned" | ||||
| msgstr[1] "%s måneder" | ||||
|  | ||||
| msgid "%s year" | ||||
| msgid_plural "%s years" | ||||
| msgstr[0] "" | ||||
| msgstr[1] "" | ||||
| msgstr[0] "%s år" | ||||
| msgstr[1] "%s år" | ||||
|  | ||||
| msgid "Display product" | ||||
| msgstr "" | ||||
| msgstr "Vis produkt" | ||||
|  | ||||
| msgid "Copy recipe" | ||||
| msgstr "" | ||||
| msgstr "Kopier oppskrift" | ||||
|  | ||||
| msgid "Copy of %s" | ||||
| msgstr "" | ||||
| msgstr "Kopi av %s" | ||||
|  | ||||
| msgid "Add decimal separator automatically for price inputs" | ||||
| msgstr "" | ||||
| msgstr "Legg til desimalseparator automatisk for prisinntasting" | ||||
|  | ||||
| msgid "" | ||||
| "When enabled, you always have to enter the value including decimal places, " | ||||
| "the decimal separator will be automatically added based on the amount of " | ||||
| "allowed decimal places" | ||||
| msgstr "" | ||||
| "Når aktivert, må du alltid angi verdien inkludert desimaler, " | ||||
| "desimalseparatoren legges til automatisk basert på mengden tillatte " | ||||
| "desimaler" | ||||
|  | ||||
| msgid "Stock entry" | ||||
| msgstr "" | ||||
| msgstr "Lageroppføring" | ||||
|  | ||||
| msgid "Configure sections" | ||||
| msgstr "" | ||||
| msgstr "Konfigurer seksjoner" | ||||
|  | ||||
| msgid "Meal plan sections" | ||||
| msgstr "" | ||||
| msgstr "Måltidsplanseksjon" | ||||
|  | ||||
| msgid "Create meal plan section" | ||||
| msgstr "" | ||||
| msgstr "Opprett måltidsplanseksjon" | ||||
|  | ||||
| msgid "Sections will be ordered by that number on the meal plan" | ||||
| msgstr "" | ||||
| msgstr "Seksjoner vil bli sortert av det nummeret på måltidsplanen" | ||||
|  | ||||
| msgid "Edit meal plan section" | ||||
| msgstr "" | ||||
| msgstr "Rediger måltidplanseksjonen" | ||||
|  | ||||
| msgid "Are you sure to delete meal plan section \"%s\"?" | ||||
| msgstr "" | ||||
| msgstr "Er du sikker på at du vil slette måltidsplanseksjonen \"%s\"?" | ||||
|  | ||||
| msgid "Section" | ||||
| msgstr "" | ||||
| msgstr "Seksjon" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Er du sikker du ønsker å slette handlelisten?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -11,6 +11,7 @@ | ||||
| # Marcin Radoszewski <moriturius@gmail.com>, 2021 | ||||
| # Konrad Mazurczak <konrad.mazurczak@gmail.com>, 2021 | ||||
| # Marcin Redlica <marcin.redlica@gmail.com>, 2021 | ||||
| # Jakub Kluba <jakub.kluba@gmail.com>, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -18,7 +19,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Marcin Redlica <marcin.redlica@gmail.com>, 2021\n" | ||||
| "Last-Translator: Jakub Kluba <jakub.kluba@gmail.com>, 2021\n" | ||||
| "Language-Team: Polish (https://www.transifex.com/grocy/teams/93189/pl/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -356,7 +357,7 @@ msgid "Manage API keys" | ||||
| msgstr "Zarządzaj kluczami API" | ||||
|  | ||||
| msgid "REST API browser" | ||||
| msgstr "" | ||||
| msgstr "Przeglądarka REST API" | ||||
|  | ||||
| msgid "API keys" | ||||
| msgstr "Klucze API" | ||||
| @@ -838,7 +839,7 @@ msgid "Create equipment" | ||||
| msgstr "Dodaj wyposażenie" | ||||
|  | ||||
| msgid "The current file will be deleted on save" | ||||
| msgstr "" | ||||
| msgstr "Bieżący plik zostanie usunięty podczas zapisu" | ||||
|  | ||||
| msgid "No picture available" | ||||
| msgstr "Brak zdjęcia" | ||||
| @@ -1279,9 +1280,6 @@ msgstr "Nigdy" | ||||
| msgid "Today" | ||||
| msgstr "Dzisiaj" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "%2$s - %1$s - oznacz jako zepsute" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Nie wszystkie składniki przepisu \"%s\" są dostępne, nic nie zostało " | ||||
| @@ -1563,12 +1561,8 @@ msgstr "Sumuj min. ilość dla produktów podrzędnych" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Jeżeli włączone, minimalna ilość produktów podrzędnych będzie sumowana w tym" | ||||
| " produkcie. Oznacza to, że produktu podrzędnego nigdy nie będzie brakować; " | ||||
| "jedynie tego produktu." | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Czy na pewno chcesz usunąć tą konwersję?" | ||||
| @@ -1639,7 +1633,7 @@ msgid "There are no units available at this location" | ||||
| msgstr "Nie ma żadnych jednostek dostępnych dla tej lokalizacji" | ||||
|  | ||||
| msgid "Amount: %1$s; Due on %2$s; Bought on %3$s" | ||||
| msgstr "" | ||||
| msgstr "Ilość: %1$s; Ważna do %2$s; Kupiona %3$s" | ||||
|  | ||||
| msgid "Transfered %1$s of %2$s from %3$s to %4$s" | ||||
| msgstr "Przeniesiono %1$s z %2$s od %3$s do %4$s" | ||||
| @@ -2082,7 +2076,7 @@ msgid "" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Copy" | ||||
| msgstr "" | ||||
| msgstr "Kopiuj" | ||||
|  | ||||
| msgid "Are you sure to remove this barcode?" | ||||
| msgstr "Czy na pewno usunąć ten kod kreskowy?" | ||||
| @@ -2296,7 +2290,7 @@ msgstr "Produkt do zachowania" | ||||
| msgid "Product to remove" | ||||
| msgstr "Produkt do usunięcia" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| @@ -2350,6 +2344,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2362,14 +2359,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2381,16 +2370,16 @@ msgid "Open stock entry label in new window" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Thermal printer" | ||||
| msgstr "" | ||||
| msgstr "Drukarka termiczna" | ||||
|  | ||||
| msgid "Printing" | ||||
| msgstr "" | ||||
| msgstr "Drukowanie" | ||||
|  | ||||
| msgid "Connecting to printer..." | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Unable to print" | ||||
| msgstr "" | ||||
| msgstr "Nie można wydrukować" | ||||
|  | ||||
| msgid "Only done items" | ||||
| msgstr "" | ||||
| @@ -2399,7 +2388,7 @@ msgid "Show only in-stock products" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Product description" | ||||
| msgstr "" | ||||
| msgstr "Opis produktu" | ||||
|  | ||||
| # Example: *3.21 USD* per *Pack* | ||||
| msgid "%1$s per %2$s" | ||||
| @@ -2441,10 +2430,10 @@ msgid "A date is required" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Day" | ||||
| msgstr "" | ||||
| msgstr "Dzień" | ||||
|  | ||||
| msgid "Add recipe" | ||||
| msgstr "" | ||||
| msgstr "Dodaj przepis" | ||||
|  | ||||
| msgid "Copy this day" | ||||
| msgstr "" | ||||
| @@ -2470,7 +2459,7 @@ msgid "Display product" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Copy recipe" | ||||
| msgstr "" | ||||
| msgstr "Kopiuj przepis" | ||||
|  | ||||
| msgid "Copy of %s" | ||||
| msgstr "" | ||||
| @@ -2510,3 +2499,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Czy na pewno chcesz wyczyścić listę zakupów?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| # Translators: | ||||
| # Andre Souto <andre.jost@gmail.com>, 2020 | ||||
| # Jefferson Brito Passos dos Santos <jeffersantoss@gmail.com>, 2021 | ||||
| # Fernando Luiz Bonifácio de Oliveira, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -9,7 +10,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Jefferson Brito Passos dos Santos <jeffersantoss@gmail.com>, 2021\n" | ||||
| "Last-Translator: Fernando Luiz Bonifácio de Oliveira, 2021\n" | ||||
| "Language-Team: Portuguese (Brazil) (https://www.transifex.com/grocy/teams/93189/pt_BR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -386,10 +387,10 @@ msgid "Finnish" | ||||
| msgstr "Finlandês" | ||||
|  | ||||
| msgid "Breakfast" | ||||
| msgstr "" | ||||
| msgstr "Café da Manhã" | ||||
|  | ||||
| msgid "Lunch" | ||||
| msgstr "" | ||||
| msgstr "Almoço" | ||||
|  | ||||
| msgid "Dinner" | ||||
| msgstr "" | ||||
| msgstr "Janta" | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
| # Translators: | ||||
| # Jefferson Brito Passos dos Santos <jeffersantoss@gmail.com>, 2021 | ||||
| # Wendell Mendes <wendellmendes@live.com>, 2021 | ||||
| # Fernando Luiz Bonifácio de Oliveira, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -9,7 +10,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2020-08-29 16:33+0000\n" | ||||
| "Last-Translator: Wendell Mendes <wendellmendes@live.com>, 2021\n" | ||||
| "Last-Translator: Fernando Luiz Bonifácio de Oliveira, 2021\n" | ||||
| "Language-Team: Portuguese (Brazil) (https://www.transifex.com/grocy/teams/93189/pt_BR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -48,7 +49,7 @@ msgstr "BATERIAS_RASTREAR_CICLO_CARGA" | ||||
|  | ||||
| # Track execution | ||||
| msgid "CHORE_TRACK_EXECUTION" | ||||
| msgstr "" | ||||
| msgstr "RASTREAR_EXECUCAO_DE_TAREFAS_DOMESTICAS" | ||||
|  | ||||
| # Undo execution | ||||
| msgid "CHORE_UNDO_EXECUTION" | ||||
|   | ||||
| @@ -11,6 +11,7 @@ | ||||
| # Jonatha Nogueira Barbosa <jb.barbosa133@gmail.com>, 2021 | ||||
| # Bruno Mouta <brumouta@gmail.com>, 2021 | ||||
| # João Filipe Cavichiolo Storrer <jofi_casto@hotmail.com>, 2021 | ||||
| # Fernando Luiz Bonifácio de Oliveira, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -18,7 +19,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: João Filipe Cavichiolo Storrer <jofi_casto@hotmail.com>, 2021\n" | ||||
| "Last-Translator: Fernando Luiz Bonifácio de Oliveira, 2021\n" | ||||
| "Language-Team: Portuguese (Brazil) (https://www.transifex.com/grocy/teams/93189/pt_BR/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -1254,9 +1255,6 @@ msgstr "Nunca" | ||||
| msgid "Today" | ||||
| msgstr "Hoje" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Consumir %1$s de %2$s como estragado" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Nem todos os ingredientes da receita \"%s\" estão no estoque, nada foi " | ||||
| @@ -1541,12 +1539,8 @@ msgstr "Acumular valor mínimo do estoque de subprodutos" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Se ativado, a quantidade mínima de estoque de subprodutos será acumulada " | ||||
| "neste produto, significa que o subproduto nunca estará \"ausente\", somente " | ||||
| "este produto" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Você tem certeza que quer remover esta conversão?" | ||||
| @@ -2053,9 +2047,11 @@ msgid "" | ||||
| "Show a warning when the due date of the purchased product is earlier than " | ||||
| "the next due date in stock" | ||||
| msgstr "" | ||||
| "Mostrar aviso quando a validade do produto comprado for inferior à validade " | ||||
| "mais curta no estoque" | ||||
|  | ||||
| msgid "This is due earlier than already in-stock items" | ||||
| msgstr "" | ||||
| msgstr "Validade está mais curta do que itens no estoque" | ||||
|  | ||||
| msgid "" | ||||
| "When enabled, after changing/scanning a product and if all fields could be " | ||||
| @@ -2127,6 +2123,9 @@ msgid "" | ||||
| "today + this amount of days, but only if the resulting date is not after the" | ||||
| " original due date (a value of 0 disables this)" | ||||
| msgstr "" | ||||
| "Quando o produto for marcado como aberto, a validade será substituída por " | ||||
| "hoje + esta quantidade de dias, mas apenas se a data resultante não for " | ||||
| "posterior à validade original (o valor de 0 desativa isto)" | ||||
|  | ||||
| msgid "Default due days after opened" | ||||
| msgstr "Dias de vencimento após o aberto." | ||||
| @@ -2310,8 +2309,8 @@ msgstr "Produto para ser mantido" | ||||
| msgid "Product to remove" | ||||
| msgstr "Produto para ser removido" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Erro durante a combinação de produtos" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "Após a combinação, este produto será mantido" | ||||
| @@ -2348,14 +2347,14 @@ msgid "A product or a note is required" | ||||
| msgstr "É necessário um produto ou uma nota" | ||||
|  | ||||
| msgid "grocycode" | ||||
| msgstr "" | ||||
| msgstr "grocycode" | ||||
|  | ||||
| msgid "Download" | ||||
| msgstr "" | ||||
| msgstr "Baixar" | ||||
|  | ||||
| # Example: Download *Product* grocycode | ||||
| msgid "Download %s grocycode" | ||||
| msgstr "" | ||||
| msgstr "Baixar grocycode de %s" | ||||
|  | ||||
| msgid "" | ||||
| "grocycode is a unique referer to this %s in your grocy instance - print it " | ||||
| @@ -2369,6 +2368,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2379,34 +2381,26 @@ msgid "Single label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
| msgstr "Etiqueta por unidade" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
| msgstr "Erro ao executar WebHook" | ||||
|  | ||||
| # Example: Print *Product* grocycode on label printer | ||||
| msgid "Print %s grocycode on label printer" | ||||
| msgstr "" | ||||
| msgstr "Imprimir grocycode de %s na impressora de etiqueta" | ||||
|  | ||||
| msgid "Open stock entry label in new window" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Thermal printer" | ||||
| msgstr "" | ||||
| msgstr "Impressora térmica" | ||||
|  | ||||
| msgid "Printing" | ||||
| msgstr "" | ||||
| msgstr "Imprimindo" | ||||
|  | ||||
| msgid "Connecting to printer..." | ||||
| msgstr "" | ||||
| msgstr "Conectando à impressora..." | ||||
|  | ||||
| msgid "Unable to print" | ||||
| msgstr "" | ||||
| @@ -2415,14 +2409,14 @@ msgid "Only done items" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Show only in-stock products" | ||||
| msgstr "" | ||||
| msgstr "Mostrar apenas produtos em estoque" | ||||
|  | ||||
| msgid "Product description" | ||||
| msgstr "" | ||||
| msgstr "Descrição do produto" | ||||
|  | ||||
| # Example: *3.21 USD* per *Pack* | ||||
| msgid "%1$s per %2$s" | ||||
| msgstr "" | ||||
| msgstr "%1$s por %2$s" | ||||
|  | ||||
| msgid "Mark this item as undone" | ||||
| msgstr "" | ||||
| @@ -2525,3 +2519,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| #  | ||||
| # Translators: | ||||
| # Ricardo Rodrigues <fenix999@gmail.com>, 2020 | ||||
| # Jorge Araújo, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -8,7 +9,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-09-17 10:45+0000\n" | ||||
| "Last-Translator: Ricardo Rodrigues <fenix999@gmail.com>, 2020\n" | ||||
| "Last-Translator: Jorge Araújo, 2021\n" | ||||
| "Language-Team: Portuguese (Portugal) (https://www.transifex.com/grocy/teams/93189/pt_PT/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -21,7 +22,7 @@ msgid "no-assignment" | ||||
| msgstr "não-atribuído " | ||||
|  | ||||
| msgid "who-least-did-first" | ||||
| msgstr "quem-fez-menos-primeiro" | ||||
| msgstr "quem-menos-fez-primeiro" | ||||
|  | ||||
| msgid "random" | ||||
| msgstr "aleatório" | ||||
|   | ||||
| @@ -6,8 +6,8 @@ | ||||
| # Maksim Moiseikin <m.moiseikin@gmail.com>, 2020 | ||||
| # unwarkz <git@unwar.kz>, 2021 | ||||
| # J K <su1ka.box@gmail.com>, 2021 | ||||
| # Sergey Kodolov, 2021 | ||||
| # Pavel Pletenev <cpp.create@gmail.com>, 2021 | ||||
| # Sergey Kodolov, 2021 | ||||
| #  | ||||
| msgid "" | ||||
| msgstr "" | ||||
| @@ -15,7 +15,7 @@ msgstr "" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2019-05-01T17:59:17+00:00\n" | ||||
| "PO-Revision-Date: 2019-05-01 17:42+0000\n" | ||||
| "Last-Translator: Pavel Pletenev <cpp.create@gmail.com>, 2021\n" | ||||
| "Last-Translator: Sergey Kodolov, 2021\n" | ||||
| "Language-Team: Russian (https://www.transifex.com/grocy/teams/93189/ru/)\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -1289,9 +1289,6 @@ msgstr "Никогда" | ||||
| msgid "Today" | ||||
| msgstr "Сегодня" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Пометить %1$s %2$s как испорченное" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "Не все ингредиенты рецепта \"%s\" есть в запасе, ничего не изъято" | ||||
|  | ||||
| @@ -1571,12 +1568,8 @@ msgstr "Накапливать мин. заданное количество с | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Если включено, то мин. заданные кол-ва субпродуктов будут накапливаться и " | ||||
| "отслеживаться в этом продукте. Это означает, что субпродукты никогда не " | ||||
| "будут \"отсутствующими\", в отличии от этого продукта" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Вы уверены, что нужно удалить это преобразование?" | ||||
| @@ -1840,7 +1833,7 @@ msgid "Calories" | ||||
| msgstr "Калории" | ||||
|  | ||||
| msgid "means %1$s per %2$s" | ||||
| msgstr "" | ||||
| msgstr "означает %1$s за %2$s" | ||||
|  | ||||
| msgid "Create inverse QU conversion" | ||||
| msgstr "Создать обратное преобразование ЕИ" | ||||
| @@ -1883,6 +1876,7 @@ msgstr "Изменить Штрихкод" | ||||
|  | ||||
| msgid "Not enough in stock (not included in costs), %s ingredient missing" | ||||
| msgstr "" | ||||
| "Недостаточно в запасах (не входит в стоимость), отсутствует %s ингредиент" | ||||
|  | ||||
| msgid "" | ||||
| "Based on the prices of the default consume rule which is \"Opened first, " | ||||
| @@ -1896,6 +1890,8 @@ msgid "" | ||||
| "Not enough in stock (not included in costs), %1$s missing, %2$s already on " | ||||
| "shopping list" | ||||
| msgstr "" | ||||
| "Недостаточно в запасах (не входит в стоимость), отсутствует %1$s, %2$s уже в" | ||||
| " списке покупок " | ||||
|  | ||||
| msgid "Quantity unit stock cannot be changed after first purchase" | ||||
| msgstr "Единица измерения не может быть изменена после первой покупки" | ||||
| @@ -1973,7 +1969,7 @@ msgid "Value" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "%s total value" | ||||
| msgstr "" | ||||
| msgstr "%s всего" | ||||
|  | ||||
| msgid "" | ||||
| "Show purchased date on purchase and inventory page (otherwise the purchased " | ||||
| @@ -2328,8 +2324,8 @@ msgstr "" | ||||
| msgid "Product to remove" | ||||
| msgstr "Продукт для удаления" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "Ошибка при объединении продуктов" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "После объединения, этот продукт будет сохранён" | ||||
| @@ -2382,6 +2378,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2394,14 +2393,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2542,3 +2533,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "Вы уверены, что нужно очистить список покупок?" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1265,9 +1265,6 @@ msgstr "Nikdy" | ||||
| msgid "Today" | ||||
| msgstr "Dnes" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Spotrebovať %1$s %2$s ako pokazené" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
| "Nie všetky ingredience v recepte \"%s\" sú v zásobe, nič nebude odstránené" | ||||
| @@ -1549,12 +1546,8 @@ msgstr "Sčítavať min. skladové množstvá podriadených výrobkov" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Ak je povolené, min. skladové množstvá podvýrobkov budú sčítané do tohto " | ||||
| "výrobku, to znamená, že podvýrobky nikdy nebudú \"chýbať\", iba tento " | ||||
| "výrobok" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Naozaj si prajete odstrániť tento prevod?" | ||||
| @@ -2277,7 +2270,7 @@ msgstr "" | ||||
| msgid "Product to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| @@ -2331,6 +2324,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2343,14 +2339,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2491,3 +2479,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1172,9 +1172,6 @@ msgstr "" | ||||
| msgid "Today" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -1414,7 +1411,7 @@ msgstr "" | ||||
| msgid "Accumulate sub products min. stock amount" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "If enabled, the min. stock amount of sub products will be accumulated into this product, means the sub product will never be \"missing\", only this product" | ||||
| msgid "If enabled, the min. stock amount of sub products will be accumulated into this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| @@ -2051,7 +2048,7 @@ msgstr "" | ||||
| msgid "Product to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| @@ -2098,6 +2095,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2110,12 +2110,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow printing of one label per unit on purchase (after conversion) - e.g. 1 purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2247,3 +2241,21 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, all occurences of this chore will be replaced by the kept chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1244,9 +1244,6 @@ msgstr "Aldrig" | ||||
| msgid "Today" | ||||
| msgstr "Idag" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "Konsumera%1$s av %2$s som förstört " | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "Inte alla ingredienser i recept \"%s\" finns i lager, inget togs bort" | ||||
|  | ||||
| @@ -1521,12 +1518,8 @@ msgstr "Ackumulera minsta lagersumma för underprodukt" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
| "Om detta är aktiverat kommer minsta lagerantal för underprodukter att " | ||||
| "ackumuleras till denna produkt, vilket innebär att underprodukten aldrig " | ||||
| "kommer saknas, endast denna överordnade produkt" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "Är du säker på att du vill radera denna konvertering?" | ||||
| @@ -2251,7 +2244,7 @@ msgstr "" | ||||
| msgid "Product to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| @@ -2305,6 +2298,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2317,14 +2313,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2461,3 +2449,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1192,9 +1192,6 @@ msgstr "从不" | ||||
| msgid "Today" | ||||
| msgstr "今天" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "消耗%2$s中的%1$s作为被损坏的" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "并不是所有的食谱“%s”的成分在库存,没有删除" | ||||
|  | ||||
| @@ -1453,9 +1450,8 @@ msgstr "累积子产品的最小库存数量" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| msgstr "如果启用,子产品的最小库存数量将累计到此产品中,意味着子产品将永远不会“丢失”,只有此产品" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "您确定要删除此转换吗?" | ||||
| @@ -2154,8 +2150,8 @@ msgstr "保留的产品" | ||||
| msgid "Product to remove" | ||||
| msgstr "要删除的产品" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgstr "合并产品时出错" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| msgstr "合并后,此产品将保留" | ||||
| @@ -2208,6 +2204,9 @@ msgstr "期限" | ||||
| msgid "Print on label printer" | ||||
| msgstr "标签打印机打印" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "库存条目标签" | ||||
|  | ||||
| @@ -2220,14 +2219,6 @@ msgstr "单一标签" | ||||
| msgid "Label per unit" | ||||
| msgstr "标签单位" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "允许标签打印每单位" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "允许打印一个标签每单位购买(转换后)-例如1购买包装增加10件库存将打印10个标签" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "执行WebHook时出错" | ||||
|  | ||||
| @@ -2362,3 +2353,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -1192,9 +1192,6 @@ msgstr "從未" | ||||
| msgid "Today" | ||||
| msgstr "今天" | ||||
|  | ||||
| msgid "Consume %1$s of %2$s as spoiled" | ||||
| msgstr "將 %2$s 的 %1$s 設為報廢" | ||||
|  | ||||
| msgid "Not all ingredients of recipe \"%s\" are in stock, nothing removed" | ||||
| msgstr "食譜「%s」並非所有食材都有庫存,未處理。" | ||||
|  | ||||
| @@ -1453,9 +1450,8 @@ msgstr "累計子物品的最小庫存數量" | ||||
|  | ||||
| msgid "" | ||||
| "If enabled, the min. stock amount of sub products will be accumulated into " | ||||
| "this product, means the sub product will never be \"missing\", only this " | ||||
| "product" | ||||
| msgstr "啟用後,子物品的最小庫存數量將累計到該物品中,這代表子物品將永遠不會「不足」。" | ||||
| "this product, means the sub product will never be missing, only this product" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Are you sure to remove this conversion?" | ||||
| msgstr "確定要刪除此單位轉換嗎?" | ||||
| @@ -2154,7 +2150,7 @@ msgstr "" | ||||
| msgid "Product to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while merging products" | ||||
| msgid "Error while merging" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this product will be kept" | ||||
| @@ -2208,6 +2204,9 @@ msgstr "" | ||||
| msgid "Print on label printer" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Default stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Stock entry label" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2220,14 +2219,6 @@ msgstr "" | ||||
| msgid "Label per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Allow label printing per unit" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "Allow printing of one label per unit on purchase (after conversion) - e.g. 1" | ||||
| " purchased pack adding 10 pieces of stock would print 10 labels" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Error while executing WebHook" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -2362,3 +2353,23 @@ msgstr "" | ||||
|  | ||||
| msgid "Are you sure to empty the shopping list?" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "This is the default which will be prefilled on purchase" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Merge chores" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to keep" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "After merging, this chore will be kept" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "Chore to remove" | ||||
| msgstr "" | ||||
|  | ||||
| msgid "" | ||||
| "After merging, all occurences of this chore will be replaced by the kept " | ||||
| "chore (means this chore will not exist anymore)" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -26,7 +26,7 @@ class ReverseProxyAuthMiddleware extends AuthMiddleware | ||||
| 		if (count($username) !== 1) | ||||
| 		{ | ||||
| 			// Invalid configuration of Proxy | ||||
| 			throw new \Exception('ReverseProxyAuthMiddleware: Invalid username from proxy: ' . var_dump($username)); | ||||
| 			throw new \Exception('ReverseProxyAuthMiddleware: ' . GROCY_REVERSE_PROXY_AUTH_HEADER . ' header is missing or invalid'); | ||||
| 		} | ||||
| 		$username = $username[0]; | ||||
|  | ||||
|   | ||||
							
								
								
									
										53
									
								
								migrations/0151.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								migrations/0151.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| CREATE TRIGGER enforce_min_stock_amount_for_cumulated_childs_INS AFTER INSERT ON products | ||||
| BEGIN | ||||
| 	/* | ||||
| 		When a parent product has cumulate_min_stock_amount_of_sub_products enabled, | ||||
| 		the child should not have any min_stock_amount | ||||
| 	*/ | ||||
|  | ||||
| 	UPDATE products | ||||
| 	SET min_stock_amount = 0 | ||||
| 	WHERE id IN ( | ||||
| 			SELECT | ||||
| 				p_child.id | ||||
| 			FROM products p_parent | ||||
| 			JOIN products p_child | ||||
| 				ON p_child.parent_product_id = p_parent.id | ||||
| 			WHERE p_parent.id = NEW.id | ||||
| 				AND IFNULL(p_parent.cumulate_min_stock_amount_of_sub_products, 0) = 1 | ||||
| 			) | ||||
| 		AND min_stock_amount > 0; | ||||
| END; | ||||
|  | ||||
| CREATE TRIGGER enforce_min_stock_amount_for_cumulated_childs_UPD AFTER UPDATE ON products | ||||
| BEGIN | ||||
| 	/* | ||||
| 		When a parent product has cumulate_min_stock_amount_of_sub_products enabled, | ||||
| 		the child should not have any min_stock_amount | ||||
| 	*/ | ||||
|  | ||||
| 	UPDATE products | ||||
| 	SET min_stock_amount = 0 | ||||
| 	WHERE id IN ( | ||||
| 			SELECT | ||||
| 				p_child.id | ||||
| 			FROM products p_parent | ||||
| 			JOIN products p_child | ||||
| 				ON p_child.parent_product_id = p_parent.id | ||||
| 			WHERE p_parent.id = NEW.id | ||||
| 				AND IFNULL(p_parent.cumulate_min_stock_amount_of_sub_products, 0) = 1 | ||||
| 			) | ||||
| 		AND min_stock_amount > 0; | ||||
| END; | ||||
|  | ||||
| UPDATE products | ||||
| SET min_stock_amount = 0 | ||||
| WHERE id IN ( | ||||
| 	SELECT | ||||
| 		p_child.id | ||||
| 	FROM products p_parent | ||||
| 	JOIN products p_child | ||||
| 		ON p_child.parent_product_id = p_parent.id | ||||
| 	WHERE IFNULL(p_parent.cumulate_min_stock_amount_of_sub_products, 0) = 1 | ||||
| 	) | ||||
| 	AND min_stock_amount > 0; | ||||
							
								
								
									
										116
									
								
								migrations/0152.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								migrations/0152.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| DROP VIEW quantity_unit_conversions_resolved; | ||||
| CREATE VIEW quantity_unit_conversions_resolved | ||||
| AS | ||||
|  | ||||
| SELECT * | ||||
| FROM ( | ||||
|  | ||||
| -- 1. Product "purchase to stock" conversion factor | ||||
| SELECT | ||||
| 	-1 AS id, -- Dummy, LessQL needs an id column | ||||
| 	p.id AS product_id, | ||||
| 	p.qu_id_purchase AS from_qu_id, | ||||
| 	qu_from.name AS from_qu_name, | ||||
| 	qu_from.name_plural AS from_qu_name_plural, | ||||
| 	p.qu_id_stock AS to_qu_id, | ||||
| 	qu_to.name AS to_qu_name, | ||||
| 	qu_to.name_plural AS to_qu_name_plural, | ||||
| 	p.qu_factor_purchase_to_stock AS factor, | ||||
| 	'1 product purchase to stock factor' AS source | ||||
| FROM products p | ||||
| JOIN quantity_units qu_from | ||||
| 	ON p.qu_id_purchase = qu_from.id | ||||
| JOIN quantity_units qu_to | ||||
| 	ON p.qu_id_stock = qu_to.id | ||||
| UNION -- Inversed | ||||
| SELECT | ||||
| 	-1 AS id, -- Dummy, LessQL needs an id column | ||||
| 	p.id AS product_id, | ||||
| 	p.qu_id_stock AS from_qu_id, | ||||
| 	qu_to.name AS from_qu_name, | ||||
| 	qu_to.name_plural AS from_qu_name_plural, | ||||
| 	p.qu_id_purchase AS to_qu_id, | ||||
| 	qu_from.name AS to_qu_name, | ||||
| 	qu_from.name_plural AS to_qu_name_plural, | ||||
| 	1 / p.qu_factor_purchase_to_stock AS factor, | ||||
| 	'1 product purchase to stock factor (inversed)' AS source | ||||
| FROM products p | ||||
| JOIN quantity_units qu_from | ||||
| 	ON p.qu_id_purchase = qu_from.id | ||||
| JOIN quantity_units qu_to | ||||
| 	ON p.qu_id_stock = qu_to.id | ||||
| WHERE p.qu_id_stock != p.qu_id_purchase -- => Only when QU stock st not the same as QU purchase | ||||
|  | ||||
| UNION | ||||
|  | ||||
| -- 2. Product specific QU overrides | ||||
| SELECT | ||||
| 	-1 AS id, -- Dummy, LessQL needs an id column | ||||
| 	p.id AS product_id, | ||||
| 	quc.from_qu_id AS from_qu_id, | ||||
| 	qu_from.name AS from_qu_name, | ||||
| 	qu_from.name_plural AS from_qu_name_plural, | ||||
| 	quc.to_qu_id AS to_qu_id, | ||||
| 	qu_to.name AS to_qu_name, | ||||
| 	qu_to.name_plural AS to_qu_name_plural, | ||||
| 	quc.factor AS factor, | ||||
| 	'2 product override' AS source | ||||
| FROM products p | ||||
| JOIN quantity_unit_conversions quc | ||||
| 	ON p.id = quc.product_id | ||||
| JOIN quantity_units qu_from | ||||
| 	ON quc.from_qu_id = qu_from.id | ||||
| JOIN quantity_units qu_to | ||||
| 	ON quc.to_qu_id = qu_to.id | ||||
|  | ||||
| UNION | ||||
|  | ||||
| -- 3. Default (direct) QU conversion factors | ||||
| SELECT | ||||
| 	-1 AS id, -- Dummy, LessQL needs an id column | ||||
| 	p.id AS product_id, | ||||
| 	p.qu_id_stock AS from_qu_id, | ||||
| 	qu_from.name AS from_qu_name, | ||||
| 	qu_from.name_plural AS from_qu_name_plural, | ||||
| 	quc.to_qu_id AS to_qu_id, | ||||
| 	qu_to.name AS to_qu_name, | ||||
| 	qu_to.name_plural AS to_qu_name_plural, | ||||
| 	quc.factor AS factor, | ||||
| 	'3 default direct factor' AS source | ||||
| FROM products p | ||||
| JOIN quantity_unit_conversions quc | ||||
| 	ON p.qu_id_stock = quc.from_qu_id | ||||
| 	AND quc.product_id IS NULL | ||||
| JOIN quantity_units qu_from | ||||
| 	ON quc.from_qu_id = qu_from.id | ||||
| JOIN quantity_units qu_to | ||||
| 	ON quc.to_qu_id = qu_to.id | ||||
|  | ||||
| UNION | ||||
|  | ||||
| -- 4. Default (indirect) QU conversion factors | ||||
| SELECT | ||||
| 	-1 AS id, -- Dummy, LessQL needs an id column | ||||
| 	p.id AS product_id, | ||||
| 	(SELECT from_qu_id FROM quantity_unit_conversions WHERE to_qu_id = quc.to_qu_id AND product_id = p.id) AS from_qu_id, | ||||
| 	qu_from.name AS from_qu_name, | ||||
| 	qu_from.name_plural AS from_qu_name_plural, | ||||
| 	quc.from_qu_id AS to_qu_id, | ||||
| 	qu_to.name AS to_qu_name, | ||||
| 	qu_to.name_plural AS to_qu_name_plural, | ||||
| 	(SELECT factor FROM quantity_unit_conversions WHERE to_qu_id = quc.to_qu_id AND product_id = p.id) / quc.factor AS factor, | ||||
| 	'4 default indirect factor' AS source | ||||
| FROM products p | ||||
| JOIN product_qu_relations pqr | ||||
| 	ON p.id = pqr.product_id | ||||
| JOIN quantity_unit_conversions quc | ||||
| 	ON pqr.qu_id = quc.from_qu_id | ||||
| 	AND quc.product_id IS NULL | ||||
| JOIN quantity_units qu_from | ||||
| 	ON (SELECT from_qu_id FROM quantity_unit_conversions WHERE to_qu_id = quc.to_qu_id AND product_id = p.id) = qu_from.id | ||||
| JOIN quantity_units qu_to | ||||
| 	ON quc.from_qu_id = qu_to.id | ||||
| WHERE NOT EXISTS(SELECT 1 FROM quantity_unit_conversions qucx WHERE qucx.product_id = p.id AND qucx.from_qu_id = pqr.qu_id) -- => Product override exists | ||||
|  | ||||
| ) x | ||||
| ORDER BY source; | ||||
							
								
								
									
										125
									
								
								migrations/0153.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								migrations/0153.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| DROP VIEW uihelper_stock_current_overview_including_opened; | ||||
| CREATE VIEW uihelper_stock_current_overview_including_opened | ||||
| AS | ||||
| SELECT | ||||
|     p.id, | ||||
|     sc.amount_opened AS amount_opened, | ||||
|     p.tare_weight AS tare_weight, | ||||
|     p.enable_tare_weight_handling AS enable_tare_weight_handling, | ||||
|     sc.amount AS amount, | ||||
|     sc.value as value, | ||||
|     sc.product_id AS product_id, | ||||
|     sc.best_before_date AS best_before_date, | ||||
|     EXISTS(SELECT id FROM stock_missing_products_including_opened WHERE id = sc.product_id) AS product_missing, | ||||
|     (SELECT name FROM quantity_units WHERE quantity_units.id = p.qu_id_stock) AS qu_unit_name, | ||||
|     (SELECT name_plural FROM quantity_units WHERE quantity_units.id = p.qu_id_stock) AS qu_unit_name_plural, | ||||
|     p.name AS product_name, | ||||
|     (SELECT name FROM product_groups WHERE product_groups.id = p.product_group_id) AS product_group_name, | ||||
|     EXISTS(SELECT * FROM shopping_list WHERE shopping_list.product_id = sc.product_id) AS on_shopping_list, | ||||
|     (SELECT name FROM quantity_units WHERE quantity_units.id = p.qu_id_purchase) AS qu_purchase_unit_name, | ||||
|     (SELECT name_plural FROM quantity_units WHERE quantity_units.id = p.qu_id_purchase) AS qu_purchase_unit_name_plural, | ||||
|     sc.is_aggregated_amount, | ||||
|     sc.amount_opened_aggregated, | ||||
|     sc.amount_aggregated, | ||||
| 	p.calories AS product_calories, | ||||
| 	sc.amount * p.calories AS calories, | ||||
| 	sc.amount_aggregated * p.calories AS calories_aggregated, | ||||
| 	p.quick_consume_amount, | ||||
| 	p.due_type, | ||||
| 	plp.purchased_date AS last_purchased, | ||||
| 	plp.price AS last_price, | ||||
| 	pap.price as average_price, | ||||
| 	p.min_stock_amount, | ||||
| 	pbcs.barcodes AS product_barcodes, | ||||
| 	p.description as product_description, | ||||
| 	l.name AS product_default_location_name, | ||||
| 	p_parent.id AS parent_product_id, | ||||
| 	p_parent.name AS parent_product_name, | ||||
| 	p.picture_file_name AS product_picture_file_name | ||||
| FROM ( | ||||
| 	SELECT * | ||||
| 	FROM stock_current | ||||
| 	WHERE best_before_date IS NOT NULL | ||||
| 	UNION | ||||
| 	SELECT m.id, 0, 0, 0, null, 0, 0, 0, p.due_type | ||||
| 	FROM stock_missing_products_including_opened m | ||||
| 	JOIN products p | ||||
| 		ON m.id = p.id | ||||
| 	WHERE m.id NOT IN (SELECT product_id FROM stock_current) | ||||
|     ) sc | ||||
| LEFT JOIN products_last_purchased plp | ||||
| 	ON sc.product_id = plp.product_id | ||||
| LEFT JOIN products_average_price pap | ||||
| 	ON sc.product_id = pap.product_id | ||||
| LEFT JOIN products p | ||||
|     ON sc.product_id = p.id | ||||
| LEFT JOIN product_barcodes_comma_separated pbcs | ||||
| 	ON sc.product_id = pbcs.product_id | ||||
| LEFT JOIN products p_parent | ||||
| 	ON p.parent_product_id = p_parent.id | ||||
| LEFT JOIN locations l | ||||
| 	ON p.location_id = l.id | ||||
| WHERE p.hide_on_stock_overview = 0; | ||||
|  | ||||
| DROP VIEW uihelper_stock_current_overview; | ||||
| CREATE VIEW uihelper_stock_current_overview | ||||
| AS | ||||
| SELECT | ||||
|     p.id, | ||||
|     sc.amount_opened AS amount_opened, | ||||
|     p.tare_weight AS tare_weight, | ||||
|     p.enable_tare_weight_handling AS enable_tare_weight_handling, | ||||
|     sc.amount AS amount, | ||||
|     sc.value as value, | ||||
|     sc.product_id AS product_id, | ||||
|     sc.best_before_date AS best_before_date, | ||||
|     EXISTS(SELECT id FROM stock_missing_products WHERE id = sc.product_id) AS product_missing, | ||||
|     (SELECT name FROM quantity_units WHERE quantity_units.id = p.qu_id_stock) AS qu_unit_name, | ||||
|     (SELECT name_plural FROM quantity_units WHERE quantity_units.id = p.qu_id_stock) AS qu_unit_name_plural, | ||||
|     p.name AS product_name, | ||||
|     (SELECT name FROM product_groups WHERE product_groups.id = p.product_group_id) AS product_group_name, | ||||
|     EXISTS(SELECT * FROM shopping_list WHERE shopping_list.product_id = sc.product_id) AS on_shopping_list, | ||||
|     (SELECT name FROM quantity_units WHERE quantity_units.id = p.qu_id_purchase) AS qu_purchase_unit_name, | ||||
|     (SELECT name_plural FROM quantity_units WHERE quantity_units.id = p.qu_id_purchase) AS qu_purchase_unit_name_plural, | ||||
|     sc.is_aggregated_amount, | ||||
|     sc.amount_opened_aggregated, | ||||
|     sc.amount_aggregated, | ||||
| 	p.calories AS product_calories, | ||||
| 	sc.amount * p.calories AS calories, | ||||
| 	sc.amount_aggregated * p.calories AS calories_aggregated, | ||||
| 	p.quick_consume_amount, | ||||
| 	p.due_type, | ||||
| 	plp.purchased_date AS last_purchased, | ||||
| 	plp.price AS last_price, | ||||
| 	pap.price as average_price, | ||||
| 	p.min_stock_amount, | ||||
| 	pbcs.barcodes AS product_barcodes, | ||||
| 	p.description AS product_description, | ||||
| 	l.name AS product_default_location_name, | ||||
| 	p_parent.id AS parent_product_id, | ||||
| 	p_parent.name AS parent_product_name, | ||||
| 	p.picture_file_name AS product_picture_file_name | ||||
| FROM ( | ||||
| 	SELECT * | ||||
| 	FROM stock_current | ||||
| 	WHERE best_before_date IS NOT NULL | ||||
| 	UNION | ||||
| 	SELECT m.id, 0, 0, 0, null, 0, 0, 0, p.due_type | ||||
| 	FROM stock_missing_products m | ||||
| 	JOIN products p | ||||
| 		ON m.id = p.id | ||||
| 	WHERE m.id NOT IN (SELECT product_id FROM stock_current) | ||||
|     ) sc | ||||
| LEFT JOIN products_last_purchased plp | ||||
| 	ON sc.product_id = plp.product_id | ||||
| LEFT JOIN products_average_price pap | ||||
| 	ON sc.product_id = pap.product_id | ||||
| LEFT JOIN products p | ||||
|     ON sc.product_id = p.id | ||||
| LEFT JOIN product_barcodes_comma_separated pbcs | ||||
| 	ON sc.product_id = pbcs.product_id | ||||
| LEFT JOIN products p_parent | ||||
| 	ON p.parent_product_id = p_parent.id | ||||
| LEFT JOIN locations l | ||||
| 	ON p.location_id = l.id | ||||
| WHERE p.hide_on_stock_overview = 0; | ||||
							
								
								
									
										67
									
								
								migrations/0154.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								migrations/0154.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| DROP VIEW chores_current; | ||||
| CREATE VIEW chores_current | ||||
| AS | ||||
| SELECT | ||||
| 	x.chore_id AS id, -- Dummy, LessQL needs an id column | ||||
| 	x.chore_id, | ||||
| 	x.chore_name, | ||||
| 	x.last_tracked_time, | ||||
| 	CASE WHEN x.rollover = 1 AND DATETIME('now', 'localtime') > x.next_estimated_execution_time THEN | ||||
| 		CASE WHEN IFNULL(x.track_date_only, 0) = 1 THEN | ||||
| 			DATETIME(STRFTIME('%Y-%m-%d', DATETIME('now', 'localtime')) || ' 23:59:59') | ||||
| 		ELSE | ||||
| 			DATETIME(STRFTIME('%Y-%m-%d', DATETIME('now', 'localtime')) || ' ' || STRFTIME('%H:%M:%S', x.next_estimated_execution_time)) | ||||
| 		END | ||||
| 	ELSE | ||||
| 		CASE WHEN IFNULL(x.track_date_only, 0) = 1 THEN | ||||
| 			DATETIME(STRFTIME('%Y-%m-%d', x.next_estimated_execution_time) || ' 23:59:59') | ||||
| 		ELSE | ||||
| 			x.next_estimated_execution_time | ||||
| 		END | ||||
| 	END AS next_estimated_execution_time, | ||||
| 	x.track_date_only, | ||||
| 	x.next_execution_assigned_to_user_id | ||||
| FROM ( | ||||
|  | ||||
| SELECT | ||||
| 	h.id AS chore_id, | ||||
| 	h.name AS chore_name, | ||||
| 	MAX(l.tracked_time) AS last_tracked_time, | ||||
| 	CASE h.period_type | ||||
| 		WHEN 'manually' THEN '2999-12-31 23:59:59' | ||||
| 		WHEN 'dynamic-regular' THEN DATETIME(MAX(l.tracked_time), '+' || CAST(h.period_days AS TEXT) || ' day') | ||||
| 		WHEN 'daily' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' day') | ||||
| 		WHEN 'weekly' THEN ( | ||||
| 			SELECT next | ||||
|         		FROM ( | ||||
| 				SELECT 'sunday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 0') AS next | ||||
| 				UNION | ||||
| 				SELECT 'monday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 1') AS next | ||||
| 				UNION | ||||
| 				SELECT 'tuesday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 2') AS next | ||||
| 				UNION | ||||
| 				SELECT 'wednesday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 3') AS next | ||||
| 				UNION | ||||
| 				SELECT 'thursday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 4') AS next | ||||
| 				UNION | ||||
| 				SELECT 'friday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 5') AS next | ||||
| 				UNION | ||||
| 				SELECT 'saturday' AS day, DATETIME(COALESCE((SELECT tracked_time FROM chores_log WHERE chore_id = h.id ORDER BY tracked_time DESC LIMIT 1), DATETIME('now', 'localtime')), '1 days', '+' || CAST((h.period_interval - 1) * 7 AS TEXT) || ' days', 'weekday 6') AS next | ||||
| 			) | ||||
| 			WHERE INSTR(period_config, day) > 0 | ||||
| 			ORDER BY next | ||||
| 			LIMIT 1 | ||||
| 		) | ||||
| 		WHEN 'monthly' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' month', 'start of month', '+' || CAST(h.period_days - 1 AS TEXT) || ' day') | ||||
| 		WHEN 'yearly' THEN DATETIME(IFNULL(MAX(l.tracked_time), DATETIME('now', 'localtime')), '+' || CAST(h.period_interval AS TEXT) || ' years') | ||||
| 	END AS next_estimated_execution_time, | ||||
| 	h.track_date_only, | ||||
| 	h.rollover, | ||||
| 	h.next_execution_assigned_to_user_id | ||||
| FROM chores h | ||||
| LEFT JOIN chores_log l | ||||
| 	ON h.id = l.chore_id | ||||
| 	AND l.undone = 0 | ||||
| WHERE h.active = 1 | ||||
| GROUP BY h.id, h.name, h.period_days | ||||
| ) x; | ||||
							
								
								
									
										159
									
								
								migrations/0155.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								migrations/0155.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| PRAGMA legacy_alter_table = ON; | ||||
| ALTER TABLE products RENAME TO products_old; | ||||
|  | ||||
| -- Remove allow_label_per_unit column | ||||
| -- Rename default_print_stock_label column to default_stock_label_type | ||||
| CREATE TABLE products ( | ||||
| 	id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, | ||||
| 	name TEXT NOT NULL UNIQUE, | ||||
| 	description TEXT, | ||||
| 	product_group_id INTEGER, | ||||
| 	active TINYINT NOT NULL DEFAULT 1 CHECK(active IN (0, 1)), | ||||
| 	location_id INTEGER NOT NULL, | ||||
| 	shopping_location_id INTEGER, | ||||
| 	qu_id_purchase INTEGER NOT NULL, | ||||
| 	qu_id_stock INTEGER NOT NULL, | ||||
| 	qu_factor_purchase_to_stock REAL NOT NULL, | ||||
| 	min_stock_amount INTEGER NOT NULL DEFAULT 0, | ||||
| 	default_best_before_days INTEGER NOT NULL DEFAULT 0, | ||||
| 	default_best_before_days_after_open INTEGER NOT NULL DEFAULT 0, | ||||
| 	default_best_before_days_after_freezing INTEGER NOT NULL DEFAULT 0, | ||||
| 	default_best_before_days_after_thawing INTEGER NOT NULL DEFAULT 0, | ||||
| 	picture_file_name TEXT, | ||||
| 	enable_tare_weight_handling TINYINT NOT NULL DEFAULT 0, | ||||
| 	tare_weight REAL NOT NULL DEFAULT 0, | ||||
| 	not_check_stock_fulfillment_for_recipes TINYINT DEFAULT 0, | ||||
| 	parent_product_id INT, | ||||
| 	calories INTEGER, | ||||
| 	cumulate_min_stock_amount_of_sub_products TINYINT DEFAULT 0, | ||||
| 	due_type TINYINT NOT NULL DEFAULT 1 CHECK(due_type IN (1, 2)), | ||||
| 	quick_consume_amount REAL NOT NULL DEFAULT 1, | ||||
| 	hide_on_stock_overview TINYINT NOT NULL DEFAULT 0 CHECK(hide_on_stock_overview IN (0, 1)), | ||||
| 	default_stock_label_type INTEGER NOT NULL DEFAULT 0, | ||||
| 	should_not_be_frozen TINYINT NOT NULL DEFAULT 0 CHECK(should_not_be_frozen IN (0, 1)), | ||||
| 	row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime')) | ||||
| ); | ||||
|  | ||||
| INSERT INTO products | ||||
| 	(id, name, description, product_group_id, active, location_id, shopping_location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock, min_stock_amount, default_best_before_days, default_best_before_days_after_open, default_best_before_days_after_freezing, default_best_before_days_after_thawing, picture_file_name, enable_tare_weight_handling, tare_weight, not_check_stock_fulfillment_for_recipes, parent_product_id, calories, cumulate_min_stock_amount_of_sub_products, due_type, quick_consume_amount, hide_on_stock_overview, default_stock_label_type, should_not_be_frozen, row_created_timestamp) | ||||
| SELECT id, name, description, product_group_id, active, location_id, shopping_location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock, min_stock_amount, default_best_before_days, default_best_before_days_after_open, default_best_before_days_after_freezing, default_best_before_days_after_thawing, picture_file_name, enable_tare_weight_handling, tare_weight, not_check_stock_fulfillment_for_recipes, parent_product_id, calories, cumulate_min_stock_amount_of_sub_products, due_type, quick_consume_amount, hide_on_stock_overview, default_print_stock_label, should_not_be_frozen, row_created_timestamp | ||||
| FROM products_old; | ||||
|  | ||||
| DROP TABLE products_old; | ||||
|  | ||||
| CREATE TRIGGER prevent_qu_stock_change_after_first_purchase AFTER UPDATE ON products | ||||
| BEGIN | ||||
| 	SELECT CASE WHEN(( | ||||
|         SELECT 1 | ||||
|         FROM stock_log | ||||
| 		WHERE product_id = NEW.id | ||||
| 			AND NEW.qu_id_stock != OLD.qu_id_stock | ||||
|     ) NOTNULL) THEN RAISE(ABORT, "qu_id_stock cannot be changed when the product was once added to stock") END; | ||||
| END; | ||||
|  | ||||
| CREATE TRIGGER enforce_parent_product_id_null_when_empty_INS AFTER INSERT ON products | ||||
| BEGIN | ||||
| 	UPDATE products | ||||
| 	SET parent_product_id = NULL | ||||
| 	WHERE id = NEW.id | ||||
| 		AND IFNULL(parent_product_id, '') = ''; | ||||
| END; | ||||
|  | ||||
| CREATE TRIGGER enforce_parent_product_id_null_when_empty_UPD AFTER UPDATE ON products | ||||
| BEGIN | ||||
| 	UPDATE products | ||||
| 	SET parent_product_id = NULL | ||||
| 	WHERE id = NEW.id | ||||
| 		AND IFNULL(parent_product_id, '') = ''; | ||||
| END; | ||||
|  | ||||
| CREATE TRIGGER cascade_product_removal AFTER DELETE ON products | ||||
| BEGIN | ||||
| 	DELETE FROM stock | ||||
| 	WHERE product_id = OLD.id; | ||||
|  | ||||
| 	DELETE FROM stock_log | ||||
| 	WHERE product_id = OLD.id; | ||||
|  | ||||
| 	DELETE FROM product_barcodes | ||||
| 	WHERE product_id = OLD.id; | ||||
|  | ||||
| 	DELETE FROM quantity_unit_conversions | ||||
| 	WHERE product_id = OLD.id; | ||||
|  | ||||
| 	DELETE FROM recipes_pos | ||||
| 	WHERE product_id = OLD.id; | ||||
|  | ||||
| 	UPDATE recipes | ||||
| 	SET product_id = NULL | ||||
| 	WHERE product_id = OLD.id; | ||||
|  | ||||
| 	DELETE FROM meal_plan | ||||
| 	WHERE product_id = OLD.id | ||||
| 		AND type = 'product'; | ||||
|  | ||||
| 	DELETE FROM shopping_list | ||||
| 	WHERE product_id = OLD.id; | ||||
| END; | ||||
|  | ||||
| CREATE TRIGGER enfore_product_nesting_level BEFORE UPDATE ON products | ||||
| BEGIN | ||||
| 	-- Currently only 1 level is supported | ||||
|     SELECT CASE WHEN(( | ||||
|         SELECT 1 | ||||
|         FROM products p | ||||
|         WHERE IFNULL(NEW.parent_product_id, '') != '' | ||||
|             AND IFNULL(parent_product_id, '') = NEW.id | ||||
|     ) NOTNULL) THEN RAISE(ABORT, "Unsupported product nesting level detected (currently only 1 level is supported)") END; | ||||
| END; | ||||
|  | ||||
| CREATE TRIGGER enforce_min_stock_amount_for_cumulated_childs_INS AFTER INSERT ON products | ||||
| BEGIN | ||||
| 	/* | ||||
| 		When a parent product has cumulate_min_stock_amount_of_sub_products enabled, | ||||
| 		the child should not have any min_stock_amount | ||||
| 	*/ | ||||
|  | ||||
| 	UPDATE products | ||||
| 	SET min_stock_amount = 0 | ||||
| 	WHERE id IN ( | ||||
| 			SELECT | ||||
| 				p_child.id | ||||
| 			FROM products p_parent | ||||
| 			JOIN products p_child | ||||
| 				ON p_child.parent_product_id = p_parent.id | ||||
| 			WHERE p_parent.id = NEW.id | ||||
| 				AND IFNULL(p_parent.cumulate_min_stock_amount_of_sub_products, 0) = 1 | ||||
| 			) | ||||
| 		AND min_stock_amount > 0; | ||||
| END; | ||||
|  | ||||
| CREATE TRIGGER enforce_min_stock_amount_for_cumulated_childs_UPD AFTER UPDATE ON products | ||||
| BEGIN | ||||
| 	/* | ||||
| 		When a parent product has cumulate_min_stock_amount_of_sub_products enabled, | ||||
| 		the child should not have any min_stock_amount | ||||
| 	*/ | ||||
|  | ||||
| 	UPDATE products | ||||
| 	SET min_stock_amount = 0 | ||||
| 	WHERE id IN ( | ||||
| 			SELECT | ||||
| 				p_child.id | ||||
| 			FROM products p_parent | ||||
| 			JOIN products p_child | ||||
| 				ON p_child.parent_product_id = p_parent.id | ||||
| 			WHERE p_parent.id = NEW.id | ||||
| 				AND IFNULL(p_parent.cumulate_min_stock_amount_of_sub_products, 0) = 1 | ||||
| 			) | ||||
| 		AND min_stock_amount > 0; | ||||
| END; | ||||
|  | ||||
| CREATE INDEX ix_products_performance1 ON products ( | ||||
|     parent_product_id | ||||
| ); | ||||
|  | ||||
| CREATE INDEX ix_products_performance2 ON products ( | ||||
|     CASE WHEN parent_product_id IS NULL THEN id ELSE parent_product_id END, | ||||
|     active | ||||
| ); | ||||
							
								
								
									
										21
									
								
								migrations/0156.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								migrations/0156.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| DROP VIEW stock_splits; | ||||
| CREATE VIEW stock_splits | ||||
| AS | ||||
|  | ||||
| /* | ||||
| 	Helper view which shows splitted stock rows which could be compacted | ||||
| 	(a stock_id starting with "x" indicates that this entry shouldn't be compacted) | ||||
| */ | ||||
|  | ||||
| SELECT | ||||
| 	product_id, | ||||
| 	SUM(amount) AS total_amount, | ||||
| 	MIN(stock_id) AS stock_id_to_keep, | ||||
| 	MAX(id) AS id_to_keep, | ||||
| 	GROUP_CONCAT(id) AS id_group, | ||||
| 	GROUP_CONCAT(stock_id) AS stock_id_group, | ||||
| 	id -- Dummy | ||||
| FROM stock | ||||
| WHERE stock_id NOT LIKE 'x%' | ||||
| GROUP BY product_id, best_before_date, purchased_date, price, open, opened_date, location_id, shopping_location_id | ||||
| HAVING COUNT(*) > 1; | ||||
| @@ -134,6 +134,19 @@ input::-webkit-inner-spin-button { | ||||
| 	-webkit-appearance: none; | ||||
| } | ||||
|  | ||||
| .sticky-form-footer { | ||||
| 	border-top: 1px solid #d6d6d6; | ||||
| 	background-color: white; | ||||
| 	bottom: 0; | ||||
| 	position: fixed; | ||||
| 	width: 100%; | ||||
| 	z-index: 1030; | ||||
| } | ||||
|  | ||||
| form.has-sticky-form-footer .form-group:nth-last-child(2) { | ||||
| 	padding-bottom: 2rem; | ||||
| } | ||||
|  | ||||
| /* Navigation style customizations */ | ||||
| #mainNav { | ||||
| 	line-height: 1; | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| body.night-mode { | ||||
| body.night-mode, | ||||
| .night-mode .sticky-form-footer { | ||||
| 	color: #c1c1c1; | ||||
| 	background-color: #333131; | ||||
| } | ||||
| @@ -145,11 +146,13 @@ body.night-mode { | ||||
| .night-mode .custom-select { | ||||
| 	color: #c1c1c1; | ||||
| 	background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23c1c1c1' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px; | ||||
| 	background-color: #333131; | ||||
| } | ||||
|  | ||||
| .night-mode .custom-select:valid, | ||||
| .night-mode .custom-select:invalid { | ||||
| 	background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23c1c1c1' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px; | ||||
| 	background-color: #333131; | ||||
| } | ||||
|  | ||||
| .night-mode .dropdown-item:focus, | ||||
| @@ -163,6 +166,11 @@ body.night-mode { | ||||
| 	background-color: #333131; | ||||
| } | ||||
|  | ||||
| .night-mode .dropdown-item-text { | ||||
| 	color: #c1c1c1; | ||||
| 	background-color: #333131; | ||||
| } | ||||
|  | ||||
| .night-mode .list-group-item { | ||||
| 	background-color: #333131; | ||||
| } | ||||
|   | ||||
| @@ -256,7 +256,7 @@ __n = function(number, singularForm, pluralForm) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return Grocy.Translator.n__(singularForm, pluralForm, number, number) | ||||
| 	return Grocy.Translator.n__(singularForm, pluralForm, Math.abs(number), Math.abs(number)) | ||||
| } | ||||
|  | ||||
| if (!Grocy.ActiveNav.isEmpty()) | ||||
|   | ||||
| @@ -89,7 +89,7 @@ function CheckNightMode() | ||||
| 		end.add(1, "day"); | ||||
| 	} | ||||
|  | ||||
| 	if (start.isSameOrBefore(now) && end.isSameOrAfter(now)) // We're INSIDE of night mode time range | ||||
| 	if (now.isBetween(start, end)) // We're INSIDE of night mode time range | ||||
| 	{ | ||||
| 		if (!$("body").hasClass("night-mode")) | ||||
| 		{ | ||||
|   | ||||
| @@ -25,7 +25,7 @@ $("#clear-filter-button").on("click", function() | ||||
| { | ||||
| 	$("#search").val(""); | ||||
| 	$("#status-filter").val("all"); | ||||
| 	batteriesOverviewTable.column(5).search("").draw(); | ||||
| 	batteriesOverviewTable.column(batteriesOverviewTable.colReorder.transpose(5)).search("").draw(); | ||||
| 	batteriesOverviewTable.search("").draw(); | ||||
| }); | ||||
|  | ||||
| @@ -40,7 +40,7 @@ $("#status-filter").on("change", function() | ||||
| 	// Transfer CSS classes of selected element to dropdown element (for background) | ||||
| 	$(this).attr("class", $("#" + $(this).attr("id") + " option[value='" + value + "']").attr("class") + " form-control"); | ||||
|  | ||||
| 	batteriesOverviewTable.column(5).search(value).draw(); | ||||
| 	batteriesOverviewTable.column(batteriesOverviewTable.colReorder.transpose(5)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $(".status-filter-message").on("click", function() | ||||
|   | ||||
| @@ -99,5 +99,8 @@ $(document).on('click', '.battery-grocycode-label-print', function(e) | ||||
| }); | ||||
|  | ||||
| Grocy.Components.UserfieldsForm.Load(); | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
| Grocy.FrontendHelpers.ValidateForm('battery-form'); | ||||
|   | ||||
| @@ -53,7 +53,12 @@ $('#battery_id').on('change', function(e) | ||||
| 	if (batteryId) | ||||
| 	{ | ||||
| 		Grocy.Components.BatteryCard.Refresh(batteryId); | ||||
| 		$('#tracked_time').find('input').focus(); | ||||
|  | ||||
| 		setTimeout(function() | ||||
| 		{ | ||||
| 			$('#tracked_time').find('input').focus(); | ||||
| 		}, 200); | ||||
|  | ||||
| 		Grocy.FrontendHelpers.ValidateForm('batterytracking-form'); | ||||
| 	} | ||||
| }); | ||||
| @@ -117,7 +122,7 @@ $(document).on("Grocy.BarcodeScanned", function(e, barcode, target) | ||||
| 		$("#battery_id_text_input").focusout(); | ||||
| 		$("#battery_id_text_input").focus(); | ||||
| 		$("#battery_id_text_input").blur(); | ||||
| 		Grocy.Components.DateTimePicker.GetInputElement().focus(); | ||||
| 		$('#tracked_time').find('input').focus(); | ||||
| 	}, 200); | ||||
| }); | ||||
|  | ||||
| @@ -170,3 +175,8 @@ $('#battery_id_text_input').on('blur', function(e) | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| $("#tracked_time").find("input").on("focus", function(e) | ||||
| { | ||||
| 	$(this).select(); | ||||
| }); | ||||
|   | ||||
| @@ -79,3 +79,28 @@ if (GetUriParam('include_disabled')) | ||||
| { | ||||
| 	$("#show-disabled").prop('checked', true); | ||||
| } | ||||
|  | ||||
| $(".merge-chores-button").on("click", function(e) | ||||
| { | ||||
| 	var choreId = $(e.currentTarget).attr("data-chore-id"); | ||||
| 	$("#merge-chores-keep").val(choreId); | ||||
| 	$("#merge-chores-remove").val(""); | ||||
| 	$("#merge-chores-modal").modal("show"); | ||||
| }); | ||||
|  | ||||
| $("#merge-chores-save-button").on("click", function() | ||||
| { | ||||
| 	var choreIdToKeep = $("#merge-chores-keep").val(); | ||||
| 	var choreIdToRemove = $("#merge-chores-remove").val(); | ||||
|  | ||||
| 	Grocy.Api.Post("chores/" + choreIdToKeep.toString() + "/merge/" + choreIdToRemove.toString(), {}, | ||||
| 		function(result) | ||||
| 		{ | ||||
| 			window.location.href = U('/chores'); | ||||
| 		}, | ||||
| 		function(xhr) | ||||
| 		{ | ||||
| 			Grocy.FrontendHelpers.ShowGenericError('Error while merging', xhr.response); | ||||
| 		} | ||||
| 	); | ||||
| }); | ||||
|   | ||||
| @@ -33,7 +33,7 @@ $("#status-filter").on("change", function() | ||||
| 	// Transfer CSS classes of selected element to dropdown element (for background) | ||||
| 	$(this).attr("class", $("#" + $(this).attr("id") + " option[value='" + value + "']").attr("class") + " form-control"); | ||||
|  | ||||
| 	choresOverviewTable.column(5).search(value).draw(); | ||||
| 	choresOverviewTable.column(choresOverviewTable.colReorder.transpose(5)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $("#user-filter").on("change", function() | ||||
| @@ -47,7 +47,7 @@ $("#user-filter").on("change", function() | ||||
| 	// Transfer CSS classes of selected element to dropdown element (for background) | ||||
| 	$(this).attr("class", $("#" + $(this).attr("id") + " option[value='" + value + "']").attr("class") + " form-control"); | ||||
|  | ||||
| 	choresOverviewTable.column(6).search(value).draw(); | ||||
| 	choresOverviewTable.column(choresOverviewTable.colReorder.transpose(6)).search(value).draw(); | ||||
|  | ||||
| 	if (!value.isEmpty()) | ||||
| 	{ | ||||
| @@ -60,8 +60,8 @@ $("#clear-filter-button").on("click", function() | ||||
| 	$("#search").val(""); | ||||
| 	$("#status-filter").val("all"); | ||||
| 	$("#user-filter").val("all"); | ||||
| 	choresOverviewTable.column(5).search("").draw(); | ||||
| 	choresOverviewTable.column(6).search("").draw(); | ||||
| 	choresOverviewTable.column(choresOverviewTable.colReorder.transpose(5)).search("").draw(); | ||||
| 	choresOverviewTable.column(choresOverviewTable.colReorder.transpose(6)).search("").draw(); | ||||
| 	choresOverviewTable.search("").draw(); | ||||
| 	RemoveUriParam("user"); | ||||
| }); | ||||
|   | ||||
| @@ -76,7 +76,12 @@ $('#chore_id').on('change', function(e) | ||||
| 		); | ||||
|  | ||||
| 		Grocy.Components.ChoreCard.Refresh(choreId); | ||||
| 		Grocy.Components.DateTimePicker.GetInputElement().focus(); | ||||
|  | ||||
| 		setTimeout(function() | ||||
| 		{ | ||||
| 			Grocy.Components.DateTimePicker.GetInputElement().focus(); | ||||
| 		}, 200); | ||||
|  | ||||
| 		Grocy.FrontendHelpers.ValidateForm('choretracking-form'); | ||||
| 	} | ||||
| }); | ||||
| @@ -133,7 +138,7 @@ $(document).on("Grocy.BarcodeScanned", function(e, barcode, target) | ||||
| 		$("#chore_id_text_input").focusout(); | ||||
| 		$("#chore_id_text_input").focus(); | ||||
| 		$("#chore_id_text_input").blur(); | ||||
| 		Grocy.Components.DateTimePicker.GetInputElement().focus(); | ||||
| 		$('#tracked_time').find('input').focus(); | ||||
| 	}, 200); | ||||
| }); | ||||
|  | ||||
| @@ -190,3 +195,8 @@ $('#chore_id_text_input').on('blur', function(e) | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| $("#tracked_time").find("input").on("focus", function(e) | ||||
| { | ||||
| 	$(this).select(); | ||||
| }); | ||||
|   | ||||
| @@ -208,6 +208,12 @@ $('#product_id_text_input').on('blur', function(e) | ||||
| 					className: 'btn-success add-new-product-dialog-button responsive-button ' + addProductWorkflowsAdditionalCssClasses, | ||||
| 					callback: function() | ||||
| 					{ | ||||
| 						// Not the best place here - this is only relevant when this flow is started from the shopping list item form | ||||
| 						// (to select the correct shopping list on return) | ||||
| 						if (GetUriParam("list") !== undefined) | ||||
| 						{ | ||||
| 							embedded += "&list=" + GetUriParam("list"); | ||||
| 						} | ||||
|  | ||||
| 						Grocy.Components.ProductPicker.PopupOpen = false; | ||||
| 						window.location.href = U('/product/new?flow=InplaceNewProductWithName&name=' + encodeURIComponent(input) + '&returnto=' + encodeURIComponent(Grocy.CurrentUrlRelative + "?flow=InplaceNewProductWithName&" + embedded) + "&" + embedded); | ||||
|   | ||||
| @@ -211,8 +211,6 @@ var sumValue = 0; | ||||
| $("#location_id").on('change', function(e) | ||||
| { | ||||
| 	var locationId = $(e.target).val(); | ||||
| 	sumValue = 0; | ||||
| 	var stockId = null; | ||||
|  | ||||
| 	$("#specific_stock_entry").find("option").remove().end().append("<option></option>"); | ||||
| 	if ($("#use_specific_stock_entry").is(":checked")) | ||||
| @@ -222,7 +220,7 @@ $("#location_id").on('change', function(e) | ||||
|  | ||||
| 	if (GetUriParam("embedded") !== undefined) | ||||
| 	{ | ||||
| 		stockId = GetUriParam('stockId'); | ||||
| 		OnLocationChange(locationId, GetUriParam('stockId')); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| @@ -232,13 +230,36 @@ $("#location_id").on('change', function(e) | ||||
| 			var gc = $("#product_id").attr("barcode").split(":"); | ||||
| 			if (gc.length == 4) | ||||
| 			{ | ||||
| 				stockId = gc[3]; | ||||
| 				Grocy.Api.Get("stock/products/" + Grocy.Components.ProductPicker.GetValue() + '/entries?query[]=stock_id=' + gc[3], | ||||
| 					function(stockEntries) | ||||
| 					{ | ||||
| 						OnLocationChange(stockEntries[0].location_id, gc[3]); | ||||
| 					}, | ||||
| 					function(xhr) | ||||
| 					{ | ||||
| 						console.error(xhr); | ||||
| 					} | ||||
| 				); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			OnLocationChange(locationId, null); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| function OnLocationChange(locationId, stockId) | ||||
| { | ||||
| 	sumValue = 0; | ||||
|  | ||||
| 	if (locationId) | ||||
| 	{ | ||||
| 		if ($("#location_id").val() != locationId) | ||||
| 		{ | ||||
| 			$("#location_id").val(locationId); | ||||
| 		} | ||||
|  | ||||
| 		Grocy.Api.Get("stock/products/" + Grocy.Components.ProductPicker.GetValue() + '/entries?include_sub_products=true', | ||||
| 			function(stockEntries) | ||||
| 			{ | ||||
| @@ -294,7 +315,7 @@ $("#location_id").on('change', function(e) | ||||
| 			} | ||||
| 		); | ||||
| 	} | ||||
| }); | ||||
| } | ||||
|  | ||||
| Grocy.Components.ProductPicker.GetPicker().on('change', function(e) | ||||
| { | ||||
| @@ -383,7 +404,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) | ||||
| 												$("#display_amount").select(); | ||||
| 											} | ||||
|  | ||||
| 											if (barcode.qu_id != null) | ||||
| 											if (barcode.qu_id != null && !barcode.qu_id.isEmpty()) | ||||
| 											{ | ||||
| 												Grocy.Components.ProductAmountPicker.SetQuantityUnit(barcode.qu_id); | ||||
| 											} | ||||
|   | ||||
| @@ -199,7 +199,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) | ||||
| 										$("#display_amount").select(); | ||||
| 									} | ||||
|  | ||||
| 									if (barcode.qu_id != null) | ||||
| 									if (barcode.qu_id != null && !barcode.qu_id.isEmpty()) | ||||
| 									{ | ||||
| 										Grocy.Components.ProductAmountPicker.SetQuantityUnit(barcode.qu_id); | ||||
| 									} | ||||
|   | ||||
| @@ -85,4 +85,7 @@ $('#location-form input').keydown(function(event) | ||||
|  | ||||
| Grocy.Components.UserfieldsForm.Load(); | ||||
| Grocy.FrontendHelpers.ValidateForm('location-form'); | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
|   | ||||
| @@ -91,7 +91,10 @@ if (Grocy.EditMode == "edit") | ||||
| } | ||||
|  | ||||
| Grocy.FrontendHelpers.ValidateForm('barcode-form'); | ||||
| $('#barcode').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#barcode').focus(); | ||||
| }, 250); | ||||
| RefreshLocaleNumberInput(); | ||||
| Grocy.Components.UserfieldsForm.Load() | ||||
|  | ||||
|   | ||||
| @@ -187,6 +187,7 @@ $('.input-group-qu').on('change', function(e) | ||||
|  | ||||
| 	$("#tare_weight_qu_info").text($("#qu_id_stock option:selected").text()); | ||||
| 	$("#quick_consume_qu_info").text($("#qu_id_stock option:selected").text()); | ||||
| 	$("#energy_qu_info").text($("#qu_id_stock option:selected").text()); | ||||
|  | ||||
| 	Grocy.FrontendHelpers.ValidateForm('product-form'); | ||||
| }); | ||||
| @@ -404,22 +405,6 @@ $('#qu_id_stock').change(function(e) | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| $('#allow_label_per_unit').on('change', function() | ||||
| { | ||||
| 	if (this.checked) | ||||
| 	{ | ||||
| 		$('#label-option-per-unit').prop("disabled", false); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		if ($('#default_print_stock_label').val() == "2") | ||||
| 		{ | ||||
| 			$("#default_print_stock_label").val("0"); | ||||
| 		} | ||||
| 		$('#label-option-per-unit').prop("disabled", true); | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| $(window).on("message", function(e) | ||||
| { | ||||
| 	var data = e.originalEvent.data; | ||||
| @@ -503,6 +488,11 @@ else if (Grocy.EditMode === 'create') | ||||
| 	{ | ||||
| 		$("select.input-group-qu").val(Grocy.UserSettings.product_presets_qu_id); | ||||
| 	} | ||||
|  | ||||
| 	if (Grocy.UserSettings.product_presets_default_due_days.toString() !== '0') | ||||
| 	{ | ||||
| 		$("#default_best_before_days").val(Grocy.UserSettings.product_presets_default_due_days); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| Grocy.Components.ProductPicker.GetPicker().on('change', function(e) | ||||
|   | ||||
| @@ -70,5 +70,8 @@ $('#product-group-form input').keydown(function(event) | ||||
| }); | ||||
|  | ||||
| Grocy.Components.UserfieldsForm.Load(); | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
| Grocy.FrontendHelpers.ValidateForm('product-group-form'); | ||||
|   | ||||
| @@ -29,14 +29,14 @@ $("#product-group-filter").on("change", function() | ||||
| 		value = ""; | ||||
| 	} | ||||
|  | ||||
| 	productsTable.column(6).search(value).draw(); | ||||
| 	productsTable.column(productsTable.colReorder.transpose(6)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $("#clear-filter-button").on("click", function() | ||||
| { | ||||
| 	$("#search").val(""); | ||||
| 	$("#product-group-filter").val("all"); | ||||
| 	productsTable.column(6).search("").draw(); | ||||
| 	productsTable.column(productsTable.colReorder.transpose(6)).search("").draw(); | ||||
| 	productsTable.search("").draw(); | ||||
| 	if ($("#show-disabled").is(":checked") || $("#show-only-in-stock").is(":checked")) | ||||
| 	{ | ||||
| @@ -147,7 +147,7 @@ $("#merge-products-save-button").on("click", function() | ||||
| 		}, | ||||
| 		function(xhr) | ||||
| 		{ | ||||
| 			Grocy.FrontendHelpers.ShowGenericError('Error while merging products', xhr.response); | ||||
| 			Grocy.FrontendHelpers.ShowGenericError('Error while merging', xhr.response); | ||||
| 		} | ||||
| 	); | ||||
| }); | ||||
|   | ||||
| @@ -23,7 +23,7 @@ $('#save-purchase-button').on('click', function(e) | ||||
| 		{ | ||||
| 			var jsonData = {}; | ||||
| 			jsonData.amount = jsonForm.amount; | ||||
| 			jsonData.print_stock_label = jsonForm.print_stock_label | ||||
| 			jsonData.stock_label_type = jsonForm.stock_label_type; | ||||
|  | ||||
| 			if (!Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) | ||||
| 			{ | ||||
| @@ -121,22 +121,41 @@ $('#save-purchase-button').on('click', function(e) | ||||
| 					{ | ||||
| 						if (Grocy.Webhooks.labelprinter !== undefined) | ||||
| 						{ | ||||
| 							var post_data = {}; | ||||
| 							post_data.product = productDetails.product.name; | ||||
| 							post_data.grocycode = 'grcy:p:' + jsonForm.product_id + ":" + result[0].stock_id | ||||
| 							if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING) | ||||
| 							if (jsonForm.stock_label_type == 1) // Single label | ||||
| 							{ | ||||
| 								post_data.due_date = __t('DD') + ': ' + result[0].best_before_date | ||||
| 							} | ||||
|  | ||||
| 							if (jsonForm.print_stock_label > 0) | ||||
| 							{ | ||||
| 								var reps = 1; | ||||
| 								if (jsonForm.print_stock_label == 2) | ||||
| 								var webhookData = {}; | ||||
| 								webhookData.product = productDetails.product.name; | ||||
| 								webhookData.grocycode = 'grcy:p:' + jsonForm.product_id + ":" + result[0].stock_id; | ||||
| 								if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING) | ||||
| 								{ | ||||
| 									reps = Math.floor(jsonData.amount); | ||||
| 									webhookData.due_date = __t('DD') + ': ' + result[0].best_before_date; | ||||
| 								} | ||||
| 								Grocy.FrontendHelpers.RunWebhook(Grocy.Webhooks.labelprinter, post_data, reps); | ||||
|  | ||||
| 								Grocy.FrontendHelpers.RunWebhook(Grocy.Webhooks.labelprinter, webhookData); | ||||
| 							} | ||||
| 							else if (jsonForm.stock_label_type == 2) // Label per unit | ||||
| 							{ | ||||
| 								Grocy.Api.Get('stock/transactions/' + result[0].transaction_id, | ||||
| 									function(stockEntries) | ||||
| 									{ | ||||
| 										stockEntries.forEach(stockEntry => | ||||
| 										{ | ||||
| 											var webhookData = {}; | ||||
| 											webhookData.product = productDetails.product.name; | ||||
| 											webhookData.grocycode = 'grcy:p:' + jsonForm.product_id + ":" + stockEntry.stock_id; | ||||
| 											if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING) | ||||
| 											{ | ||||
| 												webhookData.due_date = __t('DD') + ': ' + result[0].best_before_date; | ||||
| 											} | ||||
|  | ||||
| 											Grocy.FrontendHelpers.RunWebhook(Grocy.Webhooks.labelprinter, webhookData); | ||||
| 										}); | ||||
| 									}, | ||||
| 									function(xhr) | ||||
| 									{ | ||||
| 										console.error(xhr); | ||||
| 									} | ||||
| 								); | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| @@ -185,6 +204,10 @@ $('#save-purchase-button').on('click', function(e) | ||||
| 						} | ||||
| 						Grocy.Components.ProductPicker.GetInputElement().focus(); | ||||
| 						Grocy.Components.ProductCard.Refresh(jsonForm.product_id); | ||||
| 						if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER) | ||||
| 						{ | ||||
| 							$("#stock_label_type").val(0); | ||||
| 						} | ||||
|  | ||||
| 						$('#price-hint').text(""); | ||||
| 						var priceTypeUnitPrice = $("#price-type-unit-price"); | ||||
| @@ -286,39 +309,11 @@ if (Grocy.Components.ProductPicker !== undefined) | ||||
| 						$("#tare-weight-handling-info").addClass("d-none"); | ||||
| 					} | ||||
|  | ||||
| 					if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING) | ||||
| 					{ | ||||
| 						if (productDetails.product.default_best_before_days.toString() !== '0') | ||||
| 						{ | ||||
| 							if (productDetails.product.default_best_before_days == -1) | ||||
| 							{ | ||||
| 								if (!$("#datetimepicker-shortcut").is(":checked")) | ||||
| 								{ | ||||
| 									$("#datetimepicker-shortcut").click(); | ||||
| 								} | ||||
| 							} | ||||
| 							else | ||||
| 							{ | ||||
| 								Grocy.Components.DateTimePicker.SetValue(moment().add(productDetails.product.default_best_before_days, 'days').format('YYYY-MM-DD')); | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 					PrefillBestBeforeDate(productDetails.product, productDetails.location); | ||||
|  | ||||
| 					if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER) | ||||
| 					{ | ||||
| 						$("#print_stock_label").val(productDetails.product.default_print_stock_label); | ||||
| 						if (productDetails.product.allow_label_per_unit) | ||||
| 						{ | ||||
| 							if ($('#default_print_stock_label').val() == "2") | ||||
| 							{ | ||||
| 								$("#default_print_stock_label").val("0"); | ||||
| 							} | ||||
| 							$('#label-option-per-unit').prop("disabled", true); | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							$('#label-option-per-unit').prop("disabled", false); | ||||
| 						} | ||||
| 						$("#stock_label_type").val(productDetails.product.default_stock_label_type); | ||||
| 					} | ||||
|  | ||||
| 					$("#display_amount").focus(); | ||||
| @@ -349,7 +344,7 @@ if (Grocy.Components.ProductPicker !== undefined) | ||||
| 											$("#display_amount").select(); | ||||
| 										} | ||||
|  | ||||
| 										if (barcode.qu_id != null) | ||||
| 										if (barcode.qu_id != null && !barcode.qu_id.isEmpty()) | ||||
| 										{ | ||||
| 											Grocy.Components.ProductAmountPicker.SetQuantityUnit(barcode.qu_id); | ||||
| 										} | ||||
| @@ -396,6 +391,56 @@ if (Grocy.Components.ProductPicker !== undefined) | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| function PrefillBestBeforeDate(product, location) | ||||
| { | ||||
| 	if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING) | ||||
| 	{ | ||||
| 		var dueDays; | ||||
| 		if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRODUCT_FREEZING && BoolVal(location.is_freezer)) | ||||
| 		{ | ||||
| 			dueDays = product.default_best_before_days_after_freezing; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			dueDays = product.default_best_before_days; | ||||
| 		} | ||||
|  | ||||
| 		dueDays = parseFloat(dueDays); | ||||
| 		if (dueDays != 0) | ||||
| 		{ | ||||
| 			if (dueDays == -1) | ||||
| 			{ | ||||
| 				if (!$("#datetimepicker-shortcut").is(":checked")) | ||||
| 				{ | ||||
| 					$("#datetimepicker-shortcut").click(); | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				Grocy.Components.DateTimePicker.SetValue(moment().add(dueDays, 'days').format('YYYY-MM-DD')); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| if (Grocy.Components.LocationPicker !== undefined) | ||||
| { | ||||
| 	Grocy.Components.LocationPicker.GetPicker().on('change', function(e) | ||||
| 	{ | ||||
| 		if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRODUCT_FREEZING) | ||||
| 		{ | ||||
| 			Grocy.Api.Get('objects/locations/' + Grocy.Components.LocationPicker.GetValue(), | ||||
| 				function(location) | ||||
| 				{ | ||||
| 					PrefillBestBeforeDate(CurrentProductDetails.product, location); | ||||
| 				}, | ||||
| 				function(xhr) | ||||
| 				{ } | ||||
| 			); | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| $('#display_amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount)); | ||||
| RefreshLocaleNumberInput(); | ||||
| $(".input-group-productamountpicker").trigger("change"); | ||||
|   | ||||
| @@ -99,7 +99,7 @@ $("#status-filter").on("change", function() | ||||
| 		value = ""; | ||||
| 	} | ||||
|  | ||||
| 	recipesTables.column(5).search(value).draw(); | ||||
| 	recipesTables.column(recipesTables.colReorder.transpose(5)).search(value).draw(); | ||||
|  | ||||
| 	$('.recipe-gallery-item').removeClass('d-none'); | ||||
| 	if (value !== "") | ||||
|   | ||||
| @@ -65,7 +65,7 @@ $("#status-filter").on("change", function() | ||||
| 	// Transfer CSS classes of selected element to dropdown element (for background) | ||||
| 	$(this).attr("class", $("#" + $(this).attr("id") + " option[value='" + value + "']").attr("class") + " form-control"); | ||||
|  | ||||
| 	shoppingListTable.column(4).search(value).draw(); | ||||
| 	shoppingListTable.column(shoppingListTable.colReorder.transpose(4)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $("#selected-shopping-list").on("change", function() | ||||
| @@ -223,12 +223,7 @@ $(document).on('click', '#clear-shopping-list', function(e) | ||||
| 				Grocy.Api.Post('stock/shoppinglist/clear', { "list_id": $("#selected-shopping-list").val() }, | ||||
| 					function(result) | ||||
| 					{ | ||||
| 						animateCSS("#shoppinglist-table tbody tr", "fadeOut", function() | ||||
| 						{ | ||||
| 							Grocy.FrontendHelpers.EndUiBusy(); | ||||
| 							$("#shoppinglist-table tbody tr").remove(); | ||||
| 							OnListItemRemoved(); | ||||
| 						}); | ||||
| 						window.location.reload(); | ||||
| 					}, | ||||
| 					function(xhr) | ||||
| 					{ | ||||
| @@ -269,10 +264,12 @@ $(document).on('click', '.shopping-list-stock-add-workflow-list-item-button', fu | ||||
| Grocy.ShoppingListToStockWorkflowAll = false; | ||||
| Grocy.ShoppingListToStockWorkflowCount = 0; | ||||
| Grocy.ShoppingListToStockWorkflowCurrent = 0; | ||||
| Grocy.ShoppingListAddToStockButtonList = []; | ||||
| $(document).on('click', '#add-all-items-to-stock-button', function(e) | ||||
| { | ||||
| 	Grocy.ShoppingListToStockWorkflowAll = true; | ||||
| 	Grocy.ShoppingListToStockWorkflowCount = $(".shopping-list-stock-add-workflow-list-item-button").length; | ||||
| 	Grocy.ShoppingListAddToStockButtonList = $(".shopping-list-stock-add-workflow-list-item-button"); | ||||
| 	Grocy.ShoppingListToStockWorkflowCount = Grocy.ShoppingListAddToStockButtonList.length; | ||||
| 	Grocy.ShoppingListToStockWorkflowCurrent++; | ||||
| 	$(".shopping-list-stock-add-workflow-list-item-button").first().click(); | ||||
| }); | ||||
| @@ -282,6 +279,7 @@ $("#shopping-list-stock-add-workflow-modal").on("hidden.bs.modal", function(e) | ||||
| 	Grocy.ShoppingListToStockWorkflowAll = false; | ||||
| 	Grocy.ShoppingListToStockWorkflowCount = 0; | ||||
| 	Grocy.ShoppingListToStockWorkflowCurrent = 0; | ||||
| 	Grocy.ShoppingListAddToStockButtonList = []; | ||||
| }) | ||||
|  | ||||
| $(window).on("message", function(e) | ||||
| @@ -303,7 +301,7 @@ $(window).on("message", function(e) | ||||
| 			Grocy.ShoppingListToStockWorkflowCurrent++; | ||||
| 			if (Grocy.ShoppingListToStockWorkflowCurrent <= Grocy.ShoppingListToStockWorkflowCount) | ||||
| 			{ | ||||
| 				$(".shopping-list-stock-add-workflow-list-item-button")[Grocy.ShoppingListToStockWorkflowCurrent - 1].click(); | ||||
| 				Grocy.ShoppingListAddToStockButtonList[Grocy.ShoppingListToStockWorkflowCurrent - 1].click(); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
|   | ||||
| @@ -74,5 +74,8 @@ $('#shopping-list-form input').keydown(function(event) | ||||
| }); | ||||
|  | ||||
| Grocy.Components.UserfieldsForm.Load(); | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
| Grocy.FrontendHelpers.ValidateForm('shopping-list-form'); | ||||
|   | ||||
| @@ -209,7 +209,10 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) | ||||
| }); | ||||
|  | ||||
| Grocy.FrontendHelpers.ValidateForm('shoppinglist-form'); | ||||
| Grocy.Components.ProductPicker.GetInputElement().focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	Grocy.Components.ProductPicker.GetInputElement().focus(); | ||||
| }, 250); | ||||
|  | ||||
| if (Grocy.EditMode === "edit") | ||||
| { | ||||
|   | ||||
| @@ -84,5 +84,8 @@ $('#shoppinglocation-form input').keydown(function(event) | ||||
| }); | ||||
|  | ||||
| Grocy.Components.UserfieldsForm.Load(); | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
| Grocy.FrontendHelpers.ValidateForm('shoppinglocation-form'); | ||||
|   | ||||
| @@ -32,7 +32,7 @@ $("#transaction-type-filter").on("change", function() | ||||
| 		text = ""; | ||||
| 	} | ||||
|  | ||||
| 	stockJournalTable.column(4).search(text).draw(); | ||||
| 	stockJournalTable.column(stockJournalTable.colReorder.transpose(4)).search(text).draw(); | ||||
| }); | ||||
|  | ||||
| $("#location-filter").on("change", function() | ||||
| @@ -44,7 +44,7 @@ $("#location-filter").on("change", function() | ||||
| 		text = ""; | ||||
| 	} | ||||
|  | ||||
| 	stockJournalTable.column(5).search(text).draw(); | ||||
| 	stockJournalTable.column(stockJournalTable.colReorder.transpose(5)).search(text).draw(); | ||||
| }); | ||||
|  | ||||
| $("#user-filter").on("change", function() | ||||
| @@ -56,7 +56,7 @@ $("#user-filter").on("change", function() | ||||
| 		text = ""; | ||||
| 	} | ||||
|  | ||||
| 	stockJournalTable.column(6).search(text).draw(); | ||||
| 	stockJournalTable.column(stockJournalTable.colReorder.transpose(6)).search(text).draw(); | ||||
| }); | ||||
|  | ||||
| $("#daterange-filter").on("change", function() | ||||
|   | ||||
| @@ -14,11 +14,11 @@ $("#product-filter").on("change", function() | ||||
| 	var text = $("#product-filter option:selected").text(); | ||||
| 	if (value === "all") | ||||
| 	{ | ||||
| 		journalSummaryTable.column(1).search("").draw(); | ||||
| 		journalSummaryTable.column(journalSummaryTable.colReorder.transpose(1)).search("").draw(); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		journalSummaryTable.column(1).search("^" + text + "$", true, false).draw(); | ||||
| 		journalSummaryTable.column(journalSummaryTable.colReorder.transpose(1)).search("^" + text + "$", true, false).draw(); | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| @@ -31,7 +31,7 @@ $("#transaction-type-filter").on("change", function() | ||||
| 		text = ""; | ||||
| 	} | ||||
|  | ||||
| 	journalSummaryTable.column(2).search(text).draw(); | ||||
| 	journalSummaryTable.column(journalSummaryTable.colReorder.transpose(2)).search(text).draw(); | ||||
| }); | ||||
|  | ||||
| $("#user-filter").on("change", function() | ||||
| @@ -43,7 +43,7 @@ $("#user-filter").on("change", function() | ||||
| 		text = ""; | ||||
| 	} | ||||
|  | ||||
| 	journalSummaryTable.column(3).search(text).draw(); | ||||
| 	journalSummaryTable.column(journalSummaryTable.colReorder.transpose(3)).search(text).draw(); | ||||
| }); | ||||
|  | ||||
| $("#search").on("keyup", Delay(function() | ||||
| @@ -64,8 +64,8 @@ $("#clear-filter-button").on("click", function() | ||||
| 	$("#location-filter").val("all"); | ||||
| 	$("#user-filter").val("all"); | ||||
| 	$("#product-filter").val("all"); | ||||
| 	journalSummaryTable.column(1).search("").draw(); | ||||
| 	journalSummaryTable.column(2).search("").draw(); | ||||
| 	journalSummaryTable.column(3).search("").draw(); | ||||
| 	journalSummaryTable.column(journalSummaryTable.colReorder.transpose(1)).search("").draw(); | ||||
| 	journalSummaryTable.column(journalSummaryTable.colReorder.transpose(2)).search("").draw(); | ||||
| 	journalSummaryTable.column(journalSummaryTable.colReorder.transpose(3)).search("").draw(); | ||||
| 	journalSummaryTable.search("").draw(); | ||||
| }); | ||||
|   | ||||
| @@ -18,6 +18,7 @@ | ||||
| 		{ 'visible': false, 'targets': 15 }, | ||||
| 		{ 'visible': false, 'targets': 16 }, | ||||
| 		{ 'visible': false, 'targets': 17 }, | ||||
| 		{ 'visible': false, 'targets': 18 }, | ||||
| 		{ "type": "num", "targets": 3 }, | ||||
| 		{ "type": "html-num-fmt", "targets": 9 }, | ||||
| 		{ "type": "html-num-fmt", "targets": 10 }, | ||||
| @@ -44,7 +45,7 @@ $("#location-filter").on("change", function() | ||||
| 		value = "xx" + value + "xx"; | ||||
| 	} | ||||
|  | ||||
| 	stockOverviewTable.column(6).search(value).draw(); | ||||
| 	stockOverviewTable.column(stockOverviewTable.colReorder.transpose(6)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $("#product-group-filter").on("change", function() | ||||
| @@ -59,7 +60,7 @@ $("#product-group-filter").on("change", function() | ||||
| 		value = "xx" + value + "xx"; | ||||
| 	} | ||||
|  | ||||
| 	stockOverviewTable.column(8).search(value).draw(); | ||||
| 	stockOverviewTable.column(stockOverviewTable.colReorder.transpose(8)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $("#status-filter").on("change", function() | ||||
| @@ -73,7 +74,7 @@ $("#status-filter").on("change", function() | ||||
| 	// Transfer CSS classes of selected element to dropdown element (for background) | ||||
| 	$(this).attr("class", $("#" + $(this).attr("id") + " option[value='" + value + "']").attr("class") + " form-control"); | ||||
|  | ||||
| 	stockOverviewTable.column(7).search(value).draw(); | ||||
| 	stockOverviewTable.column(stockOverviewTable.colReorder.transpose(7)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $(".status-filter-message").on("click", function() | ||||
| @@ -89,9 +90,9 @@ $("#clear-filter-button").on("click", function() | ||||
| 	$("#status-filter").val("all"); | ||||
| 	$("#product-group-filter").val("all"); | ||||
| 	$("#location-filter").val("all"); | ||||
| 	stockOverviewTable.column(6).search("").draw(); | ||||
| 	stockOverviewTable.column(7).search("").draw(); | ||||
| 	stockOverviewTable.column(8).search("").draw(); | ||||
| 	stockOverviewTable.column(stockOverviewTable.colReorder.transpose(6)).search("").draw(); | ||||
| 	stockOverviewTable.column(stockOverviewTable.colReorder.transpose(7)).search("").draw(); | ||||
| 	stockOverviewTable.column(stockOverviewTable.colReorder.transpose(8)).search("").draw(); | ||||
| 	stockOverviewTable.search("").draw(); | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| $("#product_presets_location_id").val(Grocy.UserSettings.product_presets_location_id); | ||||
| $("#product_presets_product_group_id").val(Grocy.UserSettings.product_presets_product_group_id); | ||||
| $("#product_presets_qu_id").val(Grocy.UserSettings.product_presets_qu_id); | ||||
| $("#product_presets_default_due_days").val(Grocy.UserSettings.product_presets_default_due_days); | ||||
| $("#stock_due_soon_days").val(Grocy.UserSettings.stock_due_soon_days); | ||||
| $("#stock_default_purchase_amount").val(Grocy.UserSettings.stock_default_purchase_amount); | ||||
| $("#stock_default_consume_amount").val(Grocy.UserSettings.stock_default_consume_amount); | ||||
|   | ||||
| @@ -84,5 +84,8 @@ $('#task-category-form input').keydown(function(event) | ||||
| }); | ||||
|  | ||||
| Grocy.Components.UserfieldsForm.Load(); | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
| Grocy.FrontendHelpers.ValidateForm('task-category-form'); | ||||
|   | ||||
| @@ -88,6 +88,9 @@ $('#task-form input').keydown(function(event) | ||||
| }); | ||||
|  | ||||
| Grocy.Components.UserfieldsForm.Load(); | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
| Grocy.Components.DateTimePicker.GetInputElement().trigger('input'); | ||||
| Grocy.FrontendHelpers.ValidateForm('task-form'); | ||||
|   | ||||
| @@ -31,7 +31,7 @@ $("#status-filter").on("change", function() | ||||
| 	// Transfer CSS classes of selected element to dropdown element (for background) | ||||
| 	$(this).attr("class", $("#" + $(this).attr("id") + " option[value='" + value + "']").attr("class") + " form-control"); | ||||
|  | ||||
| 	tasksTable.column(5).search(value).draw(); | ||||
| 	tasksTable.column(tasksTable.colReorder.transpose(5)).search(value).draw(); | ||||
| }); | ||||
|  | ||||
| $("#clear-filter-button").on("click", function() | ||||
|   | ||||
| @@ -223,7 +223,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) | ||||
| 										$("#display_amount").select(); | ||||
| 									} | ||||
|  | ||||
| 									if (barcode.qu_id != null) | ||||
| 									if (barcode.qu_id != null && !barcode.qu_id.isEmpty()) | ||||
| 									{ | ||||
| 										Grocy.Components.ProductAmountPicker.SetQuantityUnit(barcode.qu_id); | ||||
| 									} | ||||
|   | ||||
| @@ -95,7 +95,10 @@ $("#show_in_sidebar_menu").on("click", function() | ||||
| 	} | ||||
| }); | ||||
|  | ||||
| $('#name').focus(); | ||||
| setTimeout(function() | ||||
| { | ||||
| 	$('#name').focus(); | ||||
| }, 250); | ||||
| Grocy.FrontendHelpers.ValidateForm('userentity-form'); | ||||
|  | ||||
| // Click twice to trigger on-click but not change the actual checked state | ||||
|   | ||||
| @@ -27,7 +27,7 @@ $("#entity-filter").on("change", function() | ||||
| 		value = ""; | ||||
| 	} | ||||
|  | ||||
| 	userfieldsTable.column(1).search(value).draw(); | ||||
| 	userfieldsTable.column(userfieldsTable.colReorder.transpose(1)).search(value).draw(); | ||||
| 	$("#new-userfield-button").attr("href", U("/userfield/new?embedded&entity=" + value)); | ||||
| }); | ||||
|  | ||||
| @@ -35,7 +35,7 @@ $("#clear-filter-button").on("click", function() | ||||
| { | ||||
| 	$("#search").val(""); | ||||
| 	$("#entity-filter").val("all"); | ||||
| 	userfieldsTable.column(1).search("").draw(); | ||||
| 	userfieldsTable.column(userfieldsTable.colReorder.transpose(1)).search("").draw(); | ||||
| 	userfieldsTable.search("").draw(); | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -238,6 +238,7 @@ $app->group('/api', function (RouteCollectorProxy $group) { | ||||
| 	$group->post('/chores/executions/{executionId}/undo', '\Grocy\Controllers\ChoresApiController:UndoChoreExecution'); | ||||
| 	$group->post('/chores/executions/calculate-next-assignments', '\Grocy\Controllers\ChoresApiController:CalculateNextExecutionAssignments'); | ||||
| 	$group->get('/chores/{choreId}/printlabel', '\Grocy\Controllers\ChoresApiController:ChorePrintLabel'); | ||||
| 	$group->post('/chores/{choreIdToKeep}/merge/{choreIdToRemove}', '\Grocy\Controllers\ChoresApiController:MergeChores'); | ||||
|  | ||||
| 	//Printing | ||||
| 	$group->get('/print/shoppinglist/thermal', '\Grocy\Controllers\PrintApiController:PrintShoppingListThermal'); | ||||
|   | ||||
| @@ -71,7 +71,9 @@ class ApplicationService extends BaseService | ||||
| 		return [ | ||||
| 			'grocy_version' => $this->GetInstalledVersion(), | ||||
| 			'php_version' => phpversion(), | ||||
| 			'sqlite_version' => $sqliteVersion | ||||
| 			'sqlite_version' => $sqliteVersion, | ||||
| 			'os' => php_uname('s') . ' ' . php_uname('r') . ' ' . php_uname('v') . ' ' . php_uname('m'), | ||||
| 			'client' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'unknown' | ||||
| 		]; | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -209,6 +209,40 @@ class ChoresService extends BaseService | ||||
| 		]); | ||||
| 	} | ||||
|  | ||||
| 	public function MergeChores(int $choreIdToKeep, int $choreIdToRemove) | ||||
| 	{ | ||||
| 		if (!$this->ChoreExists($choreIdToKeep)) | ||||
| 		{ | ||||
| 			throw new \Exception('$choreIdToKeep does not exist or is inactive'); | ||||
| 		} | ||||
|  | ||||
| 		if (!$this->ChoreExists($choreIdToRemove)) | ||||
| 		{ | ||||
| 			throw new \Exception('$choreIdToRemove does not exist or is inactive'); | ||||
| 		} | ||||
|  | ||||
| 		if ($choreIdToKeep == $choreIdToRemove) | ||||
| 		{ | ||||
| 			throw new \Exception('$choreIdToKeep cannot equal $choreIdToRemove'); | ||||
| 		} | ||||
|  | ||||
| 		$this->getDatabaseService()->GetDbConnectionRaw()->beginTransaction(); | ||||
| 		try | ||||
| 		{ | ||||
| 			$choreToKeep = $this->getDatabase()->chores($choreIdToKeep); | ||||
| 			$choreToRemove = $this->getDatabase()->chores($choreIdToRemove); | ||||
|  | ||||
| 			$this->getDatabaseService()->ExecuteDbStatement('UPDATE chores_log SET chore_id = ' . $choreIdToKeep . ' WHERE chore_id = ' . $choreIdToRemove); | ||||
| 			$this->getDatabaseService()->ExecuteDbStatement('DELETE FROM chores WHERE id = ' . $choreIdToRemove); | ||||
| 		} | ||||
| 		catch (Exception $ex) | ||||
| 		{ | ||||
| 			$this->getDatabaseService()->GetDbConnectionRaw()->rollback(); | ||||
| 			throw $ex; | ||||
| 		} | ||||
| 		$this->getDatabaseService()->GetDbConnectionRaw()->commit(); | ||||
| 	} | ||||
|  | ||||
| 	private function ChoreExists($choreId) | ||||
| 	{ | ||||
| 		$choreRow = $this->getDatabase()->chores()->where('id = :1', $choreId)->fetch(); | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user