diff --git a/app/Models/Incoming.php b/app/Models/Incoming.php new file mode 100644 index 0000000..eb4c005 --- /dev/null +++ b/app/Models/Incoming.php @@ -0,0 +1,55 @@ + + */ + protected $fillable = [ + 'supplier_id', + 'invoice_number', + 'issue_date', + 'due_date', + 'invoice_type_code', + 'currency_code', + 'net', + 'gross', + 'tax', + 'pay_date', + ]; + + /** + * Get the supplier of the incoming invoice. + */ + public function supplier(): BelongsTo + { + return $this->belongsTo(Supplier::class); + } + + /** + * Get the items (invoice positions) of this incoming invoice. + */ + public function items(): HasMany + { + return $this->hasMany(Incomingitem::class); + } + + /** + * Get the tax subtotals for the incoming invoice. + */ + public function taxes(): HasMany + { + return $this->hasMany(Incomingtax::class); + } + +} diff --git a/app/Models/Incomingitem.php b/app/Models/Incomingitem.php new file mode 100644 index 0000000..6b05f77 --- /dev/null +++ b/app/Models/Incomingitem.php @@ -0,0 +1,36 @@ + + */ + protected $fillable = [ + 'incoming_id', + 'name', + 'article_number', + 'description', + 'amount', + 'discount', + 'tax', + 'price', + 'total', + ]; + + /** + * Get the invoice the item belongs to. + */ + public function incoming(): BelongsTo + { + return $this->belongsTo(Incoming::class); + } +} diff --git a/app/Models/Incomingtax.php b/app/Models/Incomingtax.php new file mode 100644 index 0000000..b104bb7 --- /dev/null +++ b/app/Models/Incomingtax.php @@ -0,0 +1,32 @@ + + */ + protected $fillable = [ + 'incoming_id', + 'taxable_amount', + 'amount', + 'percentage', + 'currency', + ]; + + /** + * Get the incoming invoice this tax belongs to. + */ + public function incoming(): BelongsTo + { + return $this->belongsTo(Incoming::class); + } +} diff --git a/app/Models/Supplier.php b/app/Models/Supplier.php new file mode 100644 index 0000000..d3ff229 --- /dev/null +++ b/app/Models/Supplier.php @@ -0,0 +1,38 @@ + + */ + protected $fillable = [ + 'name', + 'registration_name', + 'email', + 'address', + 'city', + 'zip', + 'country_code', + 'tax_fc', + 'tax_vat', + 'contact_name', + 'contact_phone', + 'contact_email', + ]; + + /** + * Get the supplier's incoming invoices. + */ + public function invoices(): HasMany + { + return $this->hasMany(Incoming::class); + } +} diff --git a/database/migrations/2025_01_18_080700_create_suppliers_table.php b/database/migrations/2025_01_18_080700_create_suppliers_table.php new file mode 100644 index 0000000..54e9067 --- /dev/null +++ b/database/migrations/2025_01_18_080700_create_suppliers_table.php @@ -0,0 +1,41 @@ +id(); + + $table->string('name'); + $table->string('registration_name')->nullable(); + $table->string('email')->nullable(); + $table->string('address')->nullable(); + $table->string('city')->nullable(); + $table->string('zip')->nullable(); + $table->string('country_code')->default('DE')->nullable(); + $table->string('tax_fc')->nullable(); + $table->string('tax_vat')->nullable(); + $table->string('contact_name')->nullable(); + $table->string('contact_phone')->nullable(); + $table->string('contact_email')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('suppliers'); + } +}; diff --git a/database/migrations/2025_01_18_090301_create_incomings_table.php b/database/migrations/2025_01_18_090301_create_incomings_table.php new file mode 100644 index 0000000..c1b4c8b --- /dev/null +++ b/database/migrations/2025_01_18_090301_create_incomings_table.php @@ -0,0 +1,38 @@ +id(); + + $table->foreignId('supplier_id')->constrained(); + + $table->string('invoice_number'); + $table->date('issue_date'); + $table->date('due_date')->nullable(); + $table->string('invoice_type_code')->default('380'); + $table->string('currency_code')->default('EUR'); + $table->decimal('net'); + $table->decimal('gross'); + $table->decimal('tax'); + $table->date('pay_date')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('incomings'); + } +}; diff --git a/database/migrations/2025_01_18_090325_create_incomingitems_table.php b/database/migrations/2025_01_18_090325_create_incomingitems_table.php new file mode 100644 index 0000000..3e822a2 --- /dev/null +++ b/database/migrations/2025_01_18_090325_create_incomingitems_table.php @@ -0,0 +1,37 @@ +id(); + + $table->foreignId('incoming_id')->constrained(); + + $table->string('name'); + $table->string('article_number')->nullable(); + $table->text('description')->nullable(); + $table->decimal('amount', 8, 2); + $table->decimal('discount', 8, 2)->nullable(); + $table->decimal('tax', 8, 2); + $table->decimal('price', 8, 2); + $table->decimal('total', 8, 2); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('incomingitems'); + } +}; diff --git a/database/migrations/2025_01_18_093131_create_incomingtaxes_table.php b/database/migrations/2025_01_18_093131_create_incomingtaxes_table.php new file mode 100644 index 0000000..8fd7f38 --- /dev/null +++ b/database/migrations/2025_01_18_093131_create_incomingtaxes_table.php @@ -0,0 +1,33 @@ +id(); + + $table->foreignId('incoming_id')->constrained(); + + $table->decimal('taxable_amount', 8, 2)->default(0); + $table->decimal('amount', 8, 2)->default(0); + $table->decimal('percentage', 8, 2)->default(0); + $table->string('currency')->default('EUR'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('incomingtaxes'); + } +};