Add membership fee system with disability discount and fix document permissions
Features: - Implement two fee types: entrance fee and annual fee (both NT$1,000) - Add 50% discount for disability certificate holders - Add disability certificate upload in member profile - Integrate disability verification into cashier approval workflow - Add membership fee settings in system admin Document permissions: - Fix hard-coded role logic in Document model - Use permission-based authorization instead of role checks Additional features: - Add announcements, general ledger, and trial balance modules - Add income management and accounting entries - Add comprehensive test suite with factories - Update UI translations to Traditional Chinese 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -23,10 +23,19 @@ class MembershipPayment extends Model
|
||||
const METHOD_CASH = 'cash';
|
||||
const METHOD_CREDIT_CARD = 'credit_card';
|
||||
|
||||
// Fee type constants
|
||||
const FEE_TYPE_ENTRANCE = 'entrance_fee'; // 入會會費
|
||||
const FEE_TYPE_ANNUAL = 'annual_fee'; // 常年會費
|
||||
|
||||
protected $fillable = [
|
||||
'member_id',
|
||||
'fee_type',
|
||||
'paid_at',
|
||||
'amount',
|
||||
'base_amount',
|
||||
'discount_amount',
|
||||
'final_amount',
|
||||
'disability_discount',
|
||||
'method',
|
||||
'reference',
|
||||
'status',
|
||||
@@ -51,6 +60,10 @@ class MembershipPayment extends Model
|
||||
'accountant_verified_at' => 'datetime',
|
||||
'chair_verified_at' => 'datetime',
|
||||
'rejected_at' => 'datetime',
|
||||
'base_amount' => 'decimal:2',
|
||||
'discount_amount' => 'decimal:2',
|
||||
'final_amount' => 'decimal:2',
|
||||
'disability_discount' => 'boolean',
|
||||
];
|
||||
|
||||
// Relationships
|
||||
@@ -151,6 +164,36 @@ class MembershipPayment extends Model
|
||||
};
|
||||
}
|
||||
|
||||
// Accessor for fee type label
|
||||
public function getFeeTypeLabelAttribute(): string
|
||||
{
|
||||
return match($this->fee_type) {
|
||||
self::FEE_TYPE_ENTRANCE => '入會會費',
|
||||
self::FEE_TYPE_ANNUAL => '常年會費',
|
||||
default => $this->fee_type ?? '未指定',
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否有使用身心障礙優惠
|
||||
*/
|
||||
public function hasDisabilityDiscount(): bool
|
||||
{
|
||||
return (bool) $this->disability_discount;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得折扣說明
|
||||
*/
|
||||
public function getDiscountDescriptionAttribute(): ?string
|
||||
{
|
||||
if (!$this->hasDisabilityDiscount()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return '身心障礙優惠 50%';
|
||||
}
|
||||
|
||||
// Clean up receipt file when payment is deleted
|
||||
protected static function boot()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user