diff --git a/index.php b/index.php index 4a0bf53..f139339 100644 --- a/index.php +++ b/index.php @@ -1,103 +1,38 @@ - - - - - - New Style - - - - - - -
+ + +
+

Dashboard

+
+ +
-

Welcome!

-

This is your new landing page.

-

Runtime: PHP — UTC

+
+ Resumo Financeiro +
+

Aqui vai um resumo das finanças da fazenda.

-
-
- Page updated: (UTC) -
- - + +
+
+ Níveis de Estoque +
+

Aqui vai um resumo dos níveis de estoque.

+
+ +
+
+ Produtividade da Lavoura +
+

Aqui vai um resumo da produtividade da lavoura.

+
+
+ + \ No newline at end of file diff --git a/inventory.php b/inventory.php new file mode 100644 index 0000000..2ddf0c3 --- /dev/null +++ b/inventory.php @@ -0,0 +1,86 @@ + +query('SELECT * FROM products ORDER BY name'); + $products = $stmt->fetchAll(); +} catch (PDOException $e) { + $products = []; + $error = "Erro ao buscar produtos: " . $e->getMessage(); +} + +?> + +
+

Estoque

+
+ +
+
+
+ Produtos em Estoque + Adicionar Produto +
+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProdutoUnidadeQuantidadeAções
Nenhum produto encontrado.
+ Movimentar +
+
+
+ + + + diff --git a/login.php b/login.php new file mode 100644 index 0000000..29b0a7a --- /dev/null +++ b/login.php @@ -0,0 +1,117 @@ + +prepare('SELECT * FROM users WHERE email = ?'); + $stmt->execute([$_POST['email']]); + $user = $stmt->fetch(); + + if ($user && password_verify($_POST['password'], $user['password'])) { + $_SESSION['user_id'] = $user['id']; + $_SESSION['user_name'] = $user['name']; + $_SESSION['user_role'] = $user['role_id']; + header('Location: index.php'); + exit; + } else { + $error = 'E-mail ou senha inválidos.'; + } + } catch (PDOException $e) { + $error = 'Erro no banco de dados: ' . $e->getMessage(); + } + } +} +?> + + + + + + + Login - Gestão Agrícola + + + + + + + diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..77b64d6 --- /dev/null +++ b/logout.php @@ -0,0 +1,7 @@ + +prepare('SELECT COUNT(*) FROM users WHERE email = ?'); + $stmt->execute([$email]); + if ($stmt->fetchColumn() > 0) { + $error = 'Este e-mail já está cadastrado.'; + } else { + $hashed_password = password_hash($password, PASSWORD_DEFAULT); + $stmt = $pdo->prepare('INSERT INTO users (name, email, password, role_id) VALUES (?, ?, ?, ?)'); + $stmt->execute([$name, $email, $hashed_password, $role_id]); + $success = 'Usuário cadastrado com sucesso! Você pode fazer o login agora.'; + } + } catch (PDOException $e) { + $error = 'Erro no banco de dados: ' . $e->getMessage(); + } + } +} + +// Fetch roles for the dropdown +try { + $pdo = db(); + $roles = $pdo->query('SELECT * FROM roles')->fetchAll(); +} catch (PDOException $e) { + $roles = []; + $error = 'Erro ao carregar os papéis de usuário.'; +} + +?> + + + + + + + Cadastro - Gestão Agrícola + + + + +
+

Cadastro de Usuário

