*/ public function rules() { return [ 'account_id' => 'required|exists:accounts,id', 'paid_at' => 'required|date', 'checkout_id' => 'required|exists:checkouts,id', 'total_amt' => 'required|numeric|min:0.01', 'fees_amt' => 'nullable|numeric|lt:total_amt', 'source_id' => 'nullable|exists:accounts,id', 'pending' => 'nullable|boolean', 'notes' => 'nullable|string', 'ip' => 'nullable|ip', 'invoices' => [ 'nullable', 'array', function($attribute,$value,$fail) { if (($x=collect($value)->sum()) > request()->post('total_amt')) $fail(sprintf('Allocation %3.2f is greater than payment total %3.2f.',$x,request()->post('total_amt'))); } ], 'invoices.*' => [ 'nullable', function($attribute,$value,$fail) { if (! ($x=Invoice::where('id',$xx=str_replace('invoices.','',$attribute))->first())) $fail(sprintf('Invoice [%d] doesnt exist in DB',$xx)); // @todo The due amount may be influenced by this payment (ie: payment edit) elseif($x->due < $value) $fail(sprintf('Invoice [%d] is over allocated by %3.2f',$x->id,$value-$x->due)); } ], ]; } }