PHPackages                             northlab/parasut-laravel - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. northlab/parasut-laravel

ActiveLibrary[API Development](/categories/api)

northlab/parasut-laravel
========================

Parasut (Paraşüt) API V4 icin kapsamli Laravel entegrasyon paketi - E-ticaret ve ERP sistemleri icin.

v1.2(3d ago)01↓100%MITPHP ^8.1|^8.2|^8.3|^8.4

Since Jul 5Compare

[ Source](https://github.com/yamanhacioglu/parasut-laravel)[ Packagist](https://packagist.org/packages/northlab/parasut-laravel)[ RSS](/packages/northlab-parasut-laravel/feed)WikiDiscussions Synced today

READMEChangelog (1)Dependencies (5)Versions (4)Used By (0)

Northlab Parasut Laravel
========================

[](#northlab-parasut-laravel)

Parasut (Paraşüt) API V4 icin kapsamli Laravel entegrasyon paketi. E-ticaret ve ERP sistemlerinizi Parasut'a baglamak icin ihtiyaciniz olan **81 API uc noktasinin tamamini** kapsar.

> Kaynak:  resmi OpenAPI/Swagger tanimi baz alinarak hazirlanmistir.

Ozellikler
----------

[](#ozellikler)

- ✅ **25 kaynak sinifi**, Parasut API'sindeki tum uc noktalari (Contacts, Products, SalesInvoices, PurchaseBills, SalesOffers, Employees, Salaries, Taxes, BankFees, Accounts, Transactions, Tags, Warehouses, StockMovements, StockUpdates, ShipmentDocuments, EArchives, EInvoices, ESmms, EInvoiceInboxes, TrackableJobs, Sharings, Me, ItemCategories) kapsar
- 🔐 **Otomatik OAuth2 yonetimi**: password / authorization\_code / refresh\_token grant destegi, token'lar otomatik yenilenir
- 💾 Token depolama: **cache** (varsayilan, kurulum gerektirmez) veya **database** (migration ile)
- 🚦 **Rate limiting**: Parasut'un "10 saniyede 10 istek" limitini asmamak icin otomatik throttling
- 🔁 **Otomatik retry**: 429 (rate limit) ve 5xx hatalarinda akilli tekrar deneme
- 🧩 **JSON:API payload builder**: iliskili kayitlari (fatura + kalemler + urun + depo gibi) kolayca insa etme
- 🏢 **Coklu firma destegi**: `->forCompany($id)` ile tek istekte farkli firma (company\_id) kullanma
- ⚠️ **Tip guvenli exception'lar**: ParasutValidationException, ParasutAuthenticationException, ParasutRateLimitException, ParasutNotFoundException, ParasutServerException

Kurulum
-------

[](#kurulum)

```
composer require northlab/parasut-laravel
```

Laravel paket kesfi (auto-discovery) sayesinde ServiceProvider ve Facade otomatik kaydedilir.

Config dosyasini yayinlayin:

```
php artisan vendor:publish --tag=parasut-config
```

Token'lari veritabaninda saklamak isterseniz (opsiyonel, varsayilan "cache"):

```
php artisan vendor:publish --tag=parasut-migrations
php artisan migrate
```

Ortam Degiskenleri (.env)
-------------------------

[](#ortam-degiskenleri-env)

```
PARASUT_CLIENT_ID=xxxxxxxx
PARASUT_CLIENT_SECRET=xxxxxxxx
PARASUT_REDIRECT_URI=urn:ietf:wg:oauth:2.0:oob

# Sunucu-sunucu entegrasyon icin (onerilen):
PARASUT_GRANT_TYPE=password
PARASUT_USERNAME=hesap@ornek.com
PARASUT_PASSWORD=sifreniz

# Varsayilan firma numaraniz (Parasut panelindeki firma_no)
PARASUT_COMPANY_ID=115

# Opsiyonel
PARASUT_TOKEN_STORAGE=cache        # veya "database"
PARASUT_RATE_LIMIT_ENABLED=true
PARASUT_RATE_LIMIT_MAX=10
PARASUT_RATE_LIMIT_SECONDS=10
```

CLIENT\_ID / CLIENT\_SECRET bilgisini almak icin `destek@parasut.com` adresine yazmaniz gerekir.

### Ilk kimlik dogrulama

[](#ilk-kimlik-dogrulama)

```
php artisan parasut:authorize
```

`grant_type=authorization_code` kullaniyorsaniz komut once size yonlendirilecek URL'i verir, tarayicidan onaylayip donen `code` degeriyle tekrar calistirirsiniz:

```
php artisan parasut:authorize --code=DONEN_CODE
```

Token'in gecerliligini/yenilenmesini kontrol etmek icin:

```
php artisan parasut:refresh-token
```

Hizli Baslangic
---------------

[](#hizli-baslangic)

```
use Northlab\Parasut\Facades\Parasut;

// Musteri listesi
$contacts = Parasut::contacts()->list([
    'filter' => ['account_type' => 'customer'],
    'sort' => 'id',
    'page' => ['number' => 1, 'size' => 25],
]);

// Tek musteri
$contact = Parasut::contacts()->find(123);

// Yeni musteri olustur
$contact = Parasut::contacts()->create([
    'name' => 'Ahmet Yilmaz',
    'email' => 'ahmet@ornek.com',
    'account_type' => 'customer',
    'tax_number' => '1234567890',
]);

// Baska bir firma (company_id) icin islem
Parasut::forCompany(115)->products()->list();
```

E-Ticaret Senaryosu: Siparisten Faturaya
----------------------------------------

[](#e-ticaret-senaryosu-siparisten-faturaya)

```
use Northlab\Parasut\Facades\Parasut;

// 1) Musteriyi bul ya da olustur
$contact = Parasut::contacts()->create([
    'name' => $order->customer_name,
    'email' => $order->customer_email,
    'account_type' => 'customer',
], []);
$contactId = $contact['data']['id'];

// 2) Kalemleriyle birlikte satis faturasi olustur
$invoice = Parasut::salesInvoices()->createWithDetails(
    attributes: [
        'item_type' => 'invoice',
        'description' => "Siparis #{$order->id}",
        'issue_date' => now()->toDateString(),
        'due_date' => now()->addDays(14)->toDateString(),
        'currency' => 'TRL',
    ],
    contactId: $contactId,
    details: collect($order->items)->map(fn ($item) => [
        'quantity' => $item->qty,
        'unit_price' => $item->price,
        'vat_rate' => 20,
        'product_id' => $item->parasut_product_id,   // urun onceden Parasut'ta olusturulmus olmali
        'warehouse_id' => $order->warehouse_id,
        'description' => $item->name,
    ])->all()
);

$invoiceId = $invoice['data']['id'];

// 3) Odeme kaydi ekle (siparis pesin odendiyse)
Parasut::salesInvoices()->pay($invoiceId, [
    'description' => 'Online odeme',
    'account_id' => 456, // Parasut'taki kasa/banka hesabi
    'date' => now()->toDateString(),
    'amount' => $order->total,
]);

// 4) Stogu dus
Parasut::stockUpdates()->adjust(
    productId: $item->parasut_product_id,
    quantity: $item->qty,
    direction: 'out',
    warehouseId: $order->warehouse_id
);

// 5) e-Arsiv olustur (asenkron)
$job = Parasut::eArchives()->createFromSalesInvoice($invoiceId);
$jobId = $job['data']['id'];

$finishedJob = Parasut::trackableJobs()->waitUntilFinished($jobId);
```

ERP Senaryosu: Alis Faturasi + Stok Girisi
------------------------------------------

[](#erp-senaryosu-alis-faturasi--stok-girisi)

```
$bill = Parasut::purchaseBills()->createDetailed(
    attributes: [
        'item_type' => 'invoice',
        'description' => 'Tedarikci faturasi',
        'issue_date' => now()->toDateString(),
    ],
    contactId: $supplierId,
    details: [
        ['quantity' => 100, 'unit_price' => 25.5, 'vat_rate' => 20, 'product_id' => $productId, 'warehouse_id' => $warehouseId],
    ]
);

Parasut::stockUpdates()->adjust($productId, 100, 'in', $warehouseId);
```

Tum Kaynaklar (Facade Metodlari)
--------------------------------

[](#tum-kaynaklar-facade-metodlari)

MetodKaynakAciklama`me()``/me`Oturum sahibi kullanici ve erisilebilir firmalar`contacts()`Musteri/Tedarikcilist, find, create, update, delete, creditTransaction, debitTransaction`products()`Urun/Stok kartilist, find, create, update, delete, inventoryLevels`itemCategories()`Kategorilerstandart CRUD`warehouses()`Depolarstandart CRUD`tags()`Etiketlerstandart CRUD`accounts()`Kasa/BankaCRUD, creditTransaction, debitTransaction, transactions`transactions()`Finansal hareketfind, delete`stockMovements()`Stok hareketlerilist (salt okunur)`stockUpdates()`Stok guncellemecreate, adjust() (kolay kullanim)`salesInvoices()`Satis faturasiCRUD, createWithDetails, pay, archive/unarchive, cancel/recover, convertToInvoice`purchaseBills()`Alis faturasicreateBasic/createDetailed, pay, archive/unarchive, cancel/recover`salesOffers()`TeklifCRUD, createWithDetails, details, pdf, updateStatus`employees()`CalisanlarCRUD, archive/unarchive`salaries()`MaaslarCRUD, archive/unarchive, pay`taxes()`VergilerCRUD, archive/unarchive, pay`bankFees()`Banka masraflaricreate/find/update/delete (list yok), archive/unarchive, pay`shipmentDocuments()`Irsaliyelerstandart CRUD`eArchives()`e-ArsivcreateFromSalesInvoice (async), find, pdf`eInvoices()`e-FaturacreateFromSalesInvoice (async), find, pdf`eInvoiceInboxes()`Gelen e-Faturalist (salt okunur)`eSmms()`e-SMMcreateFromSalesInvoice (async), find, pdf`sharings()`Belge paylasimishare() (e-posta ile)`trackableJobs()`Asenkron is takibifind, waitUntilFinished()Listeleme Parametreleri
-----------------------

[](#listeleme-parametreleri)

Tum `list()` metodlari asagidaki esnek diziyi kabul eder:

```
Parasut::contacts()->list([
    'filter' => ['name' => 'Ahmet', 'account_type' => 'customer'],
    'sort' => '-balance',
    'page' => ['number' => 1, 'size' => 25],
    'include' => ['category', 'contact_people'],
]);
```

Hata Yonetimi
-------------

[](#hata-yonetimi)

```
use Northlab\Parasut\Exceptions\ParasutValidationException;
use Northlab\Parasut\Exceptions\ParasutNotFoundException;
use Northlab\Parasut\Exceptions\ParasutRateLimitException;

try {
    Parasut::contacts()->create(['name' => '']);
} catch (ParasutValidationException $e) {
    // $e->getErrors() -> Parasut'un dondurdugu JSON:API hata dizisi
    // $e->getStatusCode() -> 422
} catch (ParasutNotFoundException $e) {
    // 404
} catch (ParasutRateLimitException $e) {
    // 429 - $e->getRetryAfter()
}
```

Iliskili Kayit Olusturma (JsonApiPayload)
-----------------------------------------

[](#iliskili-kayit-olusturma-jsonapipayload)

Kendi ozel istekleriniz icin `JsonApiPayload` helper'ini dogrudan da kullanabilirsiniz:

```
use Northlab\Parasut\Support\JsonApiPayload;

$payload = JsonApiPayload::make('sales_invoices', $attributes, [
    'contact' => JsonApiPayload::ref('contacts', $contactId),
    'tags' => JsonApiPayload::refs('tags', [1, 2]),
    'details' => [
        JsonApiPayload::nested('sales_invoice_details', $detailAttrs, [
            'product' => JsonApiPayload::ref('products', $productId),
        ]),
    ],
]);
```

Asenkron Islemler (Trackable Jobs)
----------------------------------

[](#asenkron-islemler-trackable-jobs)

`eArchives()`, `eInvoices()`, `eSmms()` ve `salesOffers()->pdf()` gibi bazi islemler Parasut tarafinda **asenkron** islenir ve anlik sonuc yerine bir `trackable_job` kaydi doner:

```
$job = Parasut::eArchives()->createFromSalesInvoice($invoiceId);

$result = Parasut::trackableJobs()->waitUntilFinished($job['data']['id'], timeoutSeconds: 30);

if (($result['data']['attributes']['status'] ?? null) === 'succeeded') {
    // Basarili
}
```

> Uretim ortaminda `waitUntilFinished()` yerine bunu bir Laravel job/queue icinde polling ile yapmaniz onerilir (bloklayici HTTP istegi tutmamak icin).

Rate Limiting
-------------

[](#rate-limiting)

Parasut API 10 saniyede 10 istek siniri koyar. Paket, ayni process/worker icindeki ardisik cagrilarda bu limiti otomatik olarak yonetir (cache tabanli sayac + gerektiginde bekleme). `config/parasut.php` icinden kapatabilir ya da esiklerini degistirebilirsiniz.

Testler
-------

[](#testler)

Paket, `orchestra/testbench` + `Http::fake()` kullanan kapsamli bir test paketiyle birlikte gelir (gercek Parasut API'sine istek atilmaz).

```
composer install
vendor/bin/phpunit
```

Sadece belirli bir suite calistirmak icin:

```
vendor/bin/phpunit --testsuite=Unit      # JsonApiPayload, QueryParameters (saf PHP, Laravel bagimsiz)
vendor/bin/phpunit --testsuite=Feature   # HTTP client, auth, tum kaynak siniflari, service provider, artisan komutlari
```

**Kapsam:**

DosyaTest edilen`tests/Unit/JsonApiPayloadTest.php`JSON:API payload/iliski/nested kaynak insasi`tests/Unit/QueryParametersTest.php`filter/sort/page/include query uretimi`tests/Feature/ParasutClientTest.php`URL olusturma, company scoping, 401/404/422/429/5xx hata esleme, retry/backoff, `withCompany()``tests/Feature/ParasutAuthenticatorTest.php`password/refresh\_token grant, invalid\_grant/invalid\_client hata mesajlari, token cache'leme, otomatik yenileme`tests/Feature/ParasutManagerTest.php`facade binding, kaynak instance cache'leme, `forCompany()` izolasyonu`tests/Feature/ParasutServiceProviderTest.php`config merge, cache/database token repository secimi, singleton binding'ler, artisan komut kaydi`tests/Feature/Resources/*.php`25 kaynagin tamami: CRUD, ozel aksiyonlar (pay, archive, cancel, convertToInvoice, updateStatus, inventoryLevels, adjust, waitUntilFinished, share, vb.), desteklenmeyen metodlarin BadMethodCallException firlattigi durumlar`tests/Feature/Console/ConsoleCommandsTest.php``parasut:authorize`, `parasut:refresh-token` komutlarinin basarili/basarisiz senaryolari> Not: Bu ortamda `packagist.org` erisimi kapali oldugu icin testler burada `composer install` ile calistirilamadi. Tum dosyalar `php -l` ile syntax kontrolunden gecirildi ve Laravel'e bagimli olmayan `JsonApiPayload`/`QueryParameters` mantigi ayrica saf PHP ile manuel calistirilip dogrulandi. `Http::fake()` tabanli testleri kendi makinenizde `composer install && vendor/bin/phpunit` ile calistirmaniz onerilir.

Lisans
------

[](#lisans)

MIT

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance99

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

3

Last Release

3d ago

PHP version history (2 changes)v1.0PHP ^8.1

v1.1PHP ^8.1|^8.2|^8.3|^8.4

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/59294991?v=4)[Yaman HACIOĞLU](/maintainers/yamanhacioglu)[@yamanhacioglu](https://github.com/yamanhacioglu)

---

Tags

apilaravelERPe faturae arşivparasute-ticaretmuhasebe

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/northlab-parasut-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/northlab-parasut-laravel/health.svg)](https://phpackages.com/packages/northlab-parasut-laravel)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5022.3k](/packages/simplestats-io-laravel-client)[defstudio/telegraph

A laravel facade to interact with Telegram Bots

813335.6k3](/packages/defstudio-telegraph)[spatie/laravel-export

Create a static site bundle from a Laravel app

674146.0k6](/packages/spatie-laravel-export)[api-platform/laravel

API Platform support for Laravel

58173.9k16](/packages/api-platform-laravel)[eslazarev/wildberries-sdk

Wildberries OpenAPI clients (generated).

293.1k](/packages/eslazarev-wildberries-sdk)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
