Ecoloop is a Django + DRF backend for recycling businesses and factories to manage pickups, pricing, invoices/payouts, and a bidding marketplace for scrap lots. It supports multi-organization setups, JWT auth, and a Tailwind-powered UI layer.
.env and set SECRET_KEY, DEBUG, DB_*, ALLOWED_HOSTSdocker-compose up --build (web on http://localhost:8024)python manage.py migratepython manage.py runserverpython manage.py seed_ecoloop/api/schema/swagger-ui/python manage.py migrate — apply DB migrationspython manage.py seed_ecoloop — seed demo org, users, materials, pickup, weigh ticket, invoice, listing/bidpython manage.py ecoloop_auto_close_award — auto-close/award expired listingsecoloop/settings.py via django.contrib.sites and SITE_ID..env includes defaults for local hosts: ALLOWED_HOSTS=localhost,127.0.0.1,.lvh.me.env CSRF for Docker port: CSRF_TRUSTED_ORIGINS=http://localhost:8024,http://*.lvh.me:8024python manage.py migrate (applies Sites tables)alpha.lvh.me and beta.lvh.me.http://alpha.lvh.me:8024 and http://beta.lvh.me:8024.get_current_site(request) or adding a ForeignKey to Site.ecoloop/ settings and URLs; api/ public endpoints; recycle_core/ domain models/APIstemplates/, static/, media/; Entrypoints: manage.py, docker-compose.yml, Dockerfileen_route, collecting, at_facility).WeighTicket and WeighLines per material; optional finalize.ScrapListingInvite.ecoloop_auto_close_award); accepts top qualifying bid, rejects others, creates a PickupOrder.Payout to customer.AuditLog records important actions and metadata.UserProfile per organization./auth/), optional social auth (Google/LINE/Facebook).OrganizationSite./api/, filterable, with custom actions:
pickups/{id}/assign, pickups/{id}/set_statusweigh-tickets/{id}/generate_invoicescrap-listings/{id}/open, scrap-listings/{id}/close, scrap-awards/award-listing/profiles/match/, opportunities/recommend/leaderboard/ (public), leaderboard/me/ (auth)/webadmin/… routes for orgs, billing, recycle core, CMS, settings./api/schema/swagger-ui/.Factory Pickup
PickupOrder, assigns driver, schedules.WeighTicket with material lines.Payment; pickup moves to invoiced/completed.Marketplace Sale
ScrapListing with estimated quantities and a bidding window.ScrapBids.PickupOrder auto‑created.Price Review & Adjustments
PriceListItem sell/buy rates by material/unit.Compliance & Reporting
Documents linked to tickets/invoices.AuditLog for status changes and financial actions./api/schema/swagger-ui/ (interactive), /api/schema/redoc/POST /auth/jwt/create/ (get token)POST /auth/users/ (register), GET /auth/users/me/GET/POST /api/profiles/, GET /api/profiles/match/GET/POST /api/opportunities/, GET /api/opportunities/recommend/GET /api/leaderboard/, GET /api/leaderboard/me//api/organizations//api/material-categories/, /api/materials//api/price-lists/, /api/price-list-items//api/customers/, /api/customer-sites/, /api/service-agreements//api/pickups/ (actions: POST /api/pickups/{id}/assign/, POST /api/pickups/{id}/set_status/)/api/weigh-tickets/ (action: POST /api/weigh-tickets/{id}/generate_invoice/), /api/weigh-lines//api/documents/, /api/audit-logs//api/invoices/, lines: /api/invoice-lines//api/payments/, Payouts: /api/payouts//api/scrap-listings/ (actions: POST /api/scrap-listings/{id}/open/, POST /api/scrap-listings/{id}/close/)/api/scrap-listing-items//api/scrap-bids/ (action: POST /api/scrap-bids/{id}/retract/)POST /api/scrap-awards/award-listing//api/scrap-listing-invites/.env and run DB: docker-compose up --build or python manage.py migrate && runserver.python manage.py seed_ecoloop (creates users manager/manager123, driver/driver123, buyer/buyer123).POST /auth/jwt/create/ with seeded credentials, use Authorization: Bearer <token> for protected endpoints.POST /api/customers/, /api/customer-sites/, /api/materials/.POST /api/pickups/ with organization, customer, site.POST /api/pickups/{id}/assign/ {"driver_id": <user_id>}; confirm status scheduled.POST /api/pickups/{id}/set_status/ → en_route → collecting → at_facility.POST /api/weigh-tickets/ + lines via /api/weigh-lines/.POST /api/weigh-tickets/{id}/generate_invoice/; verify invoice under /api/invoices/ and any payout under /api/payouts/.POST /api/pickups/{id}/set_status/ {"status": "completed"}.POST /api/scrap-listings/ (status defaults to draft).POST /api/scrap-listings/{id}/open/; optionally add invites via /api/scrap-listing-invites/.POST /api/scrap-bids/ with listing, bidder_org, price_total (ensure role and invite if private).POST /api/scrap-listings/{id}/close/ or run python manage.py ecoloop_auto_close_award.POST /api/scrap-awards/award-listing/ {"listing_id": <id>}; verify pickup created and proceed with weighing/invoicing./api/price-lists/, /api/price-list-items/.POST /api/payments/ {"invoice": <id>, "amount": ...}.draft, then rebuild lines (see service regenerate_invoice_for_pickup).Lead and auto‑attach uploaded files as Documents.POST /api/documents/ with file and content object.GET /api/audit-logs/ after actions like assign, set_status, generate_invoice, award.