Types de champs
Reference complete des 37 types de champs disponibles dans Kasar
Kasar dispose d'un systeme de types extensible avec 37 types de champs repartis en 7 categories. Chaque type definit son mapping SQL, ses operateurs de filtre, ses fonctions d'agregation et ses regles de validation.
Vue d'ensemble
| Categorie | Types | Nombre |
|---|---|---|
| Texte | TEXT, LONG_TEXT, RICH_TEXT, EMAIL, PHONE, URL | 6 |
| Numerique | NUMBER, INTEGER, DECIMAL, PERCENT, CURRENCY | 5 |
| Temporel | DATE, DATETIME, DURATION, DATE_RANGE, DATETIME_RANGE | 5 |
| Selection | BOOLEAN, SELECT, MULTI_SELECT | 3 |
| Relationnel | RELATION, USERS, DEPENDENT_RELATION, MORPH_RELATION, MANY_TO_MANY, PRIMARY_M2M_REFERENCE, PIPELINE | 7 |
| Compose | EMAILS, PHONES | 2 |
| Avance | ADDRESS, JSON, COLOR, RATING, IMAGE, DOCUMENTS, CALCULATED, ROLLUP, EXTERNAL_LOOKUP | 9 |
Types de stockage
Les types de champs utilisent trois strategies de stockage differentes :
- Standard : une colonne SQL par champ (TEXT, NUMBER, DATE, etc.)
- Composite : plusieurs colonnes SQL pour un seul champ logique (ADDRESS, CURRENCY, PIPELINE, DATE_RANGE, DATETIME_RANGE)
- Virtuel : pas de colonne sur la table parente (MANY_TO_MANY, EMAILS, PHONES, PRIMARY_M2M_REFERENCE, ROLLUP)
Types texte
Tous les types texte supportent les memes operateurs de filtre :
equals, not_equals, contains, starts_with, ends_with, is_null, is_not_null
Les operateurs contains, starts_with et ends_with utilisent unaccent() des deux cotes pour une recherche insensible aux accents (e → e, a → a).
TEXT
Texte court sur une seule ligne. Type par defaut pour les champs textuels simples.
| Propriete | Valeur |
|---|---|
| SQL | VARCHAR(255) par defaut (configurable via maxLength) |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Oui |
| Contraintes | maxLength (defaut : 255) |
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, AVG_LENGTH, MODE, ANTI_MODE
LONG_TEXT
Texte long multi-lignes (textarea). Adapte aux descriptions, notes ou commentaires.
| Propriete | Valeur |
|---|---|
| SQL | TEXT (illimite) |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Non |
Fonctions d'agregation : COUNT, PERCENT_FILLED, PERCENT_EMPTY, AVG_LENGTH
RICH_TEXT
Texte riche avec formatage (gras, italique, listes, titres). Le contenu est stocke en HTML.
| Propriete | Valeur |
|---|---|
| SQL | TEXT (illimite) |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Non |
| Affichage tableau | HTML nettoye (texte brut) |
Fonctions d'agregation : COUNT, PERCENT_FILLED, PERCENT_EMPTY, AVG_LENGTH
RICH_TEXT est exclu du panneau de filtres dans les vues liste. Le contenu HTML est automatiquement nettoye avant affichage dans les tableaux.
Adresse email avec validation de format et normalisation automatique.
| Propriete | Valeur |
|---|---|
| SQL | VARCHAR(255) |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Oui |
| Affichage tableau | Lien mailto: cliquable |
Validation :
- Normalisation en minuscules
- Format email valide (RFC 5322)
- Longueur max : 254 caracteres
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY
PHONE
Numero de telephone avec validation et formatage automatique.
| Propriete | Valeur |
|---|---|
| SQL | VARCHAR(50) |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Oui |
| Affichage tableau | Lien tel: cliquable |
Validation :
- Nettoyage des separateurs (espaces, tirets, parentheses, points)
- Ajout automatique du prefixe pays
+33si le numero commence par0 - Format international valide : 6 a 15 chiffres
- Normalisation :
+33612345678 - Affichage :
+33 6 12 34 56 78
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY
URL
Lien URL avec validation et normalisation.
| Propriete | Valeur |
|---|---|
| SQL | TEXT |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Oui |
| Affichage tableau | Lien cliquable (nouvel onglet) |
Validation :
- Ajout automatique de
https://si pas de protocole - Seuls
http:ethttps:sont autorises - Longueur max : 2048 caracteres
- Validation via constructeur
URLstandard
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY
Types numeriques
Tous les types numeriques supportent les memes operateurs de filtre :
equals, not_equals, greater_than, less_than, greater_equal, less_equal, between, is_null, is_not_null
NUMBER
Nombre a virgule flottante double precision. Type par defaut pour les valeurs numeriques.
| Propriete | Valeur |
|---|---|
| SQL | DOUBLE PRECISION |
| Defaut SQL | DEFAULT 0 |
| Triable | Oui |
| Indexable | Oui |
| Contraintes | min, max |
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, SUM, AVG, MEDIAN, MIN, MAX, RANGE, STDDEV, VARIANCE
INTEGER
Nombre entier. Ideal pour les quantites, compteurs ou identifiants numeriques.
| Propriete | Valeur |
|---|---|
| SQL | INTEGER |
| Defaut SQL | DEFAULT 0 |
| Triable | Oui |
| Indexable | Oui |
| Contraintes | min, max |
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, SUM, AVG, MEDIAN, MIN, MAX, RANGE, STDDEV, VARIANCE, MODE, ANTI_MODE
DECIMAL
Nombre decimal avec precision configurable. Adapte aux calculs financiers ou scientifiques.
| Propriete | Valeur |
|---|---|
| SQL | DECIMAL(19,4) par defaut (configurable) |
| Defaut SQL | DEFAULT 0 |
| Triable | Oui |
| Indexable | Oui |
| Contraintes | min, max, precision (defaut : 19), scale (defaut : 4) |
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, SUM, AVG, MEDIAN, MIN, MAX, RANGE, STDDEV, VARIANCE
PERCENT
Pourcentage avec precision a 2 decimales.
| Propriete | Valeur |
|---|---|
| SQL | DECIMAL(5,2) |
| Defaut SQL | DEFAULT 0 |
| Triable | Oui |
| Indexable | Oui |
| Contraintes | min (defaut : 0), max (defaut : 100) |
| Affichage | Suffixe % |
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, SUM, AVG, MEDIAN, MIN, MAX, RANGE, STDDEV, VARIANCE
CURRENCY
Montant monetaire avec devise. Type composite : cree 2 colonnes SQL.
| Propriete | Valeur |
|---|---|
| Colonne montant | DECIMAL(19,2) avec DEFAULT 0 |
| Colonne devise | VARCHAR(3) avec DEFAULT 'EUR' |
| Triable | Oui |
| Indexable | Oui |
| Contraintes | min, max, currency (defaut : EUR) |
| Affichage | Formate avec symbole de devise (ex : 12 500,00 EUR) |
Schema SQL : pour un champ amount, deux colonnes sont creees :
"amount" DECIMAL(19,2) DEFAULT 0
"amount_currency" VARCHAR(3) DEFAULT 'EUR'Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, SUM, AVG, MEDIAN, MIN, MAX, RANGE, STDDEV, VARIANCE
Les filtres s'appliquent uniquement sur la colonne montant. Pour filtrer par devise, utilisez un filtre texte sur la colonne {champ}_currency.
Types temporels
Operateurs de filtre date
Tous les types temporels supportent 18 operateurs de filtre, dont 12 operateurs relatifs :
Operateurs absolus : date_equals, date_before, date_after, date_between, is_null, is_not_null
Operateurs relatifs : date_today, date_yesterday, date_this_week, date_last_week, date_this_month, date_last_month, date_this_quarter, date_last_quarter, date_this_year, date_last_year, date_last_n_days, date_next_n_days
Les semaines commencent le lundi (ISO 8601). Les operateurs date_last_n_days et date_next_n_days acceptent un parametre numerique (defaut : 7 jours).
DATE
Date sans heure.
| Propriete | Valeur |
|---|---|
| SQL | DATE |
| Triable | Oui |
| Indexable | Oui |
| Groupable | Oui |
| Affichage | Format local (ex : 15/04/2026) |
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, MEDIAN, MIN, MAX, RANGE
DATETIME
Date avec heure et fuseau horaire.
| Propriete | Valeur |
|---|---|
| SQL | TIMESTAMP |
| Triable | Oui |
| Indexable | Oui |
| Groupable | Oui |
| Affichage | Format local (ex : 15/04/2026 14:30) |
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, MEDIAN, MIN, MAX, RANGE
DURATION
Duree avec unite configurable. Stocke au format texte "valeur:unite".
| Propriete | Valeur |
|---|---|
| SQL | TEXT |
| Triable | Oui (converti en secondes pour le tri) |
| Indexable | Oui |
| Format de stockage | "5:hours", "30:minutes", "1:years" |
Unites supportees :
| Unite | Exemple stocke |
|---|---|
seconds | "120:seconds" |
minutes | "30:minutes" |
hours | "5:hours" |
days | "3:days" |
weeks | "2:weeks" |
months | "6:months" |
years | "1:years" |
Operateurs de filtre : equals, not_equals, greater_than, less_than, greater_equal, less_equal, between, is_null, is_not_null
Fonctions d'agregation : COUNT, PERCENT_FILLED, PERCENT_EMPTY, SUM, AVG, MEDIAN, MIN, MAX, RANGE
DATE_RANGE
Plage de dates (debut + fin). Type composite : cree 2 colonnes SQL.
| Propriete | Valeur |
|---|---|
| Colonne debut | DATE ({champ}_start) |
| Colonne fin | DATE ({champ}_end) |
| Triable | Oui |
| Indexable | Non |
Schema SQL : pour un champ timeline, deux colonnes sont creees :
"timeline_start" DATE
"timeline_end" DATEFonctions d'agregation : COUNT, PERCENT_FILLED, PERCENT_EMPTY, AVG_SPAN, MIN_SPAN, MAX_SPAN
AVG_SPAN, MIN_SPAN et MAX_SPAN calculent la duree entre les dates de debut et de fin (en jours).
DATETIME_RANGE
Plage de dates avec heures. Type composite : cree 2 colonnes SQL.
| Propriete | Valeur |
|---|---|
| Colonne debut | TIMESTAMP ({champ}_start) |
| Colonne fin | TIMESTAMP ({champ}_end) |
| Triable | Oui |
| Indexable | Non |
Schema SQL : pour un champ scheduled, deux colonnes sont creees :
"scheduled_start" TIMESTAMP
"scheduled_end" TIMESTAMPFonctions d'agregation : COUNT, PERCENT_FILLED, PERCENT_EMPTY, AVG_SPAN, MIN_SPAN, MAX_SPAN
Types selection
BOOLEAN
Vrai/Faux (toggle switch).
| Propriete | Valeur |
|---|---|
| SQL | BOOLEAN |
| Defaut SQL | DEFAULT false |
| Indexable | Oui |
Operateurs de filtre : is_true, is_false, is_null, is_not_null
SELECT
Selection unique parmi une liste d'options definies dans un enum.
| Propriete | Valeur |
|---|---|
| SQL | TEXT |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Oui |
| Configuration | enumName — reference vers enum_definitions |
Operateurs de filtre : equals, not_equals, in, not_in, is_null, is_not_null
Les options sont definies dans la table enum_definitions avec la structure suivante :
[
{ "value": "active", "label": "Actif", "color": "#22c55e" },
{ "value": "inactive", "label": "Inactif", "color": "#ef4444" }
]Chaque option a un value (cle technique stockee en base), un label (affiche a l'utilisateur) et un color optionnel (code hexadecimal parmi une palette de 16 couleurs predefinies).
Les enums sont reutilisables : plusieurs champs SELECT/MULTI_SELECT peuvent referencer le meme enumName.
MULTI_SELECT
Selection multiple. Stocke en tableau PostgreSQL.
| Propriete | Valeur |
|---|---|
| SQL | TEXT[] (tableau PostgreSQL) |
| Defaut SQL | DEFAULT '{}'::TEXT[] (tableau vide) |
| Recherche full-text | Oui |
| Triable | Oui |
| Indexable | Non |
| Configuration | enumName — reference vers enum_definitions |
Operateurs de filtre : contains, in, not_in, is_null, is_not_null
Types relationnels
RELATION
Relation classique entre deux objets via cle etrangere. Supporte deux modes :
BELONGS_TO_ONE
L'objet source contient une cle etrangere (FK) vers l'objet cible. C'est le cote "N" d'une relation 1:N.
| Propriete | Valeur |
|---|---|
| SQL | UUID (colonne {champ}_id) |
| Indexable | Oui (index automatique) |
| FK | ON DELETE CASCADE si requis, ON DELETE SET NULL sinon |
Operateurs de filtre : equals, not_equals, in, not_in, is_null, is_not_null
{
relationType: 'BELONGS_TO_ONE',
targetObjectName: 'companies', // Objet cible
targetFieldName: 'contacts', // Champ inverse auto-genere sur la cible
targetFieldLabel: 'Contacts' // Label du champ inverse
}Le suffixe _id est ajoute automatiquement au nom de colonne. Un champ company cree une colonne company_id. Le champ inverse HAS_MANY est genere automatiquement sur l'objet cible.
HAS_MANY
Cote inverse d'un BELONGS_TO_ONE. Virtuel : pas de colonne physique. Les resultats sont calcules par requete.
| Propriete | Valeur |
|---|---|
| SQL | Aucune colonne (virtuel) |
Company.contacts → SELECT * FROM contacts WHERE company_id = {company.id}USERS
Relation speciale vers les utilisateurs du workspace. Cree une cle etrangere vers workspace_users.
| Propriete | Valeur |
|---|---|
| SQL | UUID (colonne {champ}_id) |
| Indexable | Oui (index automatique) |
Operateurs de filtre : equals, not_equals, in, not_in, is_null, is_not_null
{
relationType: 'BELONGS_TO_ONE', // Force automatiquement
targetObjectName: 'workspace_users', // Force automatiquement
defaultToSessionUser: true // Pre-remplit avec l'utilisateur connecte
}DEPENDENT_RELATION
Relation dont les options dependent d'un autre champ du meme objet. Typiquement utilise pour les etapes de pipeline filtrees par pipeline.
| Propriete | Valeur |
|---|---|
| SQL | UUID (colonne {champ}_id) |
| Indexable | Oui |
| FK | ON DELETE SET NULL ON UPDATE CASCADE |
Operateurs de filtre : equals, not_equals, in, not_in, is_null, is_not_null
{
relationType: 'BELONGS_TO_ONE',
targetObjectName: 'pipeline_steps',
dependsOn: 'pipeline_id', // Champ parent (obligatoire)
filterField: 'pipeline_id', // Champ de filtre sur la cible (obligatoire)
dependencyMode: 'strict' // 'strict' = filtre dur, 'suggest' = priorisation souple
}MORPH_RELATION
Relation polymorphe : un champ peut pointer vers plusieurs types d'objets differents. Chaque objet cible recoit sa propre colonne FK, toutes liees par un identifiant morphId commun.
| Propriete | Valeur |
|---|---|
| SQL | 1 colonne UUID par objet cible |
| FK | ON DELETE SET NULL ON UPDATE CASCADE par cible |
| Nommage | {champ}_{cible}_id (ex : linked_to_contacts_id) |
Operateurs de filtre : equals, not_equals, is_null, is_not_null
Exemple : un champ linked_to avec 3 cibles cree 3 colonnes :
"linked_to_contacts_id" UUID -- FK → contacts
"linked_to_companies_id" UUID -- FK → companies
"linked_to_opportunities_id" UUID -- FK → opportunitiesTous les champs partagent le meme morphId. Un seul est rempli a la fois. Utilise pour les taches et notes qui peuvent etre liees a differents types d'objets.
MANY_TO_MANY
Relation N:N via table de jonction auto-generee. Pas de colonne sur les objets source ou cible.
| Propriete | Valeur |
|---|---|
| SQL | Aucune colonne sur les tables parentes |
| Stockage | Table de jonction dediee |
| FK jonction | ON DELETE CASCADE ON UPDATE CASCADE |
Operateurs de filtre : equals, not_equals, in, not_in, is_null, is_not_null
Table de jonction
Nommage : {source}_{champ}_target (ex : contacts_companies_target)
Structure :
CREATE TABLE "contacts_companies_target" (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
contact_id UUID NOT NULL, -- FK → contacts (CASCADE)
company_id UUID, -- FK → companies (CASCADE)
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP DEFAULT NULL
)Un index unique composite est cree automatiquement sur (source_id, target_id).
Champs de jonction
La table de jonction peut contenir des champs additionnels :
junctionFields: [
{ name: 'position', type: 'TEXT', label: 'Poste' },
{ name: 'is_primary', type: 'BOOLEAN', label: 'Contact principal' }
]Options avancees
| Option | Description |
|---|---|
allowLinkFromTarget | Autoriser la creation/suppression de liens depuis le cote cible (defaut : true) |
closedAtColumnName | Nom d'une colonne TIMESTAMP pour marquer la fin d'une relation |
sticky | Auto-extension : ajoute automatiquement une colonne FK quand un nouvel objet est cree |
Multi-cible
Une seule table de jonction peut lier un objet source a plusieurs types d'objets cibles. Chaque cible a sa propre colonne FK (nullable), et une seule est remplie par ligne.
PRIMARY_M2M_REFERENCE
Reference virtuelle vers l'entree "principale" (is_primary = true) d'une relation MANY_TO_MANY.
| Propriete | Valeur |
|---|---|
| SQL | Aucune colonne (virtuel) |
| Lecture seule | Depend du referenceType |
Deux variantes :
display: affiche la valeur du champ standard de l'objet cible principal (lecture seule)junction_field: affiche/edite un champ specifique de la ligne de jonction principale
{
relationType: 'PRIMARY_M2M_REFERENCE',
sourceM2MField: 'companies', // Champ M2M source
referenceType: 'display', // ou 'junction_field'
junctionFieldName: 'position', // Si 'junction_field'
junctionTable: 'contacts_companies_target'
}PIPELINE
Type special pour les pipelines de vente. Type composite : cree 3 colonnes SQL.
| Propriete | Valeur |
|---|---|
| Colonne pipeline | UUID ({champ}_id) — FK vers pipelines |
| Colonne etape | UUID ({champ}_step_id) — FK vers pipeline_steps |
| Colonne cloture | TIMESTAMP ({champ}_closed_at) |
| FK | ON DELETE SET NULL ON UPDATE CASCADE pour les deux FK |
| Indexable | Oui (2 index automatiques) |
Schema SQL : pour un champ pipeline, trois colonnes sont creees :
"pipeline_id" UUID -- FK → pipelines
"pipeline_step_id" UUID -- FK → pipeline_steps
"pipeline_closed_at" TIMESTAMP{
pipelineObject: 'pipelines', // Table des pipelines
stepsObject: 'pipeline_steps', // Table des etapes
stepsFilterField: 'pipeline_id', // Filtre etapes par pipeline
pipelineColumnName: 'pipeline_id',
stepColumnName: 'pipeline_step_id',
closedAtColumnName: 'pipeline_closed_at',
closedAtLabel: 'Date de cloture'
}La vue Kanban est optimisee pour afficher les etapes de pipeline comme colonnes.
Types composes
Les types composes creent automatiquement une table enfant liee par cle etrangere a l'objet parent. Ils n'ont pas de colonne sur la table parente.
EMAILS
Stocke plusieurs adresses email par enregistrement dans une table enfant dediee.
| Propriete | Valeur |
|---|---|
| SQL | Aucune colonne sur la table parente (virtuel) |
| Table enfant | {objet}_emails (ex : contacts_emails) |
Structure de la table enfant :
CREATE TABLE "contacts_emails" (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
contact_id UUID NOT NULL, -- FK → contacts (CASCADE)
email_address VARCHAR(255) NOT NULL,
is_primary BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP DEFAULT NULL
)
CREATE UNIQUE INDEX "idx_contacts_emails_unique_email"
ON "contacts_emails" ("contact_id", "email_address")La table enfant est un objet systeme cache (isHidden: true, isSystem: true). Le champ email_address est indexe pour la recherche.
PHONES
Stocke plusieurs numeros de telephone par enregistrement dans une table enfant dediee.
| Propriete | Valeur |
|---|---|
| SQL | Aucune colonne sur la table parente (virtuel) |
| Table enfant | {objet}_phones (ex : contacts_phones) |
Structure de la table enfant :
CREATE TABLE "contacts_phones" (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
contact_id UUID NOT NULL, -- FK → contacts (CASCADE)
phone_number VARCHAR(50) NOT NULL,
is_primary BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
deleted_at TIMESTAMP DEFAULT NULL
)
CREATE UNIQUE INDEX "idx_contacts_phones_unique_phone"
ON "contacts_phones" ("contact_id", "phone_number")Types avances
ADDRESS
Adresse structuree. Type composite : cree 7 colonnes SQL dont une colonne calculee.
| Propriete | Valeur |
|---|---|
| Recherche full-text | Oui (via la colonne formatted) |
Schema SQL : pour un champ address, sept colonnes sont creees :
| Colonne | Type SQL | Description |
|---|---|---|
address_address1 | TEXT | Ligne d'adresse 1 |
address_address2 | TEXT | Ligne d'adresse 2 |
address_city | TEXT | Ville |
address_region | TEXT | Region / Etat |
address_postal_code | TEXT | Code postal |
address_country | TEXT | Pays |
address_formatted | TEXT GENERATED | Adresse formatee (calculee automatiquement) |
La colonne formatted est une colonne calculee (GENERATED ALWAYS AS ... STORED) qui concatene automatiquement les composants non vides, separes par des virgules. Elle est utilisee pour la recherche full-text.
JSON
Donnees JSON libres stockees en JSONB PostgreSQL.
| Propriete | Valeur |
|---|---|
| SQL | JSONB |
| Defaut SQL | DEFAULT '{}'::jsonb |
Operateurs de filtre : is_null, is_not_null
COLOR
Couleur hexadecimale avec selecteur visuel.
| Propriete | Valeur |
|---|---|
| SQL | VARCHAR(7) |
| Indexable | Oui |
| Format | #RRGGBB (ex : #FF0000) |
| Validation | Expression reguliere ^#[0-9A-Fa-f]{6}$ |
RATING
Note sur 5 (affichee en etoiles).
| Propriete | Valeur |
|---|---|
| SQL | SMALLINT |
| Defaut SQL | DEFAULT 0 |
| Indexable | Oui |
| Contraintes | min (defaut : 0), max (defaut : 5) |
Operateurs de filtre : equals, not_equals, greater_than, less_than, greater_equal, less_equal, between, is_null, is_not_null
Fonctions d'agregation : COUNT, COUNT_DISTINCT, PERCENT_FILLED, PERCENT_EMPTY, SUM, AVG, MEDIAN, MIN, MAX, RANGE, STDDEV, VARIANCE, MODE, ANTI_MODE
IMAGE
URL d'image avec apercu visuel.
| Propriete | Valeur |
|---|---|
| SQL | TEXT |
| Contraintes | maxLength (defaut : 2048), format: 'url' |
Operateurs de filtre : is_null, is_not_null
DOCUMENTS
Pieces jointes / fichiers. Stocke un tableau de metadonnees en JSONB.
| Propriete | Valeur |
|---|---|
| SQL | JSONB |
Operateurs de filtre : is_null, is_not_null
Structure de chaque document :
{
"url": "https://...",
"fileName": "facture.pdf",
"fileType": "application/pdf",
"fileSize": 245000,
"storagePath": "org/documents/...",
"uploadedAt": "2026-04-15T10:30:00Z"
}Types de fichiers autorises : PDF, Word, Excel, CSV, PowerPoint, images. Taille max : 10 Mo par fichier.
CALCULATED
Colonne calculee cote base de donnees via une expression SQL.
| Propriete | Valeur |
|---|---|
| SQL | {type_resultat} GENERATED ALWAYS AS ({expression}) STORED |
| Lecture seule | Oui (calculee automatiquement) |
| Triable | Oui |
| Indexable | Oui |
| Recherche | Oui |
Le type SQL de la colonne depend du resultType configure (ex : NUMBER → DOUBLE PRECISION, TEXT → TEXT).
Configuration :
{
computedExpression: "first_name || ' ' || last_name", // Expression SQL
resultType: 'TEXT' // Type du resultat
}Exemple de colonne generee :
"full_name" TEXT GENERATED ALWAYS AS (first_name || ' ' || last_name) STOREDL'expression SQL est executee directement par PostgreSQL. Elle doit referencer des colonnes existantes de la meme table et etre deterministe (IMMUTABLE).
ROLLUP
Champ calcule qui agrege des donnees d'objets lies. Virtuel : pas de colonne en base, calcul au runtime.
| Propriete | Valeur |
|---|---|
| SQL | Aucune colonne (virtuel) |
| Lecture seule | Oui |
{
sourceRelationField: 'contacts', // Champ relation source
targetField: 'amount', // Champ a agreger sur l'objet cible
targetFieldType: 'CURRENCY', // Type du champ cible
rollupFunction: 'SUM' // Fonction d'agregation
}Fonctions d'agregation ROLLUP
Fonctions generales (tous les types de champs) :
| Fonction | Resultat | Description |
|---|---|---|
SHOW_ORIGINAL | meme type | Valeurs brutes |
SHOW_UNIQUE | TEXT | Valeurs uniques |
COUNT_ALL | NUMBER | Nombre total |
COUNT_VALUES | NUMBER | Nombre de valeurs non vides |
COUNT_UNIQUE | NUMBER | Nombre de valeurs uniques |
COUNT_EMPTY | NUMBER | Nombre de valeurs vides |
COUNT_NOT_EMPTY | NUMBER | Nombre de valeurs non vides |
PERCENT_EMPTY | PERCENT | Pourcentage de vides |
PERCENT_NOT_EMPTY | PERCENT | Pourcentage de non-vides |
Fonctions numeriques (NUMBER, INTEGER, DECIMAL, CURRENCY, PERCENT, RATING) :
| Fonction | Resultat | Description |
|---|---|---|
SUM | meme type | Somme |
AVERAGE | DECIMAL (ou CURRENCY) | Moyenne |
MEDIAN | meme type | Mediane |
MIN | meme type | Minimum |
MAX | meme type | Maximum |
RANGE | meme type | Ecart (max - min) |
Fonctions date (DATE, DATETIME) :
| Fonction | Resultat | Description |
|---|---|---|
EARLIEST_DATE | meme type | Date la plus ancienne |
LATEST_DATE | meme type | Date la plus recente |
DATE_RANGE | NUMBER | Ecart en jours |
Fonctions booleennes (BOOLEAN) :
| Fonction | Resultat | Description |
|---|---|---|
COUNT_TRUE | NUMBER | Nombre de true |
COUNT_FALSE | NUMBER | Nombre de false |
PERCENT_TRUE | PERCENT | Pourcentage de true |
Fonctions M2M :
| Fonction | Resultat | Description |
|---|---|---|
SHOW_PRIMARY | meme type | Valeur de l'entree principale (is_primary = true) |
Disponibilite par type de relation
| Relation source | Fonctions disponibles |
|---|---|
BELONGS_TO_ONE | SHOW_ORIGINAL uniquement |
MORPH_RELATION | SHOW_ORIGINAL uniquement |
HAS_MANY | Generales + specifiques au type |
MANY_TO_MANY | Generales + specifiques au type |
EXTERNAL_LOOKUP
Lookup en temps reel vers une base de donnees externe via un connecteur. Permet d'afficher des donnees d'un Supabase ou PostgreSQL externe directement dans Kasar.
| Propriete | Valeur |
|---|---|
| SQL | TEXT (BELONGS_TO_ONE) ou TEXT[] (HAS_MANY) |
Deux modes :
- BELONGS_TO_ONE : stocke un identifiant externe unique (
TEXT) - HAS_MANY : stocke plusieurs identifiants externes (
TEXT[], max configurable, defaut 25)
Configuration :
{
connectorId: 'cred_xxx', // ID du connecteur externe
externalSchema: 'public', // Schema de la table externe
externalTable: 'stripe_invoices', // Table externe
externalPrimaryKey: 'id', // Cle primaire de la table externe
localLookupField: 'email', // Champ local utilise pour la jointure
externalLookupField: 'customer_email', // Champ externe utilise pour la jointure
columns: [ // Colonnes a afficher
{
externalColumn: 'amount',
localAlias: 'Montant facture',
displayType: 'CURRENCY',
aggregation: 'SUM' // Pour HAS_MANY : agregation
},
{
externalColumn: 'created_at',
localAlias: 'Derniere facture',
displayType: 'DATE',
aggregation: 'LATEST_DATE'
}
],
staticFilter: { // Filtre optionnel sur la table externe
field: 'status',
operator: 'eq',
value: 'paid'
},
sortBy: { // Tri optionnel
field: 'created_at',
direction: 'desc'
}
}Chaque colonne configuree cree un champ enfant virtuel en lecture seule, affiche dans le detail de l'enregistrement.
Champs injectes automatiquement
Lors de la creation d'un objet, les champs suivants sont automatiquement ajoutes par le systeme de migration. Ne les specifiez jamais manuellement.
| Champ | Type SQL | Description |
|---|---|---|
id | UUID PRIMARY KEY DEFAULT gen_random_uuid() | Identifiant unique |
created_at | TIMESTAMP DEFAULT NOW() | Date de creation |
updated_at | TIMESTAMP DEFAULT NOW() | Date de derniere modification |
deleted_at | TIMESTAMP | Soft delete |
created_by_id | UUID (FK → workspace_users) | Createur |
De meme, pour les champs relationnels :
- Le suffixe
_idest ajoute automatiquement aux colonnes FK - Les index sur les FK sont crees automatiquement
- Le champ inverse HAS_MANY est genere automatiquement pour chaque BELONGS_TO_ONE