Going straight to 1.0...

This commit is contained in:
Bernd Bestel
2017-04-19 21:09:28 +02:00
parent 83a7534a74
commit e38c24f9ed
15 changed files with 169 additions and 110 deletions

View File

@@ -13,8 +13,8 @@ class GrocyDbMigrator
qu_id_purchase INTEGER NOT NULL, qu_id_purchase INTEGER NOT NULL,
qu_id_stock INTEGER NOT NULL, qu_id_stock INTEGER NOT NULL,
qu_factor_purchase_to_stock REAL NOT NULL, qu_factor_purchase_to_stock REAL NOT NULL,
barcode TEXT UNIQUE, barcode TEXT,
created_timestamp DATETIME DEFAULT (datetime('now', 'localtime')) row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
)" )"
); );
@@ -23,7 +23,7 @@ class GrocyDbMigrator
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT NOT NULL UNIQUE, name TEXT NOT NULL UNIQUE,
description TEXT, description TEXT,
created_timestamp DATETIME DEFAULT (datetime('now', 'localtime')) row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
)" )"
); );
@@ -32,7 +32,7 @@ class GrocyDbMigrator
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT NOT NULL UNIQUE, name TEXT NOT NULL UNIQUE,
description TEXT, description TEXT,
created_timestamp DATETIME DEFAULT (datetime('now', 'localtime')) row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
)" )"
); );
@@ -43,20 +43,23 @@ class GrocyDbMigrator
amount INTEGER NOT NULL, amount INTEGER NOT NULL,
best_before_date DATE, best_before_date DATE,
purchased_date DATE DEFAULT (datetime('now', 'localtime')), purchased_date DATE DEFAULT (datetime('now', 'localtime')),
stock_id TEXT NOT NULL stock_id TEXT NOT NULL,
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
)" )"
); );
self::ExecuteMigrationWhenNeeded($pdo, 5, " self::ExecuteMigrationWhenNeeded($pdo, 5, "
CREATE TABLE consumptions ( CREATE TABLE stock_log (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
product_id INTEGER NOT NULL, product_id INTEGER NOT NULL,
amount INTEGER NOT NULL, amount INTEGER NOT NULL,
best_before_date DATE, best_before_date DATE,
purchased_date DATE, purchased_date DATE,
used_date DATE DEFAULT (datetime('now', 'localtime')), used_date DATE,
spoiled INTEGER NOT NULL DEFAULT 0, spoiled INTEGER NOT NULL DEFAULT 0,
stock_id TEXT NOT NULL stock_id TEXT NOT NULL,
transaction_type TEXT NOT NULL,
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
)" )"
); );

View File

@@ -15,15 +15,15 @@ class GrocyDemoDataGenerator
INSERT INTO products (name, location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock) VALUES ('Gummib<69>rchen', 2, 2, 2, 1); INSERT INTO products (name, location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock) VALUES ('Gummib<69>rchen', 2, 2, 2, 1);
INSERT INTO products (name, location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock) VALUES ('Chips', 2, 2, 2, 1); INSERT INTO products (name, location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock) VALUES ('Chips', 2, 2, 2, 1);
INSERT INTO products (name, location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock) VALUES ('Eier', 1, 2, 1, 10); INSERT INTO products (name, location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock) VALUES ('Eier', 1, 2, 1, 10);
INSERT INTO stock (product_id, amount, best_before_date, stock_id) VALUES (3, 5, date('now', '+180 day'), '".uniqid()."');
INSERT INTO stock (product_id, amount, best_before_date, stock_id) VALUES (4, 5, date('now', '+180 day'), '".uniqid()."');
INSERT INTO stock (product_id, amount, best_before_date, stock_id) VALUES (5, 5, date('now', '+25 day'), '".uniqid()."');
"; ";
if ($pdo->exec(utf8_encode($sql)) === false) if ($pdo->exec(utf8_encode($sql)) === false)
{ {
throw new Exception($pdo->errorInfo()); throw new Exception($pdo->errorInfo());
} }
GrocyLogicStock::AddProduct(3, 5, date('Y-m-d', strtotime('+180 days')), GrocyLogicStock::TRANSACTION_TYPE_PURCHASE);
GrocyLogicStock::AddProduct(4, 5, date('Y-m-d', strtotime('+180 days')), GrocyLogicStock::TRANSACTION_TYPE_PURCHASE);
GrocyLogicStock::AddProduct(5, 5, date('Y-m-d', strtotime('+25 days')), GrocyLogicStock::TRANSACTION_TYPE_PURCHASE);
} }
} }

