inisiatif/distribution-financings
composer require atInisiatifZakat/distribution-financings
php artisan vendor:publish --tag="distribution-financings-migrations"
php artisan migrate
php artisan vendor:publish --tag="distribution-financings-config"
config/app.php under providers (if not auto-discovered):
AtInisiatifZakat\DistributionFinancings\DistributionFinancingsServiceProvider::class,
Create a Financing Distribution:
use AtInisiatifZakat\DistributionFinancings\Facades\DistributionFinancing;
// Create a new financing distribution
$distribution = DistributionFinancing::create([
'amount' => 1000.00,
'currency' => 'USD',
'description' => 'Q2 2025 Community Support',
'start_date' => now(),
'end_date' => now()->addMonth(),
]);
// Attach beneficiaries (assuming a `beneficiaries` relationship exists)
$distribution->beneficiaries()->attach([1, 2, 3], ['share' => 0.5]);
Financing Creation & Management:
DistributionFinancing facade to create, update, or retrieve financings.$validated = request()->validate([
'amount' => 'required|numeric|min:0',
'currency' => 'required|string|size:3',
'beneficiary_ids' => 'required|array',
]);
$distribution = DistributionFinancing::create($validated);
$distribution->beneficiaries()->attach($validated['beneficiary_ids']);
Beneficiary Allocation:
// Attach with dynamic shares
$beneficiaries = [
['beneficiary_id' => 1, 'share' => 0.3],
['beneficiary_id' => 2, 'share' => 0.7],
];
$distribution->beneficiaries()->attach($beneficiaries);
Distribution Processing:
// Listen for distribution events (if package emits them)
event(new \AtInisiatifZakat\DistributionFinancings\Events\DistributionProcessed($distribution));
Reporting:
// Get all active distributions for a beneficiary
$activeDistributions = DistributionFinancing::whereHas('beneficiaries', function($query) {
$query->where('beneficiaries.id', 1);
})->where('end_date', '>=', now())->get();
Route::middleware('auth:sanctum')->post('/distributions', function () {
return DistributionFinancing::create(request()->all());
});
// Livewire component example
public function createDistribution() {
$this->validate([
'amount' => 'required|numeric',
]);
DistributionFinancing::create($this->input());
}
$this->mock(AtInisiatifZakat\DistributionFinancings\Facades\DistributionFinancing::class)
->shouldReceive('create')
->once()
->andReturn($mockDistribution);
Database Schema Assumptions:
financings, beneficiaries, or beneficiary_distribution exist. Verify migrations match your needs.Currency Handling:
currency field (e.g., via laravel-money or similar). Default validation may not cover all cases.use Illuminate\Validation\Rule;
$request->validate([
'currency' => ['required', Rule::in(['USD', 'EUR', 'IDR'])],
]);
Polymorphic Relationships:
User or Organization), ensure the beneficiaries table has the correct beneficiary_type column.SQLSTATE[42S22] errors if columns are missing.Share Calculation:
// In DistributionFinancing model
protected static function booted() {
static::created(function ($distribution) {
$totalShare = $distribution->beneficiaries->sum('pivot.share');
if (!abs($totalShare - 1) < 0.001) {
throw new \Exception("Shares must sum to 100%");
}
});
}
\AtInisiatifZakat\DistributionFinancings\Facades\DistributionFinancing::shouldReceive('create')
->andReturnUsing(function ($args) {
\Log::info('Distribution created with:', $args);
return new \AtInisiatifZakat\DistributionFinancings\Models\DistributionFinancing();
});
EventServiceProvider.Custom Fields:
DistributionFinancing model to add fields (e.g., tax_id, priority):
php artisan make:model DistributionFinancingExtension -m
// Migration
$table->string('tax_id')->nullable();
// Model
protected $casts = [
'tax_id' => 'string',
];
Validation Rules:
// app/Http/Requests/CreateDistributionRequest.php
public function rules() {
return [
'amount' => ['required', 'numeric', 'min:100'], // Custom min amount
];
}
API Resources:
php artisan make:resource DistributionFinancingResource
// app/Http/Resources/DistributionFinancingResource.php
public function toArray($request) {
return [
'id' => $this->id,
'formatted_amount' => $this->amount . ' ' . $this->currency,
];
}
Commands:
php artisan make:command ProcessDistributions
// Handle bulk distribution processing
$distributions = DistributionFinancing::where('status', 'pending')->get();
foreach ($distributions as $distribution) {
$distribution->process();
}
How can I help you explore Laravel packages today?