Files
dockerfluxodecaixapro/app/Services/ProductStockMovementService.php
T
2026-09-01 10:46:29 -03:00

91 lines
3.5 KiB
PHP
Executable File

<?php
namespace App\Services;
use Modules\Erpstock\Models\StockMovement;
use Modules\Erpproducts\Models\Product;
use App\Helpers\Log;
use Illuminate\Database\Capsule\Manager as DB;
class ProductStockMovementService
{
/**
* Create a new product stock movement.
*
* @param array $data Movement data
* @param object $user User performing the action
* @return StockMovement The created movement
* @throws \Exception
*/
public function createMovement(array $data, $user)
{
DB::beginTransaction();
try {
$product = Product::where('pr_id', $data['product_id'])
->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;
}
}
}