181 lines
6.6 KiB
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);
|
|
}
|
|
}
|