feat: per-row and global discount with margin validation

Parts (wo_parts) already had discount_pct; now also added to wo_works.
Labor catalog gets a cost_price field as the hard minimum sell floor.

- WorkOrderWork: discount_pct + cost_price fields; total calculation
  now includes discount: hours × price_per_hour × (1 − disc/100)
- Labor model: cost_price field (used to pre-fill work rows and validate)
- WorksRelationManager: discount_pct field with live helper text showing
  effective price + margin %; validation blocks save if below buy cost
  or below company min_discount_margin_pct; "Reducere globală" header
  action applies % to all work rows (skips rows that would breach limits)
- PartsRelationManager: same validation on existing discount_pct field;
  helper text (🟢/🟠/🔴) shows effective price + margin in real time;
  "Reducere globală" header action for all parts
- Settings page: new "Reduceri & limite preț" section with
  min_discount_margin_pct — 0 = no limit, >0 = hard block below that %
- LaborResource form: cost_price field

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-09-11 04:48:15 +00:00
parent c66b895948
commit ce9f082612
7 changed files with 281 additions and 10 deletions
@@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up(): void
{
Schema::table('wo_works', function (Blueprint $table) {
$table->decimal('discount_pct', 5, 2)->default(0)->after('total');
$table->decimal('cost_price', 10, 2)->default(0)->after('discount_pct');
});
Schema::table('labors', function (Blueprint $table) {
$table->decimal('cost_price', 10, 2)->default(0)->after('price');
});
}
public function down(): void
{
Schema::table('wo_works', function (Blueprint $table) {
$table->dropColumn(['discount_pct', 'cost_price']);
});
Schema::table('labors', function (Blueprint $table) {
$table->dropColumn('cost_price');
});
}
};