PHP 7.4.33
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
Name Size Perms Modified Actions
589 B lrw-r--r-- 2023-12-20 04:43:52
Edit Download
576 B lrw-r--r-- 2023-12-20 04:43:47
Edit Download
18.69 KB lrw-r--r-- 2023-12-20 04:43:51
Edit Download
1.88 KB lrw-r--r-- 2023-12-20 04:43:46
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).