Files
pos_heidiver/app/Models/Prensilla.php
T

106 lines
3.8 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Prensilla extends Model
{
protected $fillable = [
'proveedor_id',
'usuario_asignado_id',
'orden_produccion_id',
'tipo',
'fecha_envio',
'cantidad_enviada',
'fecha_recepcion',
'cantidad_recibida',
'perdidas',
'terminada',
'proveedor_tintoreria_id',
];
protected $casts = [
'terminada' => 'boolean',
];
public function proveedor()
{
return $this->belongsTo(Proveedor::class);
}
public function usuarioAsignado()
{
return $this->belongsTo(\App\Models\User::class, 'usuario_asignado_id');
}
public function ordenProduccion()
{
return $this->belongsTo(OrdenProduccion::class);
}
protected static function booted()
{
static::creating(function ($p) {
// Validar disponibilidad desde ojales terminados
$opId = $p->orden_produccion_id;
// Total de ojales terminados
$ojalesTerminados = \App\Models\Ojal::where('orden_produccion_id', $opId)
->where('terminada', true)
->sum('cantidad_enviada');
// Ya asignado en prensillas
$yaAsignado = \App\Models\Prensilla::where('orden_produccion_id', $opId)
->sum('cantidad_enviada');
// Verificar si hay suficiente disponible
$disponible = $ojalesTerminados - $yaAsignado;
if ($disponible < ($p->cantidad_enviada ?? 0)) {
throw \Illuminate\Validation\ValidationException::withMessages([
'cantidad_enviada' => "Solo hay {$disponible} unidades disponibles desde Ojales terminados. No se pueden asignar " . ($p->cantidad_enviada ?? 0) . " unidades."
]);
}
});
// Crear traslado cuando se crea una Prensilla (Confección → Ojales/Prensillas)
static::created(function ($prensilla) {
if ($prensilla->cantidad_enviada > 0) {
\App\Models\TrasladoPrenda::create([
'orden_produccion_id' => $prensilla->orden_produccion_id,
'referencia_type' => self::class,
'referencia_id' => $prensilla->id,
'origen' => 'confeccion',
'destino' => 'ojales_prensillas',
'cantidad_enviada' => $prensilla->cantidad_enviada,
'cantidad_recibida' => $prensilla->cantidad_enviada,
'fecha_envio' => $prensilla->fecha_envio ?? now(),
'fecha_recepcion' => $prensilla->fecha_envio ?? now(),
'estado' => 'recibido',
]);
}
});
// Crear traslado cuando se marca como terminada (Ojales/Prensillas → Tintorería)
static::updated(function ($prensilla) {
if ($prensilla->terminada && $prensilla->getOriginal('terminada') == false) {
if ($prensilla->cantidad_enviada > 0) {
\App\Models\TrasladoPrenda::create([
'orden_produccion_id' => $prensilla->orden_produccion_id,
'referencia_type' => self::class,
'referencia_id' => $prensilla->id,
'origen' => 'ojales_prensillas',
'destino' => 'tintoreria',
'cantidad_enviada' => $prensilla->cantidad_enviada,
'cantidad_recibida' => $prensilla->cantidad_enviada,
'fecha_envio' => now(),
'fecha_recepcion' => now(),
'estado' => 'recibido',
]);
}
}
});
}
}