Build the stuff for incoming invoices.
This commit is contained in:
@@ -3,8 +3,10 @@
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Incoming;
|
||||
use App\Models\Invoice;
|
||||
use App\Models\Payment;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use PhpOffice\PhpSpreadsheet\Shared\Date;
|
||||
@@ -31,7 +33,7 @@ class ExcelController extends Controller
|
||||
$requestData = $request->validate([
|
||||
'from' => 'required|date',
|
||||
'end' => 'required|date',
|
||||
'report' => 'required|in:invoice,payment',
|
||||
'report' => 'required|in:invoice,payment,incoming,outgoing',
|
||||
]);
|
||||
|
||||
$this->from = $requestData['from'];
|
||||
@@ -51,7 +53,14 @@ class ExcelController extends Controller
|
||||
case 'payment':
|
||||
$this->payment();
|
||||
break;
|
||||
case 'incoming':
|
||||
$this->incoming();
|
||||
break;
|
||||
case 'outgoing':
|
||||
$this->outgoing();
|
||||
break;
|
||||
}
|
||||
|
||||
return response()->json($this->writer->save('php://output'));
|
||||
}
|
||||
|
||||
@@ -159,6 +168,7 @@ class ExcelController extends Controller
|
||||
$row = 2;
|
||||
foreach ($payments as $payment) {
|
||||
$invoice = $payment->invoice;
|
||||
|
||||
foreach ($invoice->items as $item) {
|
||||
if (!isset($net[$item->tax])) {
|
||||
$net[$item->tax] = 0;
|
||||
@@ -169,6 +179,7 @@ class ExcelController extends Controller
|
||||
$tax[$item->tax] += $item->amount * $item->price * $item->tax * $payment->paid_amount / ($invoice->sum * 100);
|
||||
$gross[$item->tax] += $item->total * $payment->paid_amount / ($invoice->sum);
|
||||
}
|
||||
|
||||
$worksheet->setCellValue('A' . $row, $invoice->number);
|
||||
$worksheet->setCellValue('B' . $row, $invoice->customer->name);
|
||||
$worksheet->setCellValue('C' . $row, $invoice->address->name);
|
||||
@@ -204,6 +215,97 @@ class ExcelController extends Controller
|
||||
}
|
||||
|
||||
$this->writer = new Xlsx($spreadsheet);
|
||||
}
|
||||
|
||||
protected function incoming(): void
|
||||
{
|
||||
$incoming = Incoming::whereBetween('issue_date', [$this->from, $this->end])->with(['supplier', 'taxes'])->orderBy('issue_date', 'desc')->get();
|
||||
$this->incomingToSheet($incoming);
|
||||
}
|
||||
|
||||
protected function outgoing(): void
|
||||
{
|
||||
$incoming = Incoming::whereBetween('pay_date', [$this->from, $this->end])->with(['supplier', 'taxes'])->orderBy('pay_date', 'desc')->get();
|
||||
$this->incomingToSheet($incoming);
|
||||
}
|
||||
|
||||
protected function incomingToSheet(Collection $incoming): void
|
||||
{
|
||||
$net = [];
|
||||
$tax = [];
|
||||
$gross = [];
|
||||
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
$worksheet->setTitle(__('incoming.Incoming'));
|
||||
$worksheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
|
||||
$worksheet->getHeaderFooter()->setEvenHeader(__('incoming.Invoices from to', ['from' => $this->from, 'end' => $this->end]));
|
||||
$worksheet->getHeaderFooter()->setOddHeader(__('incoming.Invoices from to', ['from' => $this->from, 'end' => $this->end]));
|
||||
|
||||
$worksheet->setCellValue('A1', __('invoice.Invoice Number'));
|
||||
$worksheet->setCellValue('B1', __('customer.Customer'));
|
||||
$worksheet->setCellValue('C1', __('common.Name'));
|
||||
$worksheet->setCellValue('D1', __('invoice.Net'));
|
||||
$worksheet->setCellValue('E1', __('invoice.Tax'));
|
||||
$worksheet->setCellValue('F1', __('invoice.Gross'));
|
||||
$worksheet->setCellValue('G1', __('common.Created at'));
|
||||
$worksheet->setCellValue('H1', __('common.Paid at'));
|
||||
$worksheet->getStyle('A1:H1')->getBorders()->getBottom()->applyFromArray(['borderStyle' => Border::BORDER_DOUBLE]);
|
||||
$worksheet->getStyle('A1:H1')->getFont()->setBold(true);
|
||||
$worksheet->getStyle('D1:H1')->getAlignment()->applyFromArray(['horizontal' => Alignment::HORIZONTAL_RIGHT]);
|
||||
|
||||
$row = 2;
|
||||
foreach ($incoming as $invoice) {
|
||||
foreach ($invoice->taxes as $item) {
|
||||
if (!isset($net[$item->percentage])) {
|
||||
$net[$item->percentage] = 0;
|
||||
$tax[$item->percentage] = 0;
|
||||
$gross[$item->percentage] = 0;
|
||||
}
|
||||
$net[$item->percentage] += $item->taxable_amount;
|
||||
$tax[$item->percentage] += $item->amount;
|
||||
$gross[$item->percentage] += $item->taxable_amount + $item->amount;
|
||||
}
|
||||
$worksheet->setCellValue('A' . $row, $invoice->invoice_number);
|
||||
$worksheet->setCellValue('B' . $row, $invoice->supplier->name);
|
||||
$worksheet->setCellValue('C' . $row, $invoice->supplier->email);
|
||||
$worksheet->getCell('D' . $row)->getStyle()->getNumberFormat()->setFormatCode($this->currencyMask);
|
||||
$worksheet->setCellValue('D' . $row, $invoice->net);
|
||||
$worksheet->getCell('E' . $row)->getStyle()->getNumberFormat()->setFormatCode($this->currencyMask);
|
||||
$worksheet->setCellValue('E' . $row, $invoice->tax);
|
||||
$worksheet->getCell('F' . $row)->getStyle()->getNumberFormat()->setFormatCode($this->currencyMask);
|
||||
$worksheet->setCellValue('F' . $row, $invoice->gross);
|
||||
$worksheet->setCellValue('G' . $row, Date::PHPToExcel(\DateTime::createFromFormat('!Y-m-d', $invoice->issue_date)));
|
||||
$worksheet->getCell('G' . $row)->getStyle()->getNumberFormat()->setFormatCode('dd.mm.yyyy');
|
||||
if (is_null($invoice->pay_date)) {
|
||||
$worksheet->setCellValue('H' . $row, '');
|
||||
} else {
|
||||
$worksheet->setCellValue('H' . $row, Date::PHPToExcel(\DateTime::createFromFormat('!Y-m-d', $invoice->pay_date)));
|
||||
}
|
||||
$worksheet->getCell('H' . $row)->getStyle()->getNumberFormat()->setFormatCode('dd.mm.yyyy');
|
||||
$row++;
|
||||
}
|
||||
|
||||
$worksheet->getStyle('A' . $row - 1 . ':H' . $row - 1)->getBorders()->getBottom()->applyFromArray(['borderStyle' => Border::BORDER_DOUBLE]);
|
||||
|
||||
foreach ($net as $tax_value => $amount) {
|
||||
$worksheet->getStyle('A' . $row . ':G' . $row)->getFont()->setBold(true);
|
||||
$worksheet->getStyle('D' . $row . ':G' . $row)->getAlignment()->applyFromArray(['horizontal' => Alignment::HORIZONTAL_RIGHT]);
|
||||
$worksheet->setCellValue('B' . $row, __('invoice.Sails from vat', ['tax' => \Illuminate\Support\Number::percentage($tax_value)]));
|
||||
$worksheet->getCell('D' . $row)->getStyle()->getNumberFormat()->setFormatCode($this->currencyMask);
|
||||
$worksheet->setCellValue('D' . $row, $amount);
|
||||
$worksheet->getCell('E' . $row)->getStyle()->getNumberFormat()->setFormatCode($this->currencyMask);
|
||||
$worksheet->setCellValue('E' . $row, $tax[$tax_value]);
|
||||
$worksheet->getCell('F' . $row)->getStyle()->getNumberFormat()->setFormatCode($this->currencyMask);
|
||||
$worksheet->setCellValue('F' . $row, $gross[$tax_value]);
|
||||
|
||||
$row++;
|
||||
}
|
||||
|
||||
foreach ($worksheet->getColumnIterator() as $column) {
|
||||
$worksheet->getColumnDimension($column->getColumnIndex())->setAutoSize(true);
|
||||
}
|
||||
|
||||
$this->writer = new Xlsx($spreadsheet);
|
||||
}
|
||||
}
|
||||
|
||||
180
app/Http/Controllers/Api/IncomingController.php
Normal file
180
app/Http/Controllers/Api/IncomingController.php
Normal file
@@ -0,0 +1,180 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,9 @@ class InvoiceController extends Controller
|
||||
return response()->json(Invoice::whereBetween('created_at', [$from, $end])->with(['address', 'customer'])->orderBy('created_at', 'desc')->get());
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a listing of the resource that have a status "sent".
|
||||
*/
|
||||
public function open(): JsonResponse
|
||||
{
|
||||
return response()->json(Invoice::where('status', '=', 'sent')->orderBy('created_at', 'desc')->with(['customer', 'address', 'payments'])->get());
|
||||
@@ -49,14 +52,6 @@ class InvoiceController extends Controller
|
||||
return response()->json($invoice);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(Invoice $invoice)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
@@ -76,6 +71,9 @@ class InvoiceController extends Controller
|
||||
return response()->json($invoice);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource's status in storage.
|
||||
*/
|
||||
public function state(Request $request, Invoice $invoice): JsonResponse
|
||||
{
|
||||
$invoiceData = $request->validate([
|
||||
|
||||
41
app/Http/Controllers/IncomingController.php
Normal file
41
app/Http/Controllers/IncomingController.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Incoming;
|
||||
use Illuminate\Contracts\View\View;
|
||||
|
||||
class IncomingController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(): View
|
||||
{
|
||||
return view('incoming.index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create(): View
|
||||
{
|
||||
return view('incoming.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for uploading a new resource.
|
||||
*/
|
||||
public function upload(): View
|
||||
{
|
||||
return view('incoming.upload');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(Incoming $incoming): View
|
||||
{
|
||||
return view('incoming.edit', ['incoming' => $incoming, 'supplier' => $incoming->supplier, 'items' => $incoming->items, 'taxes' => $incoming->taxes]);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
@@ -31,6 +32,41 @@ class Incoming extends Model
|
||||
'pay_iban',
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that are appended with attribute getters.
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
protected $appends = [
|
||||
'created',
|
||||
'paid',
|
||||
'due',
|
||||
];
|
||||
|
||||
/**
|
||||
* Get the pay_date attribute in local time format.
|
||||
*/
|
||||
public function getDueAttribute(): string
|
||||
{
|
||||
return (is_null($this->due_date)) ? '' : Carbon::createFromFormat('Y-m-d', $this->due_date)->format('d.m.Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the pay_date attribute in local time format.
|
||||
*/
|
||||
public function getPaidAttribute(): string
|
||||
{
|
||||
return (is_null($this->pay_date)) ? '' : Carbon::createFromFormat('Y-m-d', $this->pay_date)->format('d.m.Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the issue_date attribute in local time format.
|
||||
*/
|
||||
public function getCreatedAttribute(): string
|
||||
{
|
||||
return Carbon::createFromFormat('Y-m-d', $this->issue_date)->format('d.m.Y');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the supplier of the incoming invoice.
|
||||
*/
|
||||
|
||||
99
app/XmlReader.php
Normal file
99
app/XmlReader.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use \DOMDocument;
|
||||
use \DOMXPath;
|
||||
|
||||
class XmlReader
|
||||
{
|
||||
private DOMDocument $xml;
|
||||
private DOMXPath $xpath;
|
||||
|
||||
public function __construct(string $xml)
|
||||
{
|
||||
$this->xml = new DOMDocument();
|
||||
$this->xml->loadXML($xml);
|
||||
$this->xpath = new DOMXPath($this->xml);
|
||||
}
|
||||
|
||||
public function incoming(): array
|
||||
{
|
||||
$incoming = [];
|
||||
|
||||
$incoming['invoice_number'] = $this->xpath->query('cbc:ID', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['issue_date'] = $this->xpath->query('cbc:IssueDate', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['due_date'] = $this->xpath->query('cbc:DueDate', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['invoice_type_code'] = $this->xpath->query('cbc:InvoiceTypeCode', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['currency_code'] = $this->xpath->query('cbc:DocumentCurrencyCode', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['net'] = $this->xpath->query('cac:LegalMonetaryTotal/cbc:TaxExclusiveAmount', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['gross'] = $this->xpath->query('cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['tax'] = $this->xpath->query('cac:TaxTotal/cbc:TaxAmount', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['pay_name'] = $this->xpath->query('cac:PaymentMeans/cac:PayeeFinancialAccount/cbc:Name', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
$incoming['pay_bic'] = ($this->xpath->query('cac:PaymentMeans/cac:PayeeFinancialAccount/cac:FinancialInstitutionBranch/cbc:ID', $this->xml->documentElement)->length > 0) ? $this->xpath->query('cac:PaymentMeans/cac:PayeeFinancialAccount/cac:FinancialInstitutionBranch/cbc:ID', $this->xml->documentElement)->item(0)->nodeValue : null;
|
||||
$incoming['pay_iban'] = $this->xpath->query('cac:PaymentMeans/cac:PayeeFinancialAccount/cbc:ID', $this->xml->documentElement)->item(0)->nodeValue;
|
||||
|
||||
return $incoming;
|
||||
}
|
||||
|
||||
public function supplier(): array
|
||||
{
|
||||
$supplier = [];
|
||||
$supplierNode = $this->xpath->query('cac:AccountingSupplierParty', $this->xml->documentElement)->item(0);
|
||||
|
||||
$supplier['name'] = $this->xpath->query("cac:Party/cac:PartyName/cbc:Name", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['registration_name'] = $this->xpath->query("cac:Party/cac:PartyLegalEntity/cbc:RegistrationName", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['email'] = $this->xpath->query("cac:Party/cbc:EndpointID", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['address'] = $this->xpath->query("cac:Party/cac:PostalAddress/cbc:StreetName", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['city'] = $this->xpath->query("cac:Party/cac:PostalAddress/cbc:CityName", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['zip'] = $this->xpath->query("cac:Party/cac:PostalAddress/cbc:PostalZone", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['country_code'] = $this->xpath->query("cac:Party/cac:PostalAddress/cac:Country/cbc:IdentificationCode", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['tax_fc'] = ($this->xpath->query("cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID/text() = 'FC']", $supplierNode)->length === 0) ? null : $this->xpath->query("cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID/text() = 'FC']/cbc:CompanyID", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['tax_vat'] = ($this->xpath->query("cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID/text() = 'VAT']", $supplierNode)->length === 0) ? null : $this->xpath->query("cac:Party/cac:PartyTaxScheme[cac:TaxScheme/cbc:ID/text() = 'VAT']/cbc:CompanyID", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['contact_name'] = $this->xpath->query("cac:Party/cac:Contact/cbc:Name", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['contact_phone'] = $this->xpath->query("cac:Party/cac:Contact/cbc:Telephone", $supplierNode)->item(0)->nodeValue;
|
||||
$supplier['contact_email'] = $this->xpath->query("cac:Party/cac:Contact/cbc:ElectronicMail", $supplierNode)->item(0)->nodeValue;
|
||||
|
||||
return $supplier;
|
||||
}
|
||||
|
||||
public function items(): array
|
||||
{
|
||||
$items = [];
|
||||
$itemList = $this->xpath->query('cac:InvoiceLine', $this->xml->documentElement);
|
||||
|
||||
foreach ($itemList as $itemNode) {
|
||||
$item = [];
|
||||
$item['name'] = $this->xpath->query("cac:Item/cbc:Name", $itemNode)->item(0)->nodeValue;
|
||||
$item['article_number'] = null;
|
||||
$item['description'] = ($this->xpath->query("cac:Item/cbc:Description", $itemNode)->length === 0) ? null : $this->xpath->query("cac:Item/cbc:Description", $itemNode)->item(0)->nodeValue;
|
||||
$item['amount'] = $this->xpath->query("cbc:InvoicedQuantity", $itemNode)->item(0)->nodeValue;
|
||||
$item['discount'] = null;
|
||||
$item['tax'] = $this->xpath->query("cac:Item/cac:ClassifiedTaxCategory/cbc:Percent", $itemNode)->item(0)->nodeValue;
|
||||
$item['price'] = $this->xpath->query("cac:Price/cbc:PriceAmount", $itemNode)->item(0)->nodeValue;
|
||||
$item['total'] = $this->xpath->query("cbc:LineExtensionAmount", $itemNode)->item(0)->nodeValue;
|
||||
|
||||
$items[] = $item;
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
public function taxes(): array
|
||||
{
|
||||
$taxes = [];
|
||||
$taxList = $this->xpath->query('cac:TaxTotal/cac:TaxSubtotal', $this->xml->documentElement);
|
||||
|
||||
foreach ($taxList as $taxNode) {
|
||||
$tax = [];
|
||||
$tax['taxable_amount'] = $this->xpath->query("cbc:TaxableAmount", $taxNode)->item(0)->nodeValue;
|
||||
$tax['amount'] = $this->xpath->query("cbc:TaxAmount", $taxNode)->item(0)->nodeValue;
|
||||
$tax['percentage'] = $this->xpath->query("cac:TaxCategory/cbc:Percent", $taxNode)->item(0)->nodeValue;
|
||||
$tax['currency'] = $this->xpath->query("cbc:TaxableAmount", $taxNode)->item(0)->getAttribute("currencyID");
|
||||
|
||||
$taxes[] = $tax;
|
||||
}
|
||||
|
||||
return $taxes;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user