id(); $table->foreignId('company_id')->constrained()->cascadeOnDelete(); $table->foreignId('vendor_id')->nullable()->constrained('vendors')->nullOnDelete(); $table->string('bill_number')->nullable(); $table->string('order_number')->nullable(); // PO, SO, etc. $table->date('date')->nullable(); $table->date('due_date')->nullable(); $table->timestamp('paid_at')->nullable(); $table->string('status')->default('open'); $table->string('currency_code')->nullable(); $table->string('discount_method')->default('per_line_item'); $table->string('discount_computation')->default('percentage'); $table->integer('discount_rate')->default(0); $table->integer('subtotal')->default(0); $table->integer('tax_total')->default(0); $table->integer('discount_total')->default(0); $table->integer('total')->default(0); $table->integer('amount_paid')->default(0); $table->integer('amount_due')->storedAs('total - amount_paid'); $table->text('notes')->nullable(); $table->foreignId('created_by')->nullable()->constrained('users')->nullOnDelete(); $table->foreignId('updated_by')->nullable()->constrained('users')->nullOnDelete(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('bills'); } };