This commit is contained in:
Bernd Bestel
2023-05-19 18:08:26 +02:00
parent 49daed6c2b
commit 5f65f2abd0
69 changed files with 204 additions and 502 deletions

View File

@@ -1,7 +1,7 @@
--- ---
name: Bug Report name: Bug Report
about: If you've found something that does not work, please report it to help improve about: If you've found something that does not work, please report it to help improve
grocy Grocy
title: 'Bug: ' title: 'Bug: '
labels: bug labels: bug
assignees: '' assignees: ''

2
.github/SECURITY.md vendored
View File

@@ -1,4 +1,4 @@
grocy is not an enterprise application and neither one you (should) host publicly (means without authentication) on the internet. 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 [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose). So unless something really bad can be abused _unauthenticated_, please just open a regular issue on the [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose).

View File

@@ -1,7 +1,7 @@
<div align="center"> <div align="center">
<img alt="Logo" height="50" src="https://raw.githubusercontent.com/grocy/grocy/master/public/img/grocy_logo.svg?sanitize=true" /> <img alt="Logo" height="50" src="https://raw.githubusercontent.com/grocy/grocy/master/public/img/logo.svg?sanitize=true" />
<h3>ERP beyond your fridge</h3> <h3>ERP beyond your fridge</h3>
<h4>grocy is a web-based self-hosted groceries & household management solution for your home<br>Created by <a href="https://github.com/berrnd">@berrnd</a></h4> <h4>Grocy is a web-based self-hosted groceries & household management solution for your home<br>Created by <a href="https://github.com/berrnd">@berrnd</a></h4>
</div> </div>
----- -----
@@ -20,7 +20,7 @@ See the website &rarr; <https://grocy.info>
- General help and usage questions &rarr; [r/grocy subreddit](https://www.reddit.com/r/grocy) - General help and usage questions &rarr; [r/grocy subreddit](https://www.reddit.com/r/grocy)
- Bug Reports and Feature Requests &rarr; [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose) - Bug Reports and Feature Requests &rarr; [Issue Tracker](https://github.com/grocy/grocy/issues/new/choose)
_Please don't send me private messages or call me regarding grocy help. I check the issue tracker and the subreddit pretty much daily, but don't provide grocy support beyond that._ _Please don't send me private messages or call me regarding Grocy help. I check the issue tracker and the subreddit pretty much daily, but don't provide any support beyond that._
## Community contributions ## Community contributions
@@ -28,13 +28,13 @@ See the website for a list of community contributed Add-ons / Tools. &rarr; [htt
## How to install ## How to install
> Checkout [grocy-desktop](https://github.com/grocy/grocy-desktop), if you want to run grocy without having to manage a webserver just like a normal (Windows) desktop application. > Checkout [grocy-desktop](https://github.com/grocy/grocy-desktop), if you want to run Grocy without having to manage a webserver just like a normal (Windows) desktop application.
> >
> Directly download the [latest release](https://releases.grocy.info/latest-desktop) - the installation is nothing more than just clicking 2 times "next". > Directly download the [latest release](https://releases.grocy.info/latest-desktop) - the installation is nothing more than just clicking 2 times "next".
See the website for some installation guides and troubleshooting help. &rarr; [https://grocy.info/links](https://grocy.info/links) See the website for some installation guides and troubleshooting help. &rarr; [https://grocy.info/links](https://grocy.info/links)
grocy is technically a pretty simple PHP application, so the basic notes to get it running are: Grocy is technically a pretty simple PHP application, so the basic notes to get it running are:
- Unpack the [latest release](https://releases.grocy.info/latest) - Unpack the [latest release](https://releases.grocy.info/latest)
- Copy `config-dist.php` to `data/config.php` + edit to your needs - Copy `config-dist.php` to `data/config.php` + edit to your needs
- Ensure that the `data` directory is writable - Ensure that the `data` directory is writable
@@ -62,13 +62,13 @@ See [grocy/grocy-docker](https://github.com/grocy/grocy-docker) or [linuxserver/
- Empty the `data/viewcache` directory - Empty the `data/viewcache` directory
- Visit the main route once to apply database migrations ([see below](https://github.com/grocy/grocy#database-migrations)) - Visit the main route once to apply database migrations ([see below](https://github.com/grocy/grocy#database-migrations))
If you run grocy on Linux, there is also `update.sh` (remember to make the script executable (`chmod +x update.sh`) and ensure that you have `unzip` installed) which does exactly this and additionally creates a backup (`.tgz` archive) of the current installation in `data/backups` (backups older than 60 days will be deleted during the update). If you run Grocy on Linux, there is also `update.sh` (remember to make the script executable (`chmod +x update.sh`) and ensure that you have `unzip` installed) which does exactly this and additionally creates a backup (`.tgz` archive) of the current installation in `data/backups` (backups older than 60 days will be deleted during the update).
## Localization ## Localization
grocy is fully localizable - the default language is English (integrated into code), a German localization is always maintained by me. 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 [Transifex](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. 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.
@@ -92,7 +92,7 @@ See the integrated Swagger UI instance on [/api](https://demo.grocy.info/api).
Some fields (with a barcode icon above) also allow to select a value by scanning a barcode. It works best when your barcode reader prefixes every barcode with a letter which is normally not part of a item name (I use a `$`) and sends a `TAB` after a scan. Some fields (with a barcode icon above) also allow to select a value by scanning a barcode. It works best when your barcode reader prefixes every barcode with a letter which is normally not part of a item name (I use a `$`) and sends a `TAB` after a scan.
Additionally it's also possible to use your device camera to scan a barcode by using the camera button on the right side of the corresponding field (powered by [Quagga2](https://github.com/ericblade/quagga2), totally offline / client-side camera stream processing, please note due to browser security restrictions, this only works when serving grocy via a secure connection (`https://`)). Quick video demo: https://www.youtube.com/watch?v=Y5YH6IJFnfc Additionally it's also possible to use your device camera to scan a barcode by using the camera button on the right side of the corresponding field (powered by [Quagga2](https://github.com/ericblade/quagga2), totally offline / client-side camera stream processing, please note due to browser security restrictions, this only works when serving Grocy via a secure connection (`https://`)). Quick video demo: <https://www.youtube.com/watch?v=Y5YH6IJFnfc>
_My personal recommendation: Use a USB barcode laser scanner. They are cheap and work 1000 % better, faster, under any lighting condition and from any angle._ _My personal recommendation: Use a USB barcode laser scanner. They are cheap and work 1000 % better, faster, under any lighting condition and from any angle._
@@ -133,7 +133,7 @@ _Please note: Database migrations are supposed to work between releases, not bet
### Disable certain features ### Disable certain features
If you don't use certain feature sets of grocy (for example if you don't need "Chores"), there are feature flags per major feature set to hide/disable the related UI elements (see `config-dist.php`). If you don't use certain feature sets of Grocy (for example if you don't need "Chores"), there are feature flags per major feature set to hide/disable the related UI elements (see `config-dist.php`).
### Adding your own CSS or JS without to have to modify the application itself ### Adding your own CSS or JS without to have to modify the application itself

View File

@@ -1 +1 @@
- grocy is now fully localizable and ships by default with English and German translations - Grocy is now fully localizable and ships by default with English and German translations

View File

@@ -1,3 +1,3 @@
- Upgraded Bootstrap and some other dependencies (grocy now looks even better!) - Upgraded Bootstrap and some other dependencies (Grocy now looks even better!)
- Added Italian translation (thanks @davidoskky) - Added Italian translation (thanks @davidoskky)
- => Demo for this language available at: https://it.demo.grocy.info - => Demo for this language available at: https://it.demo.grocy.info

View File

@@ -1,5 +1,5 @@
This was released shortly after the last release to fix a small regression bug, original changes from Version 1.13.0: This was released shortly after the last release to fix a small regression bug, original changes from Version 1.13.0:
- Upgraded Bootstrap and some other dependencies (grocy now looks even better!) - Upgraded Bootstrap and some other dependencies (Grocy now looks even better!)
- Added Italian translation (thanks @davidoskky) - Added Italian translation (thanks @davidoskky)
- => Demo for this language available at: https://it.demo.grocy.info - => Demo for this language available at: https://it.demo.grocy.info

View File

@@ -1,7 +1,7 @@
- New related project: **grocy-desktop** - New related project: **grocy-desktop**
- => https://github.com/grocy/grocy-desktop - => https://github.com/grocy/grocy-desktop
- Run grocy without a webserver just like a normal (Windows) desktop application - Run Grocy without a webserver just like a normal (Windows) desktop application
- New "embedded mode" for grocy to help running in "desktop application mode" [see README](https://github.com/grocy/grocy#embedded-mode) - New "embedded mode" for Grocy to help running in "desktop application mode" [see README](https://github.com/grocy/grocy#embedded-mode)
- New datepicker shorthands and improvements - New datepicker shorthands and improvements
- `YYYYMMe` or `YYYYMM+` gets expanded to the end of the given month in the given year in proper notation - `YYYYMMe` or `YYYYMM+` gets expanded to the end of the given month in the given year in proper notation
- Changed: `MMDD` will be expanded to the given day next year if > today - Changed: `MMDD` will be expanded to the given day next year if > today

View File

@@ -19,5 +19,5 @@
- Other improvements - Other improvements
- The calendar can now be shared/integrated in iCal format (button in the header on the calendar page) - The calendar can now be shared/integrated in iCal format (button in the header on the calendar page)
- Added feature flags to hide/disable certain parts of grocy when you don't use them (for example hide "Chores" and all related UI elements, when you don't use it, see `config-dist.php`) - Added feature flags to hide/disable certain parts of grocy when you don't use them (for example hide "Chores" and all related UI elements, when you don't use it, see `config-dist.php`)
- Added a "Apple Touch Icon" and a "Web App Manifest" which should improve grocy on mobile devices and also enables "Add to Home screen" on major mobile browsers - Added a "Apple Touch Icon" and a "Web App Manifest" which should improve Grocy on mobile devices and also enables "Add to Home screen" on major mobile browsers
- A lot of other minor small and bigger UI improvements - A lot of other minor small and bigger UI improvements

View File

@@ -2,7 +2,7 @@
- Fixed a problem that the user settings were not properly initialized for the frontend JS part when not logged only (so potentially affected only the login page) - Fixed a problem that the user settings were not properly initialized for the frontend JS part when not logged only (so potentially affected only the login page)
- Fixed an issue that the shopping list did not load when a plural translation for a quantity unit was missing - Fixed an issue that the shopping list did not load when a plural translation for a quantity unit was missing
- Fixed that tooltips were visible forever when consuming all products on the stock overview page - Fixed that tooltips were visible forever when consuming all products on the stock overview page
- Fixed that login did not work when "Stay logged in permanently" was set and grocy runs on a 32-bit system (thanks @matejdro) - Fixed that login did not work when "Stay logged in permanently" was set and Grocy runs on a 32-bit system (thanks @matejdro)
- Fixed page reloads when "Auto reload on external changes" is enabled and there is unsaved form data (the detection did not work for forms in modal dialogs, e. g. when adding a entry to the meal plan) - Fixed page reloads when "Auto reload on external changes" is enabled and there is unsaved form data (the detection did not work for forms in modal dialogs, e. g. when adding a entry to the meal plan)
- Fixed (again) that the product picker did not work properly when the product name contains single quotes - Fixed (again) that the product picker did not work properly when the product name contains single quotes
- Fixed that a entered barcode on the product edit page was only saved when "adding" it to the barcodes list by pressing `TAB` (is now automatically added to the list also when just leaving the field) - Fixed that a entered barcode on the product edit page was only saved when "adding" it to the barcodes list by pressing `TAB` (is now automatically added to the list also when just leaving the field)

View File

@@ -1,12 +1,13 @@
### New feature: Custom entities / objects / lists ### New feature: Custom entities / objects / lists
- Custom entities are based on Userfields and can be used to add any custom lists you want to have in grocy
- Custom entities are based on Userfields and can be used to add any custom lists you want to have in Grocy
- They can have an own menu entry in the sidebar - They can have an own menu entry in the sidebar
- => See "Manage master data" -> "Userentities" or try it on the demo: https://demo.grocy.info/userobjects/exampleuserentity - => See "Manage master data" -> "Userentities" or try it on the demo: https://demo.grocy.info/userobjects/exampleuserentity
### New feature: Use the device camera for barcode scanning ### New feature: Use the device camera for barcode scanning
- Available on any barcode-enabled field (so currently only for picking products) - a new camera button at the right of side the text field - Available on any barcode-enabled field (so currently only for picking products) - a new camera button at the right of side the text field
- Implemented using [QuaggaJS](https://github.com/serratus/quaggaJS) - camera stream processing happens totally offline / client-side - Implemented using [QuaggaJS](https://github.com/serratus/quaggaJS) - camera stream processing happens totally offline / client-side
- Please note due to browser security restrictions, this only works when serving grocy via a secure connection (`https://`) - Please note due to browser security restrictions, this only works when serving Grocy via a secure connection (`https://`)
- There is also a `config.php` setting `DISABLE_BROWSER_BARCODE_CAMERA_SCANNING` to disable this, if you don't need it at all (defaults to `false`) - There is also a `config.php` setting `DISABLE_BROWSER_BARCODE_CAMERA_SCANNING` to disable this, if you don't need it at all (defaults to `false`)
- I you have problems that barcodes are not recognized properly, there is a little "barcode scanner testing page" at [/barcodescannertesting](https://demo.grocy.info/barcodescannertesting) - I you have problems that barcodes are not recognized properly, there is a little "barcode scanner testing page" at [/barcodescannertesting](https://demo.grocy.info/barcodescannertesting)
- => Quick video demo: https://www.youtube.com/watch?v=Y5YH6IJFnfc - => Quick video demo: https://www.youtube.com/watch?v=Y5YH6IJFnfc
@@ -20,7 +21,7 @@
- Quantity units can now be linked (related measurements / unit conversion) - Quantity units can now be linked (related measurements / unit conversion)
- On the quantity unit edit page default conversion can be defined for each unit - On the quantity unit edit page default conversion can be defined for each unit
- Products "inherit" the default conversion and additionally can have their own / override the default ones - Products "inherit" the default conversion and additionally can have their own / override the default ones
- It's now possible to print a "Location Content Sheet" with the current stock per location - new button at the top of the stock overview page (thought to hang it at the location, note used amounts on paper and track it in grocy later) - It's now possible to print a "Location Content Sheet" with the current stock per location - new button at the top of the stock overview page (thought to hang it at the location, note used amounts on paper and track it in Grocy later)
- Stock overview page improvements - Stock overview page improvements
- Options in the more/context-menu to directly open the purchase/consume/inventory pages prefilled with the current product in a popup/dialog - Options in the more/context-menu to directly open the purchase/consume/inventory pages prefilled with the current product in a popup/dialog
- Option in the more/context-menu to add the current product directly to a shopping list - Option in the more/context-menu to add the current product directly to a shopping list
@@ -104,4 +105,4 @@
- It's now also possible to provide the API key via a query parameter (same name as the header, so `GROCY-API-KEY`) - It's now also possible to provide the API key via a query parameter (same name as the header, so `GROCY-API-KEY`)
#### Say thanks #### Say thanks
Because there were some questions about that in the past: If grocy is useful for you, [say thanks](https://grocy.info/#say-thanks)! Because there were some questions about that in the past: If Grocy is useful for you, [say thanks](https://grocy.info/#say-thanks)!

View File

@@ -1,5 +1,5 @@
## !! Important notice ## !! Important notice
If you run grocy in a subdirectory, you need to set a new `config.php` setting (`BASE_PATH`, see `config-dist.php`) If you run Grocy in a subdirectory, you need to set a new `config.php` setting (`BASE_PATH`, see `config-dist.php`)
### Stock fixes ### Stock fixes
- Fixed purchase/consume/inventory problems when `FEATURE_FLAG_STOCK_LOCATION_TRACKING` was set to `false` - Fixed purchase/consume/inventory problems when `FEATURE_FLAG_STOCK_LOCATION_TRACKING` was set to `false`

View File

@@ -31,10 +31,10 @@
- New `config.php` setting `AUTH_CLASS` to change the used authentication provider - New `config.php` setting `AUTH_CLASS` to change the used authentication provider
- Via LDAP - Via LDAP
- New `config.php` settings `LDAP_DOMAIN`, `LDAP_ADDRESS` and `LDAP_BASE_DN` - New `config.php` settings `LDAP_DOMAIN`, `LDAP_ADDRESS` and `LDAP_BASE_DN`
- If you set `AUTH_CLASS` to `Grocy\Middleware\LdapAuthMiddleware`, users will be authenticated against your directory (and will also be created (in grocy), if not already present) - If you set `AUTH_CLASS` to `Grocy\Middleware\LdapAuthMiddleware`, users will be authenticated against your directory (and will also be created (in Grocy), if not already present)
- Via a reverse proxy - Via a reverse proxy
- New `config.php` setting `REVERSE_PROXY_AUTH_HEADER` - New `config.php` setting `REVERSE_PROXY_AUTH_HEADER`
- If you set `AUTH_CLASS` to `Grocy\Middleware\ReverseProxyAuthMiddleware` and your reverse proxy sends a username in the HTTP header `REMOTE_USER` (header name can be changed by the setting `REVERSE_PROXY_AUTH_HEADER`), the user is automatically authenticated (and will also be created (in grocy), if not already present) - If you set `AUTH_CLASS` to `Grocy\Middleware\ReverseProxyAuthMiddleware` and your reverse proxy sends a username in the HTTP header `REMOTE_USER` (header name can be changed by the setting `REVERSE_PROXY_AUTH_HEADER`), the user is automatically authenticated (and will also be created (in Grocy), if not already present)
- (Thanks @fipwmaqzufheoxq92ebc for the initial work on this) - (Thanks @fipwmaqzufheoxq92ebc for the initial work on this)
### Stock improvements/fixes ### Stock improvements/fixes
@@ -174,7 +174,7 @@
- Products, quantity units and product groups are possible to use now - Products, quantity units and product groups are possible to use now
- Means you can use for example the shopping list, recipes and the meal plan with products while the "stock handling part" is hidden - Means you can use for example the shopping list, recipes and the meal plan with products while the "stock handling part" is hidden
- Ordering now happens case-insensitive - Ordering now happens case-insensitive
- The data path (previously fixed to the `data` folder) is now configurable, making it possible to run multiple grocy instances from the same directory (with different `config.php` files / different database, etc.) (thanks @fgrsnau) - The data path (previously fixed to the `data` folder) is now configurable, making it possible to run multiple Grocy instances from the same directory (with different `config.php` files / different database, etc.) (thanks @fgrsnau)
- Via an environment variable `GROCY_DATAPATH` (higher priority) - Via an environment variable `GROCY_DATAPATH` (higher priority)
- Via an FastCGI parameter `GROCY_DATAPATH` (lower priority) - Via an FastCGI parameter `GROCY_DATAPATH` (lower priority)
- The language can now be set per user (see the new user settings page / top right corner settings menu) (thanks @fipwmaqzufheoxq92ebc) - The language can now be set per user (see the new user settings page / top right corner settings menu) (thanks @fipwmaqzufheoxq92ebc)

View File

@@ -2,7 +2,8 @@
> ⚠️ PHP 8.0 (with SQLite 3.27.2+) is from now on the only supported runtime version. > ⚠️ PHP 8.0 (with SQLite 3.27.2+) is from now on the only supported runtime version.
### New feature: grocycode / label printer support ### New feature: Grocycode / label printer support
#### (Own) Product/stock entry/chores/batteries labels/barcodes #### (Own) Product/stock entry/chores/batteries labels/barcodes
- Print own labels/barcodes for products/stock entries/chores/batteries and then scan that code on every place a product/stock entry/chore/battery can be selected - Print own labels/barcodes for products/stock entries/chores/batteries and then scan that code on every place a product/stock entry/chore/battery can be selected
- Can be printed (or downloaded) via - Can be printed (or downloaded) via
@@ -27,7 +28,7 @@
### New feature: Shopping list thermal printer support ### New feature: Shopping list thermal printer support
- The shopping list can now be printed on a thermal printer - The shopping list can now be printed on a thermal printer
- The printer must be compatible to the `ESC/POS` protocol and needs to be locally attached or network reachable to/by the machine hosting grocy (so the server) - The printer must be compatible to the `ESC/POS` protocol and needs to be locally attached or network reachable to/by the machine hosting Grocy (so the server)
- See the new `TPRINTER*` `config.php` options to configure the printer connection and other options - See the new `TPRINTER*` `config.php` options to configure the printer connection and other options
- => New button on the shopping list print dialog - => New button on the shopping list print dialog
- Can be enabled via the new feature flag `FEATURE_FLAG_THERMAL_PRINTER` (defaults to disabled) - Can be enabled via the new feature flag `FEATURE_FLAG_THERMAL_PRINTER` (defaults to disabled)

View File

@@ -3,7 +3,7 @@
- More information on this: Only 1 level is currently supported; creating > 1 level nestings was _never_ possible via the UI/frontend, but not checked/enforced by the backend before `v3.0.0` - so it was potentially possible via the API (or any third party app/tool which utilizes it) to create such a nesting which then made this upgrade to fail - More information on this: Only 1 level is currently supported; creating > 1 level nestings was _never_ possible via the UI/frontend, but not checked/enforced by the backend before `v3.0.0` - so it was potentially possible via the API (or any third party app/tool which utilizes it) to create such a nesting which then made this upgrade to fail
- Fixed that it was not possible to select a chore/battery on the corresponding tracking pages by mouse/touch - Fixed that it was not possible to select a chore/battery on the corresponding tracking pages by mouse/touch
- Fixed that grouping by columns in tables may caused duplicate groups - Fixed that grouping by columns in tables may caused duplicate groups
- Fixed that grocycode camera barcode scanning didn't recognize the scanned code for chore/battery tracking - Fixed that Grocycode camera barcode scanning didn't recognize the scanned code for chore/battery tracking
- Fixed that when having any "Track date only" chore on the calendar, the iCal export was broken - Fixed that when having any "Track date only" chore on the calendar, the iCal export was broken
- Optimized the meal plan page to be properly printable (thanks @MrKrisKrisu) - Optimized the meal plan page to be properly printable (thanks @MrKrisKrisu)
@@ -11,6 +11,6 @@
> ❗ 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) > ❗ 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 inactive 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 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` 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/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 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) - Fixed that the "Stock by-barcode" API routes also accepted chore or battery grocycodes (thanks @lowlee)

View File

@@ -3,7 +3,7 @@
- The `config.php` option `FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT` was removed and is now a new product option `Treat opened as out of stock`, means, if opened stock entries will be counted as missing for calculating if a product is below its minimum stock amount, can now be configured per product - The `config.php` option `FEATURE_SETTING_STOCK_COUNT_OPENED_PRODUCTS_AGAINST_MINIMUM_STOCK_AMOUNT` was removed and is now a new product option `Treat opened as out of stock`, means, if opened stock entries will be counted as missing for calculating if a product is below its minimum stock amount, can now be configured per product
- The existing option will be migrated to all existing products, so no changed behavior after the update - The existing option will be migrated to all existing products, so no changed behavior after the update
- There is also a new stock setting (section "Presets for new products") which can be used to configure the default when adding products (also that will be set based on the old setting on migration) - There is also a new stock setting (section "Presets for new products") which can be used to configure the default when adding products (also that will be set based on the old setting on migration)
- When using/scanning a stock entry grocycode on the consume page, the amount is now prefilled by the stock entry amount (making it essentially possible to consume the corresponding stock entry in one go) - When using/scanning a stock entry Grocycode on the consume page, the amount is now prefilled by the stock entry amount (making it essentially possible to consume the corresponding stock entry in one go)
- Stock entry labels get now also printed on inventory (only when adding products, same option "Stock entry label" like on the purchase page) - Stock entry labels get now also printed on inventory (only when adding products, same option "Stock entry label" like on the purchase page)
- Fixed that stock entry labels on purchase were printed, even when "No label" was selected (was only a problem when running label printer WebHooks server side) - Fixed that stock entry labels on purchase were printed, even when "No label" was selected (was only a problem when running label printer WebHooks server side)
- Fixed that formatted (HTML) text for the (hidden by default) product description column on the stock overview page was not correctly displayed - Fixed that formatted (HTML) text for the (hidden by default) product description column on the stock overview page was not correctly displayed
@@ -17,7 +17,7 @@
- Background: Before v3.0.0 recipe costs were only based on the last price per product and since v3.0.0 the "real costs" (based on the default consume rule "Opened first, then first due first, then first in first out") are used, means out of stock items have no price - so using the last price for out of stock items should reflect the current real costs better - Background: Before v3.0.0 recipe costs were only based on the last price per product and since v3.0.0 the "real costs" (based on the default consume rule "Opened first, then first due first, then first in first out") are used, means out of stock items have no price - so using the last price for out of stock items should reflect the current real costs better
- Added a new recipes setting (top right corner settings menu) "Show the recipe list and the recipe side by side" (defaults to enabled, so no changed behaviour when not configured) - Added a new recipes setting (top right corner settings menu) "Show the recipe list and the recipe side by side" (defaults to enabled, so no changed behaviour when not configured)
- When disabled, on the recipes page, the recipe list is displayed full-width and the recipe will be shown in a popup instead of on the right side - When disabled, on the recipes page, the recipe list is displayed full-width and the recipe will be shown in a popup instead of on the right side
- Recipes are now also grocycode enabled (works like any other grocycode; download/print it via the recipes edit page or the more/context menu on the recipes page; use/scan it at any place a recipe can be selected) - Recipes are now also Grocycode enabled (works like any other Grocycode; download/print it via the recipes edit page or the more/context menu on the recipes page; use/scan it at any place a recipe can be selected)
- Performance improvements (page loading time) of the recipes page - Performance improvements (page loading time) of the recipes page
- Fixed that when adding missing recipe ingredients, with the option "Only check if any amount is in stock" enabled, to the shopping list, unit conversions (if any) weren't considered - Fixed that when adding missing recipe ingredients, with the option "Only check if any amount is in stock" enabled, to the shopping list, unit conversions (if any) weren't considered
- Fixed that the recipe stock fulfillment information about shopping list amounts was not correct when the ingredient had a decimal amount - Fixed that the recipe stock fulfillment information about shopping list amounts was not correct when the ingredient had a decimal amount

View File

@@ -42,7 +42,7 @@
- When enabled, the corresponding product can't have own stock, means it will not be selectable on purchase (useful for parent products which are just used as a summary/total view of the sub products) - When enabled, the corresponding product can't have own stock, means it will not be selectable on purchase (useful for parent products which are just used as a summary/total view of the sub products)
- The location content sheet can now optionally list also out of stock products (at the products default location, new checkbox "Show only in-stock products" at the top of the page, defaults to enabled) - The location content sheet can now optionally list also out of stock products (at the products default location, new checkbox "Show only in-stock products" at the top of the page, defaults to enabled)
- Added a location filter to the stock entries page - Added a location filter to the stock entries page
- Added the product grocycode as a (hidden by default) column to the products list (master data) - Added the product Grocycode as a (hidden by default) column to the products list (master data)
- The price entered on the inventory page is now related to the selected quantity unit (like on the purchase page, was always related to the products stock QU before) - The price entered on the inventory page is now related to the selected quantity unit (like on the purchase page, was always related to the products stock QU before)
- Fixed that consuming via the consume page was not possible when `FEATURE_FLAG_STOCK_LOCATION_TRACKING` was disabled - Fixed that consuming via the consume page was not possible when `FEATURE_FLAG_STOCK_LOCATION_TRACKING` was disabled
@@ -89,7 +89,7 @@
### Batteries ### Batteries
- Fixed that the batteries overview page was broken when there was any battery Userfield with enabled "Show as column in tables" option - Fixed that the batteries overview page was broken when there was any battery Userfield with enabled "Show as column in tables" option
- Fixed that grocycode label printer printing didn't work from the battery edit page (master data) (thanks @andreheuer) - Fixed that Grocycode label printer printing didn't work from the battery edit page (master data) (thanks @andreheuer)
- Fixed that undoing a battery charge cycle had no effect on "Last charged" and "Next planned charge cycle" of the corresponding battery - Fixed that undoing a battery charge cycle had no effect on "Last charged" and "Next planned charge cycle" of the corresponding battery
### Equipment ### Equipment

View File

@@ -29,5 +29,5 @@
- Endpoint `/stock/products/{productId}`: New field/property `default_consume_location` (contains the products default consume location object) - Endpoint `/stock/products/{productId}`: New field/property `default_consume_location` (contains the products default consume location object)
- Endpoint `/stock/products/{productId}/add`: Fixed that the request body parameter `transaction_type` was ignored / always set to `purchase` - Endpoint `/stock/products/{productId}/add`: Fixed that the request body parameter `transaction_type` was ignored / always set to `purchase`
- Fixed that the endpoint `/stock/products/by-barcode/{barcode}/open` didn't handle stock entries provided by a grocycode (thanks @jtommi) - Fixed that the endpoint `/stock/products/by-barcode/{barcode}/open` didn't handle stock entries provided by a Grocycode (thanks @jtommi)
- Fixed that less or equal (`<=`) and greater or equal (`>=`) filter comparisons didn't work (optional `query[]` request query parameter on most endpoints) - Fixed that less or equal (`<=`) and greater or equal (`>=`) filter comparisons didn't work (optional `query[]` request query parameter on most endpoints)

View File

@@ -94,6 +94,7 @@
- Like already possible for products/chores/batteries, locations, stores, quantity units, product groups and task categories can now be disabled to keep them for existing references without deleting them, but to hide them everywhere for selections and so on (new option "Active") - Like already possible for products/chores/batteries, locations, stores, quantity units, product groups and task categories can now be disabled to keep them for existing references without deleting them, but to hide them everywhere for selections and so on (new option "Active")
- Added a new `config.php` setting `ENERGY_UNIT` to customize the label to display energy values (was fixed `kcal` before and defaults to that, so no changed behavior when not configured) - Added a new `config.php` setting `ENERGY_UNIT` to customize the label to display energy values (was fixed `kcal` before and defaults to that, so no changed behavior when not configured)
- New logo and "Grocy" is now officially spelled with a capital initial letter (before everything was lowercase)
- Fixed that users were unable to delete their own API keys (when not having the `All permissions` permission) - Fixed that users were unable to delete their own API keys (when not having the `All permissions` permission)
- Fixed that button tooltips on some places didn't disappear after clicking the corresponding button - Fixed that button tooltips on some places didn't disappear after clicking the corresponding button
- New translations: (thanks all the translators) - New translations: (thanks all the translators)

View File

@@ -36,7 +36,7 @@ Setting('CALENDAR_SHOW_WEEK_OF_YEAR', true);
// Can also be set to -1 to dynamically start the meal plan week on "today" // Can also be set to -1 to dynamically start the meal plan week on "today"
Setting('MEAL_PLAN_FIRST_DAY_OF_WEEK', ''); Setting('MEAL_PLAN_FIRST_DAY_OF_WEEK', '');
// To keep it simple: grocy does not handle any currency conversions, // To keep it simple: Grocy does not handle any currency conversions,
// this here is used to format all money values, // this here is used to format all money values,
// so doesn't really matter, but needs to be the // so doesn't really matter, but needs to be the
// ISO 4217 code of the currency ("USD", "EUR", "GBP", etc.) // ISO 4217 code of the currency ("USD", "EUR", "GBP", etc.)
@@ -46,7 +46,7 @@ Setting('CURRENCY', 'USD');
// E.g. "kcal" or "kJ" or something else (doesn't really matter, it's only used to display energy values) // E.g. "kcal" or "kJ" or something else (doesn't really matter, it's only used to display energy values)
Setting('ENERGY_UNIT', 'kcal'); Setting('ENERGY_UNIT', 'kcal');
// When running grocy in a subdirectory, this should be set to the relative path, otherwise empty // When running Grocy in a subdirectory, this should be set to the relative path, otherwise empty
// It needs to be set to the part (of the URL) AFTER the document root, // It needs to be set to the part (of the URL) AFTER the document root,
// if URL rewriting is disabled, including index.php // if URL rewriting is disabled, including index.php
// Example with URL Rewriting support: // Example with URL Rewriting support:
@@ -105,7 +105,7 @@ Setting('GROCYCODE_TYPE', '1D');
// Label printer settings // Label printer settings
Setting('LABEL_PRINTER_WEBHOOK', ''); // The URI that grocy will POST to when asked to print a label Setting('LABEL_PRINTER_WEBHOOK', ''); // The URI that Grocy will POST to when asked to print a label
Setting('LABEL_PRINTER_RUN_SERVER', true); // Whether the webhook will be called server- or client-side Setting('LABEL_PRINTER_RUN_SERVER', true); // Whether the webhook will be called server- or client-side
Setting('LABEL_PRINTER_PARAMS', ['font_family' => 'Source Sans Pro (Regular)']); // Additional parameters supplied to the webhook Setting('LABEL_PRINTER_PARAMS', ['font_family' => 'Source Sans Pro (Regular)']); // Additional parameters supplied to the webhook
Setting('LABEL_PRINTER_HOOK_JSON', false); // TRUE to use JSON or FALSE to use normal POST request variables Setting('LABEL_PRINTER_HOOK_JSON', false); // TRUE to use JSON or FALSE to use normal POST request variables

View File

@@ -24,7 +24,7 @@ class CalendarApiController extends BaseApiController
$maxDate = null; $maxDate = null;
$vCalendar = new Calendar(); $vCalendar = new Calendar();
$vCalendar->setProductIdentifier('grocy'); $vCalendar->setProductIdentifier('Grocy');
foreach ($events as $event) foreach ($events as $event)
{ {
@@ -81,7 +81,7 @@ class CalendarApiController extends BaseApiController
$response->write((new CalendarFactory())->createCalendar($vCalendar)); $response->write((new CalendarFactory())->createCalendar($vCalendar));
$response = $response->withHeader('Content-Type', 'text/calendar; charset=utf-8'); $response = $response->withHeader('Content-Type', 'text/calendar; charset=utf-8');
return $response->withHeader('Content-Disposition', 'attachment; filename="grocy.ics"'); return $response->withHeader('Content-Disposition', 'attachment; filename="Grocy.ics"');
} }
catch (\Exception $ex) catch (\Exception $ex)
{ {

View File

@@ -27,7 +27,7 @@ trait GrocycodeTrait
if ($isDownload) if ($isDownload)
{ {
$response = $response->withHeader('Content-Type', 'application/octet-stream') $response = $response->withHeader('Content-Type', 'application/octet-stream')
->withHeader('Content-Disposition', 'attachment; filename=grocycode.png') ->withHeader('Content-Disposition', 'attachment; filename=Grocycode.png')
->withHeader('Content-Length', strlen($png)) ->withHeader('Content-Length', strlen($png))
->withHeader('Cache-Control', 'no-cache') ->withHeader('Cache-Control', 'no-cache')
->withHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT'); ->withHeader('Last-Modified', gmdate('D, d M Y H:i:s') . ' GMT');

View File

@@ -1,15 +1,15 @@
grocycode Grocycode
========== ==========
grocycode is, in essence, a simple way to reference to arbitrary grocy entities. Grocycode is, in essence, a simple way to reference to arbitrary Grocy entities.
Each grocycode includes a magic, an entitiy identifier, an id and an ordered set of extra data. Each Grocycode includes a magic, an entitiy identifier, an id and an ordered set of extra data.
It is supported to be entered anywhere grocy expects one to read a barcode, but can also reference It is supported to be entered anywhere Grocy expects one to read a barcode, but can also reference
grocy-internal properties like specific stock entries, or specific batteries. Grocy-internal properties like specific stock entries, or specific batteries.
Serialization Serialization
---- ----
There are three mandatory parts in a grocycode: There are three mandatory parts in a Grocycode:
1. The magic `grcy` 1. The magic `grcy`
2. An entity identifer matching the regular expression `[a-z]+` (that is, lowercase english alphabet without any fancy accents, minimum length 1 character). 2. An entity identifer matching the regular expression `[a-z]+` (that is, lowercase english alphabet without any fancy accents, minimum length 1 character).

View File

@@ -6,8 +6,8 @@ To enable label printing, set `FEATURE_FLAG_LABEL_PRINTER` to `true`in your `con
Why webhook? Why webhook?
--- ---
Label printers come in all shapes and forms, and your particular one is probably not the one used by the author of this feature. Also, grocy may does not have a Label printers come in all shapes and forms, and your particular one is probably not the one used by the author of this feature. Also, Grocy may does not have a
direct connection to a local label printer (e.g. grocy is hosted in a cloud vps). Thus, a lightweight implementation is provided by grocy: whenever something direct connection to a local label printer (e.g. Grocy is hosted in a cloud vps). Thus, a lightweight implementation is provided by Grocy: whenever something
should print, a POST request to a configured URL is made. The target then is responsible for label printing. should print, a POST request to a configured URL is made. The target then is responsible for label printing.
Reference implementation Reference implementation
@@ -19,8 +19,8 @@ implemented into [a fork of brother_ql_web](https://github.com/mistressofjellyfi
Webhook request Webhook request
--- ---
Requests can be configured to be sent server-side (that is, from the machine hosting grocy through GuzzleHttp) or by an AJAX request directly from the browser. Requests can be configured to be sent server-side (that is, from the machine hosting Grocy through GuzzleHttp) or by an AJAX request directly from the browser.
The latter is neccesary for situations where the grocy hosting machine cannot reach your label printer, however server-side requests are a bit faster and The latter is neccesary for situations where the Grocy hosting machine cannot reach your label printer, however server-side requests are a bit faster and
tend to be more stable. tend to be more stable.
Both methods fire this request upon printing: Both methods fire this request upon printing:

View File

@@ -1,7 +1,7 @@
{ {
"openapi": "3.0.0", "openapi": "3.0.0",
"info": { "info": {
"title": "grocy REST API", "title": "Grocy REST API",
"description": "Authentication is done via API keys (header *GROCY-API-KEY* or same named query parameter), which you can manage [here](PlaceHolderManageApiKeysUrl).<br>Additionally requests from within the frontend are also valid (via session cookie).", "description": "Authentication is done via API keys (header *GROCY-API-KEY* or same named query parameter), which you can manage [here](PlaceHolderManageApiKeysUrl).<br>Additionally requests from within the frontend are also valid (via session cookie).",
"version": "xxx", "version": "xxx",
"license": { "license": {
@@ -60,7 +60,7 @@
"paths": { "paths": {
"/system/info": { "/system/info": {
"get": { "get": {
"summary": "Returns information about the installed grocy version, PHP runtime and OS", "summary": "Returns information about the installed Grocy version, PHP runtime and OS",
"tags": [ "tags": [
"System" "System"
], ],
@@ -1550,7 +1550,7 @@
}, },
"/stock/entry/{entryId}/printlabel": { "/stock/entry/{entryId}/printlabel": {
"get": { "get": {
"summary": "Prints the grocycode / stock entry label of the given entry on the configured label printer", "summary": "Prints the Grocycode / stock entry label of the given entry on the configured label printer",
"tags": [ "tags": [
"Stock" "Stock"
], ],
@@ -2281,7 +2281,7 @@
}, },
"/stock/products/{productId}/printlabel": { "/stock/products/{productId}/printlabel": {
"get": { "get": {
"summary": "Prints the grocycode label of the given product on the configured label printer", "summary": "Prints the Grocycode label of the given product on the configured label printer",
"tags": [ "tags": [
"Stock" "Stock"
], ],
@@ -3582,7 +3582,7 @@
}, },
"/recipes/{recipeId}/printlabel": { "/recipes/{recipeId}/printlabel": {
"get": { "get": {
"summary": "Prints the grocycode label of the given recipe on the configured label printer", "summary": "Prints the Grocycode label of the given recipe on the configured label printer",
"tags": [ "tags": [
"Recipes" "Recipes"
], ],
@@ -3855,7 +3855,7 @@
}, },
"/chores/{choreId}/printlabel": { "/chores/{choreId}/printlabel": {
"get": { "get": {
"summary": "Prints the grocycode label of the given chore on the configured label printer", "summary": "Prints the Grocycode label of the given chore on the configured label printer",
"tags": [ "tags": [
"Chores" "Chores"
], ],
@@ -4120,7 +4120,7 @@
}, },
"/batteries/{batteryId}/printlabel": { "/batteries/{batteryId}/printlabel": {
"get": { "get": {
"summary": "Prints the grocycode label of the given battery on the configured label printer", "summary": "Prints the Grocycode label of the given battery on the configured label printer",
"tags": [ "tags": [
"Batteries" "Batteries"
], ],
@@ -4368,7 +4368,7 @@
"in": "query", "in": "query",
"name": "printHeader", "name": "printHeader",
"required": false, "required": false,
"description": "Prints grocy logo if true", "description": "Prints Grocy logo if true",
"schema": { "schema": {
"type": "boolean", "type": "boolean",
"default": true "default": true

View File

@@ -3,10 +3,10 @@
namespace Grocy\Helpers; namespace Grocy\Helpers;
/** /**
* A class that abstracts grocycode. * A class that abstracts Grocycode.
* *
* grocycode is a simple, easily serializable format to reference * Grocycode is a simple, easily serializable format to reference
* stuff within grocy. It consists of n (n ≥ 3) double-colon seperated parts: * stuff within Grocy. It consists of n (n ≥ 3) double-colon seperated parts:
* *
* 1. The magic `grcy` * 1. The magic `grcy`
* 2. A type identifer, must match `[a-z]+` (i.e. only lowercase ascii, minimum length 1 character) * 2. A type identifer, must match `[a-z]+` (i.e. only lowercase ascii, minimum length 1 character)
@@ -96,12 +96,12 @@ class Grocycode
$parts = array_reverse(explode(':', $code)); $parts = array_reverse(explode(':', $code));
if (array_pop($parts) != self::MAGIC) if (array_pop($parts) != self::MAGIC)
{ {
throw new \Exception('Not a grocycode'); throw new \Exception('Not a Grocycode');
} }
if (!in_array($this->type = array_pop($parts), self::$Items)) if (!in_array($this->type = array_pop($parts), self::$Items))
{ {
throw new \Exception('Unknown grocycode type'); throw new \Exception('Unknown Grocycode type');
} }
$this->id = array_pop($parts); $this->id = array_pop($parts);
@@ -116,7 +116,7 @@ class Grocycode
} }
if (!in_array($type, self::$Items)) if (!in_array($type, self::$Items))
{ {
throw new \Exception('Unknown grocycode type'); throw new \Exception('Unknown Grocycode type');
} }
$this->type = $type; $this->type = $type;

View File

@@ -345,7 +345,7 @@ msgstr ""
msgid "Removed %1$s of %2$s from stock" msgid "Removed %1$s of %2$s from stock"
msgstr "" msgstr ""
msgid "About grocy" msgid "About Grocy"
msgstr "" msgstr ""
msgid "Close" msgid "Close"
@@ -1338,7 +1338,7 @@ msgstr ""
msgid "Price factor" msgid "Price factor"
msgstr "" msgstr ""
msgid "Do you find grocy useful?" msgid "Do you find Grocy useful?"
msgstr "" msgstr ""
msgid "Say thanks" msgid "Say thanks"
@@ -1457,7 +1457,7 @@ msgstr ""
msgid "Edit stock entry" msgid "Edit stock entry"
msgstr "" msgstr ""
msgid "Camera access is only possible when supported and allowed by your browser and when grocy is served via a secure (https://) connection" msgid "Camera access is only possible when supported and allowed by your browser and when Grocy is served via a secure (https://) connection"
msgstr "" msgstr ""
msgid "Keep screen on" msgid "Keep screen on"
@@ -2004,17 +2004,17 @@ msgstr ""
msgid "A product or a note is required" msgid "A product or a note is required"
msgstr "" msgstr ""
msgid "grocycode" msgid "Grocycode"
msgstr "" msgstr ""
msgid "Download" msgid "Download"
msgstr "" msgstr ""
# Example: Download *Product* grocycode # Example: Download *Product* Grocycode
msgid "Download %s grocycode" msgid "Download %s Grocycode"
msgstr "" msgstr ""
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" 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 "" msgstr ""
# Abbreviation for "due date" # Abbreviation for "due date"
@@ -2042,8 +2042,8 @@ msgstr ""
msgid "Error while executing WebHook" msgid "Error while executing WebHook"
msgstr "" msgstr ""
# Example: Print *Product* grocycode on label printer # Example: Print *Product* Grocycode on label printer
msgid "Print %s grocycode on label printer" msgid "Print %s Grocycode on label printer"
msgstr "" msgstr ""
msgid "Open stock entry label in new window" msgid "Open stock entry label in new window"

View File

@@ -4,10 +4,6 @@ body.night-mode,
background-color: #333131; background-color: #333131;
} }
.night-mode .navbar-brand img {
filter: invert(0.9) hue-rotate(176deg);
}
.navbar-light .navbar-toggler { .navbar-light .navbar-toggler {
color: rgba(255, 255, 255, .5); color: rgba(255, 255, 255, .5);
border-color: rgba(255, 255, 255, .1); border-color: rgba(255, 255, 255, .1);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="mstile-150x150.png"/>
<TileColor>#e5e5e5</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 948 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -1,267 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="2424.000000pt" height="2424.000000pt" viewBox="0 0 2424.000000 2424.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,2424.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2437 16674 c-1 -1 -42 -4 -92 -8 -49 -3 -101 -8 -115 -10 -14 -3
-43 -7 -65 -10 -73 -11 -109 -17 -175 -32 -36 -9 -75 -17 -86 -20 -20 -4 -137
-38 -174 -50 -8 -3 -16 -5 -18 -4 -1 0 -16 -7 -32 -15 -16 -8 -31 -15 -32 -14
-2 0 -16 -5 -33 -12 -16 -7 -34 -13 -40 -15 -19 -4 -60 -25 -120 -60 -33 -19
-70 -40 -82 -46 -13 -6 -23 -15 -23 -20 0 -4 -7 -8 -15 -8 -8 0 -15 -4 -15
-10 0 -5 -5 -10 -11 -10 -35 0 -359 -295 -454 -415 -22 -27 -48 -57 -57 -66
-10 -9 -18 -19 -18 -23 0 -4 -5 -12 -10 -19 -49 -57 -69 -86 -133 -182 -39
-60 -74 -112 -77 -115 -3 -3 -6 -12 -8 -20 -2 -8 -9 -22 -16 -30 -56 -65 -236
-506 -261 -636 -2 -10 -4 -20 -5 -21 -2 -2 -4 -12 -5 -23 -1 -11 -3 -21 -5
-22 -2 -4 -7 -27 -15 -78 -4 -24 -8 -47 -10 -50 -2 -3 -6 -30 -10 -60 -3 -30
-8 -62 -10 -70 -8 -32 -22 -170 -30 -285 -2 -38 -5 -70 -5 -70 -3 0 -11 -212
-14 -361 -2 -94 -6 -176 -10 -182 -3 -6 -3 -13 2 -16 4 -2 7 -24 5 -48 -2 -24
-3 -52 -3 -63 1 -20 1 -35 -1 -57 -1 -7 1 -25 4 -40 3 -15 1 -30 -4 -34 -6 -3
-6 -10 -1 -17 5 -7 6 -21 2 -32 -4 -11 -4 -32 1 -47 4 -16 5 -28 1 -28 -4 0
-7 -11 -7 -25 0 -14 3 -25 6 -25 3 0 4 -12 2 -27 -5 -32 -5 -33 0 -90 2 -24
-1 -43 -6 -43 -4 0 -5 -5 -1 -12 4 -7 9 -91 10 -188 2 -168 9 -324 19 -420 3
-25 7 -67 9 -95 6 -59 13 -106 32 -200 19 -96 23 -111 34 -140 5 -14 7 -25 4
-25 -4 0 1 -11 10 -25 9 -14 14 -25 11 -25 -18 0 148 -365 241 -530 20 -36 66
-110 103 -164 36 -54 71 -106 76 -115 6 -9 16 -20 22 -24 7 -4 13 -13 13 -18
0 -6 6 -16 13 -23 6 -7 28 -32 47 -56 60 -75 251 -264 335 -332 106 -85 230
-166 340 -221 100 -51 203 -97 216 -97 4 0 18 -4 31 -9 13 -5 26 -9 31 -10 4
0 21 -8 37 -16 17 -9 30 -13 30 -11 0 3 12 1 28 -5 15 -6 36 -13 47 -15 11 -2
61 -13 110 -23 50 -11 115 -23 145 -26 30 -3 80 -8 110 -12 116 -13 420 -6
511 12 13 3 38 7 54 10 43 6 87 15 108 21 10 3 30 7 45 9 52 7 251 73 347 115
68 29 179 83 185 90 3 3 26 16 53 30 26 13 47 28 47 32 0 5 3 7 8 6 6 -2 119
69 132 83 3 3 23 18 45 35 22 16 45 34 51 39 6 6 28 24 49 40 32 25 159 145
369 350 23 22 50 47 60 55 17 14 18 13 13 -5 -3 -11 -9 -49 -12 -85 -11 -135
-24 -269 -30 -325 -3 -22 -7 -67 -10 -100 -9 -112 -15 -180 -21 -225 -3 -25
-7 -65 -9 -90 -2 -25 -6 -61 -9 -80 -3 -19 -8 -62 -11 -95 -3 -33 -8 -67 -10
-75 -2 -8 -6 -40 -10 -71 -3 -31 -8 -67 -11 -80 -2 -13 -6 -40 -9 -59 -4 -30
-19 -108 -41 -210 -3 -14 -9 -41 -14 -60 -5 -19 -10 -39 -11 -45 -1 -9 -28
-80 -52 -135 -6 -14 -11 -28 -11 -31 -1 -3 -21 -37 -45 -74 -52 -80 -142 -171
-221 -222 -30 -20 -57 -39 -60 -42 -30 -35 -265 -134 -380 -161 -25 -6 -53
-13 -64 -15 -10 -2 -37 -7 -60 -9 -22 -3 -50 -7 -61 -10 -20 -4 -67 -9 -180
-21 -56 -6 -410 -7 -495 -1 -30 2 -86 7 -125 11 -38 4 -88 9 -110 11 -37 3
-94 10 -170 19 -16 2 -30 4 -30 5 0 1 -9 3 -20 4 -11 2 -38 6 -60 10 -22 3
-58 9 -80 12 -22 4 -49 8 -60 11 -11 2 -42 8 -70 13 -27 5 -84 17 -125 25 -41
9 -86 18 -100 21 -14 2 -122 29 -240 60 -118 30 -226 57 -240 59 -14 3 -77 18
-140 35 -63 17 -125 33 -137 35 -36 8 -65 14 -108 24 -58 13 -86 20 -118 27
-18 4 -29 1 -32 -8 -5 -11 -15 -136 -15 -178 0 -8 0 -61 0 -118 0 -57 -2 -107
-5 -112 -4 -6 -3 -10 2 -10 4 0 8 -30 9 -68 2 -154 12 -361 18 -371 4 -5 2
-12 -4 -16 -6 -4 -8 -11 -4 -16 5 -9 13 -139 18 -294 1 -44 5 -86 9 -93 5 -6
4 -12 -2 -12 -5 0 -8 -10 -6 -21 5 -25 8 -30 27 -33 7 -2 20 -5 28 -9 18 -6
118 -32 210 -53 36 -9 72 -18 80 -21 8 -3 20 -7 25 -8 6 -2 67 -16 135 -33
159 -39 225 -52 297 -55 18 -1 33 -4 33 -7 0 -4 10 -6 23 -6 12 0 45 -4 72 -8
28 -4 70 -9 95 -11 25 -2 70 -6 100 -9 86 -9 179 -16 250 -21 36 -2 103 -7
150 -10 47 -4 138 -8 202 -9 65 0 118 -4 118 -7 0 -5 798 -5 810 0 3 1 52 4
108 6 57 2 129 7 160 10 32 4 73 8 92 10 81 8 149 16 205 26 33 5 76 11 95 13
19 2 35 5 35 6 0 2 31 7 76 14 14 2 35 9 46 15 11 5 23 8 25 5 3 -2 40 5 81
16 42 12 84 23 94 25 43 9 277 94 309 112 12 7 24 9 28 6 3 -3 6 -1 6 5 0 7 6
12 14 12 28 0 263 130 385 214 40 28 80 56 89 61 61 39 232 207 282 278 18 26
37 47 42 47 4 0 8 5 8 10 0 6 23 41 50 79 28 38 50 74 50 80 0 6 4 11 9 11 5
0 11 8 15 18 6 18 27 54 37 62 3 3 32 55 65 115 32 61 63 113 68 117 6 4 8 8
4 8 -4 0 6 26 21 58 37 74 73 153 76 167 1 5 7 24 14 40 16 39 41 107 44 120
2 6 6 16 11 23 4 7 5 16 2 19 -3 3 -1 14 5 25 6 11 13 29 15 41 3 12 7 33 10
47 3 14 7 32 9 40 2 8 4 15 5 15 4 0 9 61 14 175 3 69 9 159 12 200 4 41 7 83
7 93 1 9 4 17 7 17 3 0 6 9 7 20 4 54 65 133 129 166 42 22 106 44 130 44 11
0 24 3 27 6 4 4 24 8 44 9 257 14 421 18 835 18 435 1 486 2 487 16 0 9 2 129
5 266 19 801 28 1275 30 1487 0 115 5 208 10 208 5 0 3 6 -3 13 -6 8 -8 17 -4
20 3 4 8 89 9 189 10 588 12 680 18 685 3 3 1 12 -5 20 -6 7 -8 13 -3 13 5 0
10 53 10 118 2 117 10 322 18 417 8 99 17 206 20 223 2 9 7 40 12 67 11 67 11
69 14 75 1 3 4 14 6 25 6 36 9 50 17 63 5 7 10 23 13 36 6 34 70 145 144 250
8 12 33 38 55 59 22 21 54 50 70 66 41 39 266 199 340 241 33 19 69 40 80 47
11 7 46 24 78 39 31 15 57 31 57 36 0 4 8 8 18 8 10 0 22 4 27 8 18 16 133 61
139 55 3 -4 6 -1 6 5 0 7 3 11 8 10 4 -1 27 4 51 11 62 18 132 16 146 -3 14
-18 8 -165 -10 -236 0 -3 -4 -27 -9 -53 -4 -27 -9 -59 -12 -70 -2 -12 -6 -33
-9 -47 -5 -28 -21 -104 -28 -135 -4 -20 -11 -55 -23 -130 -4 -22 -8 -59 -8
-82 -1 -24 -3 -43 -6 -43 -3 0 -6 -12 -6 -27 -1 -16 -4 -51 -7 -79 -38 -342
-54 -854 -34 -1119 14 -186 17 -221 24 -245 3 -14 7 -41 8 -60 2 -19 4 -35 5
-35 1 0 3 -16 5 -35 2 -19 6 -46 9 -60 4 -14 9 -41 12 -60 4 -26 44 -204 59
-260 1 -3 5 -18 9 -35 9 -35 63 -201 76 -230 4 -11 20 -51 34 -88 14 -37 47
-110 72 -162 25 -52 45 -97 44 -101 -1 -4 2 -10 7 -13 11 -8 43 -61 50 -83 3
-10 9 -18 14 -18 5 0 9 -5 9 -11 0 -23 147 -230 243 -342 228 -267 519 -493
848 -660 135 -68 260 -127 271 -127 4 0 31 -11 60 -24 44 -20 74 -31 118 -41
3 -1 19 -7 35 -14 17 -7 39 -14 50 -15 11 -2 38 -8 60 -14 56 -15 210 -41 281
-47 237 -20 813 -26 1034 -11 236 16 269 20 497 62 16 3 46 10 68 15 22 5 49
11 60 14 47 9 112 28 140 40 17 8 44 17 60 21 17 4 35 9 40 13 6 3 12 6 15 7
14 3 69 26 95 41 17 9 31 16 33 15 5 -4 127 61 134 72 4 6 8 8 8 3 0 -4 19 5
43 20 90 57 122 78 135 91 7 6 17 12 21 12 4 0 16 8 27 18 10 9 37 30 59 47
22 16 45 34 51 40 6 5 32 28 58 50 27 22 71 61 98 87 27 27 54 48 60 48 6 0 9
2 7 5 -3 2 106 118 242 257 137 139 250 250 252 248 2 -3 14 -22 26 -43 13
-21 28 -43 34 -50 15 -16 35 -47 44 -67 3 -8 12 -19 20 -23 7 -4 13 -14 13
-22 0 -7 3 -15 8 -17 4 -1 23 -28 42 -58 19 -30 37 -57 40 -60 3 -3 18 -23 35
-45 35 -47 153 -167 210 -212 122 -97 202 -156 232 -170 18 -8 33 -19 33 -23
0 -4 14 -13 30 -20 17 -7 30 -16 30 -19 0 -4 16 -13 35 -21 19 -8 35 -17 35
-20 0 -3 16 -12 35 -20 19 -8 35 -18 35 -22 0 -5 4 -6 10 -3 5 3 10 2 10 -3 0
-9 20 -18 44 -20 5 0 12 -4 15 -9 12 -16 340 -163 366 -163 6 0 23 -7 39 -15
16 -9 39 -17 50 -20 12 -2 21 -4 21 -5 0 -1 9 -3 20 -4 11 -2 40 -9 65 -16 25
-7 54 -14 65 -16 11 -1 34 -5 50 -8 34 -6 105 -16 150 -21 95 -12 355 -19 675
-18 310 0 429 3 675 15 17 1 33 7 37 13 5 6 8 5 8 -3 0 -7 3 -11 8 -9 4 3 34
8 67 12 80 8 113 13 225 32 91 14 107 18 148 27 9 2 40 9 67 16 51 11 225 68
280 91 17 6 35 13 40 15 6 1 33 12 60 25 28 12 55 23 61 24 6 2 27 10 47 20
19 9 41 18 49 19 7 2 27 9 43 16 17 7 53 23 80 35 l50 22 -1 731 c0 402 -3
734 -6 737 -2 3 -127 -56 -276 -130 -149 -74 -275 -135 -281 -135 -6 0 -19 -4
-29 -10 -33 -19 -150 -58 -156 -53 -3 4 -6 0 -6 -7 0 -7 -3 -11 -6 -7 -3 3
-25 -1 -47 -10 -23 -8 -53 -17 -67 -19 -14 -3 -50 -11 -80 -19 -30 -8 -67 -16
-82 -19 -69 -14 -80 -16 -105 -21 -16 -3 -50 -8 -78 -11 -27 -4 -55 -11 -62
-16 -7 -6 -14 -5 -18 2 -3 6 -11 7 -17 4 -12 -8 -32 -10 -178 -20 -160 -11
-409 -6 -510 11 -14 3 -43 7 -65 10 -82 12 -232 58 -305 93 -190 91 -348 260
-478 513 -41 80 -108 237 -117 274 -1 6 -5 17 -8 25 -3 8 -11 35 -18 60 -7 25
-14 50 -15 55 -9 29 -45 191 -50 223 -3 20 -7 39 -9 42 -2 3 -6 34 -10 69 -4
34 -8 72 -11 84 -25 128 -25 621 0 777 3 14 7 45 10 70 3 25 8 56 11 70 9 44
17 84 20 105 7 47 59 243 74 280 5 11 21 54 36 95 36 95 67 164 77 168 4 2 8
11 8 21 0 9 4 21 9 27 6 5 21 30 35 56 31 58 119 182 163 228 18 19 33 38 33
43 0 4 4 6 8 3 5 -3 14 5 21 17 15 27 148 134 216 173 28 16 50 27 50 26 0 -2
11 1 25 6 14 5 27 10 30 10 3 0 18 5 33 11 28 11 48 14 197 30 85 9 722 7 760
-3 14 -3 41 -8 61 -11 43 -6 161 -43 169 -53 3 -4 23 -16 44 -27 22 -11 55
-34 73 -51 18 -17 34 -30 35 -30 2 1 13 -8 25 -21 12 -13 20 -23 17 -23 -3 0
6 -10 19 -22 13 -13 39 -45 57 -73 19 -27 36 -52 39 -55 3 -3 12 -15 19 -27 6
-13 18 -33 25 -45 6 -13 14 -25 17 -28 18 -18 229 -445 220 -445 -1 0 14 -32
34 -71 20 -39 36 -74 36 -78 0 -4 9 -26 19 -49 27 -61 140 -329 206 -492 31
-77 65 -159 76 -182 10 -24 19 -47 19 -53 0 -6 4 -18 9 -28 5 -9 13 -28 19
-42 5 -14 19 -46 31 -72 12 -26 21 -50 21 -52 0 -3 5 -17 11 -33 6 -15 9 -28
8 -28 -1 0 4 -11 11 -25 8 -14 15 -27 15 -30 1 -3 7 -18 13 -33 7 -16 12 -30
12 -31 0 -2 8 -21 17 -42 9 -22 17 -41 18 -44 1 -3 8 -18 15 -35 7 -16 14 -34
16 -40 1 -8 118 -297 167 -415 5 -14 11 -29 13 -35 2 -10 44 -113 69 -170 15
-35 39 -98 41 -105 0 -3 6 -16 11 -30 43 -98 165 -407 166 -417 0 -7 4 -13 9
-13 4 0 8 -8 8 -18 0 -10 7 -28 16 -40 8 -12 13 -22 10 -22 -5 0 4 -23 39
-105 7 -16 25 -61 40 -100 16 -38 37 -90 48 -115 11 -24 20 -49 22 -55 1 -5 7
-23 14 -40 7 -16 33 -82 58 -145 25 -63 54 -135 65 -160 11 -24 21 -49 23 -55
3 -14 24 -66 36 -90 5 -12 11 -27 13 -35 1 -8 10 -31 19 -50 13 -30 24 -57 32
-80 5 -16 27 -68 35 -85 5 -11 19 -45 31 -75 11 -30 26 -66 32 -80 5 -14 11
-29 13 -35 1 -5 8 -24 15 -42 12 -31 9 -40 -99 -255 -62 -123 -112 -230 -112
-236 0 -7 -4 -12 -9 -12 -5 0 -13 -10 -17 -22 -7 -24 -103 -199 -113 -208 -3
-3 -12 -17 -20 -32 -8 -15 -22 -37 -33 -47 -10 -11 -18 -24 -18 -30 0 -5 -3
-11 -8 -13 -4 -1 -20 -20 -36 -41 -100 -135 -252 -260 -404 -334 -54 -26 -99
-47 -102 -46 -3 1 -20 -5 -37 -12 -18 -8 -33 -12 -33 -10 0 3 -12 0 -27 -6
-16 -6 -39 -13 -53 -15 -14 -3 -47 -9 -75 -14 -94 -19 -170 -22 -523 -25 -195
-2 -360 -6 -367 -9 -10 -4 -13 -129 -13 -665 0 -364 3 -661 6 -661 4 0 39 -5
77 -10 39 -6 86 -12 105 -15 19 -3 69 -10 110 -16 41 -6 93 -12 115 -14 22 -2
54 -6 71 -10 17 -3 51 -7 75 -8 25 -2 49 -6 54 -9 13 -7 501 -3 535 5 14 3 52
9 85 12 92 11 189 31 315 65 25 7 56 14 70 17 13 2 29 8 35 13 5 4 13 8 18 8
18 1 147 46 205 73 35 16 65 29 68 29 16 0 239 119 320 171 91 58 234 159 260
184 6 5 30 26 54 45 78 64 328 320 311 320 -3 0 -1 4 5 8 19 12 111 136 180
242 61 94 123 216 174 340 13 30 32 75 43 100 11 25 21 47 22 50 5 15 19 49
31 77 8 17 14 34 14 37 0 3 8 25 19 49 10 23 24 56 31 72 7 17 14 35 14 40 1
6 9 24 18 41 10 17 14 34 11 38 -4 3 -2 6 4 6 5 0 10 6 10 13 0 10 77 206 103
262 5 11 33 79 61 150 28 72 54 135 57 140 4 6 8 19 9 29 2 11 7 24 11 30 5 6
16 34 26 61 9 28 23 61 31 75 7 14 14 30 15 35 3 15 14 43 98 255 42 107 77
197 77 200 1 3 7 19 14 35 6 17 16 44 22 60 6 17 17 44 24 60 33 77 47 111 50
125 3 13 17 49 60 155 5 11 9 22 10 25 1 3 7 19 14 35 6 17 19 50 28 75 9 25
20 50 25 56 4 6 9 19 11 30 2 10 11 36 20 58 9 21 17 40 17 42 0 1 5 15 12 31
6 15 19 48 28 73 30 82 131 345 140 365 16 35 120 306 120 312 0 3 6 19 14 36
18 42 81 204 94 242 20 58 102 267 109 278 4 7 8 17 9 23 3 17 113 307 124
326 5 10 10 22 10 27 0 5 5 22 12 38 6 15 12 30 12 33 1 3 4 10 7 15 10 16 33
89 31 98 -1 4 3 7 8 7 6 0 10 6 10 13 0 11 80 228 100 272 5 11 34 85 64 165
29 80 63 168 74 196 12 29 18 55 15 58 -4 3 0 6 7 6 7 0 10 3 7 7 -4 3 -2 12
4 20 6 7 8 13 4 13 -4 0 -3 6 3 13 6 6 19 37 30 67 11 30 36 100 56 155 20 55
40 109 45 120 10 23 35 88 37 95 0 3 6 19 13 35 7 17 14 35 15 40 2 6 8 23 14
38 7 16 12 30 12 32 0 2 5 16 12 32 6 15 12 30 12 33 1 3 6 19 13 35 6 17 15
39 19 50 4 11 6 23 6 28 -1 4 2 7 8 7 5 0 7 7 4 15 -4 8 -2 15 4 15 5 0 13 12
16 28 6 23 44 128 71 197 4 11 9 25 11 30 1 6 17 48 35 95 18 46 32 90 32 97
0 7 4 13 8 13 3 0 9 10 12 23 2 12 21 67 42 122 20 55 37 105 39 110 1 6 4 15
7 20 4 6 14 35 24 65 10 30 20 60 24 65 3 6 6 17 8 25 1 8 7 23 12 35 23 44
172 470 186 534 3 9 7 26 10 37 8 27 -14 32 -265 50 -47 3 -409 7 -805 8
l-719 1 -33 -105 c-18 -58 -36 -112 -40 -120 -3 -8 -7 -19 -8 -25 -2 -5 -35
-109 -75 -229 -40 -120 -73 -224 -75 -230 -1 -6 -5 -18 -8 -26 -7 -19 -30 -92
-33 -105 -1 -5 -18 -56 -37 -112 -19 -57 -33 -103 -30 -103 3 0 1 -6 -4 -12
-6 -7 -14 -26 -18 -43 -10 -34 -10 -35 -18 -55 -3 -8 -45 -136 -93 -285 -48
-148 -109 -337 -136 -420 -27 -82 -51 -157 -53 -165 -2 -8 -23 -76 -48 -150
-50 -152 -164 -506 -209 -650 -16 -52 -34 -103 -39 -113 -5 -10 -7 -22 -4 -27
4 -6 1 -10 -4 -10 -6 0 -10 -3 -10 -7 1 -5 0 -10 -1 -13 -1 -3 -3 -12 -5 -20
-1 -8 -24 -80 -50 -159 -26 -80 -48 -149 -49 -155 -3 -15 -55 -176 -66 -201
-11 -28 -113 -347 -117 -366 -1 -9 -8 -29 -15 -45 -6 -16 -12 -36 -13 -44 -1
-9 -8 -27 -15 -40 -7 -14 -13 -27 -12 -30 1 -4 -76 -256 -98 -320 -5 -14 -16
-52 -26 -85 -10 -33 -23 -68 -30 -78 -11 -17 -12 -16 -17 5 -2 13 -5 46 -6 73
-4 101 -9 136 -35 255 -15 67 -23 98 -76 290 -18 63 -33 120 -35 125 -1 6 -5
17 -8 25 -4 12 -43 151 -51 185 -2 12 -31 106 -57 189 -11 33 -19 67 -19 76 0
9 -3 20 -7 24 -5 4 -8 11 -9 14 0 4 -8 34 -19 67 -10 33 -19 65 -21 70 -2 11
-20 67 -80 260 -21 66 -39 125 -39 130 0 6 -3 15 -7 20 -3 6 -12 30 -19 55
-15 55 -14 52 -22 70 -17 44 -167 521 -167 533 0 4 -7 21 -15 37 -8 16 -15 31
-15 32 1 2 -1 10 -4 18 -43 134 -58 181 -58 187 0 5 -4 16 -10 26 -5 10 -11
26 -13 35 -2 9 -19 64 -38 122 -19 58 -90 274 -157 480 -67 206 -133 407 -147
447 -13 40 -26 80 -28 90 -2 10 -4 19 -5 21 -2 1 -3 5 -5 10 -1 4 -7 20 -13
35 -7 16 -12 31 -12 34 0 8 -137 429 -150 463 -10 23 -16 25 -78 26 -37 1
-119 4 -182 8 -63 4 -146 8 -185 11 -38 2 -119 6 -180 9 -60 3 -146 8 -190 11
-44 3 -125 7 -179 10 -54 2 -101 7 -104 10 -3 3 -11 0 -19 -6 -7 -6 -13 -8
-13 -3 0 5 -19 10 -43 10 -23 1 -89 4 -147 8 -131 7 -463 18 -592 20 -54 0
-98 3 -98 6 0 8 -673 4 -795 -5 -118 -8 -160 -12 -160 -15 0 -1 -18 -3 -40 -5
-47 -3 -98 -11 -157 -24 -24 -6 -54 -12 -68 -15 -32 -5 -180 -45 -200 -53 -8
-3 -26 -8 -40 -10 -14 -2 -26 -8 -28 -14 -2 -5 -12 -9 -22 -9 -20 0 -95 -27
-167 -60 -24 -11 -47 -20 -52 -20 -6 0 -31 -11 -57 -25 -26 -14 -52 -25 -58
-25 -7 0 -18 -6 -25 -12 -6 -7 -15 -13 -19 -13 -7 -1 -63 -29 -152 -77 -81
-44 -234 -140 -242 -153 -5 -6 -8 -6 -8 0 0 6 -3 6 -8 -1 -4 -5 -36 -30 -72
-55 -36 -24 -70 -48 -76 -54 -6 -5 -30 -26 -54 -45 -69 -57 -222 -211 -262
-265 -21 -27 -41 -54 -46 -60 -4 -5 -32 -55 -62 -110 -30 -55 -60 -106 -67
-113 -7 -7 -13 -18 -13 -24 0 -6 -9 -26 -21 -44 l-21 -34 -331 333 c-382 384
-463 457 -656 591 -100 69 -348 206 -374 206 -2 0 -22 8 -43 17 -22 9 -43 18
-49 19 -5 1 -29 9 -52 18 -24 8 -43 12 -43 8 0 -4 -4 -2 -8 5 -4 6 -21 15 -37
18 -40 8 -60 13 -60 15 0 1 -7 3 -15 5 -8 1 -62 14 -120 28 -97 24 -124 30
-205 43 -16 3 -37 7 -45 9 -8 2 -37 6 -65 10 -27 3 -66 8 -85 11 -98 14 -309
27 -455 27 -144 1 -385 -13 -475 -26 -19 -3 -57 -9 -85 -13 -123 -17 -158 -23
-265 -45 -135 -29 -322 -74 -350 -86 -14 -5 -26 -9 -55 -16 -5 -1 -14 -5 -20
-8 -9 -5 -22 -9 -80 -25 -37 -9 -192 -67 -201 -75 -6 -5 -19 -10 -30 -12 -10
-2 -37 -11 -59 -21 -56 -24 -117 -38 -150 -34 -43 5 -64 42 -70 128 -7 104
-15 150 -26 150 -5 0 -9 6 -9 13 0 24 -79 56 -160 65 -84 9 -476 8 -555 -1
-105 -12 -126 -16 -180 -27 -27 -6 -59 -13 -70 -15 -23 -4 -40 -8 -115 -29
-30 -9 -66 -19 -80 -22 -14 -4 -30 -11 -37 -16 -7 -5 -17 -7 -23 -3 -5 3 -10
1 -10 -4 0 -6 -3 -10 -8 -9 -4 1 -17 -3 -29 -10 -13 -7 -23 -11 -23 -8 0 8
-64 -21 -180 -79 -163 -82 -170 -86 -170 -96 0 -5 -5 -9 -11 -9 -12 0 -131
-79 -141 -94 -4 -6 -8 -8 -8 -3 0 4 -8 -1 -18 -10 -10 -10 -41 -37 -68 -59
-73 -62 -123 -112 -184 -184 -30 -36 -57 -67 -60 -70 -3 -3 -23 -27 -45 -55
-78 -99 -231 -254 -273 -276 -22 -12 -26 -11 -47 15 -21 26 -63 119 -90 196
-1 3 -5 12 -8 20 -12 30 -78 252 -84 284 -2 10 -12 53 -23 95 -21 84 -31 130
-32 149 -1 6 -5 12 -9 12 -4 0 -6 7 -5 17 2 9 -5 46 -15 82 -9 36 -20 78 -23
94 l-6 27 -1330 0 c-731 0 -1331 -3 -1333 -7 -3 -5 -12 -51 -21 -103 -9 -52
-18 -106 -21 -120 -3 -14 -7 -42 -10 -63 -3 -21 -7 -48 -10 -60 -8 -36 -15
-79 -22 -129 -3 -27 -10 -48 -15 -48 -5 0 -6 -4 -3 -10 3 -5 -2 -48 -10 -96
-16 -86 -23 -127 -24 -152 -1 -10 -7 -9 -24 5 -28 22 -125 104 -141 119 -6 5
-45 39 -86 74 -41 35 -79 68 -85 74 -5 6 -32 29 -60 51 -27 22 -59 48 -70 58
-11 9 -45 35 -75 57 -30 21 -59 43 -65 47 -23 19 -192 122 -220 134 -16 8 -32
16 -35 19 -9 10 -159 79 -185 86 -14 3 -25 10 -25 16 0 5 -4 7 -8 4 -5 -3 -20
1 -35 9 -15 8 -27 12 -27 9 0 -2 -13 2 -29 11 -17 8 -38 16 -48 18 -10 1 -24
6 -30 10 -7 5 -13 6 -13 3 0 -3 -11 -1 -25 4 -14 5 -36 12 -48 15 -12 2 -53
12 -92 21 -38 8 -86 17 -105 20 -19 2 -44 6 -55 9 -41 9 -370 25 -378 19z
m721 -1399 c42 -2 102 -9 132 -16 30 -6 64 -13 75 -14 11 -1 27 -5 35 -8 8 -3
51 -18 95 -32 44 -15 112 -42 152 -61 39 -19 74 -34 78 -34 4 0 41 -23 83 -51
81 -54 222 -185 222 -205 0 -7 3 -14 8 -16 11 -5 64 -78 56 -78 -4 0 0 -8 9
-18 13 -14 68 -122 73 -142 1 -7 15 -42 24 -65 5 -11 14 -40 21 -65 6 -25 14
-49 18 -55 4 -5 8 -26 10 -45 2 -19 6 -37 10 -40 3 -3 7 -16 8 -30 1 -14 9
-61 17 -105 8 -44 17 -102 20 -130 3 -27 8 -75 12 -105 3 -30 7 -68 9 -85 23
-196 23 -970 0 -1160 -2 -16 -6 -52 -9 -80 -7 -64 -15 -119 -27 -173 -5 -24
-7 -48 -4 -53 4 -5 1 -9 -6 -9 -7 0 -10 -3 -7 -6 5 -4 -3 -41 -26 -119 -2 -5
-7 -23 -11 -39 -4 -16 -14 -41 -21 -55 -8 -14 -14 -34 -14 -43 0 -10 -5 -18
-10 -18 -6 0 -9 -3 -8 -7 3 -13 -52 -114 -95 -173 -89 -121 -249 -247 -371
-291 -20 -7 -36 -17 -36 -22 0 -4 -4 -6 -9 -3 -4 3 -26 -3 -47 -13 -32 -16
-92 -35 -139 -45 -5 -2 -35 -10 -65 -19 -30 -9 -73 -19 -95 -22 -22 -3 -58 -9
-80 -12 -58 -9 -272 -8 -330 1 -27 4 -60 9 -71 11 -81 12 -258 88 -368 158
-88 55 -209 174 -293 287 -34 47 -125 195 -129 210 -2 9 -45 105 -56 124 -30
55 -126 392 -114 403 3 4 2 11 -3 17 -9 11 -12 27 -26 126 -27 198 -37 539
-21 725 4 39 8 88 10 111 2 22 7 62 11 90 3 27 8 67 11 89 4 40 11 80 14 80 1
0 3 16 5 35 2 19 6 46 9 60 2 14 10 52 16 85 7 33 21 94 32 135 11 41 22 81
23 90 2 8 4 16 5 18 2 1 3 5 4 10 4 17 60 160 75 187 8 17 16 32 16 35 5 25
123 222 145 240 3 3 21 25 40 49 44 57 161 171 174 171 2 0 15 10 28 21 48 43
183 114 263 138 22 7 49 16 60 21 33 14 125 31 205 36 41 3 76 7 79 9 2 3 8 2
13 -1 4 -3 43 -7 86 -9z m8946 -24 c32 -6 62 -8 67 -6 4 3 10 1 13 -4 5 -8 56
-21 79 -21 4 0 21 -7 37 -15 16 -8 31 -15 32 -14 5 3 89 -42 133 -70 59 -37
193 -148 244 -201 74 -76 152 -189 207 -297 28 -57 50 -103 48 -103 -3 0 3
-14 12 -31 9 -17 18 -43 20 -57 3 -14 14 -53 26 -86 11 -34 21 -74 23 -91 2
-16 4 -30 5 -30 2 0 4 -9 6 -20 2 -11 6 -33 9 -50 3 -16 7 -43 10 -60 2 -16 6
-41 9 -55 31 -149 38 -782 11 -1015 -2 -22 -6 -66 -7 -97 -2 -32 -5 -58 -8
-58 -3 0 -5 -15 -4 -32 0 -18 -2 -37 -5 -42 -2 -6 -5 -19 -6 -30 -6 -63 -17
-132 -25 -147 -5 -9 -7 -19 -4 -22 5 -5 -25 -136 -53 -227 -10 -30 -18 -57
-18 -60 -3 -17 -21 -63 -46 -118 -16 -35 -29 -66 -29 -69 0 -3 -9 -17 -20 -33
-11 -15 -17 -30 -13 -34 3 -3 1 -6 -5 -6 -7 0 -12 -5 -12 -10 0 -29 -164 -216
-230 -263 -62 -43 -125 -79 -178 -101 -101 -41 -99 -41 -139 -50 -10 -3 -18
-5 -18 -6 0 -2 -24 -7 -69 -15 -21 -4 -48 -9 -60 -11 -11 -3 -28 -7 -36 -8
-75 -17 -423 -25 -505 -12 -169 27 -191 31 -269 58 -134 45 -261 123 -350 213
-74 75 -161 202 -202 295 -46 103 -87 220 -97 275 -2 11 -7 27 -10 35 -3 8 -8
29 -11 45 -4 17 -8 39 -10 50 -3 11 -7 34 -9 50 -3 17 -10 59 -16 95 -21 133
-23 151 -36 355 -20 302 -4 871 29 1065 3 14 7 43 11 65 5 36 9 58 20 120 2
11 4 20 5 20 1 0 3 9 5 20 2 11 6 30 9 43 3 12 8 30 10 41 12 53 60 192 86
248 17 36 30 66 30 69 0 2 24 41 53 87 55 84 152 191 222 244 66 50 258 139
320 148 6 1 12 3 15 4 14 7 89 20 220 39 76 11 402 6 474 -7z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -1,19 +0,0 @@
{
"name": "grocy",
"short_name": "grocy",
"icons": [
{
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="60.000000pt" height="93.000000pt" viewBox="0 0 60.000000 93.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.15, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,93.000000) scale(0.100000,-0.100000)"
fill="#0b024c" stroke="none">
<path d="M165 905 c-52 -18 -109 -82 -132 -148 -14 -39 -18 -82 -18 -172 0
-104 3 -127 23 -170 43 -94 114 -144 205 -145 59 0 112 21 156 63 l33 32 -7
-75 c-10 -96 -17 -116 -57 -140 -43 -26 -130 -26 -233 0 -43 11 -80 20 -82 20
-2 0 -3 -30 -1 -67 l3 -68 50 -13 c28 -8 100 -14 160 -15 172 -1 255 38 304
142 l26 56 3 353 4 352 -75 0 -75 0 -7 -40 -7 -40 -36 31 c-67 59 -150 75
-237 44z m206 -141 c45 -23 62 -72 62 -180 1 -112 -18 -152 -79 -172 -125 -42
-201 80 -163 260 21 96 97 135 180 92z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1002 B

View File

@@ -1,33 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="242.000000pt" height="93.000000pt" viewBox="0 0 242.000000 93.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.15, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,93.000000) scale(0.100000,-0.100000)"
fill="#0b024c" stroke="none">
<path d="M165 905 c-52 -18 -109 -82 -132 -148 -14 -39 -18 -82 -18 -172 0
-104 3 -127 23 -170 43 -94 114 -144 205 -145 59 0 112 21 156 63 l33 32 -7
-75 c-10 -96 -17 -116 -57 -140 -43 -26 -130 -26 -233 0 -43 11 -80 20 -82 20
-2 0 -3 -30 -1 -67 l3 -68 50 -13 c28 -8 100 -14 160 -15 121 -1 183 14 244
60 36 28 81 112 81 155 0 54 6 58 90 58 l78 0 4 193 c3 180 4 194 25 223 20
28 99 72 110 61 2 -3 -1 -24 -6 -48 -6 -24 -11 -79 -11 -121 0 -137 53 -233
158 -285 50 -24 69 -28 147 -28 107 0 158 20 219 83 l40 41 23 -34 c13 -20 46
-45 80 -62 51 -25 69 -28 153 -28 68 0 108 5 143 18 l47 19 0 74 0 74 -42 -21
c-58 -30 -154 -37 -197 -15 -85 44 -98 250 -21 328 24 24 36 28 84 28 99 0 92
9 200 -260 l97 -242 -23 -46 c-32 -65 -67 -87 -134 -87 l-54 0 0 -66 0 -67 45
-6 c108 -17 215 34 269 128 20 33 296 754 296 771 0 3 -40 5 -89 5 l-90 0 -64
-197 c-35 -109 -69 -214 -75 -233 -10 -34 -10 -34 -11 -7 -1 16 -31 120 -68
232 l-66 202 -143 8 c-116 5 -154 4 -197 -9 -61 -18 -126 -61 -145 -98 l-14
-25 -52 53 c-40 39 -67 56 -106 68 -87 26 -181 19 -272 -19 -14 -5 -18 -2 -18
14 0 19 -6 21 -52 21 -64 0 -129 -30 -164 -76 -15 -19 -30 -34 -34 -34 -4 0
-13 23 -20 50 l-12 50 -133 0 -133 0 -7 -40 -7 -40 -36 31 c-67 59 -150 75
-237 44z m206 -141 c45 -23 62 -72 62 -180 1 -112 -18 -152 -79 -172 -125 -42
-201 80 -163 260 21 96 97 135 180 92z m888 -10 c40 -33 54 -89 49 -184 -7
-118 -41 -160 -131 -160 -87 0 -121 53 -121 185 0 135 34 185 125 185 36 0 55
-6 78 -26z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

BIN
public/img/icon-1024.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

BIN
public/img/icon-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

21
public/img/icon.svg Normal file
View File

@@ -0,0 +1,21 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="185.000000pt" height="222.000000pt" viewBox="0 0 185.000000 222.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,222.000000) scale(0.100000,-0.100000)"
fill="#337ab7" stroke="none">
<path d="M983 2210 c-468 -66 -828 -418 -944 -920 -29 -124 -36 -358 -15 -478
57 -328 272 -604 565 -727 125 -53 193 -67 353 -72 112 -4 171 -1 250 12 247
41 496 156 611 284 l37 41 -5 172 c-3 95 -8 316 -11 491 l-6 319 -267 -8
c-146 -3 -342 -9 -436 -13 l-170 -6 -8 -213 c-5 -118 -7 -215 -5 -217 2 -2 81
-7 176 -11 l172 -7 0 -27 c0 -65 -12 -90 -51 -111 -60 -30 -172 -44 -241 -30
-249 52 -347 418 -180 677 105 163 290 242 537 231 68 -4 153 -15 195 -25 41
-11 77 -16 80 -11 9 13 43 526 37 542 -8 22 -124 64 -236 87 -115 23 -342 34
-438 20z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

42
public/img/logo.svg Normal file
View File

@@ -0,0 +1,42 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="846.000000pt" height="222.000000pt" viewBox="0 0 846.000000 222.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,222.000000) scale(0.100000,-0.100000)"
fill="#337ab7" stroke="none">
<path d="M983 2200 c-468 -66 -828 -418 -944 -920 -29 -124 -36 -358 -15 -478
57 -328 272 -604 565 -727 125 -53 193 -67 353 -72 112 -4 171 -1 250 12 205
34 417 121 546 225 l62 50 0 -115 0 -115 310 0 c240 0 312 3 315 13 2 6 9 142
15 302 6 159 13 291 14 292 1 2 43 6 92 9 l89 6 110 -307 c61 -169 115 -310
122 -312 6 -3 156 24 331 59 l320 63 -173 309 -173 308 78 59 c43 33 103 90
132 126 52 66 53 67 56 38 12 -135 75 -307 156 -429 245 -368 722 -511 1131
-339 186 78 365 249 461 440 19 38 35 61 38 52 3 -8 12 -41 21 -74 39 -143
134 -304 240 -410 204 -205 495 -297 790 -251 114 17 256 56 333 91 47 22 52
27 52 57 0 18 5 169 11 336 6 167 9 305 7 307 -3 3 -29 -8 -59 -24 -30 -17
-97 -44 -149 -62 -86 -30 -106 -33 -215 -33 -117 -1 -122 0 -188 32 -118 58
-162 146 -155 310 3 78 9 108 30 154 39 84 107 151 199 197 100 50 188 65 340
58 l117 -5 11 146 c7 81 14 154 15 162 1 8 98 -178 215 -415 l213 -430 -7
-413 -8 -412 378 0 377 0 -6 83 c-3 45 -8 233 -11 417 l-6 335 341 555 c288
469 338 556 323 562 -22 8 -672 52 -678 46 -3 -2 -59 -139 -126 -304 -66 -164
-124 -302 -128 -307 -4 -4 -58 131 -121 300 -62 170 -114 310 -116 312 -2 2
-135 -13 -296 -33 -161 -20 -299 -36 -305 -36 -7 0 -13 9 -13 21 0 59 -306
112 -518 90 -154 -16 -250 -42 -369 -101 -220 -108 -376 -279 -469 -514 l-27
-69 -31 90 c-121 347 -424 560 -826 580 -356 17 -664 -154 -844 -472 l-44 -76
-16 72 c-51 225 -224 411 -464 499 -148 54 -218 64 -437 64 -278 -1 -496 -32
-691 -98 l-69 -23 -6 -129 c-4 -71 -7 -232 -8 -359 -1 -126 -5 -235 -9 -242
-5 -8 -132 -15 -437 -23 -237 -7 -433 -15 -436 -18 -4 -4 -10 -102 -14 -218
l-7 -211 108 -6 c59 -4 138 -7 176 -7 l68 0 0 -29 c0 -66 -12 -91 -51 -112
-60 -30 -172 -44 -241 -30 -249 52 -347 418 -180 677 105 163 290 242 537 231
68 -4 153 -15 195 -25 41 -11 77 -16 80 -11 9 13 43 526 37 542 -8 22 -124 64
-236 87 -115 23 -342 34 -438 20z m1741 -539 c94 -42 140 -123 140 -246 1 -64
-4 -88 -21 -121 -50 -93 -160 -153 -296 -162 l-78 -5 7 159 c4 88 10 211 13
274 l6 115 40 7 c58 9 142 0 189 -21z m1752 -232 c99 -48 156 -147 162 -284 5
-104 -16 -175 -72 -248 -73 -96 -225 -131 -331 -76 -105 53 -172 192 -163 337
8 128 61 217 160 266 68 34 180 37 244 5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -39,7 +39,7 @@ try
} }
catch (ERequirementNotMet $ex) catch (ERequirementNotMet $ex)
{ {
exit('Unable to run grocy: ' . $ex->getMessage()); exit('Unable to run Grocy: ' . $ex->getMessage());
} }
require_once __DIR__ . '/../app.php'; require_once __DIR__ . '/../app.php';

15
public/manifest.json Normal file
View File

@@ -0,0 +1,15 @@
{
"name": "Grocy",
"short_name": "Grocy",
"icons": [
{
"src": "./img/icon-1024.png",
"sizes": "1024x1024",
"type": "image/png"
}
],
"start_url": "../",
"background_color": "#6c757d",
"theme_color": "#6c757d",
"display": "standalone"
}

View File

@@ -154,7 +154,7 @@ $('#battery_id_text_input').on('blur', function(e)
var input = $('#battery_id_text_input').val().toString(); var input = $('#battery_id_text_input').val().toString();
var possibleOptionElement = []; var possibleOptionElement = [];
// grocycode handling // Grocycode handling
if (input.startsWith("grcy")) if (input.startsWith("grcy"))
{ {
var gc = input.split(":"); var gc = input.split(":");

View File

@@ -190,7 +190,7 @@ $('#chore_id_text_input').on('blur', function(e)
var input = $('#chore_id_text_input').val().toString(); var input = $('#chore_id_text_input').val().toString();
var possibleOptionElement = []; var possibleOptionElement = [];
// grocycode handling // Grocycode handling
if (input.startsWith("grcy")) if (input.startsWith("grcy"))
{ {
var gc = input.split(":"); var gc = input.split(":");

View File

@@ -120,7 +120,7 @@ Grocy.Components.BarcodeScanner.StartScanning = function()
if (error) if (error)
{ {
Grocy.FrontendHelpers.ShowGenericError("Error while initializing the barcode scanning library", error.message); Grocy.FrontendHelpers.ShowGenericError("Error while initializing the barcode scanning library", error.message);
toastr.info(__t("Camera access is only possible when supported and allowed by your browser and when grocy is served via a secure (https://) connection")); toastr.info(__t("Camera access is only possible when supported and allowed by your browser and when Grocy is served via a secure (https://) connection"));
window.localStorage.removeItem("cameraId"); window.localStorage.removeItem("cameraId");
setTimeout(function() setTimeout(function()
{ {

View File

@@ -162,7 +162,7 @@ $('#product_id_text_input').on('blur', function(e)
var input = $('#product_id_text_input').val().toString(); var input = $('#product_id_text_input').val().toString();
var possibleOptionElement = []; var possibleOptionElement = [];
// grocycode handling // Grocycode handling
if (input.startsWith("grcy")) if (input.startsWith("grcy"))
{ {
var gc = input.split(":"); var gc = input.split(":");

View File

@@ -77,7 +77,7 @@ $('#recipe_id_text_input').on('blur', function(e)
var input = $('#recipe_id_text_input').val().toString(); var input = $('#recipe_id_text_input').val().toString();
var possibleOptionElement = []; var possibleOptionElement = [];
// grocycode handling // Grocycode handling
if (input.startsWith("grcy")) if (input.startsWith("grcy"))
{ {
var gc = input.split(":"); var gc = input.split(":");

View File

@@ -239,7 +239,7 @@ $("#location_id").on('change', function(e)
} }
else else
{ {
// try to get stock id from grocycode // try to get stock id from Grocycode
if ($("#product_id").data("grocycode")) if ($("#product_id").data("grocycode"))
{ {
var gc = $("#product_id").attr("barcode").split(":"); var gc = $("#product_id").attr("barcode").split(":");

View File

@@ -59,7 +59,7 @@ class PrintService extends BaseService
$printer->selectPrintMode(Printer::MODE_DOUBLE_WIDTH); $printer->selectPrintMode(Printer::MODE_DOUBLE_WIDTH);
$printer->setTextSize(4, 4); $printer->setTextSize(4, 4);
$printer->setReverseColors(true); $printer->setReverseColors(true);
$printer->text('grocy'); $printer->text('Grocy');
$printer->setJustification(); $printer->setJustification();
$printer->setTextSize(1, 1); $printer->setTextSize(1, 1);
$printer->setReverseColors(false); $printer->setReverseColors(false);

View File

@@ -821,13 +821,13 @@ class StockService extends BaseService
public function GetProductIdFromBarcode(string $barcode) public function GetProductIdFromBarcode(string $barcode)
{ {
// first, try to parse this as a product grocycode // first, try to parse this as a product Grocycode
if (Grocycode::Validate($barcode)) if (Grocycode::Validate($barcode))
{ {
$gc = new Grocycode($barcode); $gc = new Grocycode($barcode);
if ($gc->GetType() != Grocycode::PRODUCT) if ($gc->GetType() != Grocycode::PRODUCT)
{ {
throw new \Exception('Invalid grocycode'); throw new \Exception('Invalid Grocycode');
} }
return $gc->GetId(); return $gc->GetId();
} }

View File

@@ -3,7 +3,7 @@
GROCY_RELEASE_URL=https://releases.grocy.info/latest GROCY_RELEASE_URL=https://releases.grocy.info/latest
echo Start updating grocy echo Start updating Grocy
set -e set -e
shopt -s extglob shopt -s extglob
@@ -32,4 +32,4 @@ rm -f ./grocy-latest.zip > /dev/null
popd > /dev/null popd > /dev/null
echo Finished updating grocy echo Finished updating Grocy

View File

@@ -1,6 +1,6 @@
@extends('layout.default') @extends('layout.default')
@section('title', $__t('About grocy')) @section('title', $__t('About Grocy'))
@section('viewJsName', 'about') @section('viewJsName', 'about')
@section('content') @section('content')
@@ -41,7 +41,7 @@
</p> </p>
<p> <p>
{{ $__t('Do you find grocy useful?') }}<br> {{ $__t('Do you find Grocy useful?') }}<br>
<a class="btn btn-sm btn-primary text-white mt-1" <a class="btn btn-sm btn-primary text-white mt-1"
href="https://grocy.info/#say-thanks" href="https://grocy.info/#say-thanks"
target="_blank">{{ $__t('Say thanks') }} <i class="fa-solid fa-heart"></i></a> target="_blank">{{ $__t('Say thanks') }} <i class="fa-solid fa-heart"></i></a>
@@ -75,7 +75,7 @@
</div> </div>
<p class="small text-muted"> <p class="small text-muted">
grocy is a project by Grocy is a project by
<a href="https://berrnd.de" <a href="https://berrnd.de"
class="text-dark" class="text-dark"
target="_blank">Bernd Bestel</a><br> target="_blank">Bernd Bestel</a><br>

View File

@@ -154,14 +154,14 @@
<a class="dropdown-item" <a class="dropdown-item"
type="button" type="button"
href="{{ $U('/battery/' . $currentBatteryEntry->battery_id . '/grocycode?download=true') }}"> href="{{ $U('/battery/' . $currentBatteryEntry->battery_id . '/grocycode?download=true') }}">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Download %s grocycode', $__t('Battery'))) !!} {!! str_replace('grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Download %s Grocycode', $__t('Battery'))) !!}
</a> </a>
@if(GROCY_FEATURE_FLAG_LABEL_PRINTER) @if(GROCY_FEATURE_FLAG_LABEL_PRINTER)
<a class="dropdown-item battery-grocycode-label-print" <a class="dropdown-item battery-grocycode-label-print"
data-battery-id="{{ $currentBatteryEntry->battery_id }}" data-battery-id="{{ $currentBatteryEntry->battery_id }}"
type="button" type="button"
href="#"> href="#">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Print %s grocycode on label printer', $__t('Battery'))) !!} {!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Print %s Grocycode on label printer', $__t('Battery'))) !!}
</a> </a>
@endif @endif
</div> </div>

View File

@@ -101,11 +101,11 @@
<div class="col clearfix mt-2"> <div class="col clearfix mt-2">
<div class="title-related-links"> <div class="title-related-links">
<h4> <h4>
<span class="ls-n1">{{ $__t('grocycode') }}</span> <span class="ls-n1">{{ $__t('Grocycode') }}</span>
<i class="fa-solid fa-question-circle text-muted" <i class="fa-solid fa-question-circle text-muted"
data-toggle="tooltip" data-toggle="tooltip"
data-trigger="hover click" data-trigger="hover click"
title="{{ $__t('grocycode is a unique referer to this %s in your grocy instance - print it onto a label and scan it like any other barcode', $__t('Battery')) }}"></i> title="{{ $__t('Grocycode is a unique referer to this %s in your Grocy instance - print it onto a label and scan it like any other barcode', $__t('Battery')) }}"></i>
</h4> </h4>
<p> <p>
@if($mode == 'edit') @if($mode == 'edit')

View File

@@ -314,11 +314,11 @@
<div class="col clearfix"> <div class="col clearfix">
<div class="title-related-links pb-4"> <div class="title-related-links pb-4">
<h4> <h4>
<span class="ls-n1">{{ $__t('grocycode') }}</span> <span class="ls-n1">{{ $__t('Grocycode') }}</span>
<i class="fa-solid fa-question-circle text-muted" <i class="fa-solid fa-question-circle text-muted"
data-toggle="tooltip" data-toggle="tooltip"
data-trigger="hover click" data-trigger="hover click"
title="{{ $__t('grocycode is a unique referer to this %s in your grocy instance - print it onto a label and scan it like any other barcode', $__t('Chore')) }}"></i> title="{{ $__t('Grocycode is a unique referer to this %s in your Grocy instance - print it onto a label and scan it like any other barcode', $__t('Chore')) }}"></i>
</h4> </h4>
<p> <p>
@if($mode == 'edit') @if($mode == 'edit')

View File

@@ -199,14 +199,14 @@
<a class="dropdown-item" <a class="dropdown-item"
type="button" type="button"
href="{{ $U('/chore/' . $curentChoreEntry->chore_id . '/grocycode?download=true') }}"> href="{{ $U('/chore/' . $curentChoreEntry->chore_id . '/grocycode?download=true') }}">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Download %s grocycode', $__t('Chore'))) !!} {!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Download %s Grocycode', $__t('Chore'))) !!}
</a> </a>
@if(GROCY_FEATURE_FLAG_LABEL_PRINTER) @if(GROCY_FEATURE_FLAG_LABEL_PRINTER)
<a class="dropdown-item chore-grocycode-label-print" <a class="dropdown-item chore-grocycode-label-print"
data-chore-id="{{ $curentChoreEntry->chore_id }}" data-chore-id="{{ $curentChoreEntry->chore_id }}"
type="button" type="button"
href="#"> href="#">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Print %s grocycode on label printer', $__t('Chore'))) !!} {!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Print %s Grocycode on label printer', $__t('Chore'))) !!}
</a> </a>
@endif @endif
</div> </div>

View File

@@ -10,36 +10,15 @@
<meta name="robots" <meta name="robots"
content="noindex,nofollow"> content="noindex,nofollow">
<link rel="apple-touch-icon"
sizes="180x180"
href="{{ $U('/img/appicons/apple-touch-icon.png?v=', true) }}{{ $version }}">
<link rel="icon" <link rel="icon"
type="image/png" type="image/png"
sizes="32x32" sizes="32x32"
href="{{ $U('/img/appicons/favicon-32x32.png?v=', true) }}{{ $version }}"> href="{{ $U('/img/icon-32.png?v=', true) }}{{ $version }}">
<link rel="icon"
type="image/png"
sizes="16x16"
href="{{ $U('/img/appicons/favicon-16x16.png?v=', true) }}{{ $version }}">
<link rel="manifest" <link rel="manifest"
href="{{ $U('/img/appicons/site.webmanifest?v=', true) }}{{ $version }}"> href="{{ $U('/manifest.json?v=', true) }}{{ $version }}">
<link rel="mask-icon"
href="{{ $U('/img/appicons/safari-pinned-tab.svg?v=', true) }}{{ $version }}" <title>@yield('title') | Grocy</title>
color="#0b024c">
<link rel="shortcut icon"
href="{{ $U('/img/appicons/favicon.ico?v=', true) }}{{ $version }}">
<meta name="apple-mobile-web-app-title"
content="grocy">
<meta name="application-name"
content="grocy">
<meta name="msapplication-TileColor"
content="#e5e5e5">
<meta name="msapplication-config"
content="{{ $U('/img/appicons/browserconfig.xml?v=', true) }}{{ $version }}">
<meta name="theme-color"
content="#ffffff">
<title>@yield('title') | grocy</title>
<link href="{{ $U('/node_modules/bootstrap/dist/css/bootstrap.min.css?v=', true) }}{{ $version }}" <link href="{{ $U('/node_modules/bootstrap/dist/css/bootstrap.min.css?v=', true) }}{{ $version }}"
rel="stylesheet"> rel="stylesheet">
<link href="{{ $U('/node_modules/@fortawesome/fontawesome-free/css/all.min.css?v=', true) }}{{ $version }}" <link href="{{ $U('/node_modules/@fortawesome/fontawesome-free/css/all.min.css?v=', true) }}{{ $version }}"
@@ -120,7 +99,7 @@
<nav id="mainNav" <nav id="mainNav"
class="navbar navbar-expand-lg navbar-light fixed-top"> class="navbar navbar-expand-lg navbar-light fixed-top">
<a class="navbar-brand py-0" <a class="navbar-brand py-0"
href="{{ $U('/') }}"><img src="{{ $U('/img/grocy_logo.svg?v=', true) }}{{ $version }}" href="{{ $U('/') }}"><img src="{{ $U('/img/logo.svg?v=', true) }}{{ $version }}"
height="30"></a> height="30"></a>
<span id="clock-container" <span id="clock-container"
class="text-muted font-italic d-none"> class="text-muted font-italic d-none">
@@ -680,7 +659,7 @@
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a id="about-dialog-link" <a id="about-dialog-link"
class="dropdown-item discrete-link" class="dropdown-item discrete-link"
href="#"><i class="fa-solid fa-info fa-fw"></i>&nbsp;{{ $__t('About grocy') }} (Version {{ $version }})</a> href="#"><i class="fa-solid fa-info fa-fw"></i>&nbsp;{{ $__t('About Grocy') }} (Version {{ $version }})</a>
</div> </div>
</li> </li>
</ul> </ul>

View File

@@ -23,7 +23,6 @@
display: inline !important; display: inline !important;
} }
} }
</style> </style>
@endpush @endpush
@@ -75,7 +74,7 @@
@endif @endif
<div class="page"> <div class="page">
<h1 class="pt-4 text-center"> <h1 class="pt-4 text-center">
<img src="{{ $U('/img/grocy_logo.svg?v=', true) }}{{ $version }}" <img src="{{ $U('/img/logo.svg?v=', true) }}{{ $version }}"
height="30" height="30"
class="d-none d-print-flex mx-auto"> class="d-none d-print-flex mx-auto">
{{ $location->name }} {{ $location->name }}

View File

@@ -3,22 +3,18 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="x-ua-compatible"
content="ie=edge">
<meta name="viewport" <meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"> content="width=device-width, initial-scale=1">
<meta name="robots" <meta name="robots"
content="noindex,nofollow"> content="noindex,nofollow">
<meta name="format-detection"
content="telephone=no">
<meta name="author"
content="Bernd Bestel (bernd@berrnd.de)">
<link rel="icon" <link rel="icon"
href="{{ $U('/img/grocy_icon.svg?v=', true) }}{{ $version }}"> type="image/png"
sizes="32x32"
href="{{ $U('/img/icon-32.png?v=', true) }}{{ $version }}">
<title>{{ $__t('REST API browser') }} | grocy</title> <title>{{ $__t('REST API browser') }} | Grocy</title>
<link href="{{ $U('/node_modules/swagger-ui-dist/swagger-ui.css?v=', true) }}{{ $version }}" <link href="{{ $U('/node_modules/swagger-ui-dist/swagger-ui.css?v=', true) }}{{ $version }}"
rel="stylesheet"> rel="stylesheet">
@@ -53,7 +49,6 @@
-webkit-box-shadow: none !important; -webkit-box-shadow: none !important;
border-bottom: 1px solid rgba(59, 65, 81, 0.3) !important; border-bottom: 1px solid rgba(59, 65, 81, 0.3) !important;
} }
</style> </style>
</head> </head>

View File

@@ -729,11 +729,11 @@
<div class="col clearfix"> <div class="col clearfix">
<div class="title-related-links"> <div class="title-related-links">
<h4> <h4>
<span class="ls-n1">{{ $__t('grocycode') }}</span> <span class="ls-n1">{{ $__t('Grocycode') }}</span>
<i class="fa-solid fa-question-circle text-muted" <i class="fa-solid fa-question-circle text-muted"
data-toggle="tooltip" data-toggle="tooltip"
data-trigger="hover click" data-trigger="hover click"
title="{{ $__t('grocycode is a unique referer to this %s in your grocy instance - print it onto a label and scan it like any other barcode', $__t('Product')) }}"></i> title="{{ $__t('Grocycode is a unique referer to this %s in your Grocy instance - print it onto a label and scan it like any other barcode', $__t('Product')) }}"></i>
</h4> </h4>
<p> <p>
@if($mode == 'edit') @if($mode == 'edit')

View File

@@ -127,7 +127,7 @@
<th class="allow-grouping">{{ $__t('Quantity unit stock') }}</th> <th class="allow-grouping">{{ $__t('Quantity unit stock') }}</th>
<th class="">{{ $__t('Product group') }}</th> <th class="">{{ $__t('Product group') }}</th>
<th class="@if(!GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) d-none @endif allow-grouping">{{ $__t('Default store') }}</th> <th class="@if(!GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) d-none @endif allow-grouping">{{ $__t('Default store') }}</th>
<th class="">{{ $__t('grocycode') }}</th> <th class="">{{ $__t('Grocycode') }}</th>
@include('components.userfields_thead', array( @include('components.userfields_thead', array(
'userfields' => $userfields 'userfields' => $userfields

View File

@@ -341,11 +341,11 @@
<div class="col"> <div class="col">
<div class="title-related-links"> <div class="title-related-links">
<h4> <h4>
<span class="ls-n1">{{ $__t('grocycode') }}</span> <span class="ls-n1">{{ $__t('Grocycode') }}</span>
<i class="fa-solid fa-question-circle text-muted" <i class="fa-solid fa-question-circle text-muted"
data-toggle="tooltip" data-toggle="tooltip"
data-trigger="hover click" data-trigger="hover click"
title="{{ $__t('grocycode is a unique referer to this %s in your grocy instance - print it onto a label and scan it like any other barcode', $__t('Recipe')) }}"></i> title="{{ $__t('Grocycode is a unique referer to this %s in your Grocy instance - print it onto a label and scan it like any other barcode', $__t('Recipe')) }}"></i>
</h4> </h4>
<p> <p>
@if($mode == 'edit') @if($mode == 'edit')

View File

@@ -197,14 +197,14 @@
<a class="dropdown-item" <a class="dropdown-item"
type="button" type="button"
href="{{ $U('/recipe/' . $recipe->id . '/grocycode?download=true') }}"> href="{{ $U('/recipe/' . $recipe->id . '/grocycode?download=true') }}">
<span class="dropdown-item-text">{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Download %s grocycode', $__t('Recipe'))) !!}</span> <span class="dropdown-item-text">{!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Download %s Grocycode', $__t('Recipe'))) !!}</span>
</a> </a>
@if(GROCY_FEATURE_FLAG_LABEL_PRINTER) @if(GROCY_FEATURE_FLAG_LABEL_PRINTER)
<a class="dropdown-item recipe-grocycode-label-print" <a class="dropdown-item recipe-grocycode-label-print"
data-recipe-id="{{ $recipe->id }}" data-recipe-id="{{ $recipe->id }}"
type="button" type="button"
href="#"> href="#">
<span class="dropdown-item-text">{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Print %s grocycode on label printer', $__t('Recipe'))) !!}</span> <span class="dropdown-item-text">{!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Print %s Grocycode on label printer', $__t('Recipe'))) !!}</span>
</a> </a>
@endif @endif
</div> </div>

View File

@@ -345,7 +345,7 @@
<div class="d-none d-print-block"> <div class="d-none d-print-block">
<div id="print-header"> <div id="print-header">
<h1 class="text-center"> <h1 class="text-center">
<img src="{{ $U('/img/grocy_logo.svg?v=', true) }}{{ $version }}" <img src="{{ $U('/img/logo.svg?v=', true) }}{{ $version }}"
height="30" height="30"
class="d-print-flex mx-auto"> class="d-print-flex mx-auto">
{{ $__t("Shopping list") }} {{ $__t("Shopping list") }}

View File

@@ -228,14 +228,14 @@
<a class="dropdown-item" <a class="dropdown-item"
type="button" type="button"
href="{{ $U('/stockentry/' . $stockEntry->id . '/grocycode?download=true') }}"> href="{{ $U('/stockentry/' . $stockEntry->id . '/grocycode?download=true') }}">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Download %s grocycode', $__t('Stock entry'))) !!} {!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Download %s Grocycode', $__t('Stock entry'))) !!}
</a> </a>
@if(GROCY_FEATURE_FLAG_LABEL_PRINTER) @if(GROCY_FEATURE_FLAG_LABEL_PRINTER)
<a class="dropdown-item stockentry-grocycode-label-print" <a class="dropdown-item stockentry-grocycode-label-print"
data-stock-id="{{ $stockEntry->id }}" data-stock-id="{{ $stockEntry->id }}"
type="button" type="button"
href="#"> href="#">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Print %s grocycode on label printer', $__t('Stock entry'))) !!} {!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Print %s Grocycode on label printer', $__t('Stock entry'))) !!}
</a> </a>
@endif @endif
<a class="dropdown-item stockentry-label-link" <a class="dropdown-item stockentry-label-link"

View File

@@ -314,14 +314,14 @@
<a class="dropdown-item" <a class="dropdown-item"
type="button" type="button"
href="{{ $U('/product/' . $currentStockEntry->product_id . '/grocycode?download=true') }}"> href="{{ $U('/product/' . $currentStockEntry->product_id . '/grocycode?download=true') }}">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Download %s grocycode', $__t('Product'))) !!} {!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Download %s Grocycode', $__t('Product'))) !!}
</a> </a>
@if(GROCY_FEATURE_FLAG_LABEL_PRINTER) @if(GROCY_FEATURE_FLAG_LABEL_PRINTER)
<a class="dropdown-item product-grocycode-label-print" <a class="dropdown-item product-grocycode-label-print"
data-product-id="{{ $currentStockEntry->product_id }}" data-product-id="{{ $currentStockEntry->product_id }}"
type="button" type="button"
href="#"> href="#">
{!! str_replace('grocycode', '<span class="ls-n1">grocycode</span>', $__t('Print %s grocycode on label printer', $__t('Product'))) !!} {!! str_replace('Grocycode', '<span class="ls-n1">Grocycode</span>', $__t('Print %s Grocycode on label printer', $__t('Product'))) !!}
</a> </a>
@endif @endif
</div> </div>