where('pr_idbus', $user->users_bus_id) ->first(); if (!$product) { throw new \Exception(__('erpstock.erpstock.movements.error_product_not_found')); } $quantity = (float)$data['quantity']; $type = $data['type']; // 'E' for Entry, 'S' for Exit // Update product stock if ($type === 'E') { $product->pr_estocado += $quantity; } else { $product->pr_estocado -= $quantity; } $product->save(); // Create movement record $movementData = [ 'mepro_data' => date('Y-m-d'), // Fixed: Legacy system uses DATE type, not DATETIME 'mepro_idpr' => $product->pr_id, 'mepro_idoperador' => $user->users_id, 'mepro_tipoes' => $type, 'mepro_qtdade' => $quantity, 'mepro_historico' => $data['history'] ?? '', 'mepro_documento' => $data['document'] ?? '', 'mepro_lote' => $data['batch'] ?? '', 'mepro_custo' => $data['cost'] ?? 0, 'mepro_preco' => $data['price'] ?? 0, 'mepro_ipi' => $data['ipi'] ?? 0, 'mepro_icms' => $data['icms'] ?? 0, 'mepro_oimpostos' => $data['other_taxes'] ?? 0, 'mepro_obs' => $data['observation'] ?? '', 'mepro_idbus' => $user->users_bus_id, 'mepro_idfornecedor' => $data['supplier_id'] ?? 0, 'mepro_idcliente' => $data['customer_id'] ?? 0, 'mepro_idarmazem' => $data['warehouse_id'] ?? 0, 'mepro_nfantasia' => $product->pr_descricao, // Fixed: Product model doesn't have pr_nome 'mepro_descricao' => $product->pr_descricao, 'mepro_codigo' => $product->pr_codigo, 'mepro_exp1' => $data['extra1'] ?? '', 'mepro_exp2' => $data['extra2'] ?? '', 'mepro_exp3' => $data['extra3'] ?? '', // Legacy required fields with default values 'mepro_idhistorico' => 0, 'mepro_idoc' => 0, 'mepro_idcoc' => 0, 'mepro_idcot' => 0, 'mepro_pn' => '', 'mepro_bp' => '' ]; $movement = StockMovement::create($movementData); Log::write('erpstock', 'Product Stock Movement', "Created movement ID: {$movement->mepro_id} with history: " . ($movementData['mepro_historico'] ?? 'NULL')); DB::commit(); return $movement; } catch (\Exception $e) { DB::rollBack(); Log::write('erpstock', 'Error', 'Failed to create movement: ' . $e->getMessage()); throw $e; } } }