This commit is contained in:
lizandrogd
2026-01-19 20:05:07 -05:00
parent 1eb41c5725
commit 132b266948
7 changed files with 35 additions and 12 deletions
+25 -5
View File
@@ -15,6 +15,7 @@ class Recepcion extends Model
'referencia_id',
'user_id',
'cantidad',
'prendas_defectuosas',
'fecha_recepcion',
'notas',
];
@@ -22,6 +23,7 @@ class Recepcion extends Model
protected $casts = [
'fecha_recepcion' => 'datetime',
'cantidad' => 'integer',
'prendas_defectuosas' => 'integer',
];
public function referencia()
@@ -39,24 +41,38 @@ class Recepcion extends Model
static::creating(function ($rec) {
// Cantidad debe ser entero >= 1
$rec->cantidad = (int) $rec->cantidad;
$rec->prendas_defectuosas = (int) ($rec->prendas_defectuosas ?? 0);
if ($rec->cantidad <= 0) {
throw ValidationException::withMessages(['cantidad' => 'La cantidad debe ser un entero mayor que 0.']);
}
if ($rec->prendas_defectuosas < 0) {
throw ValidationException::withMessages(['prendas_defectuosas' => 'La cantidad de prendas defectuosas no puede ser negativa.']);
}
if ($rec->prendas_defectuosas > $rec->cantidad) {
throw ValidationException::withMessages(['prendas_defectuosas' => 'Las prendas defectuosas no pueden superar la cantidad recibida.']);
}
// Fecha por defecto
if (! $rec->fecha_recepcion) {
$rec->fecha_recepcion = now();
}
// Validación: no permitir sobrepasar la cantidad enviada en la referencia
// Validación: no permitir sobrepasar la cantidad enviada en la referencia (considerando defectuosos)
if ($rec->referencia) {
$referencia = $rec->referencia;
$enviada = (int) ($referencia->cantidad_enviada ?? 0);
// ya recibido efectivo (cantidad - defectuosos)
$yaRecibido = (int) \App\Models\Recepcion::where('referencia_type', get_class($referencia))
->where('referencia_id', $referencia->id)
->sum('cantidad');
->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
if (($yaRecibido + $rec->cantidad) > $enviada) {
$efectivo = $rec->cantidad - $rec->prendas_defectuosas;
if (($yaRecibido + $efectivo) > $enviada) {
throw ValidationException::withMessages(['cantidad' => "La recepción excede la cantidad pendiente (faltan: " . max(0, $enviada - $yaRecibido) . ")."]);
}
}
@@ -73,11 +89,13 @@ class Recepcion extends Model
// Crear un traslado parcial desde la referencia usando esta recepción
if ($rec->referencia) {
$referencia = $rec->referencia;
$efectivo = (int) ($rec->cantidad - ($rec->prendas_defectuosas ?? 0));
$payload = [
'cantidad_enviada' => $rec->cantidad,
'cantidad_recibida' => $rec->cantidad,
'cantidad_recibida' => $efectivo,
'fecha_recepcion' => $rec->fecha_recepcion,
'notas' => 'Creado desde recepción #' . $rec->id . ($rec->notas ? (" - " . $rec->notas) : ''),
'prendas_defectuosas' => $rec->prendas_defectuosas ?? 0,
];
// Map destino según tipo de referencia
@@ -99,6 +117,7 @@ class Recepcion extends Model
}
});
static::updated(function ($rec) {
$rec->syncParentAggregates();
});
@@ -112,9 +131,10 @@ class Recepcion extends Model
{
if (! $this->referencia) return;
$referencia = $this->referencia;
$sum = (int) static::where('referencia_type', get_class($referencia))
->where('referencia_id', $referencia->id)
->sum('cantidad');
->sum(\DB::raw('cantidad - COALESCE(prendas_defectuosas, 0)'));
$referencia->cantidad_recibida = $sum;
$referencia->save();