Files
project/app/Http/Controllers/Api/IncomingController.php

181 lines
6.6 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Incoming;
use App\Models\Incomingitem;
use App\Models\Incomingtax;
use App\Models\Supplier;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class IncomingController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index($from = null, $end = null): JsonResponse
{
return response()->json(Incoming::whereBetween('issue_date', [$from, $end])->with(['supplier'])->orderBy('issue_date', 'desc')->get());
}
/**
* Process an upload file for the resource.
*/
public function upload(Request $request): JsonResponse
{
$xmlString = base64_decode(preg_replace('#^data:text/\w+;base64,#i', '', $request->uploadFile));
$reader = new \App\XmlReader($xmlString);
$supplierData = $reader->supplier();
$incomingData = $reader->incoming();
$itemsData = $reader->items();
$taxesData = $reader->taxes();
$supplier = Supplier::where('email', '=', $supplierData['email'])->firstOrNew($supplierData);
$supplier->save();
$incomingData['supplier_id'] = $supplier->id;
$incoming = new Incoming($incomingData);
$incoming->save();
foreach ($itemsData as $item) {
$item['incoming_id'] = $incoming->id;
$incomingItem = new Incomingitem($item);
$incomingItem->save();
}
foreach ($taxesData as $tax) {
$tax['incoming_id'] = $incoming->id;
$incomingTax = new Incomingtax($tax);
$incomingTax->save();
}
return response()->json($incoming);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): JsonResponse
{
$supplierData = $request->validate([
'supplier.name' => 'required|string',
'supplier.registration_name' => 'nullable|string',
'supplier.email' => 'nullable|email',
'supplier.address' => 'nullable|string',
'supplier.city' => 'nullable|string',
'supplier.zip' => 'nullable|string',
'supplier.country_code' => 'nullable|string',
'supplier.tax_fc' => 'nullable|string',
'supplier.tax_vat' => 'nullable|string',
'supplier.contact_name' => 'nullable|string',
'supplier.contact_phone' => 'nullable|string',
'supplier.contact_email' => 'nullable|string',
]);
$supplier = Supplier::where('email', '=', $supplierData['supplier']['email'])->firstOrNew($supplierData['supplier']);
$supplier->save();
$incomingData = $request->validate([
'incoming.invoice_number' => 'required|string',
'incoming.issue_date' => 'required|date',
'incoming.due_date' => 'nullable|date',
'incoming.invoice_type_code' => 'required|string',
'incoming.currency_code' => 'required|string',
'incoming.net' => 'required|numeric',
'incoming.gross' => 'required|numeric',
'incoming.tax' => 'required|numeric',
'incoming.pay_date' => 'nullable|date',
'incoming.pay_name' => 'nullable|string',
'incoming.pay_bic' => 'nullable|string',
'incoming.pay_iban' => 'nullable|string',
]);
$incomingData['incoming']['supplier_id'] = $supplier->id;
$incoming = new Incoming($incomingData['incoming']);
$incoming->save();
$taxesData = $request->validate([
'taxes.*.taxable_amount' => 'required|numeric',
'taxes.*.amount' => 'required|numeric',
'taxes.*.percentage' => 'required|numeric',
'taxes.*.currency' => 'required|string',
]);
$incoming->taxes()->createMany($taxesData['taxes']);
return response()->json($supplierData['supplier']);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Incoming $incoming): JsonResponse
{
$incomingData = $request->validate([
'incoming.invoice_number' => 'required|string',
'incoming.issue_date' => 'required|date',
'incoming.due_date' => 'nullable|date',
'incoming.invoice_type_code' => 'required|string',
'incoming.currency_code' => 'required|string',
'incoming.net' => 'required|numeric',
'incoming.gross' => 'required|numeric',
'incoming.tax' => 'required|numeric',
'incoming.pay_date' => 'nullable|date',
'incoming.pay_name' => 'nullable|string',
'incoming.pay_bic' => 'nullable|string',
'incoming.pay_iban' => 'nullable|string',
]);
$incoming->update($incomingData['incoming']);
$supplierData = $request->validate([
'supplier.name' => 'required|string',
'supplier.registration_name' => 'nullable|string',
'supplier.email' => 'nullable|email',
'supplier.address' => 'nullable|string',
'supplier.city' => 'nullable|string',
'supplier.zip' => 'nullable|string',
'supplier.country_code' => 'nullable|string',
'supplier.tax_fc' => 'nullable|string',
'supplier.tax_vat' => 'nullable|string',
'supplier.contact_name' => 'nullable|string',
'supplier.contact_phone' => 'nullable|string',
'supplier.contact_email' => 'nullable|string',
]);
$incoming->supplier()->update($supplierData['supplier']);
$itemsData = $request->validate([
'items.*.name' => 'required|string',
'items.*.article_number' => 'nullable|string',
'items.*.description' => 'nullable|string',
'items.*.amount' => 'required|numeric',
'items.*.discount' => 'nullable|numeric',
'items.*.tax' => 'required|numeric',
'items.*.price' => 'required|numeric',
'items.*.total' => 'required|numeric',
]);
$incoming->items()->delete();
if (!empty($itemsData)) {
$incoming->items()->createMany($itemsData['items']);
}
$taxesData = $request->validate([
'taxes.*.taxable_amount' => 'required|numeric',
'taxes.*.amount' => 'required|numeric',
'taxes.*.percentage' => 'required|numeric',
'taxes.*.currency' => 'required|string',
]);
$incoming->taxes()->delete();
$incoming->taxes()->createMany($taxesData['taxes']);
return response()->json($incoming);
}
}