175 lines
9.3 KiB
PHP
175 lines
9.3 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Resources\Contracts\Schemas;
|
|
|
|
use App\Models\Product;
|
|
use App\Models\PaymentTemplate;
|
|
use Filament\Forms\Components\Select;
|
|
use Filament\Forms\Components\TextInput;
|
|
use Filament\Forms\Components\DatePicker;
|
|
use Filament\Schemas\Components\Section;
|
|
use Filament\Schemas\Components\Grid;
|
|
use Filament\Forms\Components\KeyValue;
|
|
use Filament\Forms\Components\Placeholder;
|
|
use Filament\Schemas\Schema;
|
|
use Filament\Schemas\Components\Utilities\Set;
|
|
use Illuminate\Support\HtmlString;
|
|
|
|
class ContractForm
|
|
{
|
|
public static function configure(Schema $schema): Schema
|
|
{
|
|
return $schema
|
|
->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 = '<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 15px; background: #f9fafb; padding: 15px; border-radius: 8px; border: 1px solid #e5e7eb;">';
|
|
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 .= "<div>
|
|
<div style='font-size: 0.7rem; color: #9ca3af; text-transform: uppercase; margin-bottom: 4px;'>{$label}</div>
|
|
<div style='{$style} font-size: 0.9rem;'>{$val}</div>
|
|
</div>";
|
|
}
|
|
$html .= '</div>';
|
|
return new HtmlString($html);
|
|
}),
|
|
|
|
KeyValue::make('discount_details')
|
|
->label('Bảng chi tiết chiết khấu (Dạng Key-Value)')
|
|
->columnSpanFull(),
|
|
]),
|
|
|
|
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()
|
|
->dehydrated(false)
|
|
->helperText('Lưu ý: Chỉ chọn nếu bạn muốn khởi tạo lại lịch trình thanh toán.'),
|
|
]),
|
|
]);
|
|
}
|
|
}
|