View File

@@ -2,6 +2,10 @@
class GrocyLogicStock class GrocyLogicStock
{ {
const TRANSACTION_TYPE_PURCHASE = 'purchase';
const TRANSACTION_TYPE_CONSUME = 'consume';
const TRANSACTION_TYPE_INVENTORY_CORRECTION = 'inventory-correction';
public static function GetCurrentStock() public static function GetCurrentStock()
{ {
$db = Grocy::GetDbConnectionRaw(); $db = Grocy::GetDbConnectionRaw();
@@ -15,7 +19,7 @@ class GrocyLogicStock
$product = $db->products($productId); $product = $db->products($productId);
$productStockAmount = $db->stock()->where('product_id', $productId)->sum('amount'); $productStockAmount = $db->stock()->where('product_id', $productId)->sum('amount');
$productLastPurchased = $db->stock()->where('product_id', $productId)->max('purchased_date'); $productLastPurchased = $db->stock()->where('product_id', $productId)->max('purchased_date');
$productLastUsed = $db->consumptions()->where('product_id', $productId)->max('used_date'); $productLastUsed = $db->stock_log()->where('product_id', $productId)->where('transaction_type', self::TRANSACTION_TYPE_CONSUME)->max('used_date');
$quPurchase = $db->quantity_units($product->qu_id_purchase); $quPurchase = $db->quantity_units($product->qu_id_purchase);
$quStock = $db->quantity_units($product->qu_id_stock); $quStock = $db->quantity_units($product->qu_id_stock);
@@ -29,7 +33,34 @@ class GrocyLogicStock
); );
} }
public static function ConsumeProduct(int $productId, int $amount, bool $spoiled) public static function AddProduct(int $productId, int $amount, string $bestBeforeDate, $transactionType)
{
$db = Grocy::GetDbConnection();
$stockId = uniqid();
$logRow = $db->stock_log()->createRow(array(
'product_id' => $productId,
'amount' => $amount,
'best_before_date' => $bestBeforeDate,
'purchased_date' => date('Y-m-d'),
'stock_id' => $stockId,
'transaction_type' => $transactionType
));
$logRow->save();
$stockRow = $db->stock()->createRow(array(
'product_id' => $productId,
'amount' => $amount,
'best_before_date' => $bestBeforeDate,
'purchased_date' => date('Y-m-d'),
'stock_id' => $stockId,
));
$stockRow->save();
return true;
}
public static function ConsumeProduct(int $productId, int $amount, bool $spoiled, $transactionType)
{ {
$db = Grocy::GetDbConnection(); $db = Grocy::GetDbConnection();
@@ -50,30 +81,34 @@ class GrocyLogicStock
if ($amount >= $stockEntry->amount) //Take the whole stock entry if ($amount >= $stockEntry->amount) //Take the whole stock entry
{ {
$consumptionRow = $db->consumptions()->createRow(array( $logRow = $db->stock_log()->createRow(array(
'product_id' => $stockEntry->product_id, 'product_id' => $stockEntry->product_id,
'amount' => $stockEntry->amount, 'amount' => $stockEntry->amount * -1,
'best_before_date' => $stockEntry->best_before_date, 'best_before_date' => $stockEntry->best_before_date,
'purchased_date' => $stockEntry->purchased_date, 'purchased_date' => $stockEntry->purchased_date,
'used_date' => date('Y-m-d'),
'spoiled' => $spoiled, 'spoiled' => $spoiled,
'stock_id' => $stockEntry->stock_id 'stock_id' => $stockEntry->stock_id,
'transaction_type' => $transactionType
)); ));
$consumptionRow->save(); $logRow->save();
$amount -= $stockEntry->amount; $amount -= $stockEntry->amount;
$stockEntry->delete(); $stockEntry->delete();
} }
else //Stock entry amount is > than needed amount -> split the stock entry resp. update the amount else //Stock entry amount is > than needed amount -> split the stock entry resp. update the amount
{ {
$consumptionRow = $db->consumptions()->createRow(array( $logRow = $db->stock_log()->createRow(array(
'product_id' => $stockEntry->product_id, 'product_id' => $stockEntry->product_id,
'amount' => $amount, 'amount' => $amount * -1,
'best_before_date' => $stockEntry->best_before_date, 'best_before_date' => $stockEntry->best_before_date,
'purchased_date' => $stockEntry->purchased_date, 'purchased_date' => $stockEntry->purchased_date,
'used_date' => date('Y-m-d H:i:s'),
'spoiled' => $spoiled, 'spoiled' => $spoiled,
'stock_id' => $stockEntry->stock_id 'stock_id' => $stockEntry->stock_id,
'transaction_type' => $transactionType
)); ));
$consumptionRow->save(); $logRow->save();
$restStockAmount = $stockEntry->amount - $amount; $restStockAmount = $stockEntry->amount - $amount;
$amount = 0; $amount = 0;

109
index.php
View File

@@ -32,10 +32,10 @@ if (!Grocy::IsDemoInstallation())
])); ]));
} }
$app->get('/', function(Request $request, Response $response) $db = Grocy::GetDbConnection();
{
$db = Grocy::GetDbConnection();
$app->get('/', function(Request $request, Response $response) use($db)
{
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
'title' => 'Dashboard', 'title' => 'Dashboard',
'contentPage' => 'dashboard.php', 'contentPage' => 'dashboard.php',
@@ -44,10 +44,8 @@ $app->get('/', function(Request $request, Response $response)
]); ]);
}); });
$app->get('/purchase', function(Request $request, Response $response) $app->get('/purchase', function(Request $request, Response $response) use($db)
{ {
$db = Grocy::GetDbConnection();
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
'title' => 'Purchase', 'title' => 'Purchase',
'contentPage' => 'purchase.php', 'contentPage' => 'purchase.php',
@@ -55,10 +53,8 @@ $app->get('/purchase', function(Request $request, Response $response)
]); ]);
}); });
$app->get('/consumption', function(Request $request, Response $response) $app->get('/consumption', function(Request $request, Response $response) use($db)
{ {
$db = Grocy::GetDbConnection();
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
'title' => 'Consumption', 'title' => 'Consumption',
'contentPage' => 'consumption.php', 'contentPage' => 'consumption.php',
@@ -66,10 +62,8 @@ $app->get('/consumption', function(Request $request, Response $response)
]); ]);
}); });
$app->get('/products', function(Request $request, Response $response) $app->get('/products', function(Request $request, Response $response) use($db)
{ {
$db = Grocy::GetDbConnection();
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
'title' => 'Products', 'title' => 'Products',
'contentPage' => 'products.php', 'contentPage' => 'products.php',
@@ -79,10 +73,8 @@ $app->get('/products', function(Request $request, Response $response)
]); ]);
}); });
$app->get('/locations', function(Request $request, Response $response) $app->get('/locations', function(Request $request, Response $response) use($db)
{ {
$db = Grocy::GetDbConnection();
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
'title' => 'Locations', 'title' => 'Locations',
'contentPage' => 'locations.php', 'contentPage' => 'locations.php',
@@ -90,10 +82,8 @@ $app->get('/locations', function(Request $request, Response $response)
]); ]);
}); });
$app->get('/quantityunits', function(Request $request, Response $response) $app->get('/quantityunits', function(Request $request, Response $response) use($db)
{ {
$db = Grocy::GetDbConnection();
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
'title' => 'Quantity units', 'title' => 'Quantity units',
'contentPage' => 'quantityunits.php', 'contentPage' => 'quantityunits.php',
@@ -101,10 +91,8 @@ $app->get('/quantityunits', function(Request $request, Response $response)
]); ]);
}); });
$app->get('/product/{productId}', function(Request $request, Response $response, $args) $app->get('/product/{productId}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
if ($args['productId'] == 'new') if ($args['productId'] == 'new')
{ {
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
@@ -128,10 +116,8 @@ $app->get('/product/{productId}', function(Request $request, Response $response,
} }
}); });
$app->get('/location/{locationId}', function(Request $request, Response $response, $args) $app->get('/location/{locationId}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
if ($args['locationId'] == 'new') if ($args['locationId'] == 'new')
{ {
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
@@ -151,10 +137,8 @@ $app->get('/location/{locationId}', function(Request $request, Response $respons
} }
}); });
$app->get('/quantityunit/{quantityunitId}', function(Request $request, Response $response, $args) $app->get('/quantityunit/{quantityunitId}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
if ($args['quantityunitId'] == 'new') if ($args['quantityunitId'] == 'new')
{ {
return $this->renderer->render($response, '/layout.php', [ return $this->renderer->render($response, '/layout.php', [
@@ -174,67 +158,57 @@ $app->get('/quantityunit/{quantityunitId}', function(Request $request, Response
} }
}); });
$app->group('/api', function() $app->group('/api', function() use($db, $app)
{ {
$this->get('/get-objects/{entity}', function(Request $request, Response $response, $args) $this->get('/get-objects/{entity}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
echo json_encode($db->{$args['entity']}()); echo json_encode($db->{$args['entity']}());
return $response->withHeader('Content-Type', 'application/json');
}); });
$this->get('/get-object/{entity}/{objectId}', function(Request $request, Response $response, $args) $this->get('/get-object/{entity}/{objectId}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
echo json_encode($db->{$args['entity']}($args['objectId'])); echo json_encode($db->{$args['entity']}($args['objectId']));
return $response->withHeader('Content-Type', 'application/json');
}); });
$this->post('/add-object/{entity}', function(Request $request, Response $response, $args) $this->post('/add-object/{entity}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
$newRow = $db->{$args['entity']}()->createRow($request->getParsedBody()); $newRow = $db->{$args['entity']}()->createRow($request->getParsedBody());
$newRow->save(); $newRow->save();
$success = $newRow->isClean(); $success = $newRow->isClean();
echo json_encode(array('success' => $success)); echo json_encode(array('success' => $success));
return $response->withHeader('Content-Type', 'application/json');
}); });
$this->post('/edit-object/{entity}/{objectId}', function(Request $request, Response $response, $args) $this->post('/edit-object/{entity}/{objectId}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
$row = $db->{$args['entity']}($args['objectId']); $row = $db->{$args['entity']}($args['objectId']);
$row->update($request->getParsedBody()); $row->update($request->getParsedBody());
$success = $row->isClean(); $success = $row->isClean();
echo json_encode(array('success' => $success)); echo json_encode(array('success' => $success));
return $response->withHeader('Content-Type', 'application/json');
}); });
$this->get('/delete-object/{entity}/{objectId}', function(Request $request, Response $response, $args) $this->get('/delete-object/{entity}/{objectId}', function(Request $request, Response $response, $args) use($db)
{ {
$db = Grocy::GetDbConnection();
$row = $db->{$args['entity']}($args['objectId']); $row = $db->{$args['entity']}($args['objectId']);
$row->delete(); $row->delete();
$success = $row->isClean(); $success = $row->isClean();
echo json_encode(array('success' => $success)); echo json_encode(array('success' => $success));
return $response->withHeader('Content-Type', 'application/json');
}); });
$this->get('/stock/get-product-details/{productId}', function(Request $request, Response $response, $args) $this->get('/stock/add-product/{productId}/{amount}', function(Request $request, Response $response, $args)
{ {
echo json_encode(GrocyLogicStock::GetProductDetails($args['productId'])); $bestBeforeDate = date('Y-m-d');
return $response->withHeader('Content-Type', 'application/json'); if (isset($request->getQueryParams()['bestbeforedate']) && !empty($request->getQueryParams()['bestbeforedate']))
}); {
$bestBeforeDate = $request->getQueryParams()['bestbeforedate'];
}
$this->get('/stock/get-current-stock', function(Request $request, Response $response) $transactionType = GrocyLogicStock::TRANSACTION_TYPE_PURCHASE;
{ if (isset($request->getQueryParams()['transactiontype']) && !empty($request->getQueryParams()['transactiontype']))
echo json_encode(GrocyLogicStock::GetCurrentStock()); {
return $response->withHeader('Content-Type', 'application/json'); $transactionType = $request->getQueryParams()['transactiontype'];
}
echo json_encode(array('success' => GrocyLogicStock::AddProduct($args['productId'], $args['amount'], $bestBeforeDate, $transactionType)));
}); });
$this->get('/stock/consume-product/{productId}/{amount}', function(Request $request, Response $response, $args) $this->get('/stock/consume-product/{productId}/{amount}', function(Request $request, Response $response, $args)
@@ -245,15 +219,28 @@ $app->group('/api', function()
$spoiled = true; $spoiled = true;
} }
echo json_encode(array('success' => GrocyLogicStock::ConsumeProduct($args['productId'], $args['amount'], $spoiled))); $transactionType = GrocyLogicStock::TRANSACTION_TYPE_CONSUME;
return $response->withHeader('Content-Type', 'application/json'); if (isset($request->getQueryParams()['transactiontype']) && !empty($request->getQueryParams()['transactiontype']))
{
$transactionType = $request->getQueryParams()['transactiontype'];
}
echo json_encode(array('success' => GrocyLogicStock::ConsumeProduct($args['productId'], $args['amount'], $spoiled, $transactionType)));
}); });
$this->get('/helper/uniqid', function(Request $request, Response $response) $this->get('/stock/get-product-details/{productId}', function(Request $request, Response $response, $args)
{ {
echo json_encode(array('uniqid' => uniqid())); echo json_encode(GrocyLogicStock::GetProductDetails($args['productId']));
return $response->withHeader('Content-Type', 'application/json');
}); });
$this->get('/stock/get-current-stock', function(Request $request, Response $response)
{
echo json_encode(GrocyLogicStock::GetCurrentStock());
});
})->add(function($request, $response, $next)
{
$response = $next($request, $response);
return $response->withHeader('Content-Type', 'application/json');
}); });
$app->run(); $app->run();

