64 lines
1.8 KiB
PHP
64 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
class Tela extends Model
|
|
{
|
|
protected $fillable = [
|
|
'codigo',
|
|
'tipo',
|
|
'color',
|
|
'proveedor_id',
|
|
'metros_comprados',
|
|
'fecha_compra',
|
|
'valor_total',
|
|
'costo_por_metro',
|
|
'observaciones',
|
|
];
|
|
|
|
protected $casts = [
|
|
'valor_total' => 'decimal:2',
|
|
'costo_por_metro' => 'decimal:2',
|
|
];
|
|
|
|
public function proveedor()
|
|
{
|
|
return $this->belongsTo(Proveedor::class);
|
|
}
|
|
|
|
public function ordenesProduccion()
|
|
{
|
|
return $this->hasMany(OrdenProduccion::class);
|
|
}
|
|
|
|
// Calcular metros disponibles dinámicamente
|
|
public function getMetrosDisponiblesAttribute()
|
|
{
|
|
$metrosComprados = (float) ($this->attributes['metros_comprados'] ?? 0);
|
|
$metrosUsados = (float) $this->ordenesProduccion()->sum('metros_requeridos');
|
|
return max(0, $metrosComprados - $metrosUsados);
|
|
}
|
|
|
|
protected static function booted()
|
|
{
|
|
static::saving(function ($tela) {
|
|
// Protección temporal: si la columna en la BD aún es integer, convertir a entero
|
|
try {
|
|
$type = \Illuminate\Support\Facades\Schema::getColumnType('telas', 'costo_por_metro');
|
|
if ($type === 'integer') {
|
|
$tela->costo_por_metro = (int) round($tela->costo_por_metro ?? 0);
|
|
}
|
|
|
|
$typeVal = \Illuminate\Support\Facades\Schema::getColumnType('telas', 'valor_total');
|
|
if ($typeVal === 'integer') {
|
|
$tela->valor_total = (int) round($tela->valor_total ?? 0);
|
|
}
|
|
} catch (\Exception $e) {
|
|
// Ignorar si no se puede determinar el tipo de columna (por ejemplo en pruebas antes de migraciones)
|
|
}
|
|
});
|
|
}
|
|
}
|