Compare commits

..

67 Commits

Author SHA1 Message Date
Bernd Bestel
c2b675eb06 Deleted empty changelog file 2021-11-14 16:36:20 +01:00
Bernd Bestel
e552f4b730 Updated dependencies 2021-11-14 16:31:34 +01:00
Bernd Bestel
12f6296c75 Reviewed changelog 2021-11-14 16:30:19 +01:00
Bernd Bestel
3842f05ce9 Pulled translations from Transifex 2021-11-14 16:27:37 +01:00
Bernd Bestel
4d21668265 Added the possibility to merge chores 2021-11-14 16:19:52 +01:00
Bernd Bestel
693dcc1020 Prepared next release 2021-11-14 15:59:58 +01:00
Bernd Bestel
f5562602f0 Always show the add item button on the shopping list on mobile (closes #1645) 2021-11-14 15:50:48 +01:00
Bernd Bestel
86aa8f19f7 Fixed typos 2021-11-14 15:37:10 +01:00
Bernd Bestel
43ba3b4920 Added missing API changelog (references #1676) 2021-11-14 15:33:13 +01:00
Bernd Bestel
6070507b04 Fixed per unit stock grocycodes weren't unique per unit (fixes #1676) 2021-11-14 15:26:38 +01:00
Bernd Bestel
fc413a05d1 Simplified stock entry label printing options (on purchase) (references #1647) 2021-11-13 18:26:01 +01:00
Bernd Bestel
89b87156de Added changelog for #1672 2021-11-13 17:41:51 +01:00
Graham Christensen
a7f3f64d89 StockService: Set the product's bestBeforeDate to the freezer date if it is being purchased to a freezer (#1672)
* StockService: Set the product's bestBeforeDate to the freezer date if it is being purchased to a freezer

* Formatting / feature flag checks / proper data type comparision

* Prefill due date also on location change

Co-authored-by: Bernd Bestel <bernd@berrnd.de>
2021-11-13 17:41:04 +01:00
Bernd Bestel
10bd5ce900 Added a new "Presets for new products" stock setting for the "Default due days" option of new products (closes #1552) 2021-11-13 17:05:23 +01:00
Bernd Bestel
a6ffe8480a Show stock QU hint also for the energy field on the product edit page (closes #1682) 2021-11-13 16:45:55 +01:00
Bernd Bestel
2a2335c8f4 Use original column index when accessing data table columns (fixes #1684) 2021-11-12 18:26:19 +01:00
Bernd Bestel
4338ccc132 Restore the original due date when undoing a product opened transaction (fixes #1659) 2021-11-12 18:12:34 +01:00
Bernd Bestel
f2bef554a4 Fixed track date only chores next_estimated_tracking time comparision (fixes #1655) 2021-11-12 18:02:46 +01:00
Bernd Bestel
ab53a157e4 Allow backslashes in API query filters (fixes #1649) 2021-11-12 17:52:32 +01:00
Bernd Bestel
beae32ef23 Added the products average price as a hidden by default column on the stock overview page (closes #1677) 2021-11-09 19:39:32 +01:00
Bernd Bestel
787c885ccf Fixed addnewproduct productpicker flow shopping list selection on return (fixes #1646) 2021-11-08 22:09:48 +01:00
Bernd Bestel
286351b6d2 Fixed modal dialogs / iframes initial input focus (fixes #1665) 2021-11-08 21:59:02 +01:00
Bernd Bestel
29371163ad Fixed night mode over midnight time range check (fixes #1673) 2021-11-08 21:38:19 +01:00
Bernd Bestel
3f88b8dfa2 Fixed issue templates 2021-11-08 17:39:33 +01:00
Bernd Bestel
1c161b2b29 Added changelog for #1664 2021-11-08 17:36:29 +01:00
Bernd Bestel
5ea8ec2dda Update issue templates 2021-11-08 17:36:16 +01:00
Corbo
eb8c9848eb dark bg was missing in dropdown, text was dark on dark bg in product ellipsis (#1664)
Signed-off-by: corbolais <corbolais@gmail.com>
2021-11-08 17:29:34 +01:00
Bernd Bestel
2b97ac7c1c Added buttons to the products stock entries/journal on the product edit page (like on the productcard) (closes #1670) 2021-11-08 17:21:15 +01:00
Bernd Bestel
3c656ba618 Allow renaming the default shopping list (closes #1667) 2021-11-08 17:08:37 +01:00
Bernd Bestel
edddfe234c Include duesoon/overdue/expired products for the belowminstockamount filter on the stock overview page (closes #1666) 2021-11-08 17:06:20 +01:00
Bernd Bestel
8105dea17f Added changelog for #1661 2021-11-03 21:50:44 +01:00
Dmitri Iouchtchenko
dc1954cb05 Add name to stay_logged_in checkbox (#1661)
The attribute was dropped in 9942a2d.
2021-11-03 21:47:35 +01:00
Bernd Bestel
ea63246a12 Apply timezone for iCalendar events (closes #1637) 2021-10-05 20:55:29 +02:00
Bernd Bestel
196bdbe246 Added SECURITIY.md (references #1643) 2021-10-05 15:36:57 +02:00
Bernd Bestel
01ddeb4dfd Added data_generation_scripts 2021-10-02 17:39:36 +02:00
Bernd Bestel
282168f92c Potentially fix a type mismatch problem (fixes #1629) 2021-09-29 09:21:45 +02:00
Bernd Bestel
3c74d92eb0 Prepared next release 2021-09-27 18:21:28 +02:00
Bernd Bestel
fe622cacb2 Updated dependencies 2021-09-27 18:19:04 +02:00
Bernd Bestel
5ddb438134 Pulled translations from Transifex 2021-09-27 18:18:09 +02:00
Bernd Bestel
35469c3d98 Fixed QU resolve priority (fixes #1616) 2021-09-27 18:09:30 +02:00
Bernd Bestel
b32a26cf7e Typo 2021-09-27 17:50:38 +02:00
Bernd Bestel
bed7965989 Fixed undo consume stock transaction location handling (references #1602) 2021-09-27 17:50:19 +02:00
Bernd Bestel
19ff782c00 Fixed consume transaction journal location handling (fixes #1602) 2021-09-27 17:46:42 +02:00
Bernd Bestel
cebb368a28 Enforce min_stock_amount for child products where the parent has cumulate_min_stock_amount_of_sub_products enabled (fixes #1595) 2021-09-27 17:39:00 +02:00
Bernd Bestel
038917b030 Don't show battery grocycode when not available 2021-09-27 17:20:52 +02:00
Bernd Bestel
04d826943c Don't include events without a start time in iCal export (fixes #1625) 2021-09-24 13:22:24 +02:00
Bernd Bestel
e0735ce2e4 Hide stock value on productcard when FEATURE_FLAG_STOCK_PRICE_TRACKING is disabled 2021-09-24 13:13:38 +02:00
Bernd Bestel
849c281912 Allow spaces in API filter values (fixes #1624) 2021-09-22 10:12:57 +02:00
Bernd Bestel
c06bb7784a Include OS and client information in easy error info copy/paste and on the about dialog 2021-09-20 20:16:41 +02:00
Bernd Bestel
b9fff4954a Fixed modal backdrop z-index (references #1589) 2021-09-19 16:20:06 +02:00
Bernd Bestel
7aa9e5748e Allow to add a product picture on product creation (closes #1620) 2021-09-19 16:06:16 +02:00
Bernd Bestel
6175afa6be Don't apply the barocde qu_id if empty (fixes #1619) 2021-09-19 10:07:25 +02:00
Sebastian Ecker
5563e7ed4c StockLogEntry Property is date instead of date-time (#1617) 2021-09-17 16:22:26 +02:00
Bernd Bestel
305f846dbf Implemented bottom-sticky save buttons for product and chore edit forms (closes #1589) 2021-09-15 14:59:11 +02:00
Bernd Bestel
3f850c540b Fixed stock overview context menu item disabled handling (fixes #1609) 2021-09-15 14:24:50 +02:00
Bernd Bestel
2c3af45f5c Added missing changelog 2021-09-15 14:14:24 +02:00
Bernd Bestel
230901a28a Added changelog for #1599 2021-09-15 14:11:44 +02:00
Travis Howse
30e1a5c9b0 Store the list of buttons at the workflow start and iterate over that as the workflow progresses. (#1599) 2021-09-15 14:08:23 +02:00
Bernd Bestel
616e1dd5d7 Fixed negative number plural form handling (fixes #1601) 2021-09-06 22:26:31 +02:00
Bernd Bestel
a323bca9ec Added check for mbstring PHP extension (required by eluceo/ical, references #1603) 2021-09-06 22:19:36 +02:00
Bernd Bestel
14bb04d285 Allow any letters in API filter values (fixes #1591) 2021-08-27 21:05:46 +02:00
Bernd Bestel
edd372f8c4 Optimized chore/battery tracking input focus handling 2021-08-27 20:54:27 +02:00
Bernd Bestel
b4a7642af5 Reload shopping list page on list clearing 2021-08-27 20:39:47 +02:00
Bernd Bestel
580f49e69f Update README.md 2021-08-27 20:30:09 +02:00
Bernd Bestel
22db124624 Optimized ReverseProxyAuthMiddleware error message 2021-08-22 12:55:09 +02:00
Bernd Bestel
e88294eb40 Strikethrough reverted changes 2021-08-21 22:16:44 +02:00
Bernd Bestel
ae3bacf8fe Fixed changelog typos 2021-08-21 22:12:41 +02:00
117 changed files with 2584 additions and 1204 deletions

View 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;
}

View 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);
}

Binary file not shown.

View File

@@ -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.

View File

@@ -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
View 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.

View File

@@ -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
- &rarr; 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.

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View 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

View 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

File diff suppressed because it is too large Load Diff

View File

@@ -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);

View File

@@ -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;

View File

@@ -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));

View File

@@ -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());
}
}
}

View File

@@ -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()
]);
}
}

View File

@@ -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);

View File

@@ -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",

View File

@@ -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'
];

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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)"

View File

@@ -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 "Δείπνο"

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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 "εικόνα"

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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 ""

View File

@@ -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
View 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
View 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
View 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
View 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
View 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
View 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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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())

View File

@@ -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"))
{

View File

@@ -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()

View File

@@ -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');

View File

@@ -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();
});

View File

@@ -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);
}
);
});

View File

@@ -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");
});

View File

@@ -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();
});

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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()

View File

@@ -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)

View File

@@ -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');

View File

@@ -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);
}
);
});

View File

@@ -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");

View File

@@ -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 !== "")

View File

@@ -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
{

View File

@@ -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');

View File

@@ -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")
{

View File

@@ -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');

View File

@@ -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()

View File

@@ -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();
});

View File

@@ -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();
});

View File

@@ -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);

View File

@@ -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');

View File

@@ -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');

View File

@@ -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()

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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();
});

View File

@@ -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');

View File

@@ -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'
];
}

View File

@@ -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