View File

@@ -2,6 +2,7 @@
<h1 class="page-header">Consumption</h1> <h1 class="page-header">Consumption</h1>
<form id="consumption-form"> <form id="consumption-form">
<div class="form-group"> <div class="form-group">
<label for="product_id">Product&nbsp;&nbsp;<i class="fa fa-barcode"></i></label> <label for="product_id">Product&nbsp;&nbsp;<i class="fa fa-barcode"></i></label>
<select data-instockproduct="instockproduct" class="form-control combobox" id="product_id" name="product_id" required> <select data-instockproduct="instockproduct" class="form-control combobox" id="product_id" name="product_id" required>
@@ -12,17 +13,21 @@
</select> </select>
<div id="product-error" class="help-block with-errors"></div> <div id="product-error" class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="amount">Amount</label> <label for="amount">Amount</label>
<input type="number" class="form-control" id="amount" name="amount" value="1" min="1" required> <input type="number" class="form-control" id="amount" name="amount" value="1" min="1" required>
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label for="spoiled"> <label for="spoiled">
<input type="checkbox" id="spoiled" name="spoiled"> Spoiled <input type="checkbox" id="spoiled" name="spoiled"> Spoiled
</label> </label>
</div> </div>
<button id="save-consumption-button" type="submit" class="btn btn-default">OK</button> <button id="save-consumption-button" type="submit" class="btn btn-default">OK</button>
</form> </form>
</div> </div>
@@ -35,4 +40,4 @@
<strong>Last purchased:</strong> <span id="selected-product-last-purchased"></span> <time id="selected-product-last-purchased-timeago" class="timeago timeago-contextual"></time><br /> <strong>Last purchased:</strong> <span id="selected-product-last-purchased"></span> <time id="selected-product-last-purchased-timeago" class="timeago timeago-contextual"></time><br />
<strong>Last used:</strong> <span id="selected-product-last-used"></span> <time id="selected-product-last-used-timeago" class="timeago timeago-contextual"></time> <strong>Last used:</strong> <span id="selected-product-last-used"></span> <time id="selected-product-last-used-timeago" class="timeago timeago-contextual"></time>
</p> </p>
</div> </div>

