Preview: console.php
Size: 18.69 KB
/var/www/invoice-sync.bitkit.dk/httpdocs/routes/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);
}
}
});
Directory Contents
Dirs: 0 × Files: 4