components([ Grid::make(3) ->schema([ Section::make('Thông tin định danh') ->columnSpan(2) ->columns(2) ->schema([ Select::make('product_id') ->label('Sản phẩm (Lô đất)') ->relationship('product', 'code') ->searchable() ->preload() ->required() ->live() ->afterStateUpdated(function (Set $set, $state) { if ($state) { $product = Product::find($state); if ($product) { $set('total_value', $product->total_price); $set('land_value', $product->qsdd_value); $set('foundation_value', $product->foundation_temp_value); } } }), TextInput::make('contract_number') ->label('Số HĐMB') ->required() ->unique(ignoreRecord: true), Select::make('contract_type') ->label('Loại hợp đồng') ->options([ 'HĐMB' => 'Hợp đồng mua bán', 'HĐGV' => 'Hợp đồng góp vốn', 'HĐDC' => 'Hợp đồng đặt cọc', ]) ->default('HĐMB') ->required(), TextInput::make('transfer_order') ->label('Thứ tự chuyển nhượng') ->numeric() ->default(0) ->helperText('0 là chủ hiện tại, 1 là F0, 2 là F1...'), ]), Section::make('Trạng thái') ->columnSpan(1) ->schema([ Select::make('status') ->label('Trạng thái pháp lý') ->options([ 'Đang hiệu lực' => 'Đang hiệu lực', 'Đã hoàn thành' => 'Đã hoàn thành', 'Đã hủy' => 'Đã hủy', ]) ->default('Đang hiệu lực') ->required(), DatePicker::make('signing_date') ->label('Ngày ký HĐ') ->required(), DatePicker::make('sale_date') ->label('Ngày bán thực tế'), ]), ]), Section::make('Chi tiết Tài chính & Chiết khấu') ->columns(3) ->schema([ TextInput::make('land_value') ->label('Giá trị QSDĐ') ->numeric() ->prefix('VND') ->live(onBlur: true) ->afterStateUpdated(fn ($state, $get, $set) => $set('total_value', (float)$state + (float)$get('foundation_value'))), TextInput::make('foundation_value') ->label('Giá trị Móng') ->numeric() ->prefix('VND') ->live(onBlur: true) ->afterStateUpdated(fn ($state, $get, $set) => $set('total_value', (float)$get('land_value') + (float)$state)), TextInput::make('total_value') ->label('Tổng giá trị niêm yết') ->numeric() ->prefix('VND') ->readOnly(), Placeholder::make('discount_overview') ->label('Tổng quan chiết khấu (Dữ liệu từ Excel)') ->columnSpanFull() ->content(function ($record) { if (!$record || !$record->discount_details) return 'Không có chiết khấu'; $details = $record->discount_details; $html = '
'; foreach ($details as $key => $val) { if (empty($val)) continue; $label = match($key) { 'open_sale' => 'Mở bán', 'multi_lot' => 'Số nhiều', 'wholesale' => 'Mua sỉ', 'ctv' => 'Cộng tác viên', 'full_payment' => 'Trả 1 lần', 'total_amount' => 'Tổng tiền CK', 'total_percentage' => 'Tổng % CK', default => $key }; $style = str_contains($key, 'total') ? 'font-weight: bold; color: #16a34a;' : 'color: #4b5563;'; $html .= "
{$label}
{$val}
"; } $html .= '
'; return new HtmlString($html); }), KeyValue::make('discount_details') ->label('Bảng chi tiết chiết khấu (Dạng Key-Value)') ->columnSpanFull(), Placeholder::make('price_sheet') ->label('Phiếu tính giá') ->columnSpanFull() ->content(function ($record) { if (! $record || ! $record->calculation_log) { return new HtmlString("
Chưa có dữ liệu tính toán. Vui lòng lưu hợp đồng để tạo phiếu tính giá.
"); } $steps = $record->calculation_log['price_sheet'] ?? []; if (empty($steps)) { return '-'; } $html = '
'; $html .= ''; $html .= ''; foreach ($steps as $step) { $desc = $step['description']; $value = number_format($step['value']); $isOverride = $step['is_overridden'] ? ' (ghi đè)' : ''; $style = str_contains(strtolower($desc), 'tổng') ? 'font-weight: bold; border-top: 1px solid #e5e7eb;' : ''; $html .= ""; } $html .= '
Diễn giảiGiá trị (VNĐ)
{$desc}{$isOverride}{$value}
'; return new HtmlString($html); }), ]), Section::make('Thông tin quản lý & Khách hàng') ->columns(2) ->schema([ Select::make('customers') ->label('Khách hàng đứng tên') ->multiple() ->relationship('customers', 'full_name') ->preload() ->required() ->columnSpanFull(), TextInput::make('brokerage_name') ->label('Đơn vị môi giới'), DatePicker::make('hql_confirmation_date') ->label('Ngày HQL xác nhận'), TextInput::make('stored_contract_count') ->label('Số lượng HĐ lưu') ->numeric() ->default(0), TextInput::make('filing_note') ->label('Ghi chú hồ sơ') ->columnSpanFull(), Select::make('payment_template_id') ->label('Áp dụng mẫu thanh toán') ->placeholder('Chọn mẫu để tự động tạo lịch trình...') ->options(PaymentTemplate::pluck('name', 'id')) ->searchable() ->hiddenOn('edit') ->helperText('Hệ thống sẽ tự động tạo lịch thanh toán sau khi lưu hợp đồng.'), ]), ]); } }