View File

@@ -38,6 +38,7 @@
</div> </div>
<div id="navbar-mobile" class="navbar-collapse collapse"> <div id="navbar-mobile" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li data-nav-for-page="dashboard.php"> <li data-nav-for-page="dashboard.php">
<a class="discrete-link" href="/"><i class="fa fa-tachometer fa-fw"></i>&nbsp;Dashboard</a> <a class="discrete-link" href="/"><i class="fa fa-tachometer fa-fw"></i>&nbsp;Dashboard</a>
@@ -49,6 +50,7 @@
<a class="discrete-link" href="/consumption"><i class="fa fa-cutlery fa-fw"></i>&nbsp;Record consumption</a> <a class="discrete-link" href="/consumption"><i class="fa fa-cutlery fa-fw"></i>&nbsp;Record consumption</a>
</li> </li>
</ul> </ul>
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li data-nav-for-page="products.php"> <li data-nav-for-page="products.php">
<a class="discrete-link" href="/products"><i class="fa fa-product-hunt fa-fw"></i>&nbsp;Manage products</a> <a class="discrete-link" href="/products"><i class="fa fa-product-hunt fa-fw"></i>&nbsp;Manage products</a>
@@ -60,13 +62,16 @@
<a class="discrete-link" href="/quantityunits"><i class="fa fa-balance-scale fa-fw"></i>&nbsp;Manage quantity units</a> <a class="discrete-link" href="/quantityunits"><i class="fa fa-balance-scale fa-fw"></i>&nbsp;Manage quantity units</a>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-sm-3 col-md-2 sidebar"> <div class="col-sm-3 col-md-2 sidebar">
<ul class="nav nav-sidebar"> <ul class="nav nav-sidebar">
<li data-nav-for-page="dashboard.php"> <li data-nav-for-page="dashboard.php">
<a class="discrete-link" href="/"><i class="fa fa-tachometer fa-fw"></i>&nbsp;Dashboard</a> <a class="discrete-link" href="/"><i class="fa fa-tachometer fa-fw"></i>&nbsp;Dashboard</a>
@@ -78,6 +83,7 @@
<a class="discrete-link" href="/consumption"><i class="fa fa-cutlery fa-fw"></i>&nbsp;Record consumption</a> <a class="discrete-link" href="/consumption"><i class="fa fa-cutlery fa-fw"></i>&nbsp;Record consumption</a>
</li> </li>
</ul> </ul>
<ul class="nav nav-sidebar"> <ul class="nav nav-sidebar">
<li data-nav-for-page="products.php"> <li data-nav-for-page="products.php">
<a class="discrete-link" href="/products"><i class="fa fa-product-hunt fa-fw"></i>&nbsp;Manage products</a> <a class="discrete-link" href="/products"><i class="fa fa-product-hunt fa-fw"></i>&nbsp;Manage products</a>
@@ -89,6 +95,7 @@
<a class="discrete-link" href="/quantityunits"><i class="fa fa-balance-scale fa-fw"></i>&nbsp;Manage quantity units</a> <a class="discrete-link" href="/quantityunits"><i class="fa fa-balance-scale fa-fw"></i>&nbsp;Manage quantity units</a>
</li> </li>
</ul> </ul>
<div class="nav-copyright nav nav-sidebar"> <div class="nav-copyright nav nav-sidebar">
grocy is a project by grocy is a project by
<a class="discrete-link" href="https://berrnd.de" target="_blank">Bernd Bestel</a> <a class="discrete-link" href="https://berrnd.de" target="_blank">Bernd Bestel</a>
@@ -103,10 +110,12 @@
<i class="fa fa-github"></i> <i class="fa fa-github"></i>
</a> </a>
</div> </div>
</div> </div>
<script>Grocy.ContentPage = '<?php echo $contentPage; ?>';</script> <script>Grocy.ContentPage = '<?php echo $contentPage; ?>';</script>
<?php include $contentPage; ?> <?php include $contentPage; ?>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,5 @@
<div class="col-sm-3 col-sm-offset-3 col-md-4 col-md-offset-2 main"> <div class="col-sm-3 col-sm-offset-3 col-md-4 col-md-offset-2 main">
<h1 class="page-header"><?php echo $title; ?></h1> <h1 class="page-header"><?php echo $title; ?></h1>
<script>Grocy.EditMode = '<?php echo $mode; ?>';</script> <script>Grocy.EditMode = '<?php echo $mode; ?>';</script>
@@ -8,15 +9,20 @@
<?php endif; ?> <?php endif; ?>
<form id="location-form"> <form id="location-form">
<div class="form-group"> <div class="form-group">
<label for="name">Name</label> <label for="name">Name</label>
<input type="text" class="form-control" required id="name" name="name" value="<?php if ($mode == 'edit') echo $location->name; ?>" /> <input type="text" class="form-control" required id="name" name="name" value="<?php if ($mode == 'edit') echo $location->name; ?>" />
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="description">Description</label> <label for="description">Description</label>
<textarea class="form-control" rows="2" id="description" name="description"><?php if ($mode == 'edit') echo $location->description; ?></textarea> <textarea class="form-control" rows="2" id="description" name="description"><?php if ($mode == 'edit') echo $location->description; ?></textarea>
</div> </div>
<button id="save-location-button" type="submit" class="btn btn-default">Save</button> <button id="save-location-button" type="submit" class="btn btn-default">Save</button>
</form> </form>
</div> </div>

