@mostajs/incubator
v0.2.0
Published
Cœur métier MINCE d'une couveuse/pépinière d'entreprises : entreprise incubée (+ code d'activité officiel) + contrat d'hébergement + catalogue de services + cycle d'incubation. COMPOSE users/numbering/crm/nomenclature. Assemble P1 Hadhinat.
Downloads
294
Maintainers
Readme
@mostajs/incubator
Auteur : Dr Hamid MADANI [email protected] Licence : AGPL-3.0-or-later
Cœur métier mince d'une couveuse / pépinière / incubateur d'entreprises : entreprise incubée, dirigeants, contrat d'hébergement, catalogue de services + cycle d'incubation. Il compose les briques @mostajs/* (le dirigeant dérive de @mostajs/users, n° de contrat via @mostajs/numbering, KPI via @mostajs/reporting) et ne réimplémente rien (motif « domaine mince » de @mostajs/crm / @mostajs/school). Assemble le projet P1 Hadhinat MostaJS Technopark (besoins spec F1 + F6).
Installation
npm i @mostajs/incubator @mostajs/users @mostajs/numberingExemple minimal
import { createIncubator, createMemoryRepositories } from '@mostajs/incubator';
import { createUsers, createMemoryRepositories as uRepo } from '@mostajs/users';
const users = createUsers({ repositories: uRepo() });
const inc = createIncubator({ repositories: createMemoryRepositories(), users, numbering: { next: () => 'CT-2026-001' } });
// 1) Catalogue de services (F6)
const secr = await inc.services.define({ label: 'Secrétariat', category: 'secretariat', price: 3000, unit: 'mois' });
// 2) Admission d'une entreprise + dirigeant (F1 — le dirigeant dérive de User)
const { company } = await inc.companies.admit({
company: { legalName: 'StartupDZ SARL', nif: '0987', sector: 'IT' },
contact: { firstName: 'Yacine', lastName: 'Benali', email: '[email protected]' },
});
// 3) Contrat d'hébergement + service souscrit
const ct = await inc.contracts.create(company.id, { type: 'bureau', monthlyFee: 12000 });
await inc.contracts.activate(ct.id);
await inc.subscriptions.subscribe(company.id, secr.id);
await inc.subscriptions.monthlyTotal(company.id); // { rent: 12000, services: 3000, total: 15000, currency: 'DZD' }
// 4) Cycle d'incubation : candidate → selected → incubating → … → graduated
await inc.companies.advance(company.id); // → selected
await inc.companies.advance(company.id); // → incubating (marque joinedAt)Référence API
| Domaine | Méthodes |
|---|---|
| companies | admit({company,contact}) · get · byContact · list · withContact · addMember · advance · setStatus · graduate · exit |
| contracts | create(companyId,dto) · get · listByCompany · activate · suspend · end |
| services | define(dto) · list · get |
| subscriptions | subscribe(companyId,serviceId,{qty}) · listByCompany · cancel · monthlyTotal(companyId) |
| pilotage | occupancy() · dashboard() · reportingSource() |
Cycle d'incubation : candidate → selected → incubating → accelerating → graduated → exited.
Composition
incubator compose (injection) et ne réimplémente jamais : @mostajs/users (dirigeants/membres — obligatoire), @mostajs/numbering (n° contrat), @mostajs/crm/@mostajs/audit (optionnels), @mostajs/reporting (KPI). Hors périmètre (composés par l'app) : ged, projects, marketplace, allocations, training, mailroom.
Tests & exemple
npm test # 6 tests unitaires
npm run example # parcours couveuse complet (compose users/numbering/reporting)