Files
autocrm/app/Models/Tenant/Labor.php
T
Vasyka a1be01b0d5 Stage 4 — Labor Catalog: fixed price + default parts + service templates
Schema:
- labors.pricing_mode (hourly/fixed) + fixed_price
- labor_parts (default parts auto-added with a labor)
- service_templates + service_template_items (labor/part bundles)

ServiceComposer:
- addLabor(wo, labor, withParts) — hourly (hours×rate) or fixed (fixed_price),
  then auto-adds the labor's default parts
- addPart(wo, part, qty) — catalog price snapshot
- applyTemplate(wo, template) — adds all labor+part lines, recalcs total
- hourlyRate from settings.labor_rate

Filament:
- LaborResource: pricing_mode (live) toggles hours/fixed_price fields,
  DefaultPartsRelationManager
- ServiceTemplateResource (Service group) with ItemsRelationManager
- WorkOrder edit "Aplică șablon" action → applyTemplate
- WorksRelationManager CreateAction auto-adds labor default parts

Tests (6 new):
- hourly rate×hours; fixed uses fixed_price; default parts auto-added;
  withParts=false skips; applyTemplate adds lines + recalcs total;
  templates tenant-isolated

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 06:16:50 +00:00

50 lines
1.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Models\Tenant;
use App\Models\Concerns\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
class Labor extends Model
{
use BelongsToTenant, SoftDeletes;
public const CATEGORIES = [
'Motor', 'Frâne', 'Suspensie', 'Anvelope', 'ITP', 'Cutie viteze',
'Caroserie', 'Electrică', 'Climatizare', 'Eșapament', 'Altele',
];
public const PRICING_MODES = [
'hourly' => 'Pe oră (normă × tarif)',
'fixed' => 'Preț fix',
];
protected $fillable = [
'company_id', 'category', 'name_ro', 'name_ru', 'code',
'hours', 'pricing_mode', 'fixed_price', 'price', 'is_active', 'notes',
];
protected $casts = [
'hours' => 'decimal:2',
'fixed_price' => 'decimal:2',
'price' => 'decimal:2',
'is_active' => 'boolean',
];
public function laborParts(): HasMany
{
return $this->hasMany(LaborPart::class);
}
/** Effective line total for this labor given the tenant hourly rate. */
public function effectiveTotal(float $hourlyRate): float
{
if ($this->pricing_mode === 'fixed') {
return (float) $this->fixed_price;
}
return round((float) $this->hours * $hourlyRate, 2);
}
}