View File

@@ -41,4 +41,3 @@ $(function()
] ]
}); });
}); });

View File

@@ -1,4 +1,5 @@
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header"> <h1 class="page-header">
Locations Locations
<a class="btn btn-default" href="/location/new" role="button"> <a class="btn btn-default" href="/location/new" role="button">
@@ -37,4 +38,5 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,5 @@
<div class="col-sm-3 col-sm-offset-3 col-md-4 col-md-offset-2 main"> <div class="col-sm-3 col-sm-offset-3 col-md-4 col-md-offset-2 main">
<h1 class="page-header"><?php echo $title; ?></h1> <h1 class="page-header"><?php echo $title; ?></h1>
<script>Grocy.EditMode = '<?php echo $mode; ?>';</script> <script>Grocy.EditMode = '<?php echo $mode; ?>';</script>
@@ -8,20 +9,24 @@
<?php endif; ?> <?php endif; ?>
<form id="product-form"> <form id="product-form">
<div class="form-group"> <div class="form-group">
<label for="name">Name</label> <label for="name">Name</label>
<input type="text" class="form-control" required id="name" name="name" value="<?php if ($mode == 'edit') echo $product->name; ?>"> <input type="text" class="form-control" required id="name" name="name" value="<?php if ($mode == 'edit') echo $product->name; ?>">
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="description">Description</label> <label for="description">Description</label>
<textarea class="form-control" rows="2" id="description" name="description"><?php if ($mode == 'edit') echo $product->description; ?></textarea> <textarea class="form-control" rows="2" id="description" name="description"><?php if ($mode == 'edit') echo $product->description; ?></textarea>
</div> </div>
<div class="form-group tm-group"> <div class="form-group tm-group">
<label for="barcode-taginput">Barcode(s)&nbsp;&nbsp;<i class="fa fa-barcode"></i></label> <label for="barcode-taginput">Barcode(s)&nbsp;&nbsp;<i class="fa fa-barcode"></i></label>
<input type="text" class="form-control tm-input" id="barcode-taginput"> <input type="text" class="form-control tm-input" id="barcode-taginput">
<div id="barcode-taginput-container"></div> <div id="barcode-taginput-container"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="location_id">Location</label> <label for="location_id">Location</label>
<select required class="form-control" id="location_id" name="location_id"> <select required class="form-control" id="location_id" name="location_id">
@@ -31,6 +36,7 @@
</select> </select>
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="qu_id_purchase">Quantity unit purchase</label> <label for="qu_id_purchase">Quantity unit purchase</label>
<select required class="form-control input-group-qu" id="qu_id_purchase" name="qu_id_purchase"> <select required class="form-control input-group-qu" id="qu_id_purchase" name="qu_id_purchase">
@@ -40,6 +46,7 @@
</select> </select>
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="qu_id_stock">Quantity unit stock</label> <label for="qu_id_stock">Quantity unit stock</label>
<select required class="form-control input-group-qu" id="qu_id_stock" name="qu_id_stock"> <select required class="form-control input-group-qu" id="qu_id_stock" name="qu_id_stock">
@@ -49,12 +56,16 @@
</select> </select>
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="qu_factor_purchase_to_stock">Factor purchase to stock quantity unit</label> <label for="qu_factor_purchase_to_stock">Factor purchase to stock quantity unit</label>
<input required min="1" type="number" class="form-control input-group-qu" id="qu_factor_purchase_to_stock" name="qu_factor_purchase_to_stock" value="<?php if ($mode == 'edit') echo $product->qu_factor_purchase_to_stock; else echo '1'; ?>"> <input required min="1" type="number" class="form-control input-group-qu" id="qu_factor_purchase_to_stock" name="qu_factor_purchase_to_stock" value="<?php if ($mode == 'edit') echo $product->qu_factor_purchase_to_stock; else echo '1'; ?>">
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<p id="qu-conversion-info" class="help-block text-muted"></p> <p id="qu-conversion-info" class="help-block text-muted"></p>
<button id="save-product-button" type="submit" class="btn btn-default">Save</button> <button id="save-product-button" type="submit" class="btn btn-default">Save</button>
</form> </form>
</div> </div>

