{{ error }}
{{ successMessage }}
Un administrateur a requis l'activation de l'authentification à deux facteurs pour votre compte.
Génération du QR code...
Utilisez une application comme Google Authenticator ou Authy pour scanner ce code :
Secret manuel : {{ totpSecret }}
Entrez le code à 6 chiffres généré par votre application
{{ setup2FAError }}
{{ setup2FAError }}
3D, Laser & Print from Switzerland
| Membre | Postes | Rôles | Statut | 2FA | Dernière connexion | Actions |
|---|---|---|---|---|---|---|
| Chargement... | ||||||
|
{{ u.first_name }} {{ u.last_name }} {{ u.email }} {{ formatDateShort(u.birth_date) }} |
{{ pos.trim() }}
-
|
Admin
Vendeur
|
Actif Inactif |
Activé
Requis
|
{{ u.last_login ? formatDate(u.last_login) : 'Jamais' }} |
|
Chargement des partenaires...
Aucun partenaire trouvé
| Nom commercial | Type | Téléphone | Code Postal | Ville, Pays | Actions |
|---|---|---|---|---|---|
|
{{ partner.company_name }}
{{ partner.legal_name }}
|
Client
Fournisseur
|
{{ partner.phone || '—' }} | {{ getBillingAddress(partner)?.postal_code || '—' }} | {{ getBillingAddress(partner).city || '—' }}, {{ getBillingAddress(partner).country?.name_fr || '' }} — |
|
Modifier le partenaireInformations Générales
Source :
Manuel
Odoo
Import
Site web
Recommandation
{{ partner.data_origin }}
Raison sociale :
{{ partner.legal_name }}
Numéro TVA :
{{ partner.vat_number }}
Structure juridique :
{{ partner.legal_structure.name }}
Site web :
{{ partner.website }}
Notes :
{{ partner.notes }}
Aucune information complémentaire. Utilisez le bouton "Modifier" pour en ajouter.
AdressesChargement...
Aucune adresse
Nouvelle adresse
{{ addr.client_name }}
Facturation
⭐ Fact. défaut
Livraison
⭐ Livr. défaut
{{ addr.delivery_company }}
{{ addr.address_line1 }}
{{ addr.address_line2 }}
{{ addr.postal_code }} {{ addr.city }}
({{ addr.state.name }})
{{ addr.country.name_fr }}
{{ addr.delivery_contact.first_name }} {{ addr.delivery_contact.last_name }}
ContactsChargement...
Aucun contact
Nouveau contact
M.
Mme
{{ contact.title }}
{{ contact.first_name }} {{ contact.last_name }}
|
{{ contact.position }}
|
{{ contact.email }}
|
{{ phone.country.phone_prefix }} {{ phone.phone_number }}
ext. {{ phone.extension }}
•
+{{ contact.phones.length - 2 }}
|
Reçoit factures
{{ contact.notes }}
Téléphones
Aucun téléphone enregistré
{{ phone.country.phone_prefix }}
{{ phone.phone_number }}
ext. {{ phone.extension }}
Principal
{{ phone.label }}
|
|||||
| Code | Nom | Statut | Actions |
|---|---|---|---|
| Chargement... | |||
| {{ lang.code }} | {{ lang.name }} | Active Inactive |
|
| Code | Nom (FR) | Nom (EN) | Préfixe | État requis | Statut | Actions |
|---|---|---|---|---|---|---|
| Chargement... | ||||||
| {{ country.code }} | {{ country.name_fr }} | {{ country.name_en }} | {{ country.phone_prefix || '—' }} | Actif Inactif |
|
|
| Pays | Code | Nom | Statut | Actions |
|---|---|---|---|---|
| Chargement... | ||||
| {{ getCountryName(state.country_id) }} | {{ state.code }} | {{ state.name }} | Actif Inactif |
|
| Code | Nom | Pays | Description | Statut | Actions |
|---|---|---|---|---|---|
| Chargement... | |||||
| {{ ls.code }} | {{ ls.name }} | {{ ls.country_code }} — | {{ ls.description || '—' }} | Active Inactive |
|
| Logo | Nom | Pays | TVA | Adresse | Code compta | Statut | Actions |
|---|---|---|---|---|---|---|---|
| Chargement... | |||||||
|
|
{{ be.name }}
{{ be.legal_name || '—' }}
|
{{ getCountryName(be.country_id) }} | {{ be.vat_number || '—' }} |
{{ be.address }}
{{ be.postal_code }} {{ be.city }}
|
{{ be.next_accounting_code }} | Active Inactive |
|
{{ fiscalYearsModal.entity?.name }}
| Code | Libellé | Début | Fin | Statut | Actions |
|---|---|---|---|---|---|
| Chargement... | |||||
| {{ fy.year_code }} | {{ fy.year_label }} | {{ formatDate(fy.start_date) }} | {{ formatDate(fy.end_date) }} | Clôturé Ouvert |
—
|
| Date | De | Vers | Taux | Source | Dernière MAJ |
|---|---|---|---|---|---|
| Chargement... | |||||
| {{ formatDate(rate.rate_date) }} | {{ rate.base_currency }} | {{ rate.target_currency }} | {{ rate.rate.toFixed(6) }} | Auto Manuel | {{ formatDateTime(rate.updated_at) }} |
| Code | Nom | Symbole | Catégorie | Actions |
|---|---|---|---|---|
| Aucune unité enregistrée | ||||
| {{ unit.code }} | {{ unit.name }} | {{ unit.symbol }} | {{ unit.category }} - | |
| Code | Nom | Localisation | Pays | Actions |
|---|---|---|---|---|
| Aucun dépôt enregistré | ||||
| {{ warehouse.code }} | {{ warehouse.name }} | {{ warehouse.location || '-' }} | {{ warehouse.country_name }} - | |
@{{ ctx.name }}
{{ ctx.ip_address }}
Les présets permettent de définir rapidement des plages horaires avec la syntaxe h(nom) dans la saisie rapide des tâches.
| Nom | Jours | Heures | Syntaxe | Actions |
|---|---|---|---|---|
| {{ preset.name }} | {{ formatPresetDays(preset.days) }} | {{ preset.start_time?.substring(0,5) }} - {{ preset.end_time?.substring(0,5) }} Toute la journée |
h({{ preset.name }})
|
(système) |
Temps disponible pour annuler une action de complétion de tâche
Chargement des articles...
Aucun article trouvé
| SKU | Description | Marque | Type | Stock | Actions | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ article.sku }} | {{ article.description.substring(0, 60) }}{{ article.description.length > 60 ? '...' : '' }} | {{ article.brand || '-' }} | {{ article.article_type === 'product' ? 'Produit' : 'Service' }} | {{ article.total_stock }} {{ article.unit?.symbol || '' }} | ||||||||||||||||||||||||
Informations générales{{ article.sku }}
Non modifiable après création {{ article.description }}
{{ article.brand || '—' }}
{{ article.unit?.name }} ({{ article.unit?.symbol }})
{{ article.article_type === 'product' ? 'Produit' : 'Service' }}
{{ article.reorder_level }} {{ article.unit?.symbol || '' }}
{{ article.total_stock || 0 }} {{ article.unit?.symbol || '' }}
Stock bas, réapprovisionner Galerie photos
{{ photoMessage.text }}
Upload en cours... Chargement des photos... Aucune photo. Uploadez la première ci-dessus.
Principale
Photo {{ photo.display_order }}
Astuce : La première photo uploadée devient automatiquement la photo principale. Vous pouvez ensuite changer la photo principale en cliquant sur l'icône sur une autre photo. Documents techniques
{{ documentMessage.text }}
Upload en cours... Chargement des documents... Aucun document. Uploadez le premier ci-dessus.
{{ doc.document_name }}
{{ doc.document_type }}
{{ formatFileSize(doc.file_size_kb) }}
{{ new Date(doc.created_at).toLocaleDateString('fr-FR') }}
Types de documents supportés : Datasheets (PDF), manuels d'utilisation (PDF/DOC), certificats (PDF), fiches techniques (XLS), etc. Gestion du stock
{{ stockMessage.text }}
Ajouter une entrée de stockStock total disponible
{{ article.total_stock || 0 }} {{ article.unit?.symbol || '' }}
Stock bas ! Seuil de réappro: {{ article.reorder_level }} {{ article.unit?.symbol }}
Chargement du stock... Aucune entrée de stock. Ajoutez la première ci-dessus.
Gestion multi-dépôt : Vous pouvez stocker le même article dans plusieurs dépôts avec différents lots et dates d'expiration. Le stock total est la somme de toutes les entrées actives. Grille tarifaire par paliers
{{ priceMessage.text }}
Ajouter un palier de prixLe prix s'appliquera pour ≥ cette quantité Chargement de la grille tarifaire... Aucun tarif configuré. Ajoutez le premier palier ci-dessus. Ex: ≥1u = 100€, ≥10u = 90€, ≥50u = 80€
{{ price.entity_code || 'N/A' }}
Palier {{ index + 1 }}
À partir de
≥ {{ price.quantity_from }} {{ article.unit?.symbol || 'u' }}
Prix unitaire
{{ formatPrice(price.price, price.currency) }}
Ex: {{ price.quantity_from }} {{ article.unit?.symbol }} = {{ formatPrice(price.price * price.quantity_from, price.currency) }}
Modifier le palier de prix
Tableau récapitulatif
Tarification par paliers : Le système sélectionne automatiquement le meilleur prix applicable selon la quantité commandée. Plus la quantité est élevée, plus le prix unitaire peut être avantageux. Fournisseurs de l'article
{{ supplierMessage.text }}
Ajouter un fournisseurLes fournisseurs sont des clients marqués comme "is_supplier" Un seul fournisseur préféré par article (décoche automatiquement les autres) Chargement des fournisseurs... Aucun fournisseur lié. Ajoutez le premier ci-dessus. Prix d'achat
{{ supplier.purchase_price ? formatPrice(supplier.purchase_price, supplier.currency) : '-' }}
Modifier le fournisseur
Ref. fournisseur
{{ supplier.supplier_sku }}
Code-barre 1
{{ supplier.barcode_1 }}
Code-barre 2
{{ supplier.barcode_2 }}
Code-barre 3
{{ supplier.barcode_3 }}
Seuil de réappro: {{ supplier.reorder_level }} {{ article.unit?.symbol }}
Gestion multi-fournisseurs : Vous pouvez lier plusieurs fournisseurs à un article avec leurs propres prix d'achat, codes-barres et seuils de réappro. Le fournisseur préféré est utilisé par défaut dans les commandes. Configuration comptable par entité
{{ accountingMessage.text }}
Ajouter une configuration comptableChoisissez l'entité pour laquelle configurer les comptes (PCH, PFR, etc.) Taux de TVA applicable pour cet article
{{ acc.code }}
{{ acc.label }}
Compte d'achat de marchandises
{{ acc.code }}
{{ acc.label }}
Compte de vente de produits Chargement de la configuration comptable... Aucune configuration comptable. Ajoutez la première ci-dessus. {{ config.entity?.name || getEntityName(config.billing_entity_id) }}{{ config.entity?.code }} {{ config.entity?.country_code }}Code TVA
{{ config.tax_code.code }} ({{ config.tax_code.rate }}%)
{{ config.tax_code.label }}
Compte TVA (legacy)
{{ config.vat_account_code }}
Ancien format - à mettre à jour
Compte Achat
{{ config.purchase_account_code }}
Achats de marchandises
Compte Vente
{{ config.sales_account_code }}
Ventes de produits
Configuration multi-entités : Vous pouvez définir des comptes comptables différents pour chaque entité de facturation (PCH, PFR, etc.). Les codes doivent correspondre au plan comptable du pays concerné (CH: plan comptable suisse, FR: plan comptable français). |
||||||||||||||||||||||||||||
Chargement des clients...
| Nom commercial | TVA | Téléphone | Site web | Actions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
{{ client.company_name }}
{{ client.legal_name }}
|
{{ client.vat_number || '—' }} | {{ client.phone || '—' }} | {{ client.website }} — |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Informations principalesNom commercial
{{ client.company_name }}
Raison sociale
{{ client.legal_name || '—' }}
N° TVA
{{ client.vat_number || '—' }}
Téléphone
{{ client.phone || '—' }}
Site web
Notes
{{ client.notes }}
Adresses
Contacts
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Aucun client pour le moment
Cliquez sur "Nouveau client" pour en créer un
Cette page affichera les clients assignés au vendeur connecté avec statistiques et actions rapides.
Cette page affichera le pipeline de vente avec vue Kanban par étape (Prospect, Qualification, Proposition, Négociation, Gagné/Perdu).
{{ selectedDossier.client.company_name }}
{{ selectedDossier.description || 'Aucune description' }}
{{ selectedDossier.notes_internes || 'Aucune note' }}
Aucun devis lié à ce dossier
Aucun projet lié à ce dossier
Aucune tâche liée à ce dossier
Aucun contact lié à ce dossier
Aucun dossier trouvé
{{ d.client.company_name }}
| Numero | Client | Date | Expire | Total TTC | Marge nette | Statut | Actions |
|---|---|---|---|---|---|---|---|
| Chargement... | |||||||
| Aucun devis trouve | |||||||
| {{ q.quote_number }} {{ q.entity_code }} | {{ q.client_name }} | {{ formatDateShort(q.quote_date) }} | {{ formatDateShort(q.expiry_date) }} | {{ formatMoney(q.total_ttc, q.currency) }} | {{ (q.net_margin_rate || 0).toFixed(1) }}% | {{ getQuoteStatusLabel(q.status) }} |
Pour changer d'entité, dupliquez le devis
| Description | Qte | P.U. | Coût | Remise | TVA | Total HT | Marge | ||
|---|---|---|---|---|---|---|---|---|---|
| Aucune ligne. Cliquez sur "+ Article" pour commencer. | |||||||||
|
{{ line.sku }}
|
|
{{ line.vat_rate }}% | {{ formatMoney(line.line_total_ht, quoteForm.currency) }} | {{ line.margin_rate?.toFixed(1) || 0 }}% |
Aucun composant interne
Aucun article trouvé
Chargement des fournisseurs...
Aucun fournisseur configuré pour cet article.
Devis source : {{ quoteToDuplicate?.quote_number }}
Le nouveau devis recevra un numéro de la séquence de l'entité choisie
Cette page permettra de gérer les listes de prix par client, produit et période avec historique et versions.
Cette page affichera les commandes fournisseurs avec suivi des livraisons et gestion des stocks.
Cette page permettra de gérer les factures clients et fournisseurs avec comptabilisation automatique et relances.
Aucune entité de facturation disponible
Entité sélectionnée : {{ selectedEntity.name }} ({{ selectedEntity.code }})
Cette page de transition permet d'accéder aux modules existants. La refonte complète multi-entités sera déployée prochainement.
Chargement...
Aucune écriture
Aucune écriture ne correspond aux filtres
| Compte | Libellé | Débit | Crédit | Devise |
|---|---|---|---|---|
|
{{ getAccountLabelCH(line.account_id) }}
{{ getAuxiliaryCode(line.account_id, line.partner_id, accountsCH) }} - {{ formatPartner(line.partner_id) }}
|
{{ line.description }} | {{ line.debit > 0 ? line.debit.toFixed(2) : '' }} | {{ line.credit > 0 ? line.credit.toFixed(2) : '' }} |
{{ line.amount_original.toFixed(2) }} {{ line.currency_original }}
@ {{ line.exchange_rate.toFixed(4) }} CHF |
Chargement...
Aucun journal
| Code | Nom | Type | Compte bancaire | Prochain N° | Statut | Actions | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ journal.code }} | {{ journal.name }} | {{ getJournalTypeLabel(journal.journal_type) }} |
{{ getBankAccountName(journal.bank_account_id) }}
—
|
{{ journal.code }}-{{ new Date().getFullYear() }}-{{ String(journal.next_entry_number).padStart(5, '0') }} | Actif Inactif |
|
|||||||
Gestion du compte bancaire pour {{ journal.name }}
{{ bankAccountMessage.text }}
Comptes bancaires disponibles
Aucun compte bancaire disponible. Créez-en un ci-dessous.
{{ ba.account_name }}
{{ ba.bank_name }}
{{ ba.iban }}
Nouveau compte bancaireModifier le compte bancaire |
|||||||||||||
Chargement...
Aucun compte trouvé
Compte {{ selectedAccountForTaxCodes.code }} - {{ selectedAccountForTaxCodes.label }}
Sélectionnez les codes TVA autorisés pour ce compte :
Chargement...
Aucune écriture
Aucune écriture ne correspond aux filtres
| Compte | Libellé | Débit | Crédit | Devise |
|---|---|---|---|---|
|
{{ getAccountLabelFR(line.account_id) }}
{{ getAuxiliaryCode(line.account_id, line.partner_id, accountsFR) }} - {{ formatPartner(line.partner_id) }}
|
{{ line.description }} | {{ line.debit > 0 ? line.debit.toFixed(2) : '' }} | {{ line.credit > 0 ? line.credit.toFixed(2) : '' }} |
{{ line.amount_original.toFixed(2) }} {{ line.currency_original }}
@ {{ line.exchange_rate.toFixed(4) }} EUR |
Chargement...
Aucun journal
| Code | Nom | Type | Compte bancaire | Prochain N° | Statut | Actions | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ journal.code }} | {{ journal.name }} | {{ getJournalTypeLabel(journal.journal_type) }} |
{{ getBankAccountName(journal.bank_account_id) }}
—
|
{{ journal.code }}-{{ new Date().getFullYear() }}-{{ String(journal.next_entry_number).padStart(5, '0') }} | Actif Inactif |
|
|||||||
Gestion du compte bancaire pour {{ journal.name }}
{{ bankAccountMessage.text }}
Comptes bancaires disponibles
Aucun compte bancaire disponible. Créez-en un ci-dessous.
{{ ba.account_name }}
{{ ba.bank_name }}
{{ ba.iban }}
Nouveau compte bancaireModifier le compte bancaire |
|||||||||||||
Chargement...
Aucun compte trouvé
Compte {{ selectedAccountForTaxCodes.code }} - {{ selectedAccountForTaxCodes.label }}
Sélectionnez les codes TVA autorisés pour ce compte :
Ajouter le temps (15, 1h...) ou Entrée pour ignorer
Chargement...
Aucune tâche trouvée
La tâche n'apparaîtra dans le Top 10 que pendant cette plage
La tâche n'apparaîtra dans le Top 10 que pendant cette plage
{{ task.description }}
La tâche n'apparaîtra dans le Top 10 que pendant cette plage
La tâche n'apparaîtra dans le Top 10 que pendant cette plage
{{ task.description }}
La tâche n'apparaîtra dans le Top 10 que pendant cette plage
{{ formatTotalTime(taskStats.inProgressMinutes) || '0min' }}
{{ formatTotalTime(taskStats.nextActionMinutes) || '0min' }}
{{ formatTotalTime(taskStats.waitingMinutes) || '0min' }}
{{ formatTotalTime(taskStats.somedayMinutes) || '0min' }}
Total backlog
{{ taskStats.totalPending }}
tâches actives
Temps estimé total
{{ formatTotalTime(taskStats.totalPendingMinutes) || '0' }}
de travail
Temps actionnable
{{ formatTotalTime(taskStats.actionableMinutes) || '0' }}
disponible maintenant
{{ taskStats.completedThisWeek }}
Complétées
{{ formatTotalTime(taskStats.completedThisWeekMinutes) || '0min' }}
{{ taskStats.createdThisWeek }}
Créées
{{ formatTotalTime(taskStats.createdThisWeekMinutes) || '0min' }}
{{ taskStats.completedThisMonth }}
Complétées
{{ formatTotalTime(taskStats.completedThisMonthMinutes) || '0min' }}
{{ taskStats.createdThisMonth }}
Créées
{{ formatTotalTime(taskStats.createdThisMonthMinutes) || '0min' }}
Productivité
{{ taskStats.completedThisWeek >= taskStats.completedLastWeek ? 'En progression' : 'À améliorer' }}
Nouvelles tâches
{{ taskStats.createdThisWeek <= taskStats.createdLastWeek ? 'Maîtrisé' : 'Influx élevé' }}
Vélocité (temps complété)
Cette semaine vs précédente
Pas encore de données historiques
Les statistiques s'accumulent jour après jour
Aucun projet avec des tâches
Cette section permettra de centraliser les connaissances de l'entreprise : procédures, documentation, FAQ, et ressources partagées.