Pre-alpha. No tagged release and no upgrade path between versions. Use for evaluation and development only, not production.
Addons DevPre-alpha

Add a bridge module

Bridge modules connect two existing apps with event-driven logic and no UI of their own. sale_crm is the reference implementation.

When to use

  • Automate handoff between modules (e.g. Won deal → quotation)
  • Avoid duplicating models or views in either parent module
  • Keep dependency explicit in manifest

manifest.json

{
  "name": "sale_crm",
  "display_name": "Sales CRM Bridge",
  "version": "1.0.0",
  "depends": ["sale", "crm"],
  "application": false,
  "data": []
}

init.go pattern

package sale_crm

import (
    "context"
    "sumeru/core/event"
    "sumeru/core/orm"
)

func init() {
    event.Subscribe("record.updated", onLeadUpdated)
}

func onLeadUpdated(ctx context.Context, ev event.Event) error {
    if ev.Payload["model"] != "crm.lead" {
        return nil
    }
    // check Won stage, idempotency, create sale.order
    return nil
}

Best practices

  1. Filter early — return nil if model/event does not match
  2. Idempotent — skip if target record already exists (see sale_crm quotation check)
  3. Bypass when neededorm.ContextWithBypass(ctx) for system writes
  4. Export helpers — e.g. CreateQuotationFromLead() for tests and custom addons

Install

go run . -- -c sumeru.conf -i sale_crm --stop-after-init

Requires both sale and crm already installed.

See also