View File

@@ -1,4 +1,5 @@
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header"> <h1 class="page-header">
Products Products
<a class="btn btn-default" href="/product/new" role="button"> <a class="btn btn-default" href="/product/new" role="button">
@@ -53,4 +54,5 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>

View File

@@ -9,32 +9,19 @@
{ {
jsonForm.amount = jsonForm.amount * productDetails.product.qu_factor_purchase_to_stock; jsonForm.amount = jsonForm.amount * productDetails.product.qu_factor_purchase_to_stock;
Grocy.FetchJson('/api/helper/uniqid', Grocy.FetchJson('/api/stock/add-product/' + jsonForm.product_id + '/' + jsonForm.amount + '?bestbeforedate=' + $('#best_before_date').val(),
function(uniqidResponse) function (result) {
{ toastr.success('Added ' + jsonForm.amount + ' ' + productDetails.quantity_unit_stock.name + ' of ' + productDetails.product.name + ' to stock');
jsonForm.stock_id = uniqidResponse.uniqid;
Grocy.PostJson('/api/add-object/stock', jsonForm, $('#amount').val(1);
function(result) $('#best_before_date').val('');
{ $('#product_id').val('');
toastr.success('Added ' + jsonForm.amount + ' ' + productDetails.quantity_unit_stock.name + ' of ' + productDetails.product.name + ' to stock'); $('#product_id_text_input').focus();
$('#product_id_text_input').val('');
$('#amount').val(1); $('#product_id_text_input').trigger('change');
$('#best_before_date').val(''); $('#purchase-form').validator('validate');
$('#product_id').val('');
$('#product_id_text_input').focus();
$('#product_id_text_input').val('');
$('#product_id_text_input').trigger('change');
$('#purchase-form').validator('validate');
},
function(xhr)
{
console.error(xhr);
}
);
}, },
function(xhr) function (xhr) {
{
console.error(xhr); console.error(xhr);
} }
); );

View File

@@ -2,6 +2,7 @@
<h1 class="page-header">Purchase</h1> <h1 class="page-header">Purchase</h1>
<form id="purchase-form"> <form id="purchase-form">
<div class="form-group"> <div class="form-group">
<label for="product_id">Product&nbsp;&nbsp;<i class="fa fa-barcode"></i></label> <label for="product_id">Product&nbsp;&nbsp;<i class="fa fa-barcode"></i></label>
<select class="form-control combobox" id="product_id" name="product_id" required> <select class="form-control combobox" id="product_id" name="product_id" required>
@@ -12,6 +13,7 @@
</select> </select>
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="best_before_date">Best before</label> <label for="best_before_date">Best before</label>
<div class="input-group date"> <div class="input-group date">
@@ -22,12 +24,15 @@
</div> </div>
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="amount">Amount</label> <label for="amount">Amount</label>
<input type="number" class="form-control" id="amount" name="amount" value="1" min="1" required> <input type="number" class="form-control" id="amount" name="amount" value="1" min="1" required>
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<button id="save-purchase-button" type="submit" class="btn btn-default">OK</button> <button id="save-purchase-button" type="submit" class="btn btn-default">OK</button>
</form> </form>
</div> </div>
@@ -40,4 +45,4 @@
<strong>Last purchased:</strong> <span id="selected-product-last-purchased"></span> <time id="selected-product-last-purchased-timeago" class="timeago timeago-contextual"></time><br /> <strong>Last purchased:</strong> <span id="selected-product-last-purchased"></span> <time id="selected-product-last-purchased-timeago" class="timeago timeago-contextual"></time><br />
<strong>Last used:</strong> <span id="selected-product-last-used"></span> <time id="selected-product-last-used-timeago" class="timeago timeago-contextual"></time> <strong>Last used:</strong> <span id="selected-product-last-used"></span> <time id="selected-product-last-used-timeago" class="timeago timeago-contextual"></time>
</p> </p>
</div> </div>

View File

@@ -1,4 +1,5 @@
<div class="col-sm-3 col-sm-offset-3 col-md-4 col-md-offset-2 main"> <div class="col-sm-3 col-sm-offset-3 col-md-4 col-md-offset-2 main">
<h1 class="page-header"><?php echo $title; ?></h1> <h1 class="page-header"><?php echo $title; ?></h1>
<script>Grocy.EditMode = '<?php echo $mode; ?>';</script> <script>Grocy.EditMode = '<?php echo $mode; ?>';</script>
@@ -8,15 +9,20 @@
<?php endif; ?> <?php endif; ?>
<form id="quantityunit-form"> <form id="quantityunit-form">
<div class="form-group"> <div class="form-group">
<label for="name">Name</label> <label for="name">Name</label>
<input type="text" class="form-control" required id="name" name="name" value="<?php if ($mode == 'edit') echo $quantityunit->name; ?>" /> <input type="text" class="form-control" required id="name" name="name" value="<?php if ($mode == 'edit') echo $quantityunit->name; ?>" />
<div class="help-block with-errors"></div> <div class="help-block with-errors"></div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="description">Description</label> <label for="description">Description</label>
<textarea class="form-control" rows="2" id="description" name="description"><?php if ($mode == 'edit') echo $quantityunit->description; ?></textarea> <textarea class="form-control" rows="2" id="description" name="description"><?php if ($mode == 'edit') echo $quantityunit->description; ?></textarea>
</div> </div>
<button id="save-quantityunit-button" type="submit" class="btn btn-default">Save</button> <button id="save-quantityunit-button" type="submit" class="btn btn-default">Save</button>
</form> </form>
</div> </div>

View File

@@ -1,4 +1,5 @@
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<h1 class="page-header"> <h1 class="page-header">
Quantity units Quantity units
<a class="btn btn-default" href="/quantityunit/new" role="button"> <a class="btn btn-default" href="/quantityunit/new" role="button">
@@ -37,4 +38,5 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>