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
- Filter early — return nil if model/event does not match
- Idempotent — skip if target record already exists (see
sale_crmquotation check) - Bypass when needed —
orm.ContextWithBypass(ctx)for system writes - 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.