You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

770 lines
31 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\pecosaBienes;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Validator;
use App\Models\inventarioInicial;
use App\Models\neaBienes;
class PecosaBienesController extends Controller
{
public function listPecosaBienes(Request $request)
{
try {
$neaQuery = DB::table('pecosa_bienes as pb')
->join('pecosa_pedidos as pd', 'pb.id_pecosa_pedido', '=', 'pd.id')
->join('nea_bienes', 'pb.nea_bien_id', '=', 'nea_bienes.id')
->join('bienes', 'nea_bienes.bienes_id', '=', 'bienes.id')
->join('unidad_medidas', 'bienes.id_unidad_medida', '=', 'unidad_medidas.id')
->select(
'pd.codigo as codigo_pedido',
'bienes.descripcion',
'unidad_medidas.nombre as unidad_medida',
'bienes.codigo as codigo_bien',
'nea_bienes.cantidad',
'nea_bienes.precio',
DB::raw('(nea_bienes.cantidad * nea_bienes.precio) as valor_total'),
'pb.observaciones'
);
// Segunda parte: con inventario_inicials
$inventarioQuery = DB::table('pecosa_bienes as pb')
->join('pecosa_pedidos as pd', 'pb.id_pecosa_pedido', '=', 'pd.id')
->join('inventario_inicials', 'pb.id_inventario_inicial', '=', 'inventario_inicials.id')
->join('bienes', 'inventario_inicials.bienes_id', '=', 'bienes.id')
->join('unidad_medidas', 'bienes.id_unidad_medida', '=', 'unidad_medidas.id')
->select(
'pd.codigo as codigo_pedido',
'bienes.descripcion',
'unidad_medidas.nombre as unidad_medida',
'bienes.codigo as codigo_bien',
'inventario_inicials.cantidad',
'inventario_inicials.precio',
DB::raw('(inventario_inicials.cantidad * inventario_inicials.precio) as valor_total'),
'pb.observaciones'
);
// Unir ambas
$data = $neaQuery->unionAll($inventarioQuery)->get();
return response()->json([
'success' => true,
'message' => 'Lista de Pecosa Bienes',
'data' => $data
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage() // Devuelve el mensaje de la excepción
], 500);
}
}
public function store_inventario(Request $request)
{
if (!auth()->user()->hasPermissionTo('pecosas agregar inventario bienes')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$rules = [
'registros' => 'required|array',
'registros.*.id_pecosa_pedido' => 'nullable',
'registros.*.id_inventario_inicial' => 'nullable',
'registros.*.descripcion' => 'nullable',
'registros.*.cantidad' => 'required|numeric',
'registros.*.id_unidad_medida' => 'required',
'registros.*.observaciones' => 'required',
'registros.*.fecha' => 'required|date',
];
$messages = [
'registros.required' => 'El campo registros es obligatorio.',
'registros.array' => 'El campo registros debe ser un arreglo.',
'registros.*.nea_bien_id.exists' => 'El nea_bien_id no existe en la base de datos.',
];
// Validación
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Errores de validación',
'errors' => $validator->errors()
], 422);
}
$data = $validator->validated();
foreach ($data['registros'] as &$registro) {
$registro['id'] = (string) Str::uuid(); // Generar UUID
if (!empty($registro['id_inventario_inicial'])) {
// Si el ID de inventario inicial existe, actualizar la cantidad
$inventario = inventarioInicial::find($registro['id_inventario_inicial']);
if ($inventario) {
$inventario->cantidad -= $registro['cantidad'];
if ($inventario->cantidad < 0) {
return response()->json([
'success' => false,
'message' => "No hay suficiente stock para el bien."
], 400);
}
$inventario->save();
}
}
}
// Insertar en PecosaBienes
PecosaBienes::insert($data['registros']);
return response()->json([
'success' => true,
'message' => 'Registros guardados correctamente'
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage()
], 500);
}
}
public function store_nea_bienes(Request $request)
{
if (!auth()->user()->hasPermissionTo('pecosas agregar neas bienes')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$rules = [
'registros' => 'required|array',
'registros.*.id_pecosa_pedido' => 'nullable',
'registros.*.nea_bien_id' => 'nullable|exists:nea_bienes,id', // Validar existencia en la tabla
'registros.*.descripcion' => 'nullable',
'registros.*.cantidad' => 'required|numeric',
'registros.*.id_unidad_medida' => 'required',
'registros.*.observaciones' => 'required',
'registros.*.fecha' => 'required|date',
];
$messages = [
'registros.required' => 'El campo registros es obligatorio.',
'registros.array' => 'El campo registros debe ser un arreglo.',
'registros.*.nea_bien_id.exists' => 'El nea_bien_id no existe en la base de datos.',
];
// Validación
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Errores de validación',
'errors' => $validator->errors()
], 422);
}
$data = $validator->validated();
foreach ($data['registros'] as &$registro) {
$registro['id'] = (string) Str::uuid(); // Generar UUID
if (!empty($registro['nea_bien_id'])) {
// Si el ID de nea bien existe, actualizar la cantidad
$inventario_neas = neaBienes::find($registro['nea_bien_id']);
if ($inventario_neas) {
$inventario_neas->cantidad -= $registro['cantidad'];
if ($inventario_neas->cantidad < 0) {
return response()->json([
'success' => false,
'message' => "No hay suficiente stock."
], 400);
}
$inventario_neas->save();
}
}
}
// Insertar en PecosaBienes
PecosaBienes::insert($data['registros']);
return response()->json([
'success' => true,
'message' => 'Registros guardados correctamente'
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage()
], 500);
}
}
public function listNeasBienes(Request $request, $id)
{
if (!auth()->user()->hasPermissionTo('pecosas vista')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$data = DB::table('pecosa_bienes as p')
->join('nea_bienes as n', 'n.id', '=', 'p.nea_bien_id')
->join('bienes as b', 'b.id', '=', 'n.bienes_id')
->join('unidad_medidas as u', 'u.id', '=', 'b.id_unidad_medida')
->select(
'b.descripcion AS descripcion_bien',
'n.cantidad as cantidad_stock',
'u.nombre as nombre_medida',
'p.*',
'p.id_unidad_medida AS medida_salida',
DB::raw("DATE_FORMAT(p.fecha, '%Y-%m-%d') as fecha_registro"),
'p.descripcion as descripcion_pecosa_bien'
)
->where('p.id_pecosa_pedido', $id)
->get();
return response()->json([
'success' => true,
'message' => 'Lista de NEAS de bienes',
'data' => $data
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage() // Devuelve el mensaje de la excepción
], 500);
}
}
public function listNeasBienesEnable(Request $request, $id)
{
if (!auth()->user()->hasPermissionTo('pecosas vista')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$data = DB::table('pecosa_bienes as p')
->join('nea_bienes as n', 'n.id', '=', 'p.nea_bien_id')
->join('bienes as b', 'b.id', '=', 'n.bienes_id')
->join('unidad_medidas as u', 'u.id', '=', 'b.id_unidad_medida')
->select(
'b.descripcion AS descripcion_bien',
'n.cantidad as cantidad_stock',
'u.nombre as nombre_medida',
'p.*',
'p.id_unidad_medida AS medida_salida',
DB::raw("DATE_FORMAT(p.fecha, '%Y-%m-%d') as fecha_registro"),
'p.descripcion as descripcion_pecosa_bien'
)
->where('p.id_pecosa_pedido', $id)
->where('p.status', 1) // Solo los registros habilitados
->get();
return response()->json([
'success' => true,
'message' => 'Lista de NEAS de bienes',
'data' => $data
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage() // Devuelve el mensaje de la excepción
], 500);
}
}
public function listInventarioBienes(Request $request, $id)
{
if (!auth()->user()->hasPermissionTo('pecosas vista')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$data = DB::table('pecosa_bienes as p')
->join('inventario_inicials as n', 'n.id', '=', 'p.id_inventario_inicial')
->join('bienes as b', 'b.id', '=', 'n.bienes_id')
->join('unidad_medidas as u', 'u.id', '=', 'b.id_unidad_medida')
->select(
'b.descripcion AS descripcion_bien',
'n.cantidad as cantidad_stock',
'u.nombre as nombre_medida',
'p.*',
'p.id_unidad_medida AS medida_salida',
DB::raw("DATE_FORMAT(p.fecha, '%Y-%m-%d') as fecha_registro"),
'p.descripcion as descripcion_pecosa_bien'
)
->where('p.id_pecosa_pedido', $id)
->get();
return response()->json([
'success' => true,
'message' => 'Lista de Inevntario de bienes',
'data' => $data
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage() // Devuelve el mensaje de la excepción
], 500);
}
}
public function listInventarioBienesEnable(Request $request, $id)
{
if (!auth()->user()->hasPermissionTo('pecosas vista')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$data = DB::table('pecosa_bienes as p')
->join('inventario_inicials as n', 'n.id', '=', 'p.id_inventario_inicial')
->join('bienes as b', 'b.id', '=', 'n.bienes_id')
->join('unidad_medidas as u', 'u.id', '=', 'b.id_unidad_medida')
->select(
'b.descripcion AS descripcion_bien',
'n.cantidad as cantidad_stock',
'u.nombre as nombre_medida',
'p.*',
'p.id_unidad_medida AS medida_salida',
DB::raw("DATE_FORMAT(p.fecha, '%Y-%m-%d') as fecha_registro"),
'p.descripcion as descripcion_pecosa_bien'
)
->where('p.id_pecosa_pedido', $id)
->where('p.status', 1) // Solo los registros habilitados
->get();
return response()->json([
'success' => true,
'message' => 'Lista de Inevntario de bienes',
'data' => $data
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage() // Devuelve el mensaje de la excepción
], 500);
}
}
public function update_inventario(Request $request)
{
if (!auth()->user()->hasPermissionTo('pecosas actualizar inventario bienes')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$rules = [
'registros' => 'required|array',
'registros.*.id' => 'required|exists:pecosa_bienes,id',
'registros.*.id_inventario_inicial' => 'required',
'registros.*.descripcion' => 'string',
'registros.*.cantidad' => 'required|numeric',
'registros.*.id_unidad_medida' => 'required',
'registros.*.observaciones' => 'required',
'registros.*.fecha' => 'required|date',
];
$messages = [
'registros.required' => 'El campo registros es obligatorio.',
'registros.array' => 'El campo registros debe ser un arreglo.',
'registros.*.id.exists' => 'El ID del bien no existe en la base de datos.',
];
// Validación
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Errores de validación',
'errors' => $validator->errors()
], 422);
}
$data = $validator->validated();
// Depurar los datos antes de continuar
\Log::info('Datos recibidos para actualizar:', $data);
// dd($data); // Descomenta esta línea si quieres ver los datos en la respuesta API
foreach ($data['registros'] as $registro) {
// Buscar el registro en la base de datos
$pecosaBien = PecosaBienes::find($registro['id']);
if (!$pecosaBien) {
return response()->json([
'success' => false,
'message' => 'Registro no encontrado con ID: ' . $registro['id']
], 404);
}
$temp_cantidad = $pecosaBien->cantidad;
if (!empty($registro['id_inventario_inicial'])) {
$inventario = InventarioInicial::find($registro['id_inventario_inicial']);
if ($inventario) {
// ✅ Primero, restaurar la cantidad anterior en el inventario
$inventario->cantidad += $temp_cantidad;
// ✅ Luego, restar la nueva cantidad
$inventario->cantidad -= floatval($registro['cantidad']);
// ⚠️ Verificar que no haya stock negativo
if ($inventario->cantidad < 0) {
return response()->json([
'success' => false,
'message' => "No hay suficiente stock para el bien con ID: " . $registro['id']
], 400);
}
$inventario->save();
}
}
//dd($registro['cantidad']);
// Actualizar los datos del bien
$pecosaBien->update([
'descripcion' => $registro['descripcion'],
'cantidad' => $registro['cantidad'],
'id_unidad_medida' => $registro['id_unidad_medida'],
'observaciones' => $registro['observaciones'],
'fecha' => $registro['fecha'],
]);
}
return response()->json([
'success' => true,
'message' => 'Registros actualizados correctamente'
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error en el servidor',
'error' => $e->getMessage()
], 500);
}
}
public function update_nea_bienes(Request $request)
{
if (!auth()->user()->hasPermissionTo('pecosas actualizar neas bienes')) { // Corregido nombre del permiso
return response()->json(['valid' => false, 'error' => 'Lo sentimos, pero no tiene autorización para realizar esta acción.'], 403);
}
try {
$rules = [
'registros' => 'required|array',
'registros.*.id' => 'required|exists:pecosa_bienes,id', // Agregar esta línea
'registros.*.nea_bien_id' => 'required|exists:nea_bienes,id',
'registros.*.descripcion' => 'string',
'registros.*.cantidad' => 'required|numeric',
'registros.*.id_unidad_medida' => 'required',
'registros.*.observaciones' => 'required',
'registros.*.fecha' => 'required|date',
];
$messages = [
'registros.required' => 'El campo registros es obligatorio.',
'registros.array' => 'El campo registros debe ser un arreglo.',
'registros.*.nea_bien_id.exists' => 'El nea_bien_id no existe en la base de datos.',
];
// Validación
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Errores de validación',
'errors' => $validator->errors()
], 422);
}
$data = $validator->validated();
// Depurar los datos antes de continuar
\Log::info('Datos recibidos para actualizar:', $data);
$data = $validator->validated();
foreach ($data['registros'] as &$registro) {
if (!isset($registro['id'])) {
return response()->json([
'success' => false,
'message' => 'El campo id no está presente en el registro'
], 400);
}
$pecosaBien = PecosaBienes::find($registro['id']);
if (!$pecosaBien) {
return response()->json([
'success' => false,
'message' => 'Registro no encontrado con ID: ' . $registro['id']
], 404);
}
$temp_cantidad = $pecosaBien->cantidad;
if (!empty($registro['nea_bien_id'])) {
// Si el ID de nea bien existe, actualizar la cantidad
$inventario_neas = neaBienes::find($registro['nea_bien_id']);
if ($inventario_neas) {
// ✅ Primero, restaurar la cantidad anterior en el inventario
$inventario_neas->cantidad += $temp_cantidad;
// ✅ Luego, restar la nueva cantidad
$inventario_neas->cantidad -= floatval($registro['cantidad']);
// $inventario_neas->cantidad -= $registro['cantidad'];
if ($inventario_neas->cantidad < 0) {
return response()->json([
'success' => false,
'message' => "No hay suficiente stock."
], 400);
}
$inventario_neas->save();
}
}
// Actualizar los datos del bien
$pecosaBien->update([
'descripcion' => $registro['descripcion'],
'cantidad' => $registro['cantidad'],
'id_unidad_medida' => $registro['id_unidad_medida'],
'observaciones' => $registro['observaciones'],
'fecha' => $registro['fecha'],
]);
}
return response()->json([
'success' => true,
'message' => 'Registros guardados correctamente'
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => $e->getMessage(),
'message' => 'Error en el servidor',
'error' => $e->getMessage()
], 500);
}
}
public function disableNeaBien(Request $request)
{
$idNeaBien = $request->input('nea_bien_id'); // Obtener el ID del body
$idPecosaBien = $request->input('pecosa_bien_id');
try {
$ultimoRegistro = DB::table('pecosa_bienes')->where('id', $idPecosaBien)
->orderBy('created_at', 'desc')
->first();
if (!$ultimoRegistro) {
return response()->json(['mensaje' => 'No se encontró ningún registro en pecosa_bienes'], 404);
}
// Obtener el registro de nea_bienes
$neaBien = DB::table('nea_bienes')->where('id', $idNeaBien)->first();
if (!$neaBien) {
return response()->json(['mensaje' => 'Nea bienes no encontrado'], 404);
}
// Sumar la cantidad del último registro de pecosa_bienes a nea_bienes
$nuevaCantidad = $neaBien->cantidad + $ultimoRegistro->cantidad;
// Actualizar la cantidad y cambiar el estado a inactivo (status = 0)
$updated = DB::table('nea_bienes')
->where('id', $idNeaBien)
->update([
'cantidad' => $nuevaCantidad,
]);
$updatedPecosa = DB::table('pecosa_bienes')
->where('id', $idPecosaBien)
->update([
'status' => 0,
]);
if ($updated) {
return response()->json(['mensaje' => 'Nea bienes actualizado'], 201);
} else {
return response()->json(['mensaje' => 'Nea bienes no encontrado'], 404);
}
} catch (\Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
public function enableNeaBien(Request $request)
{
$idNeaBien = $request->input('nea_bien_id'); // Obtener el ID del body
$idPecosaBien = $request->input('pecosa_bien_id');
try {
$ultimoRegistro = DB::table('pecosa_bienes')->where('id', $idPecosaBien)
->orderBy('created_at', 'desc')
->first();
if (!$ultimoRegistro) {
return response()->json(['mensaje' => 'No se encontró ningún registro en pecosa_bienes'], 404);
}
// Obtener el registro de nea_bienes
$neaBien = DB::table('nea_bienes')->where('id', $idNeaBien)->first();
if (!$neaBien) {
return response()->json(['mensaje' => 'Nea bienes no encontrado'], 404);
}
if ($ultimoRegistro->cantidad > $neaBien->cantidad || $neaBien->cantidad <= 0) {
return response()->json(['mensaje' => 'La cantidad excede al stock disponible'], 400);
}
// Sumar la cantidad del último registro de pecosa_bienes a nea_bienes
$nuevaCantidad = $neaBien->cantidad - $ultimoRegistro->cantidad;
// Actualizar la cantidad y cambiar el estado a inactivo (status = 0)
$updated = DB::table('nea_bienes')
->where('id', $idNeaBien)
->update([
'cantidad' => $nuevaCantidad,
]);
$updatedPecosa = DB::table('pecosa_bienes')
->where('id', $idPecosaBien)
->update([
'status' => 1,
]);
if ($updated) {
return response()->json(['mensaje' => 'Nea bienes actualizado'], 201);
} else {
return response()->json(['mensaje' => 'Nea bienes no encontrado'], 404);
}
} catch (\Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
public function disableInevntarioBien(Request $request)
{
$idInventarioBien = $request->input('inventario_bien_id'); // Obtener el ID del body
$idPecosaBien = $request->input('pecosa_bien_id');
try {
$ultimoRegistro = DB::table('pecosa_bienes')->where('id', $idPecosaBien)
->orderBy('created_at', 'desc')
->first();
if (!$ultimoRegistro) {
return response()->json(['mensaje' => 'No se encontró ningún registro en pecosa_bienes'], 404);
}
// Obtener el registro de nea_bienes
$InventarioBien = DB::table('inventario_inicials')->where('id', $idInventarioBien)->first();
if (!$InventarioBien) {
return response()->json(['mensaje' => 'Inventario bienes no encontrado'], 404);
}
// Sumar la cantidad del último registro de pecosa_bienes a nea_bienes
$nuevaCantidad = $InventarioBien->cantidad + $ultimoRegistro->cantidad;
// Actualizar la cantidad y cambiar el estado a inactivo (status = 0)
$updated = DB::table('inventario_inicials')
->where('id', $idInventarioBien)
->update([
'cantidad' => $nuevaCantidad,
]);
$updatedPecosa = DB::table('pecosa_bienes')
->where('id', $idPecosaBien)
->update([
'status' => 0,
]);
if ($updated) {
return response()->json(['mensaje' => 'Inventario bienes actualizado'], 201);
} else {
return response()->json(['mensaje' => 'Inventario bienes no encontrado'], 404);
}
} catch (\Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
public function enableInventarioBien(Request $request)
{
$idInventarioBien = $request->input('inventario_bien_id'); // Obtener el ID del body
$idPecosaBien = $request->input('pecosa_bien_id');
try {
$ultimoRegistro = DB::table('pecosa_bienes')->where('id', $idPecosaBien)
->orderBy('created_at', 'desc')
->first();
if (!$ultimoRegistro) {
return response()->json(['mensaje' => 'No se encontró ningún registro en pecosa_bienes'], 404);
}
// Obtener el registro de nea_bienes
$inventarioBien = DB::table('inventario_inicials')->where('id', $idInventarioBien)->first();
if (!$inventarioBien) {
return response()->json(['mensaje' => 'Invenetario bienes no encontrado'], 404);
}
if ($ultimoRegistro->cantidad > $inventarioBien->cantidad || $inventarioBien->cantidad <= 0) {
return response()->json(['mensaje' => 'La cantidad excede al stock disponible'], 400);
}
// Sumar la cantidad del último registro de pecosa_bienes a nea_bienes
$nuevaCantidad = $inventarioBien->cantidad - $ultimoRegistro->cantidad;
// Actualizar la cantidad y cambiar el estado a inactivo (status = 0)
$updated = DB::table('inventario_inicials')
->where('id', $idInventarioBien)
->update([
'cantidad' => $nuevaCantidad,
]);
$updatedPecosa = DB::table('pecosa_bienes')
->where('id', $idPecosaBien)
->update([
'status' => 1,
]);
if ($updated) {
return response()->json(['mensaje' => 'Inventario bienes actualizado'], 201);
} else {
return response()->json(['mensaje' => 'Inventario bienes no encontrado'], 404);
}
} catch (\Exception $e) {
return response()->json(['error' => $e->getMessage()], 500);
}
}
}