Search by

dashed / dashed-ecommerce-rendabiliteit

Robinvm

Profitability reporting for Dashed e-commerce shops

Package info

github.com/DashedCMS/dashed-ecommerce-rendabiliteit

pkg:composer/dashed/dashed-ecommerce-rendabiliteit

Statistics

Installs: 15

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v4.1.0 2026-11-06 11:12 UTC

This package is auto-updated.

Last update: 2026-11-06 11:16:29 UTC


README

Rendabiliteit voor Dashed-webshops: omzet, kosten, marge en advertentie-uitgaven per maand, kanaal en productgroep.

Onderdelen (Filament, navigatiegroep Rendabiliteit, permissie view_statistics):

  • Rapport met aandachtspunten en PDF-export (per maand, periode, vergelijken, progressie)
  • Advertenties (dashboard, per week/maand/kwartaal/jaar), Advertentie-uitgaven (importeren, ads-exports inlezen) en een API
  • Tarieven (betaal-, verzend- en verpakkingskosten), Vaste lasten
  • Verzendfacturen (uitlezen met Claude, correctiefactor op de geschatte verzendkosten)
  • Marges en adviesprijs (Kostprijzen)
  • Inkoopfacturen: uitlezen (pdf, csv, xlsx), koppelen op EAN of SKU en toepassen als purchase_price

Installatie

composer require dashed/dashed-ecommerce-rendabiliteit
php artisan migrate

Registreer de plugin in het Filament-panel:

use Dashed\DashedEcommerceRendabiliteit\DashedEcommerceRendabiliteitPlugin;

$panel->plugin(new DashedEcommerceRendabiliteitPlugin());

Zet in .env een token voor de advertentie-API (leeg = API dicht):

ADVERTENTIE_API_TOKEN=

POST /api/advertentie-uitgaven met {"rows": [{"datum": "2026-10-29", "platform": "meta", "bedrag": 24.10}]} en GET /api/advertentie-uitgaven?van=&tot=, met Authorization: Bearer <token>.

Advertentiekoppelingen

Rendabiliteit → Advertentiekoppelingen: per platform de inloggegevens (geheimen versleuteld, nooit teruggetoond) en een schakelaar. Standaard uit.

  • Meta: token van een systeemgebruiker met ads_read en het advertentieaccount-ID.
  • Google Ads: klant-ID, OAuth client-ID en secret, refresh token (scope adwords), developer token en zo nodig het manageraccount-ID.
  • Bol: client credentials voor de Advertising API (niet die van de Retailer API). Bol levert hoogstens 30 dagen terug, met één verzoek per dag.

rendabiliteit:haal-advertenties [--van=] [--tot=] [--platform=meta|google|bol] draait elke nacht om 05:20 over de afgelopen 7 volle dagen, omdat platforms recente dagen nog corrigeren. Een dag zonder uitgaven wordt € 0, een regel met bron handmatig blijft staan en andere regels worden overschreven (bron koppeling). Een account dat niet in euro rekent wordt geweigerd. API-versies: koppelingen in de config; Google stopt een versie na ± 1 jaar.

De nachtelijke taken lopen via de scheduler van de shop: rendabiliteit:vul-orderregel-kostprijzen om 03:50 en de koppelingen om 05:20.

Config (config/dashed-ecommerce-rendabiliteit.php): vervoerders, api_token, koppelingen, bestandsprefix, inkoopfacturen (standaard true; false registreert de Inkoopfacturen-resource niet, voor shops waar de kostprijs niet uit purchase_price komt).

De migratie maakt de tabellen aan als ze er nog niet zijn en vult geen tarieven: vul betaal-, verzend- en verpakkingskosten in onder Rendabiliteit → Tarieven (zonder tarief rekent het rapport met €0 en toont een waarschuwing). Startwaarden::zet() is alleen een hulpklasse (o.a. voor tests) en wordt niet automatisch aangeroepen.

Standaardgedrag

  • Kostprijsbron: InkoopprijsBron; de kostprijs is purchase_price van het product, zonder purchase_price is er geen kostprijs (wel een waarschuwing in het rapport).
  • Maatsleutel: '' (geen maatverdeling per productgroep).
  • Vervoerders komen uit de config; alleen vervoerders waarvan de labeltabel bestaat doen mee.
  • Geen uitgesloten productgroepen; cadeaubonnen tellen generiek niet mee.
  • Rapportcache: schema 12.

Haken (rendabiliteit())

Een shop breidt het package uit in een service provider (boot):

rendabiliteit()->kostprijsBron(KostprijsBron $bron);                          // waar de kostprijs vandaan komt
rendabiliteit()->sluitGroepenUit(Closure(): array<int>);                       // groep-id's die niet meetellen in kostprijs en marge
rendabiliteit()->kostprijsLink(Closure(int $groepId, string $sleutel): ?array); // ['url', 'label'], optioneel 'reden' en 'maat'
rendabiliteit()->maatsleutel(Closure(Product): string);                        // maatsleutel per product
rendabiliteit()->maatsleutels(Closure(iterable): array<int, string>);          // idem in batch (sneller)
rendabiliteit()->extraSignalen(Closure(Collection): list<array>);              // bv. ['soort' => 'verwacht_duurder', 'product_id' => 12]

KostprijsBron (Contracts\KostprijsBron) levert per product een Kostprijs\Kostprijs (totaal en opbouw) of null.

Voorbeeld: Lovora (app/Providers/RendabiliteitServiceProvider.php) registreert een PrintprofielBron (kostprijs uit gram, printtijd en handwerk, via een scoped Kostprijsberekenaar), de uitgesloten groepen (outlet, wenskaart, cadeaubon), een kostprijsLink naar het printprofiel, een maatsleutel uit de variantfilters en het dual-color signaal. Wie na een wijziging aan de bron de rapporten wil verversen, roept RendabiliteitCache::wis() aan.