+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ + diff --git a/stock.php b/stock.php new file mode 100644 index 0000000..ea41363 --- /dev/null +++ b/stock.php @@ -0,0 +1,185 @@ + +prepare('SELECT * FROM products WHERE id = ?'); + $stmt->execute([$product_id]); + $product = $stmt->fetch(); +} catch (PDOException $e) { + $error = "Erro ao buscar produto: " . $e->getMessage(); +} + +if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $type = $_POST['type'] ?? ''; + $quantity = $_POST['quantity'] ?? 0; + $notes = $_POST['notes'] ?? ''; + + if (empty($type) || empty($quantity) || $quantity <= 0) { + $error = 'Por favor, preencha o tipo e a quantidade (maior que zero).'; + } else { + try { + $pdo->beginTransaction(); + + // Insert into stock_movements + $stmt = $pdo->prepare('INSERT INTO stock_movements (product_id, type, quantity, user_id, notes) VALUES (?, ?, ?, ?, ?)'); + $stmt->execute([$product_id, $type, $quantity, $_SESSION['user_id'], $notes]); + + // Update product quantity + if ($type == 'entrada') { + $update_sql = 'UPDATE products SET quantity = quantity + ? WHERE id = ?'; + } else { + $update_sql = 'UPDATE products SET quantity = quantity - ? WHERE id = ?'; + } + $stmt = $pdo->prepare($update_sql); + $stmt->execute([$quantity, $product_id]); + + $pdo->commit(); + $success = 'Movimentação de estoque registrada com sucesso!'; + + // Refresh product data + $stmt = $pdo->prepare('SELECT * FROM products WHERE id = ?'); + $stmt->execute([$product_id]); + $product = $stmt->fetch(); + + } catch (PDOException $e) { + $pdo->rollBack(); + $error = 'Erro ao registrar movimentação: ' . $e->getMessage(); + } + } +} + +// Fetch stock movements for this product +try { + $stmt = $pdo->prepare('SELECT sm.*, u.name as user_name FROM stock_movements sm JOIN users u ON sm.user_id = u.id WHERE sm.product_id = ? ORDER BY sm.date DESC'); + $stmt->execute([$product_id]); + $movements = $stmt->fetchAll(); +} catch (PDOException $e) { + $movements = []; + $error = "Erro ao buscar movimentações: " . $e->getMessage(); +} + +?> + +
+

Movimentar Estoque:

+
+ +
+
+
+ Registrar Entrada/Saída +
+ +

Estoque Atual:

+ +

+

+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ Voltar para o Estoque +
+ +
+
+ Histórico de Movimentações +
+ + + + + + + + + + + + + + + + + + + + + +
DataTipoQuantidadeUsuárioNotas
+
+
+ + + + diff --git a/view_crop.php b/view_crop.php new file mode 100644 index 0000000..b088223 --- /dev/null +++ b/view_crop.php @@ -0,0 +1,189 @@ + +beginTransaction(); + + // 1. Check if there is enough stock + $stmt = $pdo->prepare('SELECT quantity FROM products WHERE id = ?'); + $stmt->execute([$product_id]); + $stock_quantity = $stmt->fetchColumn(); + + if ($stock_quantity < $quantity) { + throw new Exception('Quantidade em estoque insuficiente.'); + } + + // 2. Add to crop_inputs + $stmt = $pdo->prepare('INSERT INTO crop_inputs (crop_id, product_id, quantity, application_date, user_id) VALUES (?, ?, ?, ?, ?)'); + $stmt->execute([$crop_id, $product_id, $quantity, $application_date, $_SESSION['user_id']]); + + // 3. Update product stock (create a stock movement) + $stmt = $pdo->prepare('UPDATE products SET quantity = quantity - ? WHERE id = ?'); + $stmt->execute([$quantity, $product_id]); + + // 4. Log the stock movement + $notes = "Aplicação na lavoura ID: $crop_id"; + $stmt = $pdo->prepare('INSERT INTO stock_movements (product_id, type, quantity, user_id, notes) VALUES (?, 'saída', ?, ?, ?)'); + $stmt->execute([$product_id, $quantity, $_SESSION['user_id'], $notes]); + + $pdo->commit(); + $success = 'Insumo aplicado com sucesso!'; + + } catch (Exception $e) { + $pdo->rollBack(); + $error = 'Erro ao aplicar insumo: ' . $e->getMessage(); + } + } +} + + +// Fetch crop details +try { + $stmt = $pdo->prepare('SELECT * FROM crops WHERE id = ?'); + $stmt->execute([$crop_id]); + $crop = $stmt->fetch(); + + if (!$crop) { + header('Location: crops.php'); + exit; + } + + // Fetch applied inputs + $stmt = $pdo->prepare(' + SELECT ci.*, p.name as product_name, p.unit + FROM crop_inputs ci + JOIN products p ON ci.product_id = p.id + WHERE ci.crop_id = ? + ORDER BY ci.application_date DESC + '); + $stmt->execute([$crop_id]); + $applied_inputs = $stmt->fetchAll(); + + // Fetch products for the dropdown + $products = $pdo->query('SELECT id, name, unit, quantity FROM products WHERE quantity > 0 ORDER BY name')->fetchAll(); + +} catch (PDOException $e) { + $error = "Erro ao buscar dados da lavoura: " . $e->getMessage(); + $crop = null; + $applied_inputs = []; + $products = []; +} + +?> + +
+

Detalhes da Lavoura:

+
+ +
+

+

+ +
+
Informações Gerais
+ +

Cultura:

+

Área: ha

+

Data de Início:

+

Data de Colheita:

+ +

Lavoura não encontrada.

+ +
+ +
+
Aplicar Insumo
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+
Histórico de Insumos Aplicados
+ + + + + + + + + + + + + + + + + + + + + +
DataProdutoQuantidade
Nenhum insumo aplicado ainda.
+
+
+ Voltar para Lavouras +
+ + + +