KENNIS IN VERBINDING / ANALYSE 03.10.2026
TRACEERBAARHEID

backend.md

Feitelijke analyse op 3 oktober 2026. Codebevindingen zijn geen garantie voor foutloos of daadwerkelijk gebruikt runtimegedrag.

← Alle bronnen

Backend: endpoints en volledige functiecatalogus

De catalogus bevat 121 functies in LMF.pm, 36 in EmballageControl, 47 in RoutePlanImporter en 11 in de HTTP-handler, inclusief constructors/booleanhelpers. Bronnen: huidige werkboom; machineleesbaar bewijs. Alle objecten zijn Perl-hashrefs, DBH/cursorobjecten of de genoemde serviceobjecten. Voor logistieke/emballagebetekenis en statusgevolgen zie de doelregel per functie en de flowhoofdstukken.

Request- en outputcontract

HTTP → XLSLMFHandler → handle_request({base,user,request,request_method,url_param,requests}). Parameters staan normaliter onder base.params. Datumfilters heten start_date/end_date; ID-betekenissen verschillen per endpoint. POST verplicht alleen waar expliciet gecontroleerd (route_plan/dash); bestaande andere handlers lezen params zonder uniforme methodguard.

Responses zijn niet uniform: {code,data:{orders/...}}, {code,deliveries,role}, {code,data:[...]}, {success,error}, of een stubmelding. JSON-code403/500 betekent in deze handler niet automatisch HTTP403/500. Alleen malformed JSON zet expliciet HTTP400. Ongeldig/onbekend endpoint kan undef/null opleveren. true/false zijn scalarreferences voor JSON-booleans.

handle_request is de endpointregistratie: login/keana/check_token/postcode/dash/emballage_hub_control vóór rolbranches; daarna HUB, klant, leverancier, logistiek. identify en ongeauthenticeerde connector/log zitten uitsluitend in de handler. De geteste React-calls staan in frontend.

Kritieke payloadcontracten

  • route_plan: route_id moet positief integer zijn; route_date wordt toegestaan maar niet gebruikt/gevalideerd. stops moet een array zijn; leeg of alleen niet-customerstops levert nul updates op. Customerstops vereisen positieve location_id/sequence; locaties mogen niet dubbel, sequences worden niet op uniciteit of aaneengeslotenheid getest. Geen max500-check zoals de afzonderlijke importer.
  • hub_*_deliveries: supplier_id of location_id (numeriek), delivery_date, packages en optioneel returned_packages met id/number/package_type. Bronreference is optioneel; ontbrekende bron blokkeert niet.
  • stop: samengestelde stop_id, packages/returned_packages; de datum voor schrijven is vandaag, niet start_date/end_date.
  • confirm_*_delivery: delivery_id als pakbon.guid, outbound_packages; comment/photo/signature optioneel. returned_packages/datetime worden niet voor een emballageboeking gebruikt.
  • emballage_hub_control: start_date/end_date, eigen HUB en optionele supplier/location/article/kvd/status/paging. Let op U20: gewone hash versus blessed Base verhindert parameters uit normale handler.

Leesinstructie catalogus

Elke entry geeft doel/output, inputsignatuur/paramkeys, calls/callers en SQL-fragmenten met tabellen/writegevolgen. De common $args bevat het bovengenoemde requestobject; signatures met $dbh, lijsten of filters zijn interne helpers. “Geen directe SQL” betekent niet dat aangeroepen helpers geen DB gebruiken. Requestcache is uitsluitend in-memory.

De SQL-fragmenten zijn letterlijk uit strings gehaald en witruimte genormaliseerd. Bij stringconcatenatie staat alleen het eerste fragment hier; de gelinkte functie en genoemde bouwhelpers zijn gezaghebbend voor volledige SQL/binds. CTEnamen zijn niet als tabellen geteld. Callerindex is statisch en binnen deze vier bestanden; externe callers/React staan in andere hoofdstukken. Geen runtime calltrace of volledige CPAN-transitieve callgraph geclaimd.

XLS/LMF.pm

true

Bron. JSON-true scalarreferentie; utility, geen DB.

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::keana_webhook.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

new

Bron. Leeg blessed LMF-serviceobject; geen domeinstatus of DB.

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request; XLS/LMF.pm::_route_plan_importer; XLS/LMF.pm::postcode; XLS/LMF.pm::stops; XLS/LMF.pm::new_supplier_delivery; XLS/LMF.pm::new_supplier_deliveries; XLS/LMF.pm::next_logistics_delivery; XLS/LMF.pm::logistics_pickup; XLS/LMF.pm::logistics_delivery; XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::customer_delivery; XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries; XLS/LMF.pm::keana_webhook; XLS/LMF.pm::klant; XLS/LMF.pm::leverancier.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

handle_request

Bron. Dispatch op request en rol; retourneert resultaat van geselecteerde functie, false bij geen rol, soms undef bij onbekende request binnen rol.

  • Input: my ( $args ) = @_.
  • Aanroepen: _dash_dispatch, _dash_request, accept_new_delivery, assignment, b2c_hub_order, b2c_hub_orders, check_token, confirm_delivery, customer_dashboard, customer_deliveries, customer_delivery, download_orders, hub_customer_products, hub_customers, hub_dashboard, hub_incoming, hub_incoming_deliveries, hub_orders, hub_outgoing, hub_outgoing_deliveries, hub_routes, hub_supplier_products, hub_suppliers, hub_vehicles, keana_webhook, location_comment, log, log_report, log_report_hub, logistics_dashboard, logistics_deliveries, logistics_delivery, logistics_pickup, new, new_supplier_deliveries, new_supplier_delivery, next_logistics_delivery, orders, postcode, products, return_packaging, role, route_plan, stop, stops, supplier_dashboard, supplier_deliveries, update_supplier_delivery, upload_assortment, upload_invoices, upload_package_info. Modules: XLS::LMF::EmballageControl::new.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

route_plan

Bron. POST-guard en route_lokatie-updater; code/message/data met route_id/customer_stops/updated, geen importer-aanroep.

  • Input: my ( $args ) = @_.
  • Aanroepen: _route_plan_post_method, _route_plan_update_route_locations.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

routeplan_importer

Bron. Factory voor RoutePlanImporter; retourneert nieuw object, geen actieve caller in LMF.

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: new. Modules: XLS::LMF::RoutePlanImporter::new.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

routeplan_update_route_locations

Bron. Valideert gebruiker/payload, zoekt unieke route_lokatie per klantlocatie en wijzigt nummer; commit/rollback, code-resultaat.

  • Input: my ( $args ) = @_.
  • Aanroepen: _lmf_error, _lmf_positive_int, _lmf_truthy, _route_plan_begin_transaction, _route_plan_commit_transaction, _route_plan_request_payload, _route_plan_rollback_transaction, _route_plan_route_location, _route_plan_route_location_payload, stop.
  • Statische callers: XLS/LMF.pm::route_plan.
  • DB-objecten: route_lokatie. Writes: route_lokatie.

<details><summary>SQL-bronfragmenten</summary>

UPDATE route_lokatie SET nummer=? WHERE id=? AND (nummer IS DISTINCT FROM ?)

</details>

routeplan_request_payload

Bron. Kopie van paramshash zonder Authorization, anders oorspronkelijke waarde; geen writes.

  • Input: my ($params) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

routeplan_route_location_payload

Bron. Whitelist route_id/route_date/stops, positieve route-ID; alleen customerstops, unieke location_id en positieve sequence; code+genormaliseerde data.

  • Input: my ($payload) = @_.
  • Aanroepen: _lmf_error, _lmf_positive_int, stop.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

routeplan_route_location

Bron. SELECT route_lokatie op locatie; 422 bij geen rij, 409 bij meerdere; anders code+id/nummer.

  • Input: my ($dbh, $location_id) = @_.
  • Aanroepen: _lmf_error.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations.
  • DB-objecten: route_lokatie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, nummer FROM route_lokatie WHERE lokatie=?

</details>

routeplan_begin_transaction

Bron. DBH AutoCommit controleren/begin_work; retourneert ownership=1 ook bij bestaande transactie.

  • Input: my ($dbh) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

routeplan_commit_transaction

Bron. Commit wanneer ownership waar is; geen businessoutput.

  • Input: my ($dbh, $owns_transaction) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE; expliciete commit.

routeplan_rollback_transaction

Bron. Rollback in eval wanneer ownership waar is; geen businessoutput.

  • Input: my ($dbh, $owns_transaction) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

routeplan_post_method

Bron. Trim/case-normalisatie requestmethod → boolean POST.

  • Input: my ($method) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::route_plan; XLS/LMF.pm::_dash_dispatch.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashrequest

Bron. Herkenning van vier dash-endpointnamen → boolean.

  • Input: my ($request) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashdispatch

Bron. POST-guard, verbiedt clientscope, resolve servermarktplaatsen en roept dash-methode; response van die methode.

  • Input: my ( $args ) = @_.
  • Aanroepen: _dash_has_scope_parameter, _dash_marketplace_scope, _lmf_error, _route_plan_post_method, dash_customers, dash_orders, dash_route_customers, dash_suppliers.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashhas_scope_parameter

Bron. Normaliseert parameternamen en herkent verboden tenant/partij/projectkeys → boolean.

  • Input: my ($params) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_dash_dispatch.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashmarketplace_scope

Bron. Rol→marktplaatsen uit DB; code403 of code200/data.marketplace_ids.

  • Input: my ( $args ) = @_.
  • Aanroepen: _dash_supplier_marketplaces, _lmf_error, _lmf_positive_int, _lmf_truthy, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::_dash_dispatch.
  • DB-objecten: klant. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT klant.marktplaats FROM klant WHERE klant.id=? AND klant.marktplaats IS NOT NULL

</details>

dashsupplier_marketplaces

Bron. Supplier-ID → unieke positieve marktplaats-ID-lijst uit leverancier_marktplaats.

  • Input: my ( $dbh, $supplier_id ) = @_.
  • Aanroepen: _lmf_positive_int, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::_dash_marketplace_scope.
  • DB-objecten: leverancier_marktplaats. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT marktplaats FROM leverancier_marktplaats WHERE leverancier=? AND marktplaats IS NOT NULL ORDER BY marktplaats

</details>

lmferror

Bron. code/message/optionele data → uniforme errorhash.

  • Input: my ($code, $message, $data) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations; XLS/LMF.pm::_route_plan_route_location_payload; XLS/LMF.pm::_route_plan_route_location; XLS/LMF.pm::_dash_dispatch; XLS/LMF.pm::_dash_marketplace_scope; XLS/LMF.pm::dash_customers; XLS/LMF.pm::dash_route_customers; XLS/LMF.pm::dash_suppliers; XLS/LMF.pm::dash_orders.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

check_token

Bron. Authorization of token valideren; leest lmf_user en geeft data.valid/data.active JSON-booleans; geen sessievernieuwing.

  • Input: my ( $args ) = @_; HTTP-paramkeys: Authorization, token.
  • Aanroepen: _extract_uuid_token.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lmf_user. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, actief FROM lmf_user WHERE token=?

</details>

extractuuid_token

Bron. Strip Bearer/spaties, UUID-vormvalidatie → token of undef.

  • Input: my ($token) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::check_token; XLSLMFHandler.pm::authorization; XLSLMFHandler.pm::credentials.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

postcode

Bron. Postcode/nummer/addition normaliseren → XLS::Postcode.lookup → code/data of foutbericht; geen DB-write.

  • Input: my ( $args ) = @_.
  • Aanroepen: new. Modules: XLS::Postcode::new.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

hub_customer_products

Bron. Productaantallen per locatie/datum, customer_id is lokatie.id; data.products, geen extra HUB-filter in SQL.

  • Input: my ( $args ) = @_; HTTP-paramkeys: customer_id, end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden. Modules: XLS::Datum::JSON_Datum.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, lokatie, order_regel, product, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier.id AS supplier_id, leverancier.naam AS supplier_name, product.id, product.code, product.naam AS name, product.omschrijving_verpakking AS package_description, vers_order.afleverdatum AS delivery_date, sum(order_regel.aantal) AS number FROM lokatie, leverancier, product, order_regel, vers_order WHERE leverancier.id = product.leverancier AND product.id = order_regel.product AND order_regel.vers_order = vers_order.id AND vers_order.lokatie = lokatie.id AND lokatie.id = ? AND vers_order.afleverdatum BETWEEN ? AND ? GROUP BY leverancier.id, leverancier.naam, product.id, product.code, product.naam, product.omschrijving_verpakking, vers_order.afleverdatum ORDER BY product.naam

</details>

hub_supplier_products

Bron. Productaantallen per leverancier/datum → data.products; geen extra HUB-filter in SQL.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date, supplier_id.
  • Aanroepen: geen interne servicecall gevonden. Modules: XLS::Datum::JSON_Datum.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: order_regel, product, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT product.id, product.code, product.naam AS name, product.omschrijving_verpakking AS package_description, vers_order.afleverdatum AS delivery_date, sum(order_regel.aantal) AS number FROM product, order_regel, vers_order WHERE product.id = order_regel.product AND order_regel.vers_order = vers_order.id AND vers_order.leverancier = ? AND vers_order.afleverdatum BETWEEN ? AND ? GROUP BY product.id, product.code, product.naam, product.omschrijving_verpakking, vers_order.afleverdatum ORDER BY product.naam

</details>

hub_customers

Bron. Eigen HUB-orderlocaties binnen periode → data.customers met numerieke locatie-ID en coords.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lokatie, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT lokatie.id, lokatie.naam, lokatie.lat_lng FROM lokatie, vers_order WHERE lokatie.id = vers_order.lokatie AND vers_order.hub = ? AND vers_order.afleverdatum::date BETWEEN ? AND ? ORDER BY lokatie.naam

</details>

hub_suppliers

Bron. Leveranciers en HUB's uit eigen HUB-orders → data.suppliers met capabilityflags/coords.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT leverancier.id, leverancier.naam AS name, leverancier.latitude, leverancier.longitude, leverancier.hub AS can_act_as_hub, leverancier.vervoerder AS can_act_as_carrier FROM leverancier, vers_order WHERE ( leverancier.id = vers_order.leverancier OR leverancier.id = vers_order.hub ) AND vers_order.hub = ? AND vers_order.afleverdatum::date BETWEEN ? AND ? ORDER BY leverancier.naam

</details>

hub_orders

Bron. Pakbon/orderselectie voor eigen HUB plus partij/dagregistratietotalen → data.orders; bedrag in centen.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _location_date_key, _preload_registration_details_by_location_date, _preload_registration_details_by_supplier_date, _registration_totals. Modules: XLS::Datum::JSON_Datum, XLS::Datum::JSON_Timestamp.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon, lokatie, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT leverancier.id, leverancier.naam, leverancier.latitude, leverancier.longitude, hub.id AS hub_id, hub.naam AS hub_name, hub.latitude AS hub_latitude, hub.longitude AS hub_longitude, lokatie.id AS lokatie_id, lokatie.naam AS lokatie_naam, lokatie.lat_lng, vers_order.id AS order_id, vers_order.order_datum AS order_date, vers_order.bedrag AS order_amount, leverancier_pakbon.lever_datum FROM leverancier AS hub, leverancier, lokatie, leverancier_pakbon, vers_order WHERE vers_order.id = leverancier_pakbon.vers_order AND hub.id = leverancier_pakbon.hub AND leverancier.id = leverancier_pakbon.leverancier AND lokatie.id = leverancier_pakbon.lokatie AND leverancier_pakbon.hub = ? AND leverancier_pakbon.lever_datum::date BETWEEN ? AND ? ORDER BY leverancier.naam

</details>

dash_customers

Bron. Servermarktplaatsscope en datum → data.customers met locaties/coords.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _dash_in_clause, _lmf_error.
  • Statische callers: XLS/LMF.pm::_dash_dispatch.
  • DB-objecten: klant, lokatie, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT lokatie.id, lokatie.naam, lokatie.lat_lng FROM vers_order JOIN lokatie ON lokatie.id = vers_order.lokatie JOIN klant ON klant.id = lokatie.klant WHERE $marketplace_sql AND (vers_order.marktplaats IS NULL OR vers_order.marktplaats = klant.marktplaats) AND vers_order.afleverdatum::date BETWEEN ? AND ? ORDER BY lokatie.naam

</details>

dash_route_customers

Bron. Scoped klanten → kandidaatroute van marktplaatseigenaar; kiest gesorteerd één route per locatie en waarschuwt bij meer; data.routes[].customers.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _dash_in_clause, _dash_route_number_sort, _lmf_error, _lmf_positive_int.
  • Statische callers: XLS/LMF.pm::_dash_dispatch.
  • DB-objecten: klant, lokatie, marktplaats, route, route_lokatie, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

WITH scoped_customers AS ( SELECT DISTINCT lokatie.id, lokatie.naam, lokatie.lat_lng, klant.marktplaats FROM vers_order JOIN lokatie ON lokatie.id = vers_order.lokatie JOIN klant ON klant.id = lokatie.klant WHERE $marketplace_sql AND (vers_order.marktplaats IS NULL OR vers_order.marktplaats = klant.marktplaats) AND vers_order.afleverdatum::date BETWEEN ? AND ? ) SELECT scoped_customers.id, scoped_customers.naam, scoped_customers.lat_lng, route.id AS route_id, route.naam AS route_name, route_lokatie.nummer FROM scoped_customers LEFT JOIN marktplaats ON marktplaats.id = scoped_customers.marktplaats LEFT JOIN route_lokatie ON route_lokatie.lokatie = scoped_customers.id LEFT JOIN route ON route.id = route_lokatie.route AND route.leverancier = marktplaats.leverancier ORDER BY scoped_customers.naam, scoped_customers.id, route_lokatie.nummer, route.naam, route.id

</details>

dash_suppliers

Bron. Scoped orders → leveranciers/HUB's met coords/capabilities; data.suppliers.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _dash_in_clause, _lmf_error.
  • Statische callers: XLS/LMF.pm::_dash_dispatch.
  • DB-objecten: klant, leverancier, lokatie, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT leverancier.id, leverancier.naam AS name, leverancier.latitude, leverancier.longitude, leverancier.hub AS can_act_as_hub, leverancier.vervoerder AS can_act_as_carrier FROM vers_order JOIN lokatie ON lokatie.id = vers_order.lokatie JOIN klant ON klant.id = lokatie.klant JOIN leverancier ON ( leverancier.id = vers_order.leverancier OR leverancier.id = vers_order.hub ) WHERE $marketplace_sql AND (vers_order.marktplaats IS NULL OR vers_order.marktplaats = klant.marktplaats) AND vers_order.afleverdatum::date BETWEEN ? AND ? ORDER BY leverancier.naam

</details>

dash_orders

Bron. Scoped pakbon/orderdata plus per HUB/partij/dag geaggregeerde registratie → data.orders.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _dash_in_clause, _dash_registration_key, _lmf_error, _preload_dash_registration_details_by_location_date, _preload_dash_registration_details_by_supplier_date, _registration_totals. Modules: XLS::Datum::JSON_Datum, XLS::Datum::JSON_Timestamp.
  • Statische callers: XLS/LMF.pm::_dash_dispatch.
  • DB-objecten: klant, leverancier, leverancier_pakbon, lokatie, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

WITH scoped_pakbon AS ( SELECT DISTINCT leverancier_pakbon.id AS pakbon_id, leverancier_pakbon.hub, leverancier_pakbon.leverancier, leverancier_pakbon.lokatie, leverancier_pakbon.lever_datum, vers_order.id AS order_id, vers_order.order_datum AS order_date, vers_order.bedrag AS order_amount FROM leverancier_pakbon JOIN vers_order ON vers_order.id = leverancier_pakbon.vers_order JOIN lokatie ON lokatie.id = leverancier_pakbon.lokatie JOIN klant ON klant.id = lokatie.klant WHERE $marketplace_sql AND (vers_order.marktplaats IS NULL OR vers_order.marktplaats = klant.marktplaats) AND leverancier_pakbon.lever_datum::date BETWEEN ? AND ? ) SELECT DISTINCT leverancier.id, leverancier.naam, leverancier.latitude, leverancier.longitude, hub.id AS hub_id, hub.naam AS hub_name, hub.latitude AS hub_latitude, hub.longitude AS hub_longitude, lokatie.id AS lokatie_id, lokatie.naam AS lokatie_naam, lokatie.lat_lng, scoped_pakbon.order_id, scoped_pakbon.order_date, scoped_pakbon.order_amount, scoped_pakbon.lever_datum FROM scoped_pakbon JOIN leverancier AS hub ON hub.id = scoped_pakbon.hub JOIN leverancier ON leverancier.id = scoped_pakbon.leverancier JOIN lokatie ON lokatie.id = scoped_pakbon.lokatie ORDER BY leverancier.naam

</details>

hub_vehicles

Bron. Actieve voertuigen van eigen leverancier-ID → data.vehicles met capaciteit en km/min/stopkosten; logt supplier-ID.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: voertuig. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM voertuig WHERE leverancier=? AND actief=?

</details>

hub_routes

Bron. HUB-routeleden en pakbondatumselectie → data.route; geen opgeslagen rit of optimizer.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden. Modules: XLS::Datum::JSON_Datum.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon, lokatie, route, route_lokatie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT route.id AS route_id, route.naam AS route_name, route_lokatie.nummer, leverancier_pakbon.lever_datum AS delivery_date, leverancier.id AS supplier_id, lokatie.id AS customer_id FROM route, leverancier_pakbon, route_lokatie LEFT JOIN lokatie ON lokatie.id = route_lokatie.lokatie LEFT JOIN leverancier ON leverancier.id = route_lokatie.leverancier WHERE leverancier_pakbon.hub = ? AND leverancier_pakbon.lever_datum BETWEEN ? AND ? AND route.leverancier = leverancier_pakbon.hub AND route_lokatie.route = route.id ORDER BY route_lokatie.nummer

</details>

b2c_hub_orders

Bron. Stub: alleen code200, geen selectie of verwerking.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

b2c_hub_order

Bron. Stub: alleen code200, geen selectie of verwerking.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

log_report_hub

Bron. Stub: alleen code200.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

log_report

Bron. Connectorlog voor eigen leverancier en datum → code/data-array met username/message/date.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lmf_log. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT username, bericht AS message, datum AS date FROM lmf_log WHERE leverancier=? AND datum::date BETWEEN ? AND ? ORDER BY id DESC

</details>

log

Bron. Connectorbericht invoegen en commit → code200.

  • Input: my ( $args ) = @_; HTTP-paramkeys: message, username.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lmf_log. Writes: lmf_log; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO lmf_log(leverancier, username, bericht) VALUES(?,?,?)

</details>

hub_dashboard

Bron. Eigen HUB-orders per dag en top10 productgroepen → data.orders/data.products.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: order_regel, product, productgroep, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT afleverdatum AS delivery_date, count(*) AS orders FROM vers_order WHERE afleverdatum BETWEEN ? AND ? AND hub=? GROUP BY afleverdatum ORDER BY afleverdatum

SELECT productgroep.naam AS name, sum(order_regel.aantal) AS number FROM vers_order, order_regel, product, productgroep WHERE productgroep.id = product.productgroep AND product.id = order_regel.product AND order_regel.vers_order = vers_order.id AND vers_order.afleverdatum BETWEEN ? AND ? AND vers_order.hub = ? GROUP BY productgroep.naam ORDER BY number DESC LIMIT 10

</details>

supplier_dashboard

Bron. Eigen leveranciersorders per dag en top10 productgroepen → data.orders/data.products.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: order_regel, product, productgroep, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT afleverdatum AS delivery_date, count(*) AS orders FROM vers_order WHERE afleverdatum BETWEEN ? AND ? AND leverancier=? GROUP BY afleverdatum ORDER BY afleverdatum

SELECT productgroep.naam AS name, sum(order_regel.aantal) AS number FROM vers_order, order_regel, product, productgroep WHERE productgroep.id = product.productgroep AND product.id = order_regel.product AND order_regel.vers_order = vers_order.id AND vers_order.afleverdatum BETWEEN ? AND ? AND vers_order.leverancier = ? GROUP BY productgroep.naam ORDER BY number DESC LIMIT 10

</details>

logistics_dashboard

Bron. Orders met transporteur=user.leverancier_id per dag en top10 groepen → data.orders/data.products.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: order_regel, product, productgroep, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT afleverdatum AS delivery_date, count(*) AS orders FROM vers_order WHERE afleverdatum BETWEEN ? AND ? AND transporteur=? GROUP BY afleverdatum ORDER BY afleverdatum

SELECT productgroep.naam AS name, sum(order_regel.aantal) AS number FROM vers_order, order_regel, product, productgroep WHERE productgroep.id = product.productgroep AND product.id = order_regel.product AND order_regel.vers_order = vers_order.id AND vers_order.afleverdatum BETWEEN ? AND ? AND vers_order.transporteur = ? GROUP BY productgroep.naam ORDER BY number DESC LIMIT 10

</details>

customer_dashboard

Bron. Orders voor eerste user.locations GUID per dag en top10 groepen → data.orders/data.products; dispatch bouwt vooraf role-object.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lokatie, order_regel, product, productgroep, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT afleverdatum AS delivery_date, count(*) AS orders FROM vers_order WHERE afleverdatum BETWEEN ? AND ? AND lokatie IN( SELECT id FROM lokatie WHERE guid= ?) GROUP BY afleverdatum ORDER BY afleverdatum

SELECT productgroep.naam AS name, sum(order_regel.aantal) AS number FROM vers_order, order_regel, product, productgroep WHERE productgroep.id = product.productgroep AND product.id = order_regel.product AND order_regel.vers_order = vers_order.id AND vers_order.afleverdatum BETWEEN ? AND ? AND vers_order.lokatie IN ( SELECT id FROM lokatie WHERE guid = ?) GROUP BY productgroep.naam ORDER BY number DESC LIMIT 10

</details>

orders

Bron. Eigen leveranciersorders in periode met locatie/status en order_regels → data.orders.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: order_regels.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lokatie, order_status, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT vers_order.id AS order_id, lokatie.id AS location_id, lokatie.naam AS location_name, vers_order.afleverdatum AS delivery_date, order_status.naam AS status FROM vers_order, lokatie, order_status WHERE order_status.id = vers_order.order_status AND lokatie.id = vers_order.lokatie AND vers_order.leverancier = ? AND vers_order.afleverdatum BETWEEN ? AND ? AND (vers_order.app=false OR vers_order.app=true) ORDER BY vers_order.id

</details>

order_regels

Bron. vers_order-ID → productregels-array; weight weglaten bij stuk_gewicht=1.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::orders.
  • DB-objecten: order_regel, product. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT product.code, product.naam AS name, product.omschrijving_verpakking AS package_description, product.stuk_gewicht, order_regel.aantal AS number, order_regel.bestel_gewicht AS weight FROM product, order_regel WHERE product.id=order_regel.product AND order_regel.vers_order=? ORDER BY product.naam

</details>

products

Bron. Eigen orderproducten in periode geaggregeerd per naam/verpakking/datum → data.products.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: order_regel, product, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT vers_order.afleverdatum AS delivery_date, product.naam AS name, product.omschrijving_verpakking AS package_description, sum(order_regel.aantal) AS number FROM product, order_regel, vers_order WHERE product.id = order_regel.product AND order_regel.vers_order = vers_order.id AND vers_order.leverancier = ? AND vers_order.afleverdatum BETWEEN ? AND ? GROUP BY product.naam, product.omschrijving_verpakking, vers_order.afleverdatum ORDER BY vers_order.afleverdatum, product.naam

</details>

lmf_bezoeker

Bron. IP→bewaarde of via Base.ip_info nieuwe bezoeker; commit bij insert; kiest gebiedspagina of willekeurige fallback → pagina-hash.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: lmf_bezoeker, lmf_pagina. Writes: lmf_bezoeker; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM lmf_bezoeker WHERE ip_adres=?

INSERT INTO lmf_bezoeker(ip_adres, plaats, latitude, longitude) VALUES(?,?,?,?)

SELECT * FROM lmf_pagina WHERE ? BETWEEN west AND oost AND ? BETWEEN zuid AND noord

SELECT count(*) FROM lmf_pagina

SELECT * FROM lmf_pagina WHERE id=?

</details>

assignment

Bron. Connector debtor/date/packages → bestaande pakbonmeldingen of nieuwe LMF-pakbon/footer/HUB-registratie; commit, code/message; quantity=0→1.

  • Input: my ( $args ) = @_; HTTP-paramkeys: date, debtor, order_number, packages.
  • Aanroepen: lokatie_hub.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_emballage_artikel, leverancier_emballage_registratie, leverancier_pakbon, leverancier_pakbon_footer, lokatie, lokatie_leverancier. Writes: leverancier_emballage_registratie, leverancier_pakbon, leverancier_pakbon_footer; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM lokatie WHERE id IN ( SELECT lokatie FROM lokatie_leverancier WHERE debiteurnummer=? AND leverancier=?)

SELECT * FROM leverancier_pakbon WHERE leverancier=? AND lokatie=? AND lever_datum=?

SELECT * FROM leverancier_emballage_artikel WHERE leverancier=? AND code=?

INSERT INTO leverancier_pakbon(leverancier, lokatie, factuur_nummer, lever_datum, via_hub, hub, lmf_levering) VALUES(?,?,?,?,?,?,?) RETURNING id

INSERT INTO leverancier_pakbon_footer(leverancier_pakbon, totaal_emballage_bedrag) VALUES(?,?)

SELECT levering FROM leverancier_pakbon WHERE id=?

INSERT INTO leverancier_emballage_registratie(leverancier, leverancier_emballage_artikel, datum, hub, inkomend, lmf_user, leverancier_pakbon, levering) VALUES(?,?,?,?,?,?,?,?)

</details>

lokatie_hub

Bron. Locatie-ID → eerste leverancier met lokatie_leverancier.levering=2; hashref/undef.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::assignment.
  • DB-objecten: leverancier, lokatie_leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier WHERE id IN(SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

</details>

download_orders

Bron. Eigen status1-orders + debtor + productregels → data.orders; verandert orderstatus niet.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden. Modules: XLS::Datum::JSON_Datum.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lokatie_leverancier, order_regel, product, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT product.code, product.naam AS name, product.stuk_gewicht AS type, product.bestelgewicht AS product_weight, order_regel.aantal AS number, order_regel.bestel_gewicht AS weight FROM product, order_regel WHERE product.id = order_regel.product AND order_regel.vers_order=?

SELECT * FROM vers_order WHERE leverancier=? AND order_status=? ORDER BY id

SELECT debiteurnummer FROM lokatie_leverancier WHERE lokatie=? AND leverancier=?

</details>

upload_assortment

Bron. Stub: code200 en ontvangstmelding, geen verwerking.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

upload_invoices

Bron. Stub: code200 en ontvangstmelding, geen verwerking.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

upload_package_info

Bron. Stub: code200 en ontvangstmelding, geen verwerking.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

location_comment

Bron. Comment bij locatie-GUID opslaan, commit; klant REFRESH → code/message/locations; UPDATE niet op klant-ID begrensd.

  • Input: my ( $args ) = @_; HTTP-paramkeys: comment, location.
  • Aanroepen: klant.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: lokatie. Writes: lokatie; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

UPDATE lokatie SET bijzonderheden=? WHERE guid=?

</details>

hub_incoming_deliveries

Bron. HUB/leverancier/dag packages→inkomend en returned_packages→uitgaand; UPDATE/INSERT, bevestigd=1, bronlinks aanvullen, commit → code/message.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_date, packages, returned_packages, supplier_id.
  • Aanroepen: _emballage_source_reference.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_emballage_registratie. Writes: leverancier_emballage_registratie; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO leverancier_emballage_registratie( lmf_user, hub, leverancier_emballage_artikel, kvd, inkomend, datum, leverancier, bevestigd, leverancier_pakbon, levering) VALUES(?,?,?,?,?,?,?,?,?,?) RETURNING id

UPDATE leverancier_emballage_registratie SET inkomend=?, bevestigd=?, leverancier_pakbon=COALESCE(leverancier_pakbon, ?), levering=COALESCE(levering, ?) WHERE leverancier_emballage_artikel=? AND hub=? AND datum=? AND leverancier=?

INSERT INTO leverancier_emballage_registratie( lmf_user, hub, leverancier_emballage_artikel, kvd, uitgaand, datum, leverancier, bevestigd, leverancier_pakbon, levering) VALUES(?,?,?,?,?,?,?,?,?,?) RETURNING id

UPDATE leverancier_emballage_registratie SET uitgaand=?, bevestigd=?, leverancier_pakbon=COALESCE(leverancier_pakbon, ?), levering=COALESCE(levering, ?) WHERE leverancier_emballage_artikel=? AND hub=? AND datum=? AND leverancier=?

</details>

hub_outgoing_deliveries

Bron. HUB/locatie/dag packages→uitgaand INSERT, returned_packages→inkomend UPDATE/INSERT; bevestigd=1, bronlinks, commit → code/message.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_date, location_id, packages, returned_packages.
  • Aanroepen: _emballage_source_reference.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_emballage_registratie. Writes: leverancier_emballage_registratie; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO leverancier_emballage_registratie( lmf_user, hub, leverancier_emballage_artikel, kvd, uitgaand, datum, lokatie, bevestigd, leverancier_pakbon, levering) VALUES(?,?,?,?,?,?,?,?,?,?) RETURNING id

INSERT INTO leverancier_emballage_registratie( lmf_user, hub, leverancier_emballage_artikel, kvd, inkomend, datum, lokatie, bevestigd, leverancier_pakbon, levering) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING id

UPDATE leverancier_emballage_registratie SET inkomend = ?, bevestigd = ?, leverancier_pakbon=COALESCE(leverancier_pakbon, ?), levering=COALESCE(levering, ?) WHERE leverancier_emballage_artikel = ? AND hub = ? AND datum = ? AND lokatie = ?

</details>

emballagesource_reference

Bron. Expliciete pakbon/guid/levering of unieke HUB-partij-datumbron zoeken → pakbon/levering-hash of lege hash.

  • Input: my ( $args, $scope ) = @_; HTTP-paramkeys: delivery_id, leverancier_pakbon, levering.
  • Aanroepen: _emballage_source_reference_result, _lmf_positive_int.
  • Statische callers: XLS/LMF.pm::hub_incoming_deliveries; XLS/LMF.pm::hub_outgoing_deliveries.
  • DB-objecten: leverancier_pakbon. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, levering, hub, leverancier, lokatie, lever_datum FROM leverancier_pakbon WHERE id=?

SELECT id, levering, hub, leverancier, lokatie, lever_datum FROM leverancier_pakbon WHERE guid=?

SELECT id, levering, hub, leverancier, lokatie, lever_datum FROM leverancier_pakbon WHERE levering=?

SELECT id, levering, hub, leverancier, lokatie, lever_datum FROM leverancier_pakbon WHERE

</details>

emballagesource_reference_result

Bron. Gevonden bron en scope controleren → bron-ID-hash of lege hash.

  • Input: my ( $row, $scope ) = @_.
  • Aanroepen: _emballage_source_in_scope, _lmf_positive_int.
  • Statische callers: XLS/LMF.pm::_emballage_source_reference.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

emballagesource_in_scope

Bron. Aanwezige HUB/supplier/location/datumwaarden vergelijken → boolean; ontbrekende bronvelden blokkeren niet automatisch.

  • Input: my ( $row, $scope ) = @_.
  • Aanroepen: _lmf_positive_int.
  • Statische callers: XLS/LMF.pm::_emballage_source_reference_result.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

hub_incoming

Bron. Pakbonnen per leverancier/dag met eigen HUB, catalogus/locaties/registraties → data-array incoming/outgoing/ready/editable.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _location_date_key, _preload_locations_by_supplier_date, _preload_package_catalogs, _preload_registration_details_by_supplier_date.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier.id AS supplier_id, leverancier.naam AS supplier, leverancier.adres AS address, leverancier.postcode AS zipcode, leverancier.plaats AS city, leverancier.latitude, leverancier.longitude, leverancier_pakbon.lever_datum AS delivery_date FROM leverancier, leverancier_pakbon WHERE leverancier.id = leverancier_pakbon.leverancier AND leverancier_pakbon.hub = ? AND leverancier_pakbon.lever_datum BETWEEN ? AND ? GROUP BY leverancier.id, leverancier.naam,leverancier.adres, leverancier.postcode, leverancier.plaats, leverancier.latitude, leverancier_pakbon.lever_datum ORDER BY leverancier.naam, leverancier_pakbon.lever_datum

</details>

hub_outgoing

Bron. Pakbonnen per locatie/dag met eigen HUB, catalogus/leveranciers/registraties → data-array incoming/outgoing/ready/coords.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _location_date_key, _preload_basic_suppliers_by_location_date, _preload_package_catalogs, _preload_registration_details_by_location_date.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_pakbon, lokatie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie.id AS location_id, lokatie.naam AS location, lokatie.adres AS address, lokatie.postcode AS zipcode, lokatie.plaats AS city, lokatie.lat_lng, leverancier_pakbon.lever_datum AS delivery_date FROM lokatie, leverancier_pakbon WHERE lokatie.id = leverancier_pakbon.lokatie AND leverancier_pakbon.hub = ? AND leverancier_pakbon.lever_datum BETWEEN ? AND ? GROUP BY lokatie.id, lokatie.naam, leverancier_pakbon.lever_datum ORDER BY lokatie.naam, leverancier_pakbon.lever_datum

</details>

stop

Bron. Split samengestelde stop_id en dispatch delivery_stop/pickup_stop; onbekend type geeft undef.

  • Input: my ( $args ) = @_; HTTP-paramkeys: stop_id.
  • Aanroepen: delivery_stop, pickup_stop.
  • Statische callers: XLS/LMF.pm::handle_request; XLS/LMF.pm::_route_plan_update_route_locations; XLS/LMF.pm::_route_plan_route_location_payload.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

delivery_stop

Bron. Klantstop registreren: packages→afgeleverd, retour→opgehaald, UPDATE/INSERT op vandaag; commit → code/message/data.stops met volledige stops-response.

  • Input: my ( $args ) = @_; HTTP-paramkeys: packages, returned_packages, stop_id.
  • Aanroepen: _lmf_positive_int, stops. Modules: XLS::Datum::vandaag.
  • Statische callers: XLS/LMF.pm::stop.
  • DB-objecten: leverancier_emballage_registratie_stop, leverancier_pakbon. Writes: leverancier_emballage_registratie_stop; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier_pakbon WHERE id=?

INSERT INTO leverancier_emballage_registratie_stop( lmf_user, datum, lokatie, leverancier_emballage_artikel, opgehaald, afgeleverd, kvd, stop_id, leverancier_pakbon) VALUES(?,now(),?,?,?,?,?,?,?)

UPDATE leverancier_emballage_registratie_stop SET opgehaald=?, afgeleverd=?, leverancier_pakbon=COALESCE(leverancier_pakbon, ?) WHERE datum::date=? AND lokatie=? AND leverancier_emballage_artikel=? AND kvd=? AND stop_id=?

</details>

pickup_stop

Bron. HUB- of leveranciersstop registreren met dezelfde veldmapping; commit; berekent ongebruikte next_stop; retourneert code/message/data.stops.

  • Input: my ( $args ) = @_; HTTP-paramkeys: packages, returned_packages, stop_id.
  • Aanroepen: _lmf_positive_int, next_stop, stops. Modules: XLS::Datum::vandaag.
  • Statische callers: XLS/LMF.pm::stop.
  • DB-objecten: leverancier_emballage_registratie_stop, leverancier_pakbon. Writes: leverancier_emballage_registratie_stop; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier_pakbon WHERE id=?

INSERT INTO leverancier_emballage_registratie_stop( lmf_user, datum, hub, leverancier_emballage_artikel, opgehaald, afgeleverd, kvd, stop_id, leverancier_pakbon) VALUES(?,now(),?,?,?,?,?,?,?)

UPDATE leverancier_emballage_registratie_stop SET opgehaald=?, afgeleverd=?, leverancier_pakbon=COALESCE(leverancier_pakbon, ?) WHERE datum::date=? AND hub=? AND leverancier_emballage_artikel=? AND kvd=? AND stop_id=?

INSERT INTO leverancier_emballage_registratie_stop( lmf_user, datum, leverancier, leverancier_emballage_artikel, opgehaald, afgeleverd, kvd, stop_id, leverancier_pakbon) VALUES(?,now(),?,?,?,?,?,?,?)

UPDATE leverancier_emballage_registratie_stop SET opgehaald=?, afgeleverd=?, leverancier_pakbon=COALESCE(leverancier_pakbon, ?) WHERE datum::date=? AND leverancier=? AND leverancier_emballage_artikel=? AND kvd=? AND stop_id=?

</details>

next_stop

Bron. Transporteur/dag pakbonnen en registratiezoeken → één volgende stop/undef; lookup-ID mist pakbondeel; geen routeoptimalisatie.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::pickup_stop.
  • DB-objecten: leverancier, leverancier_emballage_registratie_stop, leverancier_pakbon, lokatie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT leverancier_pakbon.id, leverancier_pakbon.levering AS delivery_id, leverancier.id AS supplier_id, leverancier.naam AS supplier_name, leverancier.adres AS supplier_address, leverancier.postcode AS supplier_postcode, leverancier.plaats AS supplier_plaats, leverancier.longitude, leverancier.latitude, lokatie.id AS location_id, lokatie.naam AS location_name, lokatie.adres AS location_adres, lokatie.postcode AS location_postcode, lokatie.aflever_nummer AS location_huisnummer, lokatie.aflever_toevoeging AS location_toevoeging, lokatie.plaats AS location_plaats, lokatie.lat_lng, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.hub FROM leverancier, lokatie, leverancier_pakbon WHERE leverancier_pakbon.transporteur = ? AND leverancier_pakbon.lever_datum BETWEEN ? AND ? AND leverancier.id = leverancier_pakbon.hub AND lokatie.id = leverancier_pakbon.lokatie ORDER BY leverancier_pakbon.lever_datum

SELECT * FROM leverancier_emballage_registratie_stop WHERE datum::date=? AND stop_id=?

</details>

stops

Bron. Pakbonnen voor user.route/periode → per HUB/locatie gededupliceerde stops; ontbrekende levering schrijven/commit; ready/visit uit stopregistratie; code/role/data.route/data.stops.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: emballage_artikelen_hub, new, role. Modules: Data::GUID::new.
  • Statische callers: XLS/LMF.pm::handle_request; XLS/LMF.pm::delivery_stop; XLS/LMF.pm::pickup_stop.
  • DB-objecten: leverancier, leverancier_emballage_registratie_stop, leverancier_pakbon, lokatie, route_lokatie. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT leverancier_pakbon.id, leverancier_pakbon.levering AS delivery_id, leverancier.id AS supplier_id, leverancier.naam AS supplier_name, leverancier.adres AS supplier_address, leverancier.postcode AS supplier_postcode, leverancier.plaats AS supplier_plaats, leverancier.longitude, leverancier.latitude, lokatie.id AS location_id, lokatie.naam AS location_name, lokatie.adres AS location_adres, lokatie.postcode AS location_postcode, lokatie.aflever_nummer AS location_huisnummer, lokatie.aflever_toevoeging AS location_toevoeging, lokatie.plaats AS location_plaats, lokatie.lat_lng, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.hub, route_lokatie.route, route_lokatie.nummer FROM leverancier, lokatie, leverancier_pakbon, route_lokatie WHERE leverancier_pakbon.lever_datum BETWEEN ? AND ? AND leverancier.id = leverancier_pakbon.hub AND lokatie.id = leverancier_pakbon.lokatie AND lokatie.id = route_lokatie.lokatie AND route_lokatie.route = ? ORDER BY route_lokatie.nummer

UPDATE leverancier_pakbon SET levering=? WHERE id=?

SELECT * FROM leverancier_emballage_registratie_stop WHERE datum::date=? AND stop_id=?

SELECT * FROM leverancier_emballage_registratie_stop WHERE datum::date=? AND stop_id=?

</details>

return_packaging

Bron. Leest eerste pakbon bij levering en HUB → code/message/pakbon/hub/delivery_id; GEEN registratie ondanks melding.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_id.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier_pakbon WHERE levering=? LIMIT 1

SELECT * FROM leverancier WHERE id=?

</details>

accept_new_delivery

Bron. Vrije pakbon.guid accepteren: status0→1, geaccepteerd now, transporteur; commit → code/message.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_id.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_pakbon. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier_pakbon WHERE guid=?

UPDATE leverancier_pakbon SET geaccepteerd=now(), status_levering=?, transporteur=? WHERE guid=?

</details>

confirm_delivery

Bron. Pakbon.guid en actorbevestiging; INSERT bevestiging en outbound geleverd_volgens_leverancier; commit + optionele bestanden; code/message; retour en statuswrite ontbreken.

  • Input: my ( $args ) = @_; HTTP-paramkeys: comment, delivery_id, outbound_packages, photo, signature.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_pakbon, leverancier_pakbon_emballage, leverancier_pakbon_levering. Writes: leverancier_pakbon_emballage, leverancier_pakbon_levering; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier_pakbon WHERE guid=? AND leverancier=?

SELECT * FROM leverancier_pakbon WHERE guid=?

SELECT * FROM leverancier_pakbon_levering WHERE leverancier_pakbon=? AND lmf_user=?

INSERT INTO leverancier_pakbon_levering(leverancier_pakbon, datum, commentaar, lmf_user) VALUES(?,now(),?,?)

UPDATE leverancier_pakbon_emballage SET geleverd_volgens_leverancier=? WHERE leverancier_emballage_artikel=? AND kvd=? AND leverancier_pakbon=?

INSERT INTO leverancier_pakbon_emballage(leverancier_pakbon, leverancier_emballage_artikel, kvd, geleverd_volgens_leverancier) VALUES(?,?,?,?)

</details>

new_supplier_delivery

Bron. Locatie-GUID/periode/packages → pakbon+footer+leveranciersaantallen; waarde som prijs×aantal; commit → code/message; bestaat supplier/location/datum al dan fout.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_date, location, packages.
  • Aanroepen: new. Modules: Data::GUID::new.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_emballage_artikel, leverancier_pakbon, leverancier_pakbon_emballage, leverancier_pakbon_footer, lokatie. Writes: leverancier_pakbon, leverancier_pakbon_emballage, leverancier_pakbon_footer; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM lokatie WHERE guid=?

SELECT id FROM leverancier_pakbon WHERE leverancier=? AND lokatie=? AND lever_datum=?

SELECT id FROM leverancier_pakbon WHERE leverancier=?

INSERT INTO leverancier_pakbon(leverancier, lokatie, lever_datum, factuur_nummer, guid, lmf_levering) VALUES(?,?,?,?,?,?) RETURNING id

INSERT INTO leverancier_pakbon_footer(leverancier_pakbon, totaal_netto_regel_bedrag, grondslag_bedrag_btw_hoog, grondslag_bedrag_btw_laag, grondslag_bedrag_btw_nul, btw_bedrag_hoog, btw_bedrag_laag, btw_percentage_laag, btw_percentage_hoog, totaal_btw_bedrag, totaal_emballage_bedrag, totaal_factuur_bedrag) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING id

SELECT * FROM leverancier_emballage_artikel WHERE id=?

UPDATE leverancier_pakbon_emballage SET geleverd_volgens_leverancier=? WHERE leverancier_pakbon=? AND leverancier_emballage_artikel=?

INSERT INTO leverancier_pakbon_emballage(leverancier_pakbon, leverancier_emballage_artikel, geleverd_volgens_leverancier, kvd) VALUES(?,?,?,?)

UPDATE leverancier_pakbon_footer SET totaal_emballage_bedrag=? WHERE leverancier_pakbon=?

</details>

update_supplier_delivery

Bron. Pakbon.guid/packages → actuele geleverd-aantallen en footerbedrag; commit → code/message; geen supplier-eigendomsfilter en geen kvd-key.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_id, packages.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_emballage_artikel, leverancier_pakbon, leverancier_pakbon_emballage, leverancier_pakbon_footer. Writes: leverancier_pakbon_emballage, leverancier_pakbon_footer; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT id FROM leverancier_pakbon WHERE guid=?

SELECT * FROM leverancier_emballage_artikel WHERE id=?

UPDATE leverancier_pakbon_emballage SET geleverd=? WHERE leverancier_pakbon=? AND leverancier_emballage_artikel=?

INSERT INTO leverancier_pakbon_emballage(leverancier_pakbon, leverancier_emballage_artikel, geleverd) VALUES(?,?,?)

UPDATE leverancier_pakbon_footer SET totaal_emballage_bedrag=? WHERE leverancier_pakbon=?

</details>

new_supplier_deliveries

Bron. Datumrange/status0/lmf_levering → vrije deliveries en role; ontbrekende pakbon.guid schrijven/commit; fallback krat indien geen emballage.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: new, packages, role. Modules: Data::GUID::new, XLS::Datum::JSON_Datum, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon, leverancier_pakbon_regel, lokatie, lokatie_leverancier. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie.guid AS id, lokatie.id AS lokatie_id, lokatie.naam AS name, lokatie.adres AS address, lokatie.postcode, lokatie.plaats AS city, lokatie.lat_lng, leverancier.guid AS supplier_id, leverancier.naam AS supplier_name, leverancier.adres AS supplier_address, leverancier.postcode AS supplier_postcode, leverancier.plaats AS supplier_city, leverancier.latitude AS supplier_latitude, leverancier.longitude AS supplier_longitude, leverancier_pakbon.guid AS delivery_id, leverancier_pakbon.lever_datum AS delivery_date, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM lokatie, leverancier, leverancier_pakbon LEFT JOIN leverancier_pakbon_regel ON leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id WHERE leverancier.id = leverancier_pakbon.leverancier AND lokatie.id = leverancier_pakbon.lokatie AND leverancier_pakbon.lever_datum >= ? AND leverancier_pakbon.lever_datum <= ? AND leverancier_pakbon.status_levering = ? AND leverancier_pakbon.lmf_levering = ? GROUP BY lokatie.guid, lokatie.id, lokatie.naam, lokatie.adres, lokatie.postcode, lokatie.plaats, leverancier.guid, leverancier.naam, leverancier.adres, leverancier.postcode, leverancier.plaats, leverancier.latitude, leverancier.longitude, leverancier_pakbon.guid, leverancier_pakbon.lever_datum, lokatie.lat_lng ORDER BY leverancier_pakbon.lever_datum

SELECT * FROM leverancier WHERE id IN ( SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND (levering=? OR levering=?))

UPDATE leverancier_pakbon SET guid=? WHERE lokatie=? AND lever_datum=?

</details>

next_logistics_delivery

Bron. Eerste niet-afgeleverde pakbon voor transporteur OF HUB in periode → deliveries/role; ontbrekende levering invullen; supplier/package/catalogusdetails.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: leveranciers, logistic_packages, new, packaging, role. Modules: Data::GUID::new, XLS::Datum::JSON_Datum, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon, leverancier_pakbon_regel, lokatie, lokatie_leverancier. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie.guid AS id, lokatie.id AS lokatie_id, lokatie.naam AS name, lokatie.adres AS address, lokatie.postcode, lokatie.plaats AS city, lokatie.lat_lng, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.status_levering AS status, leverancier_pakbon.levering AS delivery_id, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM lokatie, leverancier_pakbon, leverancier_pakbon_regel WHERE lokatie.id = leverancier_pakbon.lokatie AND (leverancier_pakbon.transporteur = ? OR leverancier_pakbon.hub=?) AND leverancier_pakbon.lever_datum >= ? AND leverancier_pakbon.lever_datum <= ? AND leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id AND leverancier_pakbon.afgeleverd IS NULL GROUP BY lokatie.guid, lokatie.id, lokatie.naam, lokatie.adres, lokatie.postcode, lokatie.plaats, leverancier_pakbon.levering, leverancier_pakbon.lever_datum, leverancier_pakbon.status_levering, lokatie.lat_lng ORDER BY leverancier_pakbon.lever_datum LIMIT 1

SELECT * FROM leverancier WHERE id IN ( SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

SELECT * FROM leverancier WHERE id IN ( SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

UPDATE leverancier_pakbon SET levering=? WHERE lokatie=? AND lever_datum=?

</details>

logistics_pickup

Bron. Eerste levering-ID voor transporteur OF HUB → pickup-object/status/packages/packaging en role; geen actieve write in deze functie.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_id.
  • Aanroepen: leveranciers, logistic_packages, new, packaging, role. Modules: Data::GUID::new, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon, leverancier_pakbon_regel. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier.guid AS id, leverancier.id AS supplier_id, leverancier.naam AS name, leverancier.adres AS address, leverancier.postcode, leverancier.plaats AS city, leverancier.latitude, leverancier.longitude, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.status_levering AS status, leverancier_pakbon.hub, leverancier_pakbon.transporteur AS carrier, leverancier_pakbon.levering AS delivery_id, leverancier_pakbon.lokatie AS lokatie_id, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM leverancier, leverancier_pakbon, leverancier_pakbon_regel WHERE leverancier.id = leverancier_pakbon.leverancier AND (leverancier_pakbon.transporteur = ? OR leverancier_pakbon.hub=?) AND leverancier_pakbon.levering = ? AND leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id GROUP BY leverancier.guid, leverancier.id, leverancier.naam, leverancier.adres, leverancier.postcode, leverancier.plaats, leverancier_pakbon.hub, leverancier_pakbon.transporteur, leverancier_pakbon.levering, leverancier_pakbon.lokatie, leverancier_pakbon.lever_datum, leverancier_pakbon.status_levering, leverancier.latitude, leverancier.longitude ORDER BY leverancier_pakbon.lever_datum LIMIT 1

SELECT * FROM leverancier WHERE id=?

SELECT * FROM leverancier WHERE id=?

</details>

logistics_delivery

Bron. Levering-ID voor transporteur OF HUB → delivery-object + role; partner/supplier/packageinformatie; bevat GUID-writefallback.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_id.
  • Aanroepen: leveranciers, logistic_packages, new, packaging, role. Modules: Data::GUID::new, XLS::Datum::JSON_Datum, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon, leverancier_pakbon_regel, lokatie, lokatie_leverancier. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie.guid AS id, lokatie.id AS lokatie_id, lokatie.naam AS name, lokatie.adres AS address, lokatie.postcode, lokatie.plaats AS city, lokatie.lat_lng, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.status_levering AS status, leverancier_pakbon.levering AS delivery_id, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM lokatie, leverancier_pakbon, leverancier_pakbon_regel WHERE lokatie.id = leverancier_pakbon.lokatie AND (leverancier_pakbon.transporteur = ? OR leverancier_pakbon.hub=?) AND leverancier_pakbon.levering = ? AND leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id GROUP BY lokatie.guid, lokatie.id, lokatie.naam, lokatie.adres, lokatie.postcode, lokatie.plaats, leverancier_pakbon.levering, leverancier_pakbon.lever_datum, leverancier_pakbon.status_levering, lokatie.lat_lng ORDER BY leverancier_pakbon.lever_datum LIMIT 1

SELECT * FROM leverancier WHERE id IN ( SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

SELECT * FROM leverancier WHERE id IN ( SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

UPDATE leverancier_pakbon SET levering=? WHERE lokatie=? AND lever_datum=?

</details>

logistics_deliveries

Bron. Eigen user.route + actieve projectmarktplaatsen + actieve klantlocaties → gesorteerde deliveries/role; GUID-writefallback; status5 maakt niet editable.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, start_date.
  • Aanroepen: _lmf_positive_int, _location_partner, _preload_delivery_packages, _preload_location_delivery_suppliers_for_records, _preload_location_partners, leveranciers, logistic_packages, new, role. Modules: Data::GUID::new, XLS::Datum::JSON_Datum, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: klant, leverancier, leverancier_marktplaats, leverancier_pakbon, leverancier_pakbon_regel, lmf_project, lmf_user_project, lokatie, route, route_lokatie, vers_order. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie.guid AS id, lokatie.id AS lokatie_id, lokatie.naam AS name, lokatie.adres AS address, lokatie.postcode, lokatie.plaats AS city, lokatie.lat_lng, lokatie.bijzonderheden AS comment, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.status_levering AS status, leverancier_pakbon.levering AS delivery_id, route_location_order.nummer AS volgnummer, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM leverancier_pakbon JOIN lokatie ON lokatie.id = leverancier_pakbon.lokatie JOIN klant ON klant.id = lokatie.klant LEFT JOIN vers_order ON vers_order.id = leverancier_pakbon.vers_order JOIN leverancier_pakbon_regel ON leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id JOIN ( SELECT routed_stop.lokatie, MIN(routed_stop.nummer) FILTER ( WHERE routed_stop.nummer IS NOT NULL AND routed_stop.nummer >= 0 ) AS nummer, CASE WHEN COUNT(*) FILTER ( WHERE routed_stop.nummer IS NOT NULL AND routed_stop.nummer >= 0 ) > 0 THEN 0 ELSE 1 END AS nummer_missing, MIN(routed_stop.route_lokatie_id) AS route_lokatie_id FROM ( SELECT route_lokatie.lokatie, route_lokatie.nummer, route_lokatie.id AS route_lokatie_id FROM route_lokatie JOIN route route_location_scope ON route_location_scope.id = route_lokatie.route JOIN lokatie route_location_lokatie ON route_location_lokatie.id = route_lokatie.lokatie JOIN klant route_location_klant ON route_location_klant.id = route_location_lokatie.klant WHERE route_lokatie.route = ? AND route_lokatie.lokatie IS NOT NULL AND route_location_klant.actief IS TRUE AND route_location_lokatie.actief IS TRUE AND route_location_lokatie.postcode != '' AND lower(replace(route_location_lokatie.postcode, ' ', '')) != '1066jc' AND length(replace(route_location_lokatie.postcode, ' ', '')) = 6 AND lower(replace(route_location_lokatie.naam, ' ', '')) != lower(replace(route_location_lokatie.postcode, ' ', '')) AND route_location_klant.marktplaats IN ( SELECT leverancier_marktplaats.marktplaats FROM leverancier_marktplaats WHERE leverancier_marktplaats.leverancier = route_location_scope.leverancier ) UNION ALL SELECT route_supplier_pakbon.lokatie, route_lokatie.nummer, route_lokatie.id AS route_lokatie_id FROM route_lokatie JOIN route route_location_scope ON route_location_scope.id = route_lokatie.route JOIN leverancier route_location_leverancier ON route_location_leverancier.id = route_lokatie.leverancier JOIN leverancier_pakbon route_supplier_pakbon ON route_supplier_pakbon.leverancier = route_lokatie.leverancier JOIN lokatie route_location_lokatie ON route_location_lokatie.id = route_supplier_pakbon.lokatie JOIN klant route_location_klant ON route_location_klant.id = route_location_lokatie.klant WHERE route_lokatie.route = ? AND route_lokatie.leverancier IS NOT NULL AND route_location_leverancier.actief IS TRUE AND NOT EXISTS ( SELECT 1 FROM route_lokatie route_customer WHERE route_customer.route = route_lokatie.route AND route_customer.lokatie IS NOT NULL ) AND route_supplier_pakbon.lever_datum BETWEEN ? AND ? AND route_location_klant.actief IS TRUE AND route_location_lokatie.actief IS TRUE AND route_location_lokatie.postcode != '' AND lower(replace(route_location_lokatie.postcode, ' ', '')) != '1066jc' AND length(replace(route_location_lokatie.postcode, ' ', '')) = 6 AND lower(replace(route_location_lokatie.naam, ' ', '')) != lower(replace(route_location_lokatie.postcode, ' ', '')) AND route_location_klant.marktplaats IN ( SELECT leverancier_marktplaats.marktplaats FROM leverancier_marktplaats WHERE leverancier_marktplaats.leverancier = route_location_scope.leverancier ) ) routed_stop GROUP BY routed_stop.lokatie ) route_location_order ON route_location_order.lokatie = lokatie.id WHERE EXISTS ( SELECT 1 FROM lmf_user_project JOIN lmf_project ON lmf_project.id = lmf_user_project.lmf_project WHERE lmf_user_project.lmf_user = ? AND lmf_user_project.actief IS TRUE AND lmf_project.marktplaats = klant.marktplaats ) AND leverancier_pakbon.lever_datum BETWEEN ? AND ? AND (vers_order.marktplaats IS NULL OR vers_order.marktplaats = klant.marktplaats) GROUP BY lokatie.guid, lokatie.id, lokatie.naam, lokatie.adres, lokatie.postcode, lokatie.plaats, leverancier_pakbon.levering, leverancier_pakbon.lever_datum, leverancier_pakbon.status_levering, lokatie.lat_lng, route_location_order.nummer, route_location_order.nummer_missing, route_location_order.route_lokatie_id ORDER BY route_location_order.nummer_missing, route_location_order.nummer, route_location_order.route_lokatie_id, lokatie.id, leverancier_pakbon.lever_datum, lokatie.naam

UPDATE leverancier_pakbon SET levering=? WHERE lokatie=? AND lever_datum=?

</details>

leveranciers

Bron. Locatie/datum → supplierdetail-array via requestcache/projectscope, optioneel HUB-filter en fallback aantallen; packages per pakbon.guid.

  • Input: my ($args) = @_.
  • Aanroepen: _location_date_key, _preload_location_delivery_suppliers_for_records, packages.
  • Statische callers: XLS/LMF.pm::next_logistics_delivery; XLS/LMF.pm::logistics_pickup; XLS/LMF.pm::logistics_delivery; XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::customer_delivery; XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

customer_delivery

Bron. Klant-ID + levering-ID → deliveries/role, partners/coords; bevat GUID-writefallback.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_id.
  • Aanroepen: leveranciers, new, role. Modules: Data::GUID::new, XLS::Datum::JSON_Datum, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier, leverancier_pakbon, leverancier_pakbon_regel, lokatie, lokatie_leverancier. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie.guid AS id, lokatie.id AS lokatie_id, lokatie.naam AS name, lokatie.adres AS address, lokatie.postcode, lokatie.plaats AS city, leverancier_pakbon.levering AS delivery_id, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.status_levering AS status, lokatie.lat_lng, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM lokatie, leverancier_pakbon LEFT JOIN leverancier_pakbon_regel ON leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id WHERE lokatie.id = leverancier_pakbon.lokatie AND lokatie.klant = ? AND leverancier_pakbon.levering = ? GROUP BY lokatie.guid, lokatie.id, lokatie.naam, lokatie.adres, lokatie.postcode, lokatie.plaats, leverancier_pakbon.levering, leverancier_pakbon.lever_datum, leverancier_pakbon.status_levering, lokatie.lat_lng ORDER BY leverancier_pakbon.lever_datum

SELECT * FROM leverancier WHERE id IN ( SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

SELECT * FROM leverancier WHERE id IN ( SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

UPDATE leverancier_pakbon SET levering=? WHERE lokatie=? AND lever_datum=?

</details>

customer_deliveries

Bron. Klant-ID + locatie-GUID + datum → deliveries/role met ETA/emballage; kan GUID schrijven; bestaande emballage geeft response-status5.

  • Input: my ( $args ) = @_; HTTP-paramkeys: end_date, location_id, start_date.
  • Aanroepen: _location_partner, _preload_guid_packages, _preload_location_delivery_suppliers_for_records, _preload_location_partners, _preload_suppliers_by_id, _supplier_by_id, leveranciers, new, packages, role. Modules: Data::GUID::new, XLS::Datum::JSON_Datum, XLS::Datum::JSON_Timestamp, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_pakbon, leverancier_pakbon_levering, leverancier_pakbon_regel, lokatie, order_status. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT lokatie.guid AS id, lokatie.id AS lokatie_id, lokatie.naam AS name, lokatie.adres AS address, lokatie.postcode, lokatie.plaats AS city, leverancier_pakbon.guid AS slip_id, leverancier_pakbon.levering AS delivery_id, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.status_levering AS status, leverancier_pakbon.leverancier AS supplier_id, lokatie.lat_lng, leverancier_pakbon_levering.datum AS delivery_time, leverancier_pakbon_levering.eta AS eta, order_status.naam AS delivery_status, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM lokatie, leverancier_pakbon LEFT JOIN leverancier_pakbon_regel ON leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id LEFT JOIN leverancier_pakbon_levering ON leverancier_pakbon_levering.leverancier_pakbon = leverancier_pakbon.id LEFT JOIN order_status ON order_status.id = leverancier_pakbon_levering.order_status WHERE leverancier_pakbon.lokatie = lokatie.id AND lokatie.klant = ? AND lokatie.guid = ? AND leverancier_pakbon.lever_datum BETWEEN ? AND ? GROUP BY lokatie.guid, lokatie.id, lokatie.naam, lokatie.adres, lokatie.postcode, lokatie.plaats, leverancier_pakbon.id, leverancier_pakbon.levering, leverancier_pakbon.lever_datum, leverancier_pakbon.status_levering, leverancier_pakbon_levering.datum, leverancier_pakbon_levering.eta, order_status.naam, lokatie.lat_lng ORDER BY leverancier_pakbon.lever_datum

UPDATE leverancier_pakbon SET levering=? WHERE lokatie=? AND lever_datum=?

</details>

supplier_deliveries

Bron. Eigen supplier-ID + datumrange of pakbon.guid → deliveries/role; GUID-writefallback; bij emballage response-status delivered.

  • Input: my ( $args ) = @_; HTTP-paramkeys: delivery_id, end_date, start_date.
  • Aanroepen: _location_partner, _preload_guid_packages, _preload_location_delivery_suppliers_for_records, _preload_location_partners, leveranciers, new, packages, role. Modules: Data::GUID::new, XLS::Datum::JSON_Datum, XLS::Datum::today.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_pakbon, leverancier_pakbon_regel, lokatie. Writes: leverancier_pakbon; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie.guid AS id, lokatie.id AS lokatie_id, lokatie.naam AS name, lokatie.adres AS address, lokatie.postcode, lokatie.plaats AS city, lokatie.lat_lng, leverancier_pakbon.guid AS delivery_id, leverancier_pakbon.leverancier, leverancier_pakbon.lever_datum AS delivery_date, leverancier_pakbon.status_levering AS status, sum(leverancier_pakbon_regel.besteld_aantal) AS packages FROM lokatie, leverancier_pakbon LEFT JOIN leverancier_pakbon_regel ON leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id WHERE lokatie.id = leverancier_pakbon.lokatie AND leverancier_pakbon.leverancier = ? AND

UPDATE leverancier_pakbon SET guid=? WHERE lokatie=? AND lever_datum=?

</details>

_placeholders

Bron. Aantal → kommagescheiden SQL-vraagtekens.

  • Input: my ($count) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_dash_in_clause; XLS/LMF.pm::_preload_location_partners; XLS/LMF.pm::_preload_suppliers_by_id; XLS/LMF.pm::_preload_package_catalogs; XLS/LMF.pm::_preload_locations_by_supplier_date; XLS/LMF.pm::_preload_basic_suppliers_by_location_date; XLS/LMF.pm::_preload_registration_details_by_entity_date; XLS/LMF.pm::_preload_dash_registration_details_by_entity_date; XLS/LMF.pm::_preload_guid_packages; XLS/LMF.pm::_preload_delivery_packages; XLS/LMF.pm::_preload_packaging; XLS/LMF.pm::_preload_location_delivery_suppliers_for_records.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashin_clause

Bron. Kolom en waarden → IN-clausule plus unieke positieve integerbinds.

  • Input: my ($column, $values) = @_.
  • Aanroepen: _lmf_positive_int, _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::dash_customers; XLS/LMF.pm::dash_route_customers; XLS/LMF.pm::dash_suppliers; XLS/LMF.pm::dash_orders.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashroute_number_value

Bron. Geheel niet-negatief routenummer → numeriek of undef.

  • Input: my ($number) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_dash_route_number_sort.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashroute_number_sort

Bron. Twee routenummers → comparator, ongeldige waarden achteraan.

  • Input: my ($left, $right) = @_.
  • Aanroepen: _dash_route_number_value.
  • Statische callers: XLS/LMF.pm::dash_route_customers.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

uniquedefined_values

Bron. Lijst → unieke gedefinieerde niet-lege waarden.

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_dash_marketplace_scope; XLS/LMF.pm::_dash_supplier_marketplaces; XLS/LMF.pm::_dash_in_clause; XLS/LMF.pm::_preload_location_partners; XLS/LMF.pm::_preload_suppliers_by_id; XLS/LMF.pm::_preload_package_catalogs; XLS/LMF.pm::_preload_locations_by_supplier_date; XLS/LMF.pm::_preload_basic_suppliers_by_location_date; XLS/LMF.pm::_preload_registration_details_by_entity_date; XLS/LMF.pm::_preload_dash_registration_details_by_entity_date; XLS/LMF.pm::_preload_guid_packages; XLS/LMF.pm::_preload_delivery_packages; XLS/LMF.pm::_preload_packaging; XLS/LMF.pm::_preload_location_delivery_suppliers_for_records.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

lmfpositive_int

Bron. Waarde → boolean strikt positief geheel getal.

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations; XLS/LMF.pm::_route_plan_route_location_payload; XLS/LMF.pm::_dash_marketplace_scope; XLS/LMF.pm::_dash_supplier_marketplaces; XLS/LMF.pm::dash_route_customers; XLS/LMF.pm::_emballage_source_reference; XLS/LMF.pm::_emballage_source_reference_result; XLS/LMF.pm::_emballage_source_in_scope; XLS/LMF.pm::delivery_stop; XLS/LMF.pm::pickup_stop; XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::_dash_in_clause; XLS/LMF.pm::_logistics_route.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

lmftruthy

Bron. Niet-referentiewaarde → Perl-truthiness 0/1; geen string false-parser.

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::_route_plan_update_route_locations; XLS/LMF.pm::_dash_marketplace_scope.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

locationdate_key

Bron. Partij-ID/datum → interne cachekey met scheidingsteken.

  • Input: my ($location_id, $delivery_date) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::hub_orders; XLS/LMF.pm::hub_incoming; XLS/LMF.pm::hub_outgoing; XLS/LMF.pm::leveranciers; XLS/LMF.pm::_preload_locations_by_supplier_date; XLS/LMF.pm::_preload_basic_suppliers_by_location_date; XLS/LMF.pm::_preload_registration_details_by_entity_date; XLS/LMF.pm::_preload_location_delivery_suppliers_for_records.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dashregistration_key

Bron. HUB/partij/datum → interne cachekey.

  • Input: my ($hub_id, $entity_id, $delivery_date) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::dash_orders; XLS/LMF.pm::_preload_dash_registration_details_by_entity_date.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

preloadlocation_partners

Bron. Locatie-ID-lijst → requestcache van HUB/transportpartner (levering2/4); kiest eerste volgens supplier-ID; geen DB-writes.

  • Input: my ( $args, $location_ids ) = @_.
  • Aanroepen: _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries; XLS/LMF.pm::_location_partner.
  • DB-objecten: leverancier, lokatie_leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT lokatie_leverancier.lokatie AS lokatie_id, lokatie_leverancier.levering, leverancier.* FROM lokatie_leverancier JOIN leverancier ON leverancier.id = lokatie_leverancier.leverancier WHERE lokatie_leverancier.lokatie IN (

</details>

locationpartner

Bron. Locatie en leveringtype → gecachte supplier-hash/undef, lazy preload.

  • Input: my ( $args, $location_id, $delivery_type ) = @_.
  • Aanroepen: _preload_location_partners.
  • Statische callers: XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

preloadsuppliers_by_id

Bron. Supplier-ID-lijst → requestcache supplierrecords; geen DB-writes.

  • Input: my ( $args, $supplier_ids ) = @_.
  • Aanroepen: _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::_supplier_by_id.
  • DB-objecten: leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier WHERE id IN (

</details>

supplierby_id

Bron. Supplier-ID → gecachte hash/undef, lazy preload.

  • Input: my ( $args, $supplier_id ) = @_.
  • Aanroepen: _preload_suppliers_by_id.
  • Statische callers: XLS/LMF.pm::customer_deliveries.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

registrationtotals

Bron. Detailrijen → vier totalen: inkomend/uitgaand en beide volumes; geen nettosaldo.

  • Input: my ( $rows ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::hub_orders; XLS/LMF.pm::dash_orders.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

preloadpackage_catalogs

Bron. Supplier-ID-lijst → requestcache catalogus package_id/name per leverancier, op volgorde.

  • Input: my ( $args, $supplier_ids ) = @_.
  • Aanroepen: _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::hub_incoming; XLS/LMF.pm::hub_outgoing.
  • DB-objecten: leverancier_emballage_artikel. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_emballage_artikel.leverancier AS supplier_id, leverancier_emballage_artikel.id AS package_id, leverancier_emballage_artikel.omschrijving AS name FROM leverancier_emballage_artikel WHERE leverancier_emballage_artikel.leverancier IN (

</details>

preloadlocations_by_supplier_date

Bron. Supplier/date-records → requestcache locatie-ID/naam per combinatie; pakbonread, geen extra HUB-filter.

  • Input: my ( $args, $records ) = @_.
  • Aanroepen: _location_date_key, _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::hub_incoming.
  • DB-objecten: leverancier_pakbon, lokatie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_pakbon.leverancier AS supplier_id, leverancier_pakbon.lever_datum AS delivery_date, lokatie.id AS location_id, lokatie.naam AS name FROM leverancier_pakbon JOIN lokatie ON lokatie.id = leverancier_pakbon.lokatie WHERE leverancier_pakbon.leverancier IN (

</details>

preloadbasic_suppliers_by_location_date

Bron. Location/date-records → requestcache supplier-ID/naam per combinatie; pakbonread.

  • Input: my ( $args, $records ) = @_.
  • Aanroepen: _location_date_key, _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::hub_outgoing.
  • DB-objecten: leverancier, leverancier_pakbon. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_pakbon.lokatie AS location_id, leverancier_pakbon.lever_datum AS delivery_date, leverancier.id AS supplier_id, leverancier.naam AS name FROM leverancier_pakbon JOIN leverancier ON leverancier.id = leverancier_pakbon.leverancier WHERE leverancier_pakbon.lokatie IN (

</details>

preloadregistration_details_by_entity_date

Bron. Args/HUB/records/veld/kolom/cachenaam → geaggregeerde inkomend/uitgaand/confirmed/volumes in requestcache; geen DB-writes.

  • Input: my ( $args, $hub_id, $records, $record_field, $entity_column, $cache_name ) = @_.
  • Aanroepen: _location_date_key, _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::_preload_registration_details_by_supplier_date; XLS/LMF.pm::_preload_registration_details_by_location_date.
  • DB-objecten: leverancier_emballage_artikel, leverancier_emballage_registratie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_emballage_registratie.

AS entity_id, leverancier_emballage_registratie.datum AS delivery_date, leverancier_emballage_artikel.id, leverancier_emballage_artikel.omschrijving AS name, leverancier_emballage_registratie.kvd AS package_type, sum(COALESCE(leverancier_emballage_registratie.inkomend, 0)) AS incoming_number, sum(COALESCE(leverancier_emballage_registratie.uitgaand, 0)) AS outgoing_number, max(CASE WHEN leverancier_emballage_registratie.bevestigd IS TRUE THEN 1 ELSE 0 END) AS confirmed, COALESCE(sum(COALESCE(leverancier_emballage_registratie.inkomend, 0)::numeric * COALESCE( ( NULLIF(leverancier_emballage_artikel.lengte, 0)::numeric * NULLIF(leverancier_emballage_artikel.breedte, 0)::numeric * NULLIF(leverancier_emballage_artikel.hoogte, 0)::numeric ) / 1000000::numeric, leverancier_emballage_artikel.volume::numeric, 0::numeric )), 0) AS incoming_volume, COALESCE(sum(COALESCE(leverancier_emballage_registratie.uitgaand, 0)::numeric * COALESCE( ( NULLIF(leverancier_emballage_artikel.lengte, 0)::numeric * NULLIF(leverancier_emballage_artikel.breedte, 0)::numeric * NULLIF(leverancier_emballage_artikel.hoogte, 0)::numeric ) / 1000000::numeric, leverancier_emballage_artikel.volume::numeric, 0::numeric )), 0) AS outgoing_volume FROM leverancier_emballage_registratie JOIN leverancier_emballage_artikel ON leverancier_emballage_artikel.id = leverancier_emballage_registratie.leverancier_emballage_artikel WHERE leverancier_emballage_registratie.hub = ? AND leverancier_emballage_registratie.

</details>

preloadregistration_details_by_supplier_date

Bron. Wrapper voor entity-preload met supplier_id/leverancier en leverancierscache; side-effect alleen cache.

  • Input: my ( $args, $hub_id, $records ) = @_.
  • Aanroepen: _preload_registration_details_by_entity_date.
  • Statische callers: XLS/LMF.pm::hub_orders; XLS/LMF.pm::hub_incoming.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

preloadregistration_details_by_location_date

Bron. Wrapper voor entity-preload met location_id/lokatie en locatiecache; side-effect alleen cache.

  • Input: my ( $args, $hub_id, $records ) = @_.
  • Aanroepen: _preload_registration_details_by_entity_date.
  • Statische callers: XLS/LMF.pm::hub_orders; XLS/LMF.pm::hub_outgoing.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

preloaddash_registration_details_by_supplier_date

Bron. Wrapper multi-HUB entity-preload voor leverancier; side-effect cache.

  • Input: my ( $args, $records ) = @_.
  • Aanroepen: _preload_dash_registration_details_by_entity_date.
  • Statische callers: XLS/LMF.pm::dash_orders.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

preloaddash_registration_details_by_location_date

Bron. Wrapper multi-HUB entity-preload voor locatie; side-effect cache.

  • Input: my ( $args, $records ) = @_.
  • Aanroepen: _preload_dash_registration_details_by_entity_date.
  • Statische callers: XLS/LMF.pm::dash_orders.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

preloaddash_registration_details_by_entity_date

Bron. Records met HUB/partij/datum → aggregaties per gewenste combinatie in cache; includes HUB in SQL-group en key.

  • Input: my ( $args, $records, $record_field, $entity_column, $cache_name ) = @_.
  • Aanroepen: _dash_registration_key, _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::_preload_dash_registration_details_by_supplier_date; XLS/LMF.pm::_preload_dash_registration_details_by_location_date.
  • DB-objecten: leverancier_emballage_artikel, leverancier_emballage_registratie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_emballage_registratie.hub AS hub_id, leverancier_emballage_registratie.

AS entity_id, leverancier_emballage_registratie.datum AS delivery_date, leverancier_emballage_artikel.id, leverancier_emballage_artikel.omschrijving AS name, leverancier_emballage_registratie.kvd AS package_type, sum(COALESCE(leverancier_emballage_registratie.inkomend, 0)) AS incoming_number, sum(COALESCE(leverancier_emballage_registratie.uitgaand, 0)) AS outgoing_number, max(CASE WHEN leverancier_emballage_registratie.bevestigd IS TRUE THEN 1 ELSE 0 END) AS confirmed, COALESCE(sum(COALESCE(leverancier_emballage_registratie.inkomend, 0)::numeric * COALESCE( ( NULLIF(leverancier_emballage_artikel.lengte, 0)::numeric * NULLIF(leverancier_emballage_artikel.breedte, 0)::numeric * NULLIF(leverancier_emballage_artikel.hoogte, 0)::numeric ) / 1000000::numeric, leverancier_emballage_artikel.volume::numeric, 0::numeric )), 0) AS incoming_volume, COALESCE(sum(COALESCE(leverancier_emballage_registratie.uitgaand, 0)::numeric * COALESCE( ( NULLIF(leverancier_emballage_artikel.lengte, 0)::numeric * NULLIF(leverancier_emballage_artikel.breedte, 0)::numeric * NULLIF(leverancier_emballage_artikel.hoogte, 0)::numeric ) / 1000000::numeric, leverancier_emballage_artikel.volume::numeric, 0::numeric )), 0) AS outgoing_volume FROM leverancier_emballage_registratie JOIN leverancier_emballage_artikel ON leverancier_emballage_artikel.id = leverancier_emballage_registratie.leverancier_emballage_artikel WHERE leverancier_emballage_registratie.hub IN (

</details>

preloadguid_packages

Bron. Pakbon-GUIDs → cache aantal per artikel/kvd; supplier/customer-perspectief en nullfallback, geen DB-writes.

  • Input: my ( $args, $delivery_guids ) = @_.
  • Aanroepen: _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries; XLS/LMF.pm::_preload_location_delivery_suppliers_for_records; XLS/LMF.pm::packages.
  • DB-objecten: leverancier_emballage_artikel, leverancier_pakbon, leverancier_pakbon_emballage. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_pakbon.guid AS delivery_guid, leverancier_emballage_artikel.id, leverancier_emballage_artikel.code, leverancier_emballage_artikel.omschrijving AS name, leverancier_pakbon_emballage.kvd AS package_type, sum(leverancier_pakbon_emballage.geleverd_volgens_leverancier) AS delivered_supplier, sum(leverancier_pakbon_emballage.retour_volgens_leverancier) AS fetched_supplier, sum(leverancier_pakbon_emballage.geleverd) AS delivered, sum(leverancier_pakbon_emballage.retour) AS fetched FROM leverancier_emballage_artikel, leverancier_pakbon_emballage, leverancier_pakbon WHERE leverancier_emballage_artikel.id = leverancier_pakbon_emballage.leverancier_emballage_artikel AND leverancier_pakbon_emballage.leverancier_pakbon = leverancier_pakbon.id AND leverancier_pakbon.guid IN (

</details>

preloaddelivery_packages

Bron. Levering-ID-lijst → cache SUM(geleverd/retour) per artikel/kvd; packaging=true, geen saldo.

  • Input: my ( $args, $delivery_ids ) = @_.
  • Aanroepen: _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::logistic_packages.
  • DB-objecten: leverancier_emballage_artikel, leverancier_pakbon, leverancier_pakbon_emballage. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_pakbon.levering AS delivery_id, leverancier_emballage_artikel.id, leverancier_emballage_artikel.code, leverancier_emballage_artikel.omschrijving AS name, leverancier_pakbon_emballage.kvd AS package_type, sum(leverancier_pakbon_emballage.geleverd) AS delivered, sum(leverancier_pakbon_emballage.retour) AS fetched FROM leverancier_emballage_artikel, leverancier_pakbon_emballage, leverancier_pakbon WHERE leverancier_emballage_artikel.id = leverancier_pakbon_emballage.leverancier_emballage_artikel AND leverancier_pakbon_emballage.leverancier_pakbon = leverancier_pakbon.id AND leverancier_pakbon.levering IN (

</details>

preloadpackaging

Bron. Levering-ID-lijst → cache distinct beschikbare artikelcode/naam van pakbonleveranciers, geen aantallen.

  • Input: my ( $args, $delivery_ids ) = @_.
  • Aanroepen: _placeholders, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::packaging.
  • DB-objecten: leverancier_emballage_artikel, leverancier_pakbon. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT leverancier_pakbon.levering AS delivery_id, leverancier_emballage_artikel.code, leverancier_emballage_artikel.omschrijving AS name FROM leverancier_emballage_artikel JOIN leverancier_pakbon ON leverancier_pakbon.leverancier = leverancier_emballage_artikel.leverancier WHERE leverancier_pakbon.levering IN (

</details>

preloadlocation_delivery_suppliers_for_records

Bron. Locatie/datum → cache supplier/pakbon-GUID/aantallen; actieve projectmarktplaats en levering3; preload guid-packages.

  • Input: my ( $args, $records ) = @_.
  • Aanroepen: _location_date_key, _placeholders, _preload_guid_packages, _unique_defined_values.
  • Statische callers: XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::leveranciers; XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries.
  • DB-objecten: klant, leverancier, leverancier_pakbon, leverancier_pakbon_regel, lmf_project, lmf_user_project, lokatie, lokatie_leverancier, vers_order. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_pakbon.lokatie AS lokatie_id, leverancier_pakbon.lever_datum AS delivery_date, leverancier.id, leverancier.naam, leverancier.adres, leverancier.postcode, leverancier.plaats, leverancier.latitude, leverancier.longitude, leverancier_pakbon.hub, leverancier_pakbon.guid AS delivery_id, COALESCE(sum(leverancier_pakbon_regel.besteld_aantal), 0) AS packages FROM leverancier JOIN leverancier_pakbon ON leverancier_pakbon.leverancier = leverancier.id JOIN lokatie ON lokatie.id = leverancier_pakbon.lokatie JOIN klant ON klant.id = lokatie.klant LEFT JOIN vers_order ON vers_order.id = leverancier_pakbon.vers_order JOIN lokatie_leverancier ON lokatie_leverancier.lokatie = leverancier_pakbon.lokatie AND lokatie_leverancier.leverancier = leverancier.id AND lokatie_leverancier.levering = 3 LEFT JOIN leverancier_pakbon_regel ON leverancier_pakbon_regel.leverancier_pakbon = leverancier_pakbon.id WHERE EXISTS ( SELECT 1 FROM lmf_user_project JOIN lmf_project ON lmf_project.id = lmf_user_project.lmf_project WHERE lmf_user_project.lmf_user = ? AND lmf_user_project.actief IS TRUE AND lmf_project.marktplaats = klant.marktplaats ) AND leverancier_pakbon.lokatie IN (

</details>

packaging

Bron. Levering-ID → catalogus-array uit requestcache; geen hoeveelheid of saldo.

  • Input: my ( $args ) = @_.
  • Aanroepen: _preload_packaging.
  • Statische callers: XLS/LMF.pm::next_logistics_delivery; XLS/LMF.pm::logistics_pickup; XLS/LMF.pm::logistics_delivery.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

logistic_packages

Bron. Levering-ID → geaggregeerde geleverd/retour-array uit cache.

  • Input: my ( $args ) = @_.
  • Aanroepen: _preload_delivery_packages.
  • Statische callers: XLS/LMF.pm::next_logistics_delivery; XLS/LMF.pm::logistics_pickup; XLS/LMF.pm::logistics_delivery; XLS/LMF.pm::logistics_deliveries.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

emballage_artikelen_hub

Bron. Supplier-ID → artikel-ID/code/name-array; aangeroepen door stops met vaste HUB-default.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::stops.
  • DB-objecten: leverancier_emballage_artikel. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier_emballage_artikel.id, leverancier_emballage_artikel.code, leverancier_emballage_artikel.omschrijving AS name FROM leverancier_emballage_artikel WHERE leverancier_emballage_artikel.leverancier = ? ORDER BY leverancier_emballage_artikel.code

</details>

packages

Bron. Parameter leverancier_pakbon is GUID → perspectiefafhankelijke aantallen-array uit cache.

  • Input: my ( $args ) = @_.
  • Aanroepen: _preload_guid_packages.
  • Statische callers: XLS/LMF.pm::new_supplier_deliveries; XLS/LMF.pm::leveranciers; XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

role

Bron. Userrol kiezen en klant/leverancier/hub/logistiek aanroepen; login- of profielresponse.

  • Input: my ( $args ) = @_.
  • Aanroepen: hub, klant, leverancier, logistiek.
  • Statische callers: XLS/LMF.pm::handle_request; XLS/LMF.pm::stops; XLS/LMF.pm::new_supplier_deliveries; XLS/LMF.pm::next_logistics_delivery; XLS/LMF.pm::logistics_pickup; XLS/LMF.pm::logistics_delivery; XLS/LMF.pm::logistics_deliveries; XLS/LMF.pm::customer_delivery; XLS/LMF.pm::customer_deliveries; XLS/LMF.pm::supplier_deliveries.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

keana_webhook

Bron. Callback IDs → Keana auth/tracking; externe status naar order/pakbon-events; commits per stap; success/error; vaste actor, geen incoming signature/dedup.

  • Input: my ($args) = @_; HTTP-paramkeys: deliveryId, deliveryTrackingId.
  • Aanroepen: new, true. Modules: Keana::API::new.
  • Statische callers: XLS/LMF.pm::handle_request.
  • DB-objecten: leverancier_pakbon, leverancier_pakbon_levering, order_status, vers_order. Writes: leverancier_pakbon_levering, vers_order; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT id FROM order_status WHERE name = ?

UPDATE vers_order SET hub_status = ?, transport_status = ? WHERE id = ?

SELECT id FROM leverancier_pakbon WHERE vers_order=?

INSERT INTO leverancier_pakbon_levering (datum, commentaar, lmf_user, order_status, leverancier_pakbon, eta, ata, tracking_code) VALUES (?, ?, ?, ?, ?, ?, ?, ?)

</details>

klant

Bron. Klant/user-ID → actieve locaties met partners/HUBcatalogus; login bevat token/user_name.locations, REFRESH alleen locaties-array, anders rolprofiel.

  • Input: my ( $args ) = @_; HTTP-paramkeys: location_id.
  • Aanroepen: new. Modules: XML::TreePP::new.
  • Statische callers: XLS/LMF.pm::location_comment; XLS/LMF.pm::role.
  • DB-objecten: klant, klant_koppeling, leverancier, leverancier_emballage_artikel, lokatie, lokatie_leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM klant WHERE id=?

SELECT * FROM lokatie WHERE klant=? AND actief=? ORDER BY naam

SELECT lokatie_leverancier.debiteurnummer, leverancier.id, leverancier.naam, leverancier.adres, leverancier.postcode, leverancier.plaats, leverancier.latitude, leverancier.longitude, lokatie_leverancier.levering FROM lokatie_leverancier, leverancier WHERE leverancier.id = lokatie_leverancier.leverancier AND lokatie_leverancier.lokatie = ? ORDER BY leverancier.naam

SELECT * FROM leverancier_emballage_artikel WHERE leverancier=? ORDER BY omschrijving

SELECT definitie_in_xml FROM klant_koppeling WHERE klant=? AND koppeling=?

</details>

hub

Bron. Eigen supplier-ID → HUBprofiel/catalogus/navigator; loginresponse met token/flags/coords, anders compact profiel; locaties worden gelezen maar niet in loginresponse gezet.

  • Input: my ( $args ) = @_.
  • Aanroepen: navigator.
  • Statische callers: XLS/LMF.pm::role.
  • DB-objecten: klant, leverancier, leverancier_emballage_artikel, lokatie, lokatie_leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier WHERE id=?

SELECT * FROM lokatie WHERE lat_lng IS NOT NULL AND id IN ( SELECT lokatie FROM lokatie_leverancier WHERE leverancier=?) AND actief=true AND naam!=postcode AND klant IN(SELECT id FROM klant WHERE public=false) ORDER BY lokatie.naam

SELECT levering FROM lokatie_leverancier WHERE lokatie=? AND leverancier=?

SELECT guid AS id, naam AS name, adres AS address, postcode, plaats AS city, latitude, longitude FROM leverancier WHERE id IN(SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

SELECT * FROM leverancier_emballage_artikel WHERE leverancier=? ORDER BY omschrijving

</details>

leverancier_lokaties

Bron. Eigen supplier-ID → actieve niet-public locaties met GUID/debtor/coords/HUB; array.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::leverancier.
  • DB-objecten: klant, leverancier, lokatie, lokatie_leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM lokatie WHERE lat_lng IS NOT NULL AND id IN ( SELECT lokatie FROM lokatie_leverancier WHERE leverancier=?) AND actief=true AND naam!=postcode AND klant IN(SELECT id FROM klant WHERE public=false) ORDER BY lokatie.naam

SELECT debiteurnummer, levering FROM lokatie_leverancier WHERE lokatie=? AND leverancier=?

SELECT guid AS id, naam AS name, adres AS address, postcode, plaats AS city, latitude, longitude FROM leverancier WHERE id IN(SELECT leverancier FROM lokatie_leverancier WHERE lokatie=? AND levering=?)

</details>

leverancier_emballage_artikelen

Bron. Eigen supplier-ID → artikel-array met maten/volume/gewicht (outputkey weigth).

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::leverancier.
  • DB-objecten: leverancier_emballage_artikel. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier_emballage_artikel WHERE leverancier=? ORDER BY omschrijving

</details>

leverancier

Bron. Eigen supplier-ID → profiel/login met locaties/catalogus/flags/config/prompt/public-key; koppeling30/31/32 en WhapKey gelezen, waarden niet gedocumenteerd.

  • Input: my ( $args ) = @_.
  • Aanroepen: leverancier_emballage_artikelen, leverancier_lokaties, navigator, new. Modules: XML::TreePP::new.
  • Statische callers: XLS/LMF.pm::role.
  • DB-objecten: leverancier, leverancier_apikey, leverancier_koppeling. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier WHERE id=?

SELECT definitie_in_xml FROM leverancier_koppeling WHERE leverancier=? AND koppeling=?

SELECT key FROM leverancier_apikey WHERE naam=? AND leverancier=?

SELECT definitie_in_xml FROM leverancier_koppeling WHERE leverancier = ? AND koppeling = ?

SELECT definitie_in_xml FROM leverancier_koppeling WHERE leverancier=? AND koppeling=?

</details>

navigator

Bron. user.navigator → navigator.naam of none.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::hub; XLS/LMF.pm::leverancier; XLS/LMF.pm::logistiek.
  • DB-objecten: navigator. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT naam FROM navigator WHERE id=?

</details>

logistiek

Bron. Eigen supplier-ID → logistiekprofiel; login met route/name/planningflag en meerdere forced true-flags.

  • Input: my ( $args ) = @_.
  • Aanroepen: _logistics_route, _logistics_route_planning, navigator.
  • Statische callers: XLS/LMF.pm::role.
  • DB-objecten: leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM leverancier WHERE id=?

</details>

logisticsroute_planning

Bron. user.lmf_project → marktplaats-eigenaar leverancier.route_planning; scalar/undef.

  • Input: my ( $args ) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::logistiek.
  • DB-objecten: leverancier, lmf_project, marktplaats. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT leverancier.route_planning FROM lmf_project JOIN marktplaats ON marktplaats.id = lmf_project.marktplaats JOIN leverancier ON leverancier.id = marktplaats.leverancier WHERE lmf_project.id = ?

</details>

logisticsroute

Bron. user.route → {id,name} of nullvelden.

  • Input: my ( $args ) = @_.
  • Aanroepen: _lmf_positive_int.
  • Statische callers: XLS/LMF.pm::logistiek.
  • DB-objecten: route. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, naam AS name FROM route WHERE id=?

</details>

XLS/LMF/EmballageControl.pm

true

Bron. JSON-true scalarreferentie; utility, geen DB.

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::keana_webhook.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

new

Bron. Leeg blessed LMF-serviceobject; geen domeinstatus of DB.

  • Input: my ($class, %args) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

handle_request

Bron. filters valideren, bronnen lezen, >2000 rijen afwijzen, ketens filteren/sorteren/pagineren → code+overview of detail; read-only

  • Input: my ($self, $args) = @_.
  • Aanroepen: _attention_rank, _chains, _detail_item, _filters, _matches_filters, _overview_item, _page, _pagination, _source_rows, _summary.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_filters

Bron. HUB/params/datumrange/paging/statusvalidatie → filterhash of code-error; ref(base) moet gewone HASH zijn

  • Input: my ($self, $args) = @_.
  • Aanroepen: _boolean_param, _date_epoch, _positive_int.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

sourcerows

Bron. args/filters → {packing,hub,stop} arrays

  • Input: my ($self, $args, $filters) = @_.
  • Aanroepen: _hub_rows, _packing_rows, _stop_rows.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request; XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

packingrows

Bron. HUB/datum/artikel/kvd → pakbonemballage-bronrijen

  • Input: my ($self, $args, $filters) = @_.
  • Aanroepen: _add_source_filters, _selectall_hashref.
  • Statische callers: XLS/LMF/EmballageControl.pm::_source_rows.
  • DB-objecten: leverancier_emballage_artikel, leverancier_pakbon, leverancier_pakbon_emballage. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT emb.id, emb.leverancier_pakbon, emb.leverancier_emballage_artikel, emb.kvd, emb.geleverd, emb.retour, emb.geleverd_volgens_leverancier, emb.retour_volgens_leverancier, emb.ontvangen, emb.verstuurd, pakbon.leverancier, pakbon.lokatie, pakbon.hub, pakbon.lever_datum AS datum, pakbon.guid AS pakbon_guid, pakbon.levering AS levering_id, art.code AS emballage_code, art.omschrijving AS emballage_omschrijving FROM leverancier_pakbon_emballage emb JOIN leverancier_pakbon pakbon ON pakbon.id = emb.leverancier_pakbon LEFT JOIN leverancier_emballage_artikel art ON art.id = emb.leverancier_emballage_artikel WHERE

</details>

hubrows

Bron. HUB/datum/artikel/kvd → HUB-registratiebronrijen met pakbonmeta

  • Input: my ($self, $args, $filters) = @_.
  • Aanroepen: _add_source_filters, _selectall_hashref.
  • Statische callers: XLS/LMF/EmballageControl.pm::_source_rows.
  • DB-objecten: leverancier_emballage_artikel, leverancier_emballage_registratie, leverancier_pakbon. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT reg.id, reg.hub, reg.leverancier, reg.lokatie, reg.leverancier_emballage_artikel, reg.kvd, reg.inkomend, reg.uitgaand, reg.bevestigd, reg.datum, reg.lmf_user, reg.leverancier_pakbon, reg.levering AS levering_id, pakbon.guid AS pakbon_guid, pakbon.leverancier AS pakbon_leverancier, pakbon.lokatie AS pakbon_lokatie, pakbon.hub AS pakbon_hub, pakbon.lever_datum AS pakbon_datum, art.code AS emballage_code, art.omschrijving AS emballage_omschrijving FROM leverancier_emballage_registratie reg LEFT JOIN leverancier_pakbon pakbon ON pakbon.id = reg.leverancier_pakbon LEFT JOIN leverancier_emballage_artikel art ON art.id = reg.leverancier_emballage_artikel WHERE

</details>

stoprows

Bron. HUB of verbonden partij/locatie + datum/artikel/kvd → stopbronnen met actor/transportpartij

  • Input: my ($self, $args, $filters) = @_.
  • Aanroepen: _add_source_filters, _selectall_hashref.
  • Statische callers: XLS/LMF/EmballageControl.pm::_source_rows.
  • DB-objecten: leverancier, leverancier_emballage_artikel, leverancier_emballage_registratie_stop, leverancier_pakbon, lmf_user. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT stop.id, stop.hub, stop.leverancier, stop.lokatie, stop.leverancier_emballage_artikel, stop.kvd, stop.opgehaald, stop.afgeleverd, stop.datum, stop.lmf_user, stop.stop_id, stop.leverancier_pakbon, pakbon.guid AS pakbon_guid, pakbon.levering AS levering_id, pakbon.leverancier AS pakbon_leverancier, pakbon.lokatie AS pakbon_lokatie, pakbon.hub AS pakbon_hub, pakbon.lever_datum AS pakbon_datum, usr.roepnaam AS actor_first_name, usr.naam AS actor_last_name, usr.leverancier_id AS logistics_party_id, logistics.naam AS logistics_party_name, art.code AS emballage_code, art.omschrijving AS emballage_omschrijving FROM leverancier_emballage_registratie_stop stop LEFT JOIN leverancier_pakbon pakbon ON pakbon.id = stop.leverancier_pakbon LEFT JOIN lmf_user usr ON usr.id = stop.lmf_user LEFT JOIN leverancier logistics ON logistics.id = usr.leverancier_id LEFT JOIN leverancier_emballage_artikel art ON art.id = stop.leverancier_emballage_artikel WHERE

</details>

addsource_filters

Bron. WHERE/binds aanvullen voor datum/artikel/kvd; wijzigt arrays in geheugen

  • Input: my ($self, $where, $bind, $filters, $columns) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_packing_rows; XLS/LMF/EmballageControl.pm::_hub_rows; XLS/LMF/EmballageControl.pm::_stop_rows.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

selectallhashref

Bron. SQL+binds via DBH → array hashrefs; finish cursor

  • Input: my ($self, $args, $sql, @bind) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_packing_rows; XLS/LMF/EmballageControl.pm::_hub_rows; XLS/LMF/EmballageControl.pm::_stop_rows.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_chains

Bron. packing/hub/stop-arrays → lijst definitieve controleketens

  • Input: my ($self, $rows) = @_.
  • Aanroepen: _add_hub, _add_packing, _add_stop, _delivery_index, _finalize_chain, _hard_group_key, _linked_group_key, _merge_metadata, _new_chain.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

hardgroup_key

Bron. bron/rij → pakbon- of levering- of bronrijsleutel + artikel/kvd

  • Input: my ($self, $source, $row) = @_.
  • Aanroepen: _positive_int.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains; XLS/LMF/EmballageControl.pm::_linked_group_key.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

linkedgroup_key

Bron. bron/rij/leveringindex → key en ambiguityflag; alleen unieke harde koppeling

  • Input: my ($self, $source, $row, $delivery_keys) = @_.
  • Aanroepen: _delivery_index, _hard_group_key, _positive_int.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

newchain

Bron. key → nieuw afgeleid chainobject met SHA1, slots/sources

  • Input: my ($self, $key) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

mergemetadata

Bron. keten/rij → partij/artikel/datum/bronmetadata in keten; conflicten ambiguous

  • Input: my ($self, $chain, $row) = @_.
  • Aanroepen: _canonical_date, _positive_int.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

addpacking

Bron. pakbonrij → vier supplier/customer heen/retourslots

  • Input: my ($self, $chain, $row) = @_.
  • Aanroepen: _set_slot.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

addhub

Bron. HUBrij → supplier-in/out of customer-out/in-slots; onduidelijke partij bron+ambiguity

  • Input: my ($self, $chain, $row) = @_.
  • Aanroepen: _add_source, _positive_int, _set_slot.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

addstop

Bron. klantstop → twee logistiekslots; HUB/supplierstop alleen bronwaarnemingen

  • Input: my ($self, $chain, $row) = @_.
  • Aanroepen: _add_source, _positive_int, _set_slot.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

setslot

Bron. qty valideren, bron toevoegen, dubbele slot markeren; geen som

  • Input: my ($self, $chain, $slot, $raw_value, $row, $perspective, $action) = @_.
  • Aanroepen: _add_source, _registered_quantity.
  • Statische callers: XLS/LMF/EmballageControl.pm::_add_packing; XLS/LMF/EmballageControl.pm::_add_hub; XLS/LMF/EmballageControl.pm::_add_stop.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

addsource

Bron. bronrij → source_type/id/action/qty/date/actor/link-meta in keten

  • Input: my ($self, $chain, $row, $perspective, $action, $quantity) = @_.
  • Aanroepen: _canonical_date, _num, _positive_int.
  • Statische callers: XLS/LMF/EmballageControl.pm::_add_hub; XLS/LMF/EmballageControl.pm::_add_stop; XLS/LMF/EmballageControl.pm::_set_slot.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

finalizechain

Bron. zes paren vergelijken → comparisons/control_status op keten; geen saldo

  • Input: my ($self, $chain) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

matchesfilters

Bron. keten/filter → boolean incl chain_id/status/partij

  • Input: my ($self, $chain, $filters) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_summary

Bron. ketens → aantallen per status

  • Input: my ($self, $chains) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

overviewitem

Bron. keten → compacte DTO met slots/partijen/artikel/refs

  • Input: my ($self, $chain) = @_.
  • Aanroepen: _party.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request; XLS/LMF/EmballageControl.pm::_detail_item.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

detailitem

Bron. keten → overview plus sources/comparisons/ambiguous_slots

  • Input: my ($self, $chain) = @_.
  • Aanroepen: _overview_item.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_page

Bron. items/offset/limit → pagina-lijst

  • Input: my ($self, $items, $offset, $limit) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_pagination

Bron. counts/offset/limit → paginationhash met has_more

  • Input: my ($self, $total, $returned, $offset, $limit) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_party

Bron. type/id → partij-DTO

  • Input: my ($type, $id) = @_.
  • Aanroepen: _positive_int.
  • Statische callers: XLS/LMF/EmballageControl.pm::_overview_item.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

registeredquantity

Bron. numerieke niet-nulwaarde → getal, anders undef

  • Input: my ($value) = @_.
  • Aanroepen: _num.
  • Statische callers: XLS/LMF/EmballageControl.pm::_set_slot.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

deliveryindex

Bron. rij → levering/artikel/kvd-key of undef

  • Input: my ($row) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_chains; XLS/LMF/EmballageControl.pm::_linked_group_key.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

canonicaldate

Bron. datum/timestamp → ISO-date of undef

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_merge_metadata; XLS/LMF/EmballageControl.pm::_add_source.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

dateepoch

Bron. geldige ISO-date → UTC-epoch of undef met roundtripcontrole

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_filters.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

booleanparam

Bron. true/false-achtige string → value/error-tuple

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_filters.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

positiveint

Bron. waarde → positief-integerboolean

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_filters; XLS/LMF/EmballageControl.pm::_hard_group_key; XLS/LMF/EmballageControl.pm::_linked_group_key; XLS/LMF/EmballageControl.pm::_merge_metadata; XLS/LMF/EmballageControl.pm::_add_hub; XLS/LMF/EmballageControl.pm::_add_stop; XLS/LMF/EmballageControl.pm::_add_source; XLS/LMF/EmballageControl.pm::_party; XLS/LMF/RoutePlanImporter.pm::import_route_plan; XLS/LMF/RoutePlanImporter.pm::_validate_payload; XLS/LMF/RoutePlanImporter.pm::_expected_stopset; XLS/LMF/RoutePlanImporter.pm::_match_payload_to_expected; XLS/LMF/RoutePlanImporter.pm::_validate_stop_references; XLS/LMF/RoutePlanImporter.pm::_resolve_route; XLS/LMF/RoutePlanImporter.pm::_active_route_owner_project_ids; XLS/LMF/RoutePlanImporter.pm::_user_has_project_access; XLS/LMF/RoutePlanImporter.pm::_routes_by_name_for_transporteur_marketplaces; XLS/LMF/RoutePlanImporter.pm::_marketplace_route_supplier_for_customer_stops; XLS/LMF/RoutePlanImporter.pm::_insert_route_locations; XLS/LMF/RoutePlanImporter.pm::_insert_route_plan; XLS/LMF/RoutePlanImporter.pm::_route_reference.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_num

Bron. waarde → numeriek, ongeldig/null→0

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_add_source; XLS/LMF/EmballageControl.pm::_registered_quantity.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

attentionrank

Bron. ketenstatus → sorteerrang difference/missing/ambiguous/aligned

  • Input: my ($chain) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

XLS/LMF/RoutePlanImporter.pm

Niet aangesloten op de huidige route_plan-dispatch. Onderstaande writes horen bij de aanwezige module en tests, niet bij het actieve endpoint.

new

Bron. Leeg blessed LMF-serviceobject; geen domeinstatus of DB.

  • Input: my ($class, %args) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

import_route_plan

Bron. payload/user/DBH → valideren, route/projectscope, verwachte stops, atomair sync; code/data routeplan of error

  • Input: my ($self, $args) = @_.
  • Aanroepen: _active_route_owner_project_ids, _begin_transaction, _commit_transaction, _error, _expected_stopset, _match_payload_to_expected, _positive_int, _request_payload, _resolve_route, _rollback_transaction, _source_rows, _sync_route_plan, _truthy, _user_has_project_access, _validate_payload, _validate_stop_references.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

validatepayload

Bron. payload → genormaliseerde route/date/stops of error; max500, types/identity, unieke aaneengesloten sequences

  • Input: my ($self, $payload) = @_.
  • Aanroepen: _allowed_stop_type, _error, _logical_key, _positive_int, _route_reference, _valid_date.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

expectedstopset

Bron. pakbonbronrijen → verplichte customerstops en optionele supplier/hub_start/hub_end-kandidaten met bron-ID-lijsten

  • Input: my ($self, $source_rows) = @_.
  • Aanroepen: _error, _logical_key, _positive_int, _unique_ints.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

matchpayload_to_expected

Bron. payload/verwachte set → gematchte stops of error; verplichte stops en start/eindregels

  • Input: my ($self, $payload_stops, $expected_stops) = @_.
  • Aanroepen: _error, _positive_int, _unique_ints.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

validatestop_references

Bron. stops → code200 of fout bij onbekende supplier/location-ID

  • Input: my ($self, $dbh, $stops) = @_.
  • Aanroepen: _all_location_ids_exist, _all_supplier_ids_exist, _error, _positive_int, _unique_ints.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

resolveroute

Bron. ID/naam/transporteur/stops → bestaande of nieuw gemaakte route binnen marktplaatsherleiding; code/data

  • Input: my ($self, $dbh, $args) = @_.
  • Aanroepen: _error, _insert_route, _insert_route_locations, _marketplace_route_supplier_for_customer_stops, _positive_int, _route_by_id, _routes_by_name_for_transporteur_marketplaces.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

syncroute_plan

Bron. routecontext → lock, bestaande/toegevoegde/verwijderde stops/links synchroniseren; draft/planned→planned; code/data changed

  • Input: my ($self, $dbh, $args) = @_.
  • Aanroepen: _defer_sequence_constraint, _delete_stop, _delete_stop_links, _error, _existing_links, _existing_stops, _find_route_plan, _find_route_plan_by_id, _insert_route_plan, _insert_stop, _lock_route_plan, _mark_route_plan_planned, _mutable_status, _sync_stop_links, _update_stop_sequence.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

syncstop_links

Bron. stop/wanted/existing → insert/delete bronlinks, retourneert changed

  • Input: my ($self, $dbh, $stop_id, $wanted_source_ids, $existing) = @_.
  • Aanroepen: _delete_stop_link, _insert_stop_link.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

activeroute_owner_project_ids

Bron. route-ID → actieve logistieke route-eigenaarproject-ID-lijst

  • Input: my ($self, $dbh, $route_id) = @_.
  • Aanroepen: _positive_int.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: lmf_user, route. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT lmf_user.lmf_project FROM route JOIN lmf_user ON lmf_user.leverancier_id = route.leverancier WHERE route.id=? AND lmf_user.actief IS TRUE AND lmf_user.logistiek IS TRUE AND lmf_user.lmf_project IS NOT NULL ORDER BY lmf_user.lmf_project

</details>

userhas_project_access

Bron. user/project → boolean actieve lmf_user_project

  • Input: my ($self, $dbh, $user_id, $lmf_project) = @_.
  • Aanroepen: _positive_int.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: lmf_user_project. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT 1 FROM lmf_user_project WHERE lmf_user=? AND lmf_project=? AND actief IS TRUE LIMIT 1

</details>

routeby_id

Bron. route-ID → id/naam hash of undef

  • Input: my ($self, $dbh, $route_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_resolve_route.
  • DB-objecten: route. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, naam FROM route WHERE id=?

</details>

routesby_name_for_transporteur_marketplaces

Bron. naam/transporteur → passende routes-array

  • Input: my ($self, $dbh, $route_name, $transporteur_id) = @_.
  • Aanroepen: _positive_int.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_resolve_route.
  • DB-objecten: leverancier_marktplaats, marktplaats, route. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT route.id, route.naam FROM route JOIN marktplaats ON marktplaats.leverancier = route.leverancier JOIN leverancier_marktplaats ON leverancier_marktplaats.marktplaats = marktplaats.id WHERE route.naam=? AND leverancier_marktplaats.leverancier=? AND marktplaats.leverancier IS NOT NULL ORDER BY route.id

</details>

marketplaceroute_supplier_for_customer_stops

Bron. transporteur/stops → unieke marktplaats/eigenaar of code-error; customerpad en supplier-only fallback

  • Input: my ($self, $dbh, $transporteur_id, $stops) = @_.
  • Aanroepen: _error, _positive_int, _unique_ints.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_resolve_route.
  • DB-objecten: klant, leverancier_marktplaats, lokatie, marktplaats. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT marktplaats.id AS marketplace_id, marktplaats.leverancier AS supplier_id FROM lokatie JOIN klant ON klant.id = lokatie.klant JOIN marktplaats ON marktplaats.id = klant.marktplaats JOIN leverancier_marktplaats ON leverancier_marktplaats.marktplaats = marktplaats.id WHERE lokatie.id IN ($placeholders) AND leverancier_marktplaats.leverancier=? AND marktplaats.leverancier IS NOT NULL ORDER BY marktplaats.id, marktplaats.leverancier

SELECT marktplaats.id AS marketplace_id, marktplaats.leverancier AS supplier_id FROM marktplaats JOIN leverancier_marktplaats transporteur_marktplaats ON transporteur_marktplaats.marktplaats = marktplaats.id AND transporteur_marktplaats.leverancier=? JOIN leverancier_marktplaats supplier_marktplaats ON supplier_marktplaats.marktplaats = marktplaats.id WHERE supplier_marktplaats.leverancier IN ($placeholders) AND marktplaats.leverancier IS NOT NULL GROUP BY marktplaats.id, marktplaats.leverancier HAVING count(DISTINCT supplier_marktplaats.leverancier)=? ORDER BY marktplaats.id, marktplaats.leverancier

</details>

insertroute

Bron. supplier/naam → INSERT route, retourneert ID

  • Input: my ($self, $dbh, $supplier_id, $route_name) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_resolve_route.
  • DB-objecten: route. Writes: route.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO route(leverancier, naam) VALUES(?, ?) RETURNING id

</details>

insertroute_locations

Bron. route/stops → INSERT route_lokatie voor customer/supplier; geen hub-start/endleden

  • Input: my ($self, $dbh, $route_id, $stops) = @_.
  • Aanroepen: _positive_int.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_resolve_route.
  • DB-objecten: route_lokatie. Writes: route_lokatie.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO route_lokatie(route, lokatie, nummer) VALUES(?, ?, ?)

INSERT INTO route_lokatie(route, leverancier, nummer) VALUES(?, ?, ?)

</details>

requestpayload

Bron. kopie params zonder Authorization

  • Input: my ($self, $params) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

sourcerows

Bron. route/datum/transporteur → pakbonbronrijen; routeklanten of supplier-only fallback; carrier gelijk of null

  • Input: my ($self, $dbh, $args) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::handle_request; XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: leverancier_pakbon, route_lokatie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT DISTINCT leverancier_pakbon.id AS leverancier_pakbon_id, leverancier_pakbon.leverancier AS supplier_id, CASE WHEN route_lokatie.lokatie IS NOT NULL THEN leverancier_pakbon.lokatie ELSE NULL END AS location_id, leverancier_pakbon.hub AS hub_id FROM route_lokatie JOIN leverancier_pakbon ON ( ( route_lokatie.lokatie IS NOT NULL AND leverancier_pakbon.lokatie = route_lokatie.lokatie ) OR ( route_lokatie.leverancier IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM route_lokatie route_customer WHERE route_customer.route = route_lokatie.route AND route_customer.lokatie IS NOT NULL ) AND leverancier_pakbon.leverancier = route_lokatie.leverancier ) ) WHERE route_lokatie.route = ? AND leverancier_pakbon.lever_datum::date = ? AND ( leverancier_pakbon.transporteur = ? OR leverancier_pakbon.transporteur IS NULL ) ORDER BY leverancier_pakbon.id

</details>

allsupplier_ids_exist

Bron. IDs → boolean alle supplierrecords aanwezig

  • Input: my ($self, $dbh, $ids) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_validate_stop_references.
  • DB-objecten: leverancier. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT count(DISTINCT id) FROM leverancier WHERE id IN ($placeholders)

</details>

alllocation_ids_exist

Bron. IDs → boolean alle locaties aanwezig

  • Input: my ($self, $dbh, $ids) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_validate_stop_references.
  • DB-objecten: lokatie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT count(DISTINCT id) FROM lokatie WHERE id IN ($placeholders)

</details>

findroute_plan

Bron. project/route/date/carrier → id/status van plan of undef

  • Input: my ($self, $dbh, $args) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan; XLS/LMF/RoutePlanImporter.pm::_insert_route_plan.
  • DB-objecten: lmf_route. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, status FROM lmf_route WHERE lmf_project=? AND route_id=? AND route_date=? AND transporteur_id=?

</details>

findroute_plan_by_id

Bron. plan-ID → id/status of undef

  • Input: my ($self, $dbh, $id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_route. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, status FROM lmf_route WHERE id=?

</details>

insertroute_plan

Bron. context → INSERT draft met conflict-ignore, bestaand ID fallback

  • Input: my ($self, $dbh, $args) = @_.
  • Aanroepen: _find_route_plan, _positive_int.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_route. Writes: lmf_route.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO lmf_route(lmf_project, nummer, naam, route_id, route_date, transporteur_id, status) VALUES(?, ?, ?, ?, ?, ?, 'draft') ON CONFLICT ON CONSTRAINT lmf_route_project_route_date_transporteur_uid DO NOTHING RETURNING id

</details>

lockroute_plan

Bron. plan-ID → id/status onder FOR UPDATE-lock

  • Input: my ($self, $dbh, $id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_route. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, status FROM lmf_route WHERE id=? FOR UPDATE

</details>

existingstops

Bron. plan-ID → gelockte stops-array met logical_key

  • Input: my ($self, $dbh, $lmf_route_id) = @_.
  • Aanroepen: _logical_key.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_stop. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT id, stop_type, leverancier AS supplier_id, lokatie AS location_id, volgnummer FROM lmf_stop WHERE lmf_route=? ORDER BY id FOR UPDATE

</details>

existinglinks

Bron. plan-ID → stop→pakbon-ID-set

  • Input: my ($self, $dbh, $lmf_route_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_stop, lmf_stop_leverancier_pakbon. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT lmf_stop_leverancier_pakbon.lmf_stop, lmf_stop_leverancier_pakbon.leverancier_pakbon FROM lmf_stop_leverancier_pakbon JOIN lmf_stop ON lmf_stop.id = lmf_stop_leverancier_pakbon.lmf_stop WHERE lmf_stop.lmf_route=?

</details>

insertstop

Bron. plan/stop → INSERT lmf_stop, retourneert ID

  • Input: my ($self, $dbh, $lmf_route_id, $stop) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_stop. Writes: lmf_stop.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO lmf_stop(lmf_route, leverancier, lokatie, volgnummer, stop_type) VALUES(?, ?, ?, ?, ?) RETURNING id

</details>

updatestop_sequence

Bron. stop-ID/sequence → UPDATE volgnummer

  • Input: my ($self, $dbh, $stop_id, $sequence) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_stop. Writes: lmf_stop.

<details><summary>SQL-bronfragmenten</summary>

UPDATE lmf_stop SET volgnummer=? WHERE id=?

</details>

insertstop_link

Bron. stop/pakbon → INSERT bronlink ON CONFLICT DO NOTHING

  • Input: my ($self, $dbh, $stop_id, $source_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_stop_links.
  • DB-objecten: lmf_stop_leverancier_pakbon. Writes: lmf_stop_leverancier_pakbon.

<details><summary>SQL-bronfragmenten</summary>

INSERT INTO lmf_stop_leverancier_pakbon(lmf_stop, leverancier_pakbon) VALUES(?, ?) ON CONFLICT DO NOTHING

</details>

deletestop_link

Bron. stop/pakbon → DELETE specifieke link

  • Input: my ($self, $dbh, $stop_id, $source_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_stop_links.
  • DB-objecten: lmf_stop_leverancier_pakbon. Writes: lmf_stop_leverancier_pakbon.

<details><summary>SQL-bronfragmenten</summary>

DELETE FROM lmf_stop_leverancier_pakbon WHERE lmf_stop=? AND leverancier_pakbon=?

</details>

deletestop_links

Bron. stop-ID → DELETE alle bronlinks

  • Input: my ($self, $dbh, $stop_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_stop_leverancier_pakbon. Writes: lmf_stop_leverancier_pakbon.

<details><summary>SQL-bronfragmenten</summary>

DELETE FROM lmf_stop_leverancier_pakbon WHERE lmf_stop=?

</details>

deletestop

Bron. stop-ID → DELETE lmf_stop

  • Input: my ($self, $dbh, $stop_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_stop. Writes: lmf_stop.

<details><summary>SQL-bronfragmenten</summary>

DELETE FROM lmf_stop WHERE id=?

</details>

markroute_plan_planned

Bron. plan-ID → status planned en updated_at now

  • Input: my ($self, $dbh, $lmf_route_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: lmf_route. Writes: lmf_route.

<details><summary>SQL-bronfragmenten</summary>

UPDATE lmf_route SET status='planned', updated_at=CURRENT_TIMESTAMP WHERE id=?

</details>

defersequence_constraint

Bron. DBH → SET CONSTRAINTS volgnummer-uniciteit DEFERRED

  • Input: my ($self, $dbh) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SET CONSTRAINTS lmf_stop_route_volgnummer_uid DEFERRED

</details>

begintransaction

Bron. DBH → ownershipflag; caller_managed_transaction geeft0, anders begin_work zo nodig en1

  • Input: my ($self, $dbh) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

committransaction

Bron. DBH/ownership → commit indien eigenaar

  • Input: my ($self, $dbh, $owns_transaction) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE; expliciete commit.

rollbacktransaction

Bron. DBH/ownership → rollback in eval indien eigenaar

  • Input: my ($self, $dbh, $owns_transaction) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_error

Bron. code/error/message/data → foutresponse

  • Input: my ($http_code, $error_code, $message, $details) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan; XLS/LMF/RoutePlanImporter.pm::_validate_payload; XLS/LMF/RoutePlanImporter.pm::_expected_stopset; XLS/LMF/RoutePlanImporter.pm::_match_payload_to_expected; XLS/LMF/RoutePlanImporter.pm::_validate_stop_references; XLS/LMF/RoutePlanImporter.pm::_resolve_route; XLS/LMF/RoutePlanImporter.pm::_sync_route_plan; XLS/LMF/RoutePlanImporter.pm::_marketplace_route_supplier_for_customer_stops.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

logicalkey

Bron. type/supplier/location → string businessidentiteit stop

  • Input: my ($type, $supplier_id, $location_id) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_validate_payload; XLS/LMF/RoutePlanImporter.pm::_expected_stopset; XLS/LMF/RoutePlanImporter.pm::_existing_stops.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

allowedstop_type

Bron. type → boolean hub_start/supplier/customer/hub_end

  • Input: my ($type) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_validate_payload.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

mutablestatus

Bron. status → boolean draft/planned

  • Input: my ($status) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_sync_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

positiveint

Bron. waarde → positief-integerboolean

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/EmballageControl.pm::_filters; XLS/LMF/EmballageControl.pm::_hard_group_key; XLS/LMF/EmballageControl.pm::_linked_group_key; XLS/LMF/EmballageControl.pm::_merge_metadata; XLS/LMF/EmballageControl.pm::_add_hub; XLS/LMF/EmballageControl.pm::_add_stop; XLS/LMF/EmballageControl.pm::_add_source; XLS/LMF/EmballageControl.pm::_party; XLS/LMF/RoutePlanImporter.pm::import_route_plan; XLS/LMF/RoutePlanImporter.pm::_validate_payload; XLS/LMF/RoutePlanImporter.pm::_expected_stopset; XLS/LMF/RoutePlanImporter.pm::_match_payload_to_expected; XLS/LMF/RoutePlanImporter.pm::_validate_stop_references; XLS/LMF/RoutePlanImporter.pm::_resolve_route; XLS/LMF/RoutePlanImporter.pm::_active_route_owner_project_ids; XLS/LMF/RoutePlanImporter.pm::_user_has_project_access; XLS/LMF/RoutePlanImporter.pm::_routes_by_name_for_transporteur_marketplaces; XLS/LMF/RoutePlanImporter.pm::_marketplace_route_supplier_for_customer_stops; XLS/LMF/RoutePlanImporter.pm::_insert_route_locations; XLS/LMF/RoutePlanImporter.pm::_insert_route_plan; XLS/LMF/RoutePlanImporter.pm::_route_reference.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

routereference

Bron. route-ID/naam → parsed reference of undef

  • Input: my ($value) = @_.
  • Aanroepen: _positive_int.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_validate_payload.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

_truthy

Bron. scalar → boolean uitsluitend bij scalarwaarde eq 1

  • Input: my ($value) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::import_route_plan.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

validdate

Bron. ISO-date → geldigheidsboolean

  • Input: my ($value) = @_.
  • Aanroepen: _leap_year.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_validate_payload.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

leapyear

Bron. jaar → schrikkeljaarboolean

  • Input: my ($year) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_valid_date.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

uniqueints

Bron. lijst → unieke gesorteerde int-geconverteerde waarden; geen eigen positiviteitsfilter

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF/RoutePlanImporter.pm::_expected_stopset; XLS/LMF/RoutePlanImporter.pm::_match_payload_to_expected; XLS/LMF/RoutePlanImporter.pm::_validate_stop_references; XLS/LMF/RoutePlanImporter.pm::_marketplace_route_supplier_for_customer_stops.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

XLSLMFHandler.pm

handler

Bron. HTTP-request → Base/params/auth/dispatch → JSON en Apache OK; malformed JSON HTTP400; standaard code-fouten blijven JSON

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven; HTTP-paramkeys: Authorization, POSTDATA, message, url, username.
  • Aanroepen: _build_cgi, _capture_request_body, _populate_request_params, _request_method, authen, authorization, credentials, request. Modules: Apache2::Cookie::Jar::new, XLS::Base::new, XLS::LMF::lmf_bezoeker, XLS::LMF::new.
  • Statische callers: geen binnen deze vier bestanden; constructor/dispatch/externe toegang zoals beschreven.
  • DB-objecten: domain, lmf_log. Writes: lmf_log; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT title, logo, favicon, achtergrond AS background FROM domain WHERE naam=?

SELECT title, logo, favicon, achtergrond AS background FROM domain WHERE naam=?

INSERT INTO lmf_log(username, bericht) VALUES(?,?)

</details>

authorization

Bron. Authorization → UUID → actieve lmf_user-hash of undef

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: _extract_uuid_token.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: lmf_user. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM lmf_user WHERE token=? AND actief=?

</details>

credentials

Bron. cookie/username-password/tokenparams → credentialobject; hash/base64, geen nieuwe DB-write

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: _extract_uuid_token.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: lmf_user. Writes: geen directe INSERT/UPDATE/DELETE.

<details><summary>SQL-bronfragmenten</summary>

SELECT email, password FROM lmf_user WHERE token=?

</details>

extractuuid_token

Bron. Bearer/spaties/UUID → token of undef

  • Input: my ($token) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLS/LMF.pm::check_token; XLSLMFHandler.pm::authorization; XLSLMFHandler.pm::credentials.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

buildcgi

Bron. request/rawbody → CGI-query of normale CGI-parser

  • Input: my ($r, $raw_body) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

capturerequest_body

Bron. HTTP-method/body/header → ruwe body voor POST/PUT/PATCH/DELETE

  • Input: my ($r) = @_.
  • Aanroepen: _header_value.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

requestmethod

Bron. request → genormaliseerde methodenaam

  • Input: my ($r) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

populaterequest_params

Bron. CGI/body → samengevoegde params met POSTDATA

  • Input: my ($cgi, $raw_body) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

headervalue

Bron. request/headernaam → waarde via get/hashfallback

  • Input: my ($r, $name) = @_.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLSLMFHandler.pm::_capture_request_body.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

request

Bron. URI → niet-lege segmentenarray

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: geen directe tabelselectie. Writes: geen directe INSERT/UPDATE/DELETE.

authen

Bron. credentials → actieve lmf_user met bestaand token; last_login/from UPDATE/commit of undef

  • Input: methodereceiver + request-args, of parameterloze helper zoals hierboven beschreven.
  • Aanroepen: geen interne servicecall gevonden.
  • Statische callers: XLSLMFHandler.pm::handler.
  • DB-objecten: lmf_user. Writes: lmf_user; expliciete commit.

<details><summary>SQL-bronfragmenten</summary>

SELECT * FROM lmf_user WHERE email=? AND password=? AND actief=?

UPDATE lmf_user SET last_login=now(), last_login_from=? WHERE token=?

</details>

Legenda · bewijs en verbindingen

Bewijsstatus

CONFIRMED Aangetroffen in bron of catalogus; niet automatisch foutloos livegedrag.

LIKELY Gevolgtrekking met onderbouwing.

UNCLEAR Onvoldoende bewijs voor deze koppeling of werking.

NOT FOUND Niet aangetroffen binnen de onderzochte scope.

FUTURE / PROPOSED Voorstel; geen huidige functionaliteit.

Relaties

direct · Aangetroffen rechtstreekse referentie of aanroep.

derived · Afgeleid door selectie, groepering of berekening.

conditional · Alleen bij de genoemde voorwaarden of aanwezige bronverwijzing.

not active · Code/model aanwezig, niet aangesloten op het beschreven pad.

unclear · Verbinding niet vastgesteld.