Changeset 3803495
- Timestamp:
- 11/15/2026 03:31:43 PM (5 hours ago)
- Location:
- ultimate-business-dashboard
- Files:
-
- 20 edited
- 1 copied
-
tags/2.7.1 (copied) (copied from ultimate-business-dashboard/trunk )
-
tags/2.7.1/assets/css/admin.css (modified) (3 diffs)
-
tags/2.7.1/assets/js/admin.js (modified) (1 diff)
-
tags/2.7.1/includes/format.php (modified) (2 diffs)
-
tags/2.7.1/includes/invoice-store.php (modified) (1 diff)
-
tags/2.7.1/includes/quality.php (modified) (10 diffs)
-
tags/2.7.1/languages/ultimate-business-dashboard-fr_FR.mo (modified) ( previous)
-
tags/2.7.1/languages/ultimate-business-dashboard-fr_FR.po (modified) (21 diffs)
-
tags/2.7.1/languages/ultimate-business-dashboard.pot (modified) (12 diffs)
-
tags/2.7.1/readme.txt (modified) (3 diffs)
-
tags/2.7.1/ultimate-business-dashboard.php (modified) (4 diffs)
-
trunk/assets/css/admin.css (modified) (3 diffs)
-
trunk/assets/js/admin.js (modified) (1 diff)
-
trunk/includes/format.php (modified) (2 diffs)
-
trunk/includes/invoice-store.php (modified) (1 diff)
-
trunk/includes/quality.php (modified) (10 diffs)
-
trunk/languages/ultimate-business-dashboard-fr_FR.mo (modified) ( previous)
-
trunk/languages/ultimate-business-dashboard-fr_FR.po (modified) (21 diffs)
-
trunk/languages/ultimate-business-dashboard.pot (modified) (12 diffs)
-
trunk/readme.txt (modified) (3 diffs)
-
trunk/ultimate-business-dashboard.php (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ultimate-business-dashboard/tags/2.7.1/assets/css/admin.css
r3803022 r3803495 841 841 .card-empty { margin: 0; color: var(--ubd-grey); font-style: italic; } 842 842 .card-actions { align-items: center; gap: 6px; flex-wrap: wrap; } 843 .card-actions .button .dashicons { font-size: 16px; width: 16px; height: 16px; vertical-align: middle; margin: -3px 2px 0 0; }844 843 .ultibuda-icon-button.button { padding: 0 6px; color: var(--ubd-grey); } 845 844 .ultibuda-icon-button.button:hover, 846 845 .ultibuda-icon-button.button:focus { color: var(--ubd-blue); } 847 .ultibuda-icon-button .dashicons { margin-right: 0 !important; }848 846 .ultibuda-inline-form { display: inline; margin: 0; } 849 847 … … 896 894 .ultibuda-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; } 897 895 .ultibuda-break-even { margin: 12px 0 0; color: var(--ubd-grey); } 898 .print-report-btn .dashicons { vertical-align: middle; margin-top: -3px; }899 896 @media (max-width: 1100px) { 900 897 .ultibuda-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); } … … 1023 1020 .ultibuda-code-input { width: 100px; } 1024 1021 .ultibuda-categories-table select { max-width: 100%; } 1022 1023 /* 2.7.1 : icônes centrées dans les boutons, quelle que soit la taille du texte */ 1024 .card-actions .button, 1025 .print-report-btn.button { 1026 display: inline-flex; 1027 align-items: center; 1028 justify-content: center; 1029 gap: 4px; 1030 } 1031 .card-actions .button .dashicons, 1032 .print-report-btn .dashicons { 1033 font-size: 16px; 1034 width: 16px; 1035 height: 16px; 1036 line-height: 1; 1037 margin: 0; 1038 vertical-align: baseline; 1039 } 1040 1041 /* 2.7.1 : page Factures, catégorie lisible et type compact */ 1042 .ultibuda-invoices-table .column-supplier { width: 24%; } 1043 .ultibuda-invoices-table .column-category { width: 28%; } 1044 .ultibuda-invoices-table .column-category select { width: 100%; min-width: 200px; max-width: none; } 1045 .ultibuda-invoices-table .ultibuda-select-small { width: auto; max-width: 140px; min-width: 0; } 1046 .ultibuda-invoices-table .column-input { width: 96px; } 1047 .ultibuda-invoices-table .column-input input { max-width: 96px; } 1048 1049 /* 2.7.1 : doublons probables en colonnes alignées */ 1050 .ultibuda-dup-line { display: grid; grid-template-columns: 150px 100px 100px minmax(0, 1fr) auto; align-items: center; gap: 4px 12px; padding: 3px 0; } 1051 .ultibuda-dup-line .num { text-align: right; font-variant-numeric: tabular-nums; } 1052 .ultibuda-dup-line > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } 1053 @media (max-width: 782px) { .ultibuda-dup-line { grid-template-columns: minmax(0, 1fr) auto; } .ultibuda-dup-line > span:nth-child(4) { display: none; } } -
ultimate-business-dashboard/tags/2.7.1/assets/js/admin.js
r3803022 r3803495 334 334 { type: 'bar', label: d.revenueLabel, data: d.revenue, backgroundColor: 'rgba(34, 113, 177, 0.75)', borderRadius: 3, order: 3 }, 335 335 { type: 'line', label: d.revenuePrevLabel, data: d.revenuePrev, borderColor: '#8c8f94', borderDash: [6, 4], pointRadius: 0, borderWidth: 2, order: 2 }, 336 { type: 'line', label: d.ebeLabel, data: d.ebe, borderColor: '#00a32a', backgroundColor: '#00a32a', tension: 0.25, borderWidth: 2, order: 1},337 { type: 'line', label: d.resultLabel, data: d.result, borderColor: '#d63638', backgroundColor: '#d63638', tension: 0.25, borderWidth: 2, order: 0}336 { type: 'line', label: d.ebeLabel, data: d.ebe, borderColor: '#00a32a', backgroundColor: '#00a32a', tension: 0.25, borderWidth: 4, pointRadius: 4, order: 0 }, 337 { type: 'line', label: d.resultLabel, data: d.result, borderColor: '#d63638', backgroundColor: '#d63638', tension: 0.25, borderWidth: 2, borderDash: [5, 4], pointRadius: 3, pointStyle: 'rectRot', order: 1 } 338 338 ] 339 339 }, -
ultimate-business-dashboard/tags/2.7.1/includes/format.php
r3802991 r3803495 45 45 return [ 46 46 'symbol' => $symbol !== '' ? $symbol : $default['symbol'], 47 'position' => in_array($position, ['before', 'after'], true) ? $position : $default['position'], 47 // Position automatique : celle de la langue de l'utilisateur, comme le format des nombres 48 // (« 100 € » en français, « €100 » en anglais), quelle que soit la langue du site. 49 'position' => in_array($position, ['before', 'after'], true) ? $position : ultibuda_locale_currency_position(get_user_locale()), 48 50 ]; 51 } 52 53 /** 54 * Place habituelle du symbole monétaire dans une langue. 55 * 56 * @param string $locale Langue (ex. fr_FR, en_US). 57 * @return string before|after 58 */ 59 function ultibuda_locale_currency_position($locale) { 60 foreach (['en', 'nl', 'ja', 'zh', 'ko', 'he', 'pt_BR', 'es_MX', 'es_AR', 'es_CO', 'es_CL', 'th', 'ms', 'id'] as $prefix) { 61 if (strpos((string) $locale, $prefix) === 0) { 62 return 'before'; 63 } 64 } 65 return 'after'; 49 66 } 50 67 … … 123 140 return '<span class="variation neutral" title="' . esc_attr__('No comparison available', 'ultimate-business-dashboard') . '">–</span>'; 124 141 } 142 if (is_numeric($var) && abs((float) $var) >= 1000) { 143 // Base de comparaison presque nulle : le pourcentage n'a pas de sens 144 return '<span class="variation neutral" title="' . esc_attr__('Variation too large to be meaningful (very small comparison base)', 'ultimate-business-dashboard') . '">' . esc_html__('n/m', 'ultimate-business-dashboard') . '</span>'; 145 } 125 146 if ($var === 'NM') { 126 147 return '<span class="variation neutral" title="' . esc_attr__('Variation not meaningful (transition from loss to profit or vice versa)', 'ultimate-business-dashboard') . '">' . esc_html__('n/m', 'ultimate-business-dashboard') . '</span>'; -
ultimate-business-dashboard/tags/2.7.1/includes/invoice-store.php
r3803022 r3803495 640 640 641 641 /** 642 * Date d'ajout de la facture la plus récente (toutes sources), en horodatage, ou 0. 643 * 644 * @return int 645 */ 646 function ultibuda_last_invoice_added_time() { 647 if (!ultibuda_invoices_store_ready()) { 648 return 0; 649 } 650 global $wpdb; 651 $table = ultibuda_invoices_table(); 652 $last = $wpdb->get_var("SELECT MAX(created_at) FROM $table"); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared 653 return $last ? (int) strtotime($last . ' UTC') : 0; 654 } 655 656 /** 642 657 * Nombre de factures par catégorie. 643 658 * -
ultimate-business-dashboard/tags/2.7.1/includes/quality.php
r3802991 r3803495 40 40 * Alertes ignorées. 41 41 * 42 * @return array{duplicates: string[], suppliers: string[], amounts: string[] }42 * @return array{duplicates: string[], suppliers: string[], amounts: string[], shared_numbers: string[]} 43 43 */ 44 44 function ultibuda_quality_ignored() { 45 45 $ignored = get_option('ultibuda_quality_ignored', []); 46 46 $ignored = is_array($ignored) ? $ignored : []; 47 foreach (['duplicates', 'suppliers', 'amounts' ] as $key) {47 foreach (['duplicates', 'suppliers', 'amounts', 'shared_numbers'] as $key) { 48 48 $ignored[$key] = isset($ignored[$key]) && is_array($ignored[$key]) ? $ignored[$key] : []; 49 49 } … … 54 54 * Ignore une alerte. 55 55 * 56 * @param string $type duplicates|suppliers|amounts .56 * @param string $type duplicates|suppliers|amounts|shared_numbers. 57 57 * @param string $key Clé de l'alerte. 58 58 */ … … 94 94 95 95 foreach ($by_supplier as $supplier_invoices) { 96 // Même numéro de facture chez le même fournisseur 96 // Même numéro de facture et même montant chez le même fournisseur (un même numéro avec des 97 // montants différents désigne en général deux documents distincts, ex. relevés Deliveroo) 97 98 $by_number = []; 98 99 foreach ($supplier_invoices as $invoice) { 99 100 $number = strtolower(trim((string) ($invoice['invoice_number'] ?? ''))); 100 101 if ($number !== '' && $number !== 'n/a') { 101 $by_number[$number ][] = $invoice;102 $by_number[$number . '|' . number_format((float) ($invoice['total_amount'] ?? 0), 2, '.', '')][] = $invoice; 102 103 } 103 104 } … … 139 140 140 141 /** 142 * Numéros de facture partagés par plusieurs documents de montants différents, regroupés par fournisseur. 143 * 144 * Ce n'est pas un doublon (acomptes, avoirs, relevés), mais un relevé de paiement importé à côté 145 * de la facture qu'il règle compterait deux fois en charge : on le signale à part, une ligne par fournisseur. 146 * 147 * @param array[] $invoices Factures. 148 * @return array[] Liste de ['key' => string, 'supplier' => string, 'numbers' => int, 'invoices' => int, 'example' => string]. 149 */ 150 function ultibuda_quality_shared_numbers($invoices) { 151 $ignored = ultibuda_quality_ignored()['shared_numbers']; 152 $groups = []; 153 foreach ($invoices as $invoice) { 154 $supplier = ultibuda_normalize_supplier($invoice['supplier'] ?? ''); 155 $number = strtolower(trim((string) ($invoice['invoice_number'] ?? ''))); 156 if ($supplier === '' || $supplier === 'unknown' || $number === '' || $number === 'n/a' || in_array($supplier, $ignored, true)) { 157 continue; 158 } 159 $groups[$supplier]['name'] = $groups[$supplier]['name'] ?? (string) $invoice['supplier']; 160 $groups[$supplier]['numbers'][$number]['label'] = (string) $invoice['invoice_number']; 161 $groups[$supplier]['numbers'][$number]['amounts'][number_format((float) ($invoice['total_amount'] ?? 0), 2, '.', '')] = true; 162 $groups[$supplier]['numbers'][$number]['count'] = ($groups[$supplier]['numbers'][$number]['count'] ?? 0) + 1; 163 } 164 $result = []; 165 foreach ($groups as $supplier => $group) { 166 $shared = array_filter($group['numbers'], function ($entry) { 167 return count($entry['amounts']) > 1; 168 }); 169 if (!$shared) { 170 continue; 171 } 172 $first = reset($shared); 173 $result[] = [ 174 'key' => $supplier, 175 'supplier' => $group['name'], 176 'numbers' => count($shared), 177 'invoices' => array_sum(array_column($shared, 'count')), 178 'example' => $first['label'], 179 ]; 180 } 181 usort($result, function ($a, $b) { 182 return $b['numbers'] - $a['numbers']; 183 }); 184 return $result; 185 } 186 187 /** 141 188 * Factures non catégorisées (ou rattachées à une catégorie supprimée). 142 189 * … … 288 335 function ultibuda_quality_issue_count($invoices) { 289 336 return count(ultibuda_quality_duplicates($invoices)) 337 + count(ultibuda_quality_shared_numbers($invoices)) 290 338 + ultibuda_quality_uncategorized_count($invoices) 291 339 + count(ultibuda_quality_supplier_groups($invoices)) … … 367 415 $message = __('Invoice deleted.', 'ultimate-business-dashboard'); 368 416 } 369 } elseif (in_array($action, ['ignore_duplicate', 'ignore_suppliers', 'ignore_amount' ], true) && $key !== '') {370 $types = ['ignore_duplicate' => 'duplicates', 'ignore_suppliers' => 'suppliers', 'ignore_amount' => 'amounts' ];417 } elseif (in_array($action, ['ignore_duplicate', 'ignore_suppliers', 'ignore_amount', 'ignore_shared_number'], true) && $key !== '') { 418 $types = ['ignore_duplicate' => 'duplicates', 'ignore_suppliers' => 'suppliers', 'ignore_amount' => 'amounts', 'ignore_shared_number' => 'shared_numbers']; 371 419 ultibuda_quality_ignore($types[$action], $key); 372 420 $message = __('Alert ignored.', 'ultimate-business-dashboard'); … … 384 432 $invoices = ultibuda_get_invoices(); 385 433 $duplicates = ultibuda_quality_duplicates($invoices); 434 $shared_numbers = ultibuda_quality_shared_numbers($invoices); 386 435 $uncategorized = ultibuda_quality_uncategorized_count($invoices); 387 436 $supplier_groups = ultibuda_quality_supplier_groups($invoices); … … 422 471 <?php 423 472 /* translators: %d: number of days */ 424 echo esc_html(sprintf(__('Same supplier with the same invoice number , or with the same total amount less than %d days apart.', 'ultimate-business-dashboard'), ULTIBUDA_DUPLICATE_DAYS));473 echo esc_html(sprintf(__('Same supplier with the same invoice number and amount, or with the same total amount less than %d days apart.', 'ultimate-business-dashboard'), ULTIBUDA_DUPLICATE_DAYS)); 425 474 ?> 426 475 </p> … … 438 487 <td><?php echo esc_html($pair['invoices'][0]['supplier']); ?></td> 439 488 <td> 440 <?php foreach ($pair['invoices'] as $invoice) : ?>441 <div>442 <?php echo wp_kses_post(ultibuda_quality_document_link($invoice));?>443 — <?php echo esc_html($invoice['date']); ?>444 — <?php echo esc_html($money($invoice['total_amount'])); ?>445 < ?php if (!empty($invoice['invoice_number']) && $invoice['invoice_number'] !== 'N/A') : ?>446 — <?php echo esc_html($invoice['invoice_number']); ?>447 < ?php endif; ?>448 < ?php $action_button('delete_invoice', $invoice['id'], __('Delete this one', 'ultimate-business-dashboard'), __('Delete this invoice? This cannot be undone.', 'ultimate-business-dashboard')); ?>489 <?php foreach ($pair['invoices'] as $invoice) : 490 $time = strtotime((string) $invoice['date']); 491 ?> 492 <div class="ultibuda-dup-line"> 493 <span><?php echo wp_kses_post(ultibuda_quality_document_link($invoice)); ?></span> 494 <span><?php echo esc_html($time ? date_i18n('j M Y', $time) : $invoice['date']); ?></span> 495 <span class="num"><?php echo esc_html($money($invoice['total_amount'])); ?></span> 496 <span class="ultibuda-muted"><?php echo esc_html((!empty($invoice['invoice_number']) && $invoice['invoice_number'] !== 'N/A') ? $invoice['invoice_number'] : '–'); ?></span> 497 <span><?php $action_button('delete_invoice', $invoice['id'], __('Delete this one', 'ultimate-business-dashboard'), __('Delete this invoice? This cannot be undone.', 'ultimate-business-dashboard')); ?></span> 449 498 </div> 450 499 <?php endforeach; ?> 451 500 </td> 452 <td><?php echo $pair['reason'] === 'number' ? esc_html__('Same invoice number ', 'ultimate-business-dashboard') : esc_html__('Same amount, close dates', 'ultimate-business-dashboard'); ?></td>501 <td><?php echo $pair['reason'] === 'number' ? esc_html__('Same invoice number and amount', 'ultimate-business-dashboard') : esc_html__('Same amount, close dates', 'ultimate-business-dashboard'); ?></td> 453 502 <td><?php $action_button('ignore_duplicate', $pair['key'], __('Not a duplicate', 'ultimate-business-dashboard')); ?></td> 454 503 </tr> … … 465 514 </p> 466 515 <?php endif; ?> 516 <?php endif; ?> 517 518 <?php if ($shared_numbers) : ?> 519 <h2> 520 <?php 521 /* translators: %d: number of suppliers */ 522 echo esc_html(sprintf(__('Same number, different amounts (%d)', 'ultimate-business-dashboard'), count($shared_numbers))); 523 ?> 524 </h2> 525 <p class="description"><?php esc_html_e('Several documents of these suppliers share the same number with different amounts. It is often normal (instalments, credit notes), but a payment statement imported next to the invoice it settles is counted twice as an expense: open an example and check that each document is a real invoice.', 'ultimate-business-dashboard'); ?></p> 526 <div class="ultibuda-quality-table-wrap"> 527 <table class="widefat striped"> 528 <thead><tr> 529 <th><?php esc_html_e('Supplier', 'ultimate-business-dashboard'); ?></th> 530 <th><?php esc_html_e('Numbers concerned', 'ultimate-business-dashboard'); ?></th> 531 <th><?php esc_html_e('Example', 'ultimate-business-dashboard'); ?></th> 532 <th><?php esc_html_e('Actions', 'ultimate-business-dashboard'); ?></th> 533 </tr></thead> 534 <tbody> 535 <?php foreach ($shared_numbers as $entry) : ?> 536 <tr> 537 <td><?php echo esc_html($entry['supplier']); ?></td> 538 <td> 539 <?php 540 /* translators: 1: number of invoice numbers, 2: number of invoices */ 541 echo esc_html(sprintf(_n('%1$s number (%2$s invoices)', '%1$s numbers (%2$s invoices)', $entry['numbers'], 'ultimate-business-dashboard'), ultibuda_number($entry['numbers'], 0), ultibuda_number($entry['invoices'], 0))); 542 ?> 543 </td> 544 <td><a href="<?php echo esc_url(add_query_arg(['page' => 'ultibuda-invoices', 's' => $entry['example']], admin_url('admin.php'))); ?>"><?php echo esc_html($entry['example']); ?></a></td> 545 <td> 546 <a class="button button-small" href="<?php echo esc_url(add_query_arg(['page' => 'ultibuda-invoices', 's' => $entry['supplier']], admin_url('admin.php'))); ?>"><?php esc_html_e('See the invoices', 'ultimate-business-dashboard'); ?></a> 547 <?php $action_button('ignore_shared_number', $entry['key'], __('This is normal', 'ultimate-business-dashboard')); ?> 548 </td> 549 </tr> 550 <?php endforeach; ?> 551 </tbody> 552 </table> 553 </div> 467 554 <?php endif; ?> 468 555 -
ultimate-business-dashboard/tags/2.7.1/languages/ultimate-business-dashboard-fr_FR.po
r3803022 r3803495 4 4 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-business-" 5 5 "dashboard\n" 6 "POT-Creation-Date: 2026-11-15T 09:59:02+00:00\n"6 "POT-Creation-Date: 2026-11-15T15:30:11+00:00\n" 7 7 "PO-Revision-Date: 2025-11-22 17:17+0100\n" 8 8 "Last-Translator: \n" … … 77 77 #: includes/categories.php:17 includes/dashboard.php:263 includes/data.php:16 78 78 #: includes/imports.php:451 includes/imports.php:535 includes/invoices.php:133 79 #: includes/quality.php: 358includes/quickbooks.php:2579 #: includes/quality.php:406 includes/quickbooks.php:25 80 80 #: includes/quickbooks.php:511 includes/reports.php:17 includes/settings.php:44 81 81 #: includes/user-management.php:17 includes/zapier.php:17 … … 159 159 "Categories are created from your imports (Dext, CSV, QuickBooks). For each " 160 160 "one, choose how it is counted in your results." 161 msgstr "Les catégories sont créées à partir de vos imports (Dext, CSV, QuickBooks). Pour chacune, choisissez comment elle compte dans vos résultats." 161 msgstr "" 162 "Les catégories sont créées à partir de vos imports (Dext, CSV, QuickBooks). " 163 "Pour chacune, choisissez comment elle compte dans vos résultats." 162 164 163 165 #: includes/categories.php:209 … … 175 177 "of goods sold, adjusted by inventory), occupancy costs (rent, energy…), " 176 178 "other operating expenses, or exceptional expenses (excluded from the EBE)." 177 msgstr "la ligne du compte de résultat où apparaissent les factures : achats de marchandises (coût des marchandises vendues, corrigé du stock), coûts d’occupation (loyer, énergie…), autres charges d’exploitation, ou charges exceptionnelles (hors EBE)." 179 msgstr "" 180 "la ligne du compte de résultat où apparaissent les factures : achats de " 181 "marchandises (coût des marchandises vendues, corrigé du stock), coûts " 182 "d’occupation (loyer, énergie…), autres charges d’exploitation, ou charges " 183 "exceptionnelles (hors EBE)." 178 184 179 185 #: includes/categories.php:212 includes/categories.php:247 … … 187 193 "fixed or variable cost, used for the contribution margin and the break-even " 188 194 "point. Purchases of goods are always variable." 189 msgstr "coût fixe ou variable, utilisé pour la marge sur coûts variables et le point mort. Les achats de marchandises sont toujours variables." 195 msgstr "" 196 "coût fixe ou variable, utilisé pour la marge sur coûts variables et le point " 197 "mort. Les achats de marchandises sont toujours variables." 190 198 191 199 #: includes/categories.php:213 includes/categories.php:245 … … 207 215 "The Uncategorized category is the default for unassigned invoices and cannot " 208 216 "be deleted." 209 msgstr "La catégorie Non classé reçoit les factures sans catégorie et ne peut pas être supprimée." 217 msgstr "" 218 "La catégorie Non classé reçoit les factures sans catégorie et ne peut pas " 219 "être supprimée." 210 220 211 221 #: includes/categories.php:223 includes/categories.php:294 … … 257 267 258 268 #: includes/categories.php:244 includes/invoices.php:436 259 #: includes/quality.php:4 31ultimate-business-dashboard.php:138269 #: includes/quality.php:480 ultimate-business-dashboard.php:138 260 270 msgid "Invoices" 261 271 msgstr "Factures" … … 699 709 "Monthly amounts that do not come from invoices, excluding VAT. They feed the " 700 710 "Dashboard and the Ratios & Reports." 701 msgstr "Montants mensuels qui ne viennent pas des factures, hors TVA. Ils alimentent le tableau de bord et les Ratios et Rapports." 711 msgstr "" 712 "Montants mensuels qui ne viennent pas des factures, hors TVA. Ils alimentent " 713 "le tableau de bord et les Ratios et Rapports." 702 714 703 715 #: includes/data.php:136 … … 823 835 824 836 #. translators: %s: number. Percentage format; French uses a non-breaking space before the % sign. 825 #: includes/format.php: 93837 #: includes/format.php:110 826 838 msgctxt "percentage" 827 839 msgid "%s%%" 828 840 msgstr "%s %%" 829 841 830 #: includes/format.php:1 23842 #: includes/format.php:140 831 843 msgid "No comparison available" 832 844 msgstr "Pas de comparaison possible" 833 845 834 #: includes/format.php:126 ultimate-business-dashboard.php:352 846 #: includes/format.php:144 847 msgid "Variation too large to be meaningful (very small comparison base)" 848 msgstr "" 849 "Variation trop forte pour être significative (base de comparaison très " 850 "faible)" 851 852 #: includes/format.php:144 includes/format.php:147 853 msgid "n/m" 854 msgstr "n.s." 855 856 #: includes/format.php:147 ultimate-business-dashboard.php:352 835 857 msgid "Variation not meaningful (transition from loss to profit or vice versa)" 836 858 msgstr "" 837 859 "Variation non significative (transition d’une perte à un bénéfice ou vice " 838 860 "versa)" 839 840 #: includes/format.php:126841 msgid "n/m"842 msgstr "n.s."843 861 844 862 #: includes/import-header.php:12 ultimate-business-dashboard.php:142 … … 850 868 msgstr "Vue d’ensemble" 851 869 852 #: includes/import-tabs.php:13 ultimate-business-dashboard.php:53 2870 #: includes/import-tabs.php:13 ultimate-business-dashboard.php:537 853 871 msgid "Dext & Zapier" 854 872 msgstr "Dext & Zapier" 855 873 856 #: includes/import-tabs.php:14 ultimate-business-dashboard.php:53 3874 #: includes/import-tabs.php:14 ultimate-business-dashboard.php:538 857 875 msgid "Dext CSV" 858 876 msgstr "CSV Dext" 859 877 860 #: includes/import-tabs.php:15 ultimate-business-dashboard.php:53 4878 #: includes/import-tabs.php:15 ultimate-business-dashboard.php:539 861 879 msgid "Other CSV" 862 880 msgstr "Autre CSV" 863 881 864 #: includes/import-tabs.php:16 ultimate-business-dashboard.php:5 35882 #: includes/import-tabs.php:16 ultimate-business-dashboard.php:540 865 883 msgid "QuickBooks" 866 884 msgstr "QuickBooks" … … 1023 1041 1024 1042 #: includes/imports.php:488 includes/imports.php:567 includes/invoices.php:484 1025 #: includes/invoices.php:513 includes/quality.php:430 includes/quality.php:542 1043 #: includes/invoices.php:513 includes/quality.php:479 includes/quality.php:529 1044 #: includes/quality.php:629 1026 1045 msgid "Supplier" 1027 1046 msgstr "Fournisseur" … … 1051 1070 1052 1071 #: includes/imports.php:490 includes/imports.php:569 includes/invoices.php:486 1053 #: includes/invoices.php:537 includes/quality.php: 5441072 #: includes/invoices.php:537 includes/quality.php:631 1054 1073 msgid "Net Amount" 1055 1074 msgstr "Montant net" … … 1431 1450 msgstr "Sélectionner" 1432 1451 1433 #: includes/invoices.php:507 includes/quality.php:3 491452 #: includes/invoices.php:507 includes/quality.php:397 1434 1453 msgid "Open the invoice document" 1435 1454 msgstr "Ouvrir le document de la facture" … … 1464 1483 msgstr[1] "Amortie · %d mois" 1465 1484 1466 #: includes/quality.php: 3671485 #: includes/quality.php:415 1467 1486 msgid "Invoice deleted." 1468 1487 msgstr "Facture supprimée." 1469 1488 1470 #: includes/quality.php: 3721489 #: includes/quality.php:420 1471 1490 msgid "Alert ignored." 1472 1491 msgstr "Alerte ignorée." 1473 1492 1474 1493 #. translators: 1: number of invoices, 2: supplier name 1475 #: includes/quality.php: 3791494 #: includes/quality.php:427 1476 1495 msgid "%1$d invoice now uses the supplier name \"%2$s\"." 1477 1496 msgid_plural "%1$d invoices now use the supplier name \"%2$s\"." … … 1479 1498 msgstr[1] "%1$d factures portent désormais le nom de fournisseur « %2$s »." 1480 1499 1481 #: includes/quality.php:4 06ultimate-business-dashboard.php:1391500 #: includes/quality.php:455 ultimate-business-dashboard.php:139 1482 1501 msgid "Checks" 1483 1502 msgstr "Contrôles" 1484 1503 1485 #: includes/quality.php:4 071504 #: includes/quality.php:456 1486 1505 msgid "" 1487 1506 "Points to check before relying on your figures. Each alert can be ignored if " … … 1492 1511 1493 1512 #. translators: %d: number of alerts 1494 #: includes/quality.php:4 151513 #: includes/quality.php:464 1495 1514 msgid "Possible duplicates (%d)" 1496 1515 msgstr "Doublons probables (%d)" 1497 1516 1498 #: includes/quality.php:4 191517 #: includes/quality.php:468 1499 1518 msgid "No possible duplicate." 1500 1519 msgstr "Aucun doublon probable." 1501 1520 1502 1521 #. translators: %d: number of days 1503 #: includes/quality.php:4 241504 msgid "" 1505 "Same supplier with the same invoice number , or with the same total amount"1506 " less than %d days apart."1507 msgstr "" 1508 "Même fournisseur avec le même numéro de facture , ou avec le même montant TTC"1509 " à moins de %d jours d’écart."1510 1511 #: includes/quality.php:4 321522 #: includes/quality.php:473 1523 msgid "" 1524 "Same supplier with the same invoice number and amount, or with the same " 1525 "total amount less than %d days apart." 1526 msgstr "" 1527 "Même fournisseur avec le même numéro de facture et le même montant, ou avec " 1528 "le même montant TTC à moins de %d jours d’écart." 1529 1530 #: includes/quality.php:481 1512 1531 msgid "Reason" 1513 1532 msgstr "Motif" 1514 1533 1515 #: includes/quality.php:4 33 includes/quality.php:498 includes/quality.php:5461516 #: includes/ user-management.php:2131534 #: includes/quality.php:482 includes/quality.php:532 includes/quality.php:585 1535 #: includes/quality.php:633 includes/user-management.php:213 1517 1536 msgid "Actions" 1518 1537 msgstr "Actions" 1519 1538 1520 #: includes/quality.php:4 481539 #: includes/quality.php:497 1521 1540 msgid "Delete this one" 1522 1541 msgstr "Supprimer celle-ci" 1523 1542 1524 #: includes/quality.php:4 481543 #: includes/quality.php:497 1525 1544 msgid "Delete this invoice? This cannot be undone." 1526 1545 msgstr "Supprimer cette facture ? Cette action est irréversible." 1527 1546 1528 #: includes/quality.php: 4521529 msgid "Same invoice number "1530 msgstr "Même numéro de facture"1531 1532 #: includes/quality.php: 4521547 #: includes/quality.php:501 1548 msgid "Same invoice number and amount" 1549 msgstr "Même numéro et même montant" 1550 1551 #: includes/quality.php:501 1533 1552 msgid "Same amount, close dates" 1534 1553 msgstr "Même montant, dates proches" 1535 1554 1536 #: includes/quality.php: 4531555 #: includes/quality.php:502 1537 1556 msgid "Not a duplicate" 1538 1557 msgstr "Pas un doublon" 1539 1558 1540 1559 #. translators: %d: number of rows shown 1541 #: includes/quality.php: 4631560 #: includes/quality.php:512 1542 1561 msgid "Only the first %d are shown." 1543 1562 msgstr "Seuls les %d premiers sont affichés." 1544 1563 1564 #. translators: %d: number of suppliers 1565 #: includes/quality.php:522 1566 msgid "Same number, different amounts (%d)" 1567 msgstr "Même numéro, montants différents (%d)" 1568 1569 #: includes/quality.php:525 1570 msgid "" 1571 "Several documents of these suppliers share the same number with different " 1572 "amounts. It is often normal (instalments, credit notes), but a payment " 1573 "statement imported next to the invoice it settles is counted twice as an " 1574 "expense: open an example and check that each document is a real invoice." 1575 msgstr "" 1576 "Chez ces fournisseurs, plusieurs documents portent le même numéro avec des " 1577 "montants différents. C’est souvent normal (acomptes, avoirs), mais un relevé " 1578 "de paiement importé à côté de la facture qu’il règle compte deux fois en " 1579 "charge : ouvrez un exemple et vérifiez que chaque document est bien une " 1580 "facture." 1581 1582 #: includes/quality.php:530 1583 msgid "Numbers concerned" 1584 msgstr "Numéros concernés" 1585 1586 #: includes/quality.php:531 1587 msgid "Example" 1588 msgstr "Exemple" 1589 1590 #. translators: 1: number of invoice numbers, 2: number of invoices 1591 #: includes/quality.php:541 1592 msgid "%1$s number (%2$s invoices)" 1593 msgid_plural "%1$s numbers (%2$s invoices)" 1594 msgstr[0] "%1$s numéro (%2$s factures)" 1595 msgstr[1] "%1$s numéros (%2$s factures)" 1596 1597 #: includes/quality.php:546 1598 msgid "See the invoices" 1599 msgstr "Voir les factures" 1600 1601 #: includes/quality.php:547 1602 msgid "This is normal" 1603 msgstr "C’est normal" 1604 1545 1605 #. translators: %d: number of invoices 1546 #: includes/quality.php: 4721606 #: includes/quality.php:559 1547 1607 msgid "Uncategorized invoices (%d)" 1548 1608 msgstr "Factures non catégorisées (%d)" 1549 1609 1550 #: includes/quality.php: 4761610 #: includes/quality.php:563 1551 1611 msgid "All invoices have a category." 1552 1612 msgstr "Toutes les factures ont une catégorie." 1553 1613 1554 #: includes/quality.php: 4791614 #: includes/quality.php:566 1555 1615 msgid "" 1556 1616 "These invoices are counted in \"Other Invoices\" and as unclassified costs." … … 1558 1618 "Ces factures sont comptées dans « Autres factures » et en coûts non classés." 1559 1619 1560 #: includes/quality.php: 4801620 #: includes/quality.php:567 1561 1621 msgid "Show them" 1562 1622 msgstr "Les afficher" 1563 1623 1564 1624 #. translators: %d: number of groups 1565 #: includes/quality.php: 4871625 #: includes/quality.php:574 1566 1626 msgid "Suppliers written in several ways (%d)" 1567 1627 msgstr "Fournisseurs écrits de plusieurs façons (%d)" 1568 1628 1569 #: includes/quality.php: 4911629 #: includes/quality.php:578 1570 1630 msgid "No similar supplier names." 1571 1631 msgstr "Aucun nom de fournisseur similaire." 1572 1632 1573 #: includes/quality.php: 4931633 #: includes/quality.php:580 1574 1634 msgid "Choose the name to keep: all the invoices of the group will use it." 1575 1635 msgstr "" 1576 1636 "Choisissez le nom à garder : toutes les factures du groupe le prendront." 1577 1637 1578 #: includes/quality.php: 4971638 #: includes/quality.php:584 1579 1639 msgid "Names found (invoices)" 1580 1640 msgstr "Noms trouvés (factures)" 1581 1641 1582 #: includes/quality.php: 5191642 #: includes/quality.php:606 1583 1643 msgid "Use this name" 1584 1644 msgstr "Garder ce nom" 1585 1645 1586 #: includes/quality.php: 5201646 #: includes/quality.php:607 1587 1647 msgid "Different suppliers" 1588 1648 msgstr "Fournisseurs différents" 1589 1649 1590 1650 #. translators: %d: number of invoices 1591 #: includes/quality.php: 5321651 #: includes/quality.php:619 1592 1652 msgid "Unusual amounts (%d)" 1593 1653 msgstr "Montants inhabituels (%d)" 1594 1654 1595 #: includes/quality.php: 5361655 #: includes/quality.php:623 1596 1656 msgid "No unusual amount over the last 12 months." 1597 1657 msgstr "Aucun montant inhabituel sur les 12 derniers mois." 1598 1658 1599 #: includes/quality.php: 5381659 #: includes/quality.php:625 1600 1660 msgid "" 1601 1661 "Invoices of the last 12 months more than 3 times the usual amount (median) " … … 1605 1665 "(médiane) du fournisseur." 1606 1666 1607 #: includes/quality.php: 5431667 #: includes/quality.php:630 1608 1668 msgid "Invoice" 1609 1669 msgstr "Facture" 1610 1670 1611 #: includes/quality.php: 5451671 #: includes/quality.php:632 1612 1672 msgid "Usual amount" 1613 1673 msgstr "Montant habituel" 1614 1674 1615 #: includes/quality.php: 5551675 #: includes/quality.php:642 1616 1676 msgid "Checked" 1617 1677 msgstr "Vérifié" 1618 1678 1619 1679 #. translators: 1: number of points, 2: opening link, 3: closing link 1620 #: includes/quality.php: 5851680 #: includes/quality.php:672 1621 1681 msgid "" 1622 1682 "%1$d point to check in your data (duplicates, categories, suppliers, " … … 1977 2037 "The largest expense items of the period, including the costs entered in the " 1978 2038 "Data page." 1979 msgstr "Les principaux postes de dépenses de la période, y compris les charges saisies dans la page Données." 2039 msgstr "" 2040 "Les principaux postes de dépenses de la période, y compris les charges " 2041 "saisies dans la page Données." 1980 2042 1981 2043 #: includes/reports.php:277 ultimate-business-dashboard.php:360 … … 1991 2053 "Costs entered in the Data page, amortizations and provisions are fixed; the " 1992 2054 "cost of goods sold is variable. Invoices follow the type of their category." 1993 msgstr "Les charges saisies dans la page Données, les amortissements et les provisions sont fixes ; le coût des marchandises vendues est variable. Les factures suivent le type de leur catégorie." 2055 msgstr "" 2056 "Les charges saisies dans la page Données, les amortissements et les " 2057 "provisions sont fixes ; le coût des marchandises vendues est variable. Les " 2058 "factures suivent le type de leur catégorie." 1994 2059 1995 2060 #. translators: 1: break-even revenue, 2: percentage of the actual revenue 1996 2061 #: includes/reports.php:309 1997 2062 msgid "Break-even point: %1$s of revenue (%2$s of the actual revenue)." 1998 msgstr "Point mort : %1$s de chiffre d’affaires (%2$s du chiffre d’affaires réel)." 2063 msgstr "" 2064 "Point mort : %1$s de chiffre d’affaires (%2$s du chiffre d’affaires réel)." 1999 2065 2000 2066 #: includes/reports.php:314 … … 2633 2699 msgstr "Non connecté" 2634 2700 2635 #: ultimate-business-dashboard.php:532 2701 #: ultimate-business-dashboard.php:534 2702 msgctxt "import status" 2703 msgid "Configured" 2704 msgstr "Configuré" 2705 2706 #: ultimate-business-dashboard.php:537 2636 2707 msgid "" 2637 2708 "Automatic import: each invoice processed in Dext is sent here by Zapier." 2638 msgstr "Import automatique : chaque facture traitée dans Dext est envoyée ici par Zapier." 2639 2640 #: ultimate-business-dashboard.php:532 2709 msgstr "" 2710 "Import automatique : chaque facture traitée dans Dext est envoyée ici par " 2711 "Zapier." 2712 2713 #: ultimate-business-dashboard.php:537 ultimate-business-dashboard.php:540 2714 msgid "Manage" 2715 msgstr "Gérer" 2716 2717 #: ultimate-business-dashboard.php:537 2641 2718 msgid "Set up" 2642 2719 msgstr "Configurer" 2643 2720 2644 #: ultimate-business-dashboard.php:53 32721 #: ultimate-business-dashboard.php:538 2645 2722 msgid "Import a CSV export from Dext (\"Dext Prepare Default\" format)." 2646 2723 msgstr "Importer un export CSV de Dext (format « Dext Prepare Default »)." 2647 2724 2648 #: ultimate-business-dashboard.php:53 3 ultimate-business-dashboard.php:5342725 #: ultimate-business-dashboard.php:538 ultimate-business-dashboard.php:539 2649 2726 msgid "Import a file" 2650 2727 msgstr "Importer un fichier" 2651 2728 2652 #: ultimate-business-dashboard.php:53 42729 #: ultimate-business-dashboard.php:539 2653 2730 msgid "Import invoices from any other tool with a simple CSV file." 2654 2731 msgstr "Importer les factures de tout autre outil avec un simple fichier CSV." 2655 2732 2656 #: ultimate-business-dashboard.php:5 352733 #: ultimate-business-dashboard.php:540 2657 2734 msgid "Connect QuickBooks Online to import supplier bills every hour." 2658 msgstr "Connecter QuickBooks Online pour importer les factures fournisseurs toutes les heures." 2659 2660 #: ultimate-business-dashboard.php:535 2661 msgid "Manage" 2662 msgstr "Gérer" 2663 2664 #: ultimate-business-dashboard.php:535 2735 msgstr "" 2736 "Connecter QuickBooks Online pour importer les factures fournisseurs toutes " 2737 "les heures." 2738 2739 #: ultimate-business-dashboard.php:540 2665 2740 msgid "Connect" 2666 2741 msgstr "Connecter" 2667 2742 2668 #: ultimate-business-dashboard.php:54 02743 #: ultimate-business-dashboard.php:545 2669 2744 msgid "" 2670 2745 "Choose how your supplier invoices reach the dashboard. Duplicates are " 2671 2746 "ignored automatically, whatever the method." 2672 msgstr "Choisissez comment vos factures fournisseurs arrivent dans le tableau de bord. Les doublons sont ignorés automatiquement, quelle que soit la méthode." 2747 msgstr "" 2748 "Choisissez comment vos factures fournisseurs arrivent dans le tableau de " 2749 "bord. Les doublons sont ignorés automatiquement, quelle que soit la méthode." 2750 2751 #. translators: 1: date and time, 2: total number of invoices 2752 #: ultimate-business-dashboard.php:551 2753 msgid "Last invoice added on %1$s · %2$s invoices in total" 2754 msgstr "Dernière facture ajoutée le %1$s · %2$s factures au total" 2673 2755 2674 2756 #~ msgid "" -
ultimate-business-dashboard/tags/2.7.1/languages/ultimate-business-dashboard.pot
r3803022 r3803495 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Ultimate Business Dashboard 2. 6\n"5 "Project-Id-Version: Ultimate Business Dashboard 2.7.1\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-business-dashboard\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2026-11-15T 09:59:02+00:00\n"12 "POT-Creation-Date: 2026-11-15T15:30:11+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.11.0\n" … … 85 85 #: includes/imports.php:535 86 86 #: includes/invoices.php:133 87 #: includes/quality.php: 35887 #: includes/quality.php:406 88 88 #: includes/quickbooks.php:25 89 89 #: includes/quickbooks.php:511 … … 237 237 #: includes/categories.php:244 238 238 #: includes/invoices.php:436 239 #: includes/quality.php:4 31239 #: includes/quality.php:480 240 240 #: ultimate-business-dashboard.php:138 241 241 msgid "Invoices" … … 839 839 840 840 #. translators: %s: number. Percentage format; French uses a non-breaking space before the % sign. 841 #: includes/format.php: 93841 #: includes/format.php:110 842 842 msgctxt "percentage" 843 843 msgid "%s%%" 844 844 msgstr "" 845 845 846 #: includes/format.php:1 23846 #: includes/format.php:140 847 847 msgid "No comparison available" 848 848 msgstr "" 849 849 850 #: includes/format.php:126 850 #: includes/format.php:144 851 msgid "Variation too large to be meaningful (very small comparison base)" 852 msgstr "" 853 854 #: includes/format.php:144 855 #: includes/format.php:147 856 msgid "n/m" 857 msgstr "" 858 859 #: includes/format.php:147 851 860 #: ultimate-business-dashboard.php:352 852 861 msgid "Variation not meaningful (transition from loss to profit or vice versa)" 853 msgstr ""854 855 #: includes/format.php:126856 msgid "n/m"857 862 msgstr "" 858 863 … … 867 872 868 873 #: includes/import-tabs.php:13 869 #: ultimate-business-dashboard.php:53 2874 #: ultimate-business-dashboard.php:537 870 875 msgid "Dext & Zapier" 871 876 msgstr "" 872 877 873 878 #: includes/import-tabs.php:14 874 #: ultimate-business-dashboard.php:53 3879 #: ultimate-business-dashboard.php:538 875 880 msgid "Dext CSV" 876 881 msgstr "" 877 882 878 883 #: includes/import-tabs.php:15 879 #: ultimate-business-dashboard.php:53 4884 #: ultimate-business-dashboard.php:539 880 885 msgid "Other CSV" 881 886 msgstr "" 882 887 883 888 #: includes/import-tabs.php:16 884 #: ultimate-business-dashboard.php:5 35889 #: ultimate-business-dashboard.php:540 885 890 msgid "QuickBooks" 886 891 msgstr "" … … 1036 1041 #: includes/invoices.php:484 1037 1042 #: includes/invoices.php:513 1038 #: includes/quality.php:430 1039 #: includes/quality.php:542 1043 #: includes/quality.php:479 1044 #: includes/quality.php:529 1045 #: includes/quality.php:629 1040 1046 msgid "Supplier" 1041 1047 msgstr "" … … 1072 1078 #: includes/invoices.php:486 1073 1079 #: includes/invoices.php:537 1074 #: includes/quality.php: 5441080 #: includes/quality.php:631 1075 1081 msgid "Net Amount" 1076 1082 msgstr "" … … 1411 1417 1412 1418 #: includes/invoices.php:507 1413 #: includes/quality.php:3 491419 #: includes/quality.php:397 1414 1420 msgid "Open the invoice document" 1415 1421 msgstr "" … … 1446 1452 msgstr[1] "" 1447 1453 1448 #: includes/quality.php: 3671454 #: includes/quality.php:415 1449 1455 msgid "Invoice deleted." 1450 1456 msgstr "" 1451 1457 1452 #: includes/quality.php: 3721458 #: includes/quality.php:420 1453 1459 msgid "Alert ignored." 1454 1460 msgstr "" 1455 1461 1456 1462 #. translators: 1: number of invoices, 2: supplier name 1457 #: includes/quality.php: 3791463 #: includes/quality.php:427 1458 1464 msgid "%1$d invoice now uses the supplier name \"%2$s\"." 1459 1465 msgid_plural "%1$d invoices now use the supplier name \"%2$s\"." … … 1461 1467 msgstr[1] "" 1462 1468 1463 #: includes/quality.php:4 061469 #: includes/quality.php:455 1464 1470 #: ultimate-business-dashboard.php:139 1465 1471 msgid "Checks" 1466 1472 msgstr "" 1467 1473 1468 #: includes/quality.php:4 071474 #: includes/quality.php:456 1469 1475 msgid "Points to check before relying on your figures. Each alert can be ignored if it is not a problem." 1470 1476 msgstr "" 1471 1477 1472 1478 #. translators: %d: number of alerts 1473 #: includes/quality.php:4 151479 #: includes/quality.php:464 1474 1480 msgid "Possible duplicates (%d)" 1475 1481 msgstr "" 1476 1482 1477 #: includes/quality.php:4 191483 #: includes/quality.php:468 1478 1484 msgid "No possible duplicate." 1479 1485 msgstr "" 1480 1486 1481 1487 #. translators: %d: number of days 1482 #: includes/quality.php:4 241483 msgid "Same supplier with the same invoice number , or with the same total amount less than %d days apart."1484 msgstr "" 1485 1486 #: includes/quality.php:4 321488 #: includes/quality.php:473 1489 msgid "Same supplier with the same invoice number and amount, or with the same total amount less than %d days apart." 1490 msgstr "" 1491 1492 #: includes/quality.php:481 1487 1493 msgid "Reason" 1488 1494 msgstr "" 1489 1495 1490 #: includes/quality.php:433 1491 #: includes/quality.php:498 1492 #: includes/quality.php:546 1496 #: includes/quality.php:482 1497 #: includes/quality.php:532 1498 #: includes/quality.php:585 1499 #: includes/quality.php:633 1493 1500 #: includes/user-management.php:213 1494 1501 msgid "Actions" 1495 1502 msgstr "" 1496 1503 1497 #: includes/quality.php:4 481504 #: includes/quality.php:497 1498 1505 msgid "Delete this one" 1499 1506 msgstr "" 1500 1507 1501 #: includes/quality.php:4 481508 #: includes/quality.php:497 1502 1509 msgid "Delete this invoice? This cannot be undone." 1503 1510 msgstr "" 1504 1511 1505 #: includes/quality.php: 4521506 msgid "Same invoice number "1507 msgstr "" 1508 1509 #: includes/quality.php: 4521512 #: includes/quality.php:501 1513 msgid "Same invoice number and amount" 1514 msgstr "" 1515 1516 #: includes/quality.php:501 1510 1517 msgid "Same amount, close dates" 1511 1518 msgstr "" 1512 1519 1513 #: includes/quality.php: 4531520 #: includes/quality.php:502 1514 1521 msgid "Not a duplicate" 1515 1522 msgstr "" 1516 1523 1517 1524 #. translators: %d: number of rows shown 1518 #: includes/quality.php: 4631525 #: includes/quality.php:512 1519 1526 msgid "Only the first %d are shown." 1520 1527 msgstr "" 1521 1528 1529 #. translators: %d: number of suppliers 1530 #: includes/quality.php:522 1531 msgid "Same number, different amounts (%d)" 1532 msgstr "" 1533 1534 #: includes/quality.php:525 1535 msgid "Several documents of these suppliers share the same number with different amounts. It is often normal (instalments, credit notes), but a payment statement imported next to the invoice it settles is counted twice as an expense: open an example and check that each document is a real invoice." 1536 msgstr "" 1537 1538 #: includes/quality.php:530 1539 msgid "Numbers concerned" 1540 msgstr "" 1541 1542 #: includes/quality.php:531 1543 msgid "Example" 1544 msgstr "" 1545 1546 #. translators: 1: number of invoice numbers, 2: number of invoices 1547 #: includes/quality.php:541 1548 msgid "%1$s number (%2$s invoices)" 1549 msgid_plural "%1$s numbers (%2$s invoices)" 1550 msgstr[0] "" 1551 msgstr[1] "" 1552 1553 #: includes/quality.php:546 1554 msgid "See the invoices" 1555 msgstr "" 1556 1557 #: includes/quality.php:547 1558 msgid "This is normal" 1559 msgstr "" 1560 1522 1561 #. translators: %d: number of invoices 1523 #: includes/quality.php: 4721562 #: includes/quality.php:559 1524 1563 msgid "Uncategorized invoices (%d)" 1525 1564 msgstr "" 1526 1565 1527 #: includes/quality.php: 4761566 #: includes/quality.php:563 1528 1567 msgid "All invoices have a category." 1529 1568 msgstr "" 1530 1569 1531 #: includes/quality.php: 4791570 #: includes/quality.php:566 1532 1571 msgid "These invoices are counted in \"Other Invoices\" and as unclassified costs." 1533 1572 msgstr "" 1534 1573 1535 #: includes/quality.php: 4801574 #: includes/quality.php:567 1536 1575 msgid "Show them" 1537 1576 msgstr "" 1538 1577 1539 1578 #. translators: %d: number of groups 1540 #: includes/quality.php: 4871579 #: includes/quality.php:574 1541 1580 msgid "Suppliers written in several ways (%d)" 1542 1581 msgstr "" 1543 1582 1544 #: includes/quality.php: 4911583 #: includes/quality.php:578 1545 1584 msgid "No similar supplier names." 1546 1585 msgstr "" 1547 1586 1548 #: includes/quality.php: 4931587 #: includes/quality.php:580 1549 1588 msgid "Choose the name to keep: all the invoices of the group will use it." 1550 1589 msgstr "" 1551 1590 1552 #: includes/quality.php: 4971591 #: includes/quality.php:584 1553 1592 msgid "Names found (invoices)" 1554 1593 msgstr "" 1555 1594 1556 #: includes/quality.php: 5191595 #: includes/quality.php:606 1557 1596 msgid "Use this name" 1558 1597 msgstr "" 1559 1598 1560 #: includes/quality.php: 5201599 #: includes/quality.php:607 1561 1600 msgid "Different suppliers" 1562 1601 msgstr "" 1563 1602 1564 1603 #. translators: %d: number of invoices 1565 #: includes/quality.php: 5321604 #: includes/quality.php:619 1566 1605 msgid "Unusual amounts (%d)" 1567 1606 msgstr "" 1568 1607 1569 #: includes/quality.php: 5361608 #: includes/quality.php:623 1570 1609 msgid "No unusual amount over the last 12 months." 1571 1610 msgstr "" 1572 1611 1573 #: includes/quality.php: 5381612 #: includes/quality.php:625 1574 1613 msgid "Invoices of the last 12 months more than 3 times the usual amount (median) of the supplier." 1575 1614 msgstr "" 1576 1615 1577 #: includes/quality.php: 5431616 #: includes/quality.php:630 1578 1617 msgid "Invoice" 1579 1618 msgstr "" 1580 1619 1581 #: includes/quality.php: 5451620 #: includes/quality.php:632 1582 1621 msgid "Usual amount" 1583 1622 msgstr "" 1584 1623 1585 #: includes/quality.php: 5551624 #: includes/quality.php:642 1586 1625 msgid "Checked" 1587 1626 msgstr "" 1588 1627 1589 1628 #. translators: 1: number of points, 2: opening link, 3: closing link 1590 #: includes/quality.php: 5851629 #: includes/quality.php:672 1591 1630 msgid "%1$d point to check in your data (duplicates, categories, suppliers, amounts). %2$sSee the checks%3$s" 1592 1631 msgid_plural "%1$d points to check in your data (duplicates, categories, suppliers, amounts). %2$sSee the checks%3$s" … … 2420 2459 msgstr "" 2421 2460 2422 #: ultimate-business-dashboard.php:532 2461 #: ultimate-business-dashboard.php:534 2462 msgctxt "import status" 2463 msgid "Configured" 2464 msgstr "" 2465 2466 #: ultimate-business-dashboard.php:537 2423 2467 msgid "Automatic import: each invoice processed in Dext is sent here by Zapier." 2424 2468 msgstr "" 2425 2469 2426 #: ultimate-business-dashboard.php:532 2470 #: ultimate-business-dashboard.php:537 2471 #: ultimate-business-dashboard.php:540 2472 msgid "Manage" 2473 msgstr "" 2474 2475 #: ultimate-business-dashboard.php:537 2427 2476 msgid "Set up" 2428 2477 msgstr "" 2429 2478 2430 #: ultimate-business-dashboard.php:53 32479 #: ultimate-business-dashboard.php:538 2431 2480 msgid "Import a CSV export from Dext (\"Dext Prepare Default\" format)." 2432 2481 msgstr "" 2433 2482 2434 #: ultimate-business-dashboard.php:53 32435 #: ultimate-business-dashboard.php:53 42483 #: ultimate-business-dashboard.php:538 2484 #: ultimate-business-dashboard.php:539 2436 2485 msgid "Import a file" 2437 2486 msgstr "" 2438 2487 2439 #: ultimate-business-dashboard.php:53 42488 #: ultimate-business-dashboard.php:539 2440 2489 msgid "Import invoices from any other tool with a simple CSV file." 2441 2490 msgstr "" 2442 2491 2443 #: ultimate-business-dashboard.php:5 352492 #: ultimate-business-dashboard.php:540 2444 2493 msgid "Connect QuickBooks Online to import supplier bills every hour." 2445 2494 msgstr "" 2446 2495 2447 #: ultimate-business-dashboard.php:535 2448 msgid "Manage" 2449 msgstr "" 2450 2451 #: ultimate-business-dashboard.php:535 2496 #: ultimate-business-dashboard.php:540 2452 2497 msgid "Connect" 2453 2498 msgstr "" 2454 2499 2455 #: ultimate-business-dashboard.php:54 02500 #: ultimate-business-dashboard.php:545 2456 2501 msgid "Choose how your supplier invoices reach the dashboard. Duplicates are ignored automatically, whatever the method." 2457 2502 msgstr "" 2503 2504 #. translators: 1: date and time, 2: total number of invoices 2505 #: ultimate-business-dashboard.php:551 2506 msgid "Last invoice added on %1$s · %2$s invoices in total" 2507 msgstr "" -
ultimate-business-dashboard/tags/2.7.1/readme.txt
r3803022 r3803495 5 5 Requires at least: 5.5 6 6 Tested up to: 7.1 7 Stable tag: 2.7 7 Stable tag: 2.7.1 8 8 Requires PHP: 7.4 9 9 License: GPLv2 or later … … 96 96 97 97 == Changelog == 98 = 2.7.1 - 15 November 2026 = 99 * Fixed: The EBITDA line of the dashboard chart was hidden behind the net result line when both were close 100 * Fixed: The currency symbol follows the user's language when its position is automatic (100 € in French, €100 in English), whatever the site language 101 * Fixed: Variations above 1,000 % (very small comparison base) are shown as "n/m" 102 * Improved: Checks: invoices with the same number but different amounts are no longer listed one pair at a time among duplicates, but in a separate "Same number, different amounts" section, one line per supplier (a payment statement imported next to its invoice would be counted twice) 103 * Improved: Icons and text centered in the buttons, wider category column on the Invoices page, aligned duplicate lines on the Checks page 104 * Improved: Imports page shows Dext & Zapier as configured and the date of the last invoice added 105 98 106 = 2.7 - 15 November 2026 = 99 107 * Improved: Ratios & Reports redesigned: key figures as tiles compared with the same period of the previous year, ratios with the previous year, expense breakdown as sorted bars (top 8 + others) instead of a pie chart, fixed vs variable costs as a single bar with amounts and the break-even point, cleaner print / PDF … … 232 240 233 241 == Upgrade Notice == 242 = 2.7.1 = 243 Visual fixes (chart, buttons, invoices, checks) and clearer duplicate checks. 244 234 245 = 2.7 = 235 246 Redesigned Reports, Invoices (with mobile cards), Data (spreadsheet), Imports, Settings and Categories pages. -
ultimate-business-dashboard/tags/2.7.1/ultimate-business-dashboard.php
r3803022 r3803495 4 4 * Plugin URI: https://tulipemedia.com/en/ultimate-business-dashboard/ 5 5 * Description: Turn your WordPress dashboard into a Financial Powerhouse. 6 * Version: 2.7 6 * Version: 2.7.1 7 7 * Author: Ziyad Bachalany 8 8 * Author URI: https://tulipemedia.com … … 17 17 18 18 // Define plugin constants 19 define('ULTIBUDA_VERSION', '2.7 ');19 define('ULTIBUDA_VERSION', '2.7.1'); 20 20 define('ULTIBUDA_PLUGIN_DIR', plugin_dir_path(__FILE__)); 21 21 define('ULTIBUDA_PLUGIN_URL', plugin_dir_url(__FILE__)); … … 529 529 $qb_status = ['', __('Not connected', 'ultimate-business-dashboard')]; 530 530 } 531 // Zapier : envois antérieurs à la 2.7 absents du journal ; la clé API indique qu'il est configuré 532 $zapier_status = $last('zapier'); 533 if ($zapier_status[0] === '' && get_option('ultibuda_webhook_api_key', '')) { 534 $zapier_status = ['ok', _x('Configured', 'import status', 'ultimate-business-dashboard')]; 535 } 531 536 $cards = [ 532 ['ultibuda-setup-zapier', 'dashicons-update', __('Dext & Zapier', 'ultimate-business-dashboard'), __('Automatic import: each invoice processed in Dext is sent here by Zapier.', 'ultimate-business-dashboard'), $ last('zapier'),__('Set up', 'ultimate-business-dashboard')],537 ['ultibuda-setup-zapier', 'dashicons-update', __('Dext & Zapier', 'ultimate-business-dashboard'), __('Automatic import: each invoice processed in Dext is sent here by Zapier.', 'ultimate-business-dashboard'), $zapier_status, $zapier_status[0] ? __('Manage', 'ultimate-business-dashboard') : __('Set up', 'ultimate-business-dashboard')], 533 538 ['ultibuda-dext-import', 'dashicons-media-spreadsheet', __('Dext CSV', 'ultimate-business-dashboard'), __('Import a CSV export from Dext ("Dext Prepare Default" format).', 'ultimate-business-dashboard'), $last('dext_csv'), __('Import a file', 'ultimate-business-dashboard')], 534 539 ['ultibuda-other-import', 'dashicons-media-text', __('Other CSV', 'ultimate-business-dashboard'), __('Import invoices from any other tool with a simple CSV file.', 'ultimate-business-dashboard'), $last('other_csv'), __('Import a file', 'ultimate-business-dashboard')], … … 539 544 ?> 540 545 <p class="description"><?php esc_html_e('Choose how your supplier invoices reach the dashboard. Duplicates are ignored automatically, whatever the method.', 'ultimate-business-dashboard'); ?></p> 546 <?php $last_added = ultibuda_last_invoice_added_time(); ?> 547 <?php if ($last_added) : ?> 548 <p> 549 <?php 550 /* translators: 1: date and time, 2: total number of invoices */ 551 echo esc_html(sprintf(__('Last invoice added on %1$s · %2$s invoices in total', 'ultimate-business-dashboard'), wp_date(get_option('date_format') . ' ' . get_option('time_format'), $last_added), number_format_i18n(ultibuda_count_invoices()))); 552 ?> 553 </p> 554 <?php endif; ?> 541 555 <div class="ultibuda-import-cards"> 542 556 <?php foreach ($cards as $card) : ?> -
ultimate-business-dashboard/trunk/assets/css/admin.css
r3803022 r3803495 841 841 .card-empty { margin: 0; color: var(--ubd-grey); font-style: italic; } 842 842 .card-actions { align-items: center; gap: 6px; flex-wrap: wrap; } 843 .card-actions .button .dashicons { font-size: 16px; width: 16px; height: 16px; vertical-align: middle; margin: -3px 2px 0 0; }844 843 .ultibuda-icon-button.button { padding: 0 6px; color: var(--ubd-grey); } 845 844 .ultibuda-icon-button.button:hover, 846 845 .ultibuda-icon-button.button:focus { color: var(--ubd-blue); } 847 .ultibuda-icon-button .dashicons { margin-right: 0 !important; }848 846 .ultibuda-inline-form { display: inline; margin: 0; } 849 847 … … 896 894 .ultibuda-dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; } 897 895 .ultibuda-break-even { margin: 12px 0 0; color: var(--ubd-grey); } 898 .print-report-btn .dashicons { vertical-align: middle; margin-top: -3px; }899 896 @media (max-width: 1100px) { 900 897 .ultibuda-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); } … … 1023 1020 .ultibuda-code-input { width: 100px; } 1024 1021 .ultibuda-categories-table select { max-width: 100%; } 1022 1023 /* 2.7.1 : icônes centrées dans les boutons, quelle que soit la taille du texte */ 1024 .card-actions .button, 1025 .print-report-btn.button { 1026 display: inline-flex; 1027 align-items: center; 1028 justify-content: center; 1029 gap: 4px; 1030 } 1031 .card-actions .button .dashicons, 1032 .print-report-btn .dashicons { 1033 font-size: 16px; 1034 width: 16px; 1035 height: 16px; 1036 line-height: 1; 1037 margin: 0; 1038 vertical-align: baseline; 1039 } 1040 1041 /* 2.7.1 : page Factures, catégorie lisible et type compact */ 1042 .ultibuda-invoices-table .column-supplier { width: 24%; } 1043 .ultibuda-invoices-table .column-category { width: 28%; } 1044 .ultibuda-invoices-table .column-category select { width: 100%; min-width: 200px; max-width: none; } 1045 .ultibuda-invoices-table .ultibuda-select-small { width: auto; max-width: 140px; min-width: 0; } 1046 .ultibuda-invoices-table .column-input { width: 96px; } 1047 .ultibuda-invoices-table .column-input input { max-width: 96px; } 1048 1049 /* 2.7.1 : doublons probables en colonnes alignées */ 1050 .ultibuda-dup-line { display: grid; grid-template-columns: 150px 100px 100px minmax(0, 1fr) auto; align-items: center; gap: 4px 12px; padding: 3px 0; } 1051 .ultibuda-dup-line .num { text-align: right; font-variant-numeric: tabular-nums; } 1052 .ultibuda-dup-line > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } 1053 @media (max-width: 782px) { .ultibuda-dup-line { grid-template-columns: minmax(0, 1fr) auto; } .ultibuda-dup-line > span:nth-child(4) { display: none; } } -
ultimate-business-dashboard/trunk/assets/js/admin.js
r3803022 r3803495 334 334 { type: 'bar', label: d.revenueLabel, data: d.revenue, backgroundColor: 'rgba(34, 113, 177, 0.75)', borderRadius: 3, order: 3 }, 335 335 { type: 'line', label: d.revenuePrevLabel, data: d.revenuePrev, borderColor: '#8c8f94', borderDash: [6, 4], pointRadius: 0, borderWidth: 2, order: 2 }, 336 { type: 'line', label: d.ebeLabel, data: d.ebe, borderColor: '#00a32a', backgroundColor: '#00a32a', tension: 0.25, borderWidth: 2, order: 1},337 { type: 'line', label: d.resultLabel, data: d.result, borderColor: '#d63638', backgroundColor: '#d63638', tension: 0.25, borderWidth: 2, order: 0}336 { type: 'line', label: d.ebeLabel, data: d.ebe, borderColor: '#00a32a', backgroundColor: '#00a32a', tension: 0.25, borderWidth: 4, pointRadius: 4, order: 0 }, 337 { type: 'line', label: d.resultLabel, data: d.result, borderColor: '#d63638', backgroundColor: '#d63638', tension: 0.25, borderWidth: 2, borderDash: [5, 4], pointRadius: 3, pointStyle: 'rectRot', order: 1 } 338 338 ] 339 339 }, -
ultimate-business-dashboard/trunk/includes/format.php
r3802991 r3803495 45 45 return [ 46 46 'symbol' => $symbol !== '' ? $symbol : $default['symbol'], 47 'position' => in_array($position, ['before', 'after'], true) ? $position : $default['position'], 47 // Position automatique : celle de la langue de l'utilisateur, comme le format des nombres 48 // (« 100 € » en français, « €100 » en anglais), quelle que soit la langue du site. 49 'position' => in_array($position, ['before', 'after'], true) ? $position : ultibuda_locale_currency_position(get_user_locale()), 48 50 ]; 51 } 52 53 /** 54 * Place habituelle du symbole monétaire dans une langue. 55 * 56 * @param string $locale Langue (ex. fr_FR, en_US). 57 * @return string before|after 58 */ 59 function ultibuda_locale_currency_position($locale) { 60 foreach (['en', 'nl', 'ja', 'zh', 'ko', 'he', 'pt_BR', 'es_MX', 'es_AR', 'es_CO', 'es_CL', 'th', 'ms', 'id'] as $prefix) { 61 if (strpos((string) $locale, $prefix) === 0) { 62 return 'before'; 63 } 64 } 65 return 'after'; 49 66 } 50 67 … … 123 140 return '<span class="variation neutral" title="' . esc_attr__('No comparison available', 'ultimate-business-dashboard') . '">–</span>'; 124 141 } 142 if (is_numeric($var) && abs((float) $var) >= 1000) { 143 // Base de comparaison presque nulle : le pourcentage n'a pas de sens 144 return '<span class="variation neutral" title="' . esc_attr__('Variation too large to be meaningful (very small comparison base)', 'ultimate-business-dashboard') . '">' . esc_html__('n/m', 'ultimate-business-dashboard') . '</span>'; 145 } 125 146 if ($var === 'NM') { 126 147 return '<span class="variation neutral" title="' . esc_attr__('Variation not meaningful (transition from loss to profit or vice versa)', 'ultimate-business-dashboard') . '">' . esc_html__('n/m', 'ultimate-business-dashboard') . '</span>'; -
ultimate-business-dashboard/trunk/includes/invoice-store.php
r3803022 r3803495 640 640 641 641 /** 642 * Date d'ajout de la facture la plus récente (toutes sources), en horodatage, ou 0. 643 * 644 * @return int 645 */ 646 function ultibuda_last_invoice_added_time() { 647 if (!ultibuda_invoices_store_ready()) { 648 return 0; 649 } 650 global $wpdb; 651 $table = ultibuda_invoices_table(); 652 $last = $wpdb->get_var("SELECT MAX(created_at) FROM $table"); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared 653 return $last ? (int) strtotime($last . ' UTC') : 0; 654 } 655 656 /** 642 657 * Nombre de factures par catégorie. 643 658 * -
ultimate-business-dashboard/trunk/includes/quality.php
r3802991 r3803495 40 40 * Alertes ignorées. 41 41 * 42 * @return array{duplicates: string[], suppliers: string[], amounts: string[] }42 * @return array{duplicates: string[], suppliers: string[], amounts: string[], shared_numbers: string[]} 43 43 */ 44 44 function ultibuda_quality_ignored() { 45 45 $ignored = get_option('ultibuda_quality_ignored', []); 46 46 $ignored = is_array($ignored) ? $ignored : []; 47 foreach (['duplicates', 'suppliers', 'amounts' ] as $key) {47 foreach (['duplicates', 'suppliers', 'amounts', 'shared_numbers'] as $key) { 48 48 $ignored[$key] = isset($ignored[$key]) && is_array($ignored[$key]) ? $ignored[$key] : []; 49 49 } … … 54 54 * Ignore une alerte. 55 55 * 56 * @param string $type duplicates|suppliers|amounts .56 * @param string $type duplicates|suppliers|amounts|shared_numbers. 57 57 * @param string $key Clé de l'alerte. 58 58 */ … … 94 94 95 95 foreach ($by_supplier as $supplier_invoices) { 96 // Même numéro de facture chez le même fournisseur 96 // Même numéro de facture et même montant chez le même fournisseur (un même numéro avec des 97 // montants différents désigne en général deux documents distincts, ex. relevés Deliveroo) 97 98 $by_number = []; 98 99 foreach ($supplier_invoices as $invoice) { 99 100 $number = strtolower(trim((string) ($invoice['invoice_number'] ?? ''))); 100 101 if ($number !== '' && $number !== 'n/a') { 101 $by_number[$number ][] = $invoice;102 $by_number[$number . '|' . number_format((float) ($invoice['total_amount'] ?? 0), 2, '.', '')][] = $invoice; 102 103 } 103 104 } … … 139 140 140 141 /** 142 * Numéros de facture partagés par plusieurs documents de montants différents, regroupés par fournisseur. 143 * 144 * Ce n'est pas un doublon (acomptes, avoirs, relevés), mais un relevé de paiement importé à côté 145 * de la facture qu'il règle compterait deux fois en charge : on le signale à part, une ligne par fournisseur. 146 * 147 * @param array[] $invoices Factures. 148 * @return array[] Liste de ['key' => string, 'supplier' => string, 'numbers' => int, 'invoices' => int, 'example' => string]. 149 */ 150 function ultibuda_quality_shared_numbers($invoices) { 151 $ignored = ultibuda_quality_ignored()['shared_numbers']; 152 $groups = []; 153 foreach ($invoices as $invoice) { 154 $supplier = ultibuda_normalize_supplier($invoice['supplier'] ?? ''); 155 $number = strtolower(trim((string) ($invoice['invoice_number'] ?? ''))); 156 if ($supplier === '' || $supplier === 'unknown' || $number === '' || $number === 'n/a' || in_array($supplier, $ignored, true)) { 157 continue; 158 } 159 $groups[$supplier]['name'] = $groups[$supplier]['name'] ?? (string) $invoice['supplier']; 160 $groups[$supplier]['numbers'][$number]['label'] = (string) $invoice['invoice_number']; 161 $groups[$supplier]['numbers'][$number]['amounts'][number_format((float) ($invoice['total_amount'] ?? 0), 2, '.', '')] = true; 162 $groups[$supplier]['numbers'][$number]['count'] = ($groups[$supplier]['numbers'][$number]['count'] ?? 0) + 1; 163 } 164 $result = []; 165 foreach ($groups as $supplier => $group) { 166 $shared = array_filter($group['numbers'], function ($entry) { 167 return count($entry['amounts']) > 1; 168 }); 169 if (!$shared) { 170 continue; 171 } 172 $first = reset($shared); 173 $result[] = [ 174 'key' => $supplier, 175 'supplier' => $group['name'], 176 'numbers' => count($shared), 177 'invoices' => array_sum(array_column($shared, 'count')), 178 'example' => $first['label'], 179 ]; 180 } 181 usort($result, function ($a, $b) { 182 return $b['numbers'] - $a['numbers']; 183 }); 184 return $result; 185 } 186 187 /** 141 188 * Factures non catégorisées (ou rattachées à une catégorie supprimée). 142 189 * … … 288 335 function ultibuda_quality_issue_count($invoices) { 289 336 return count(ultibuda_quality_duplicates($invoices)) 337 + count(ultibuda_quality_shared_numbers($invoices)) 290 338 + ultibuda_quality_uncategorized_count($invoices) 291 339 + count(ultibuda_quality_supplier_groups($invoices)) … … 367 415 $message = __('Invoice deleted.', 'ultimate-business-dashboard'); 368 416 } 369 } elseif (in_array($action, ['ignore_duplicate', 'ignore_suppliers', 'ignore_amount' ], true) && $key !== '') {370 $types = ['ignore_duplicate' => 'duplicates', 'ignore_suppliers' => 'suppliers', 'ignore_amount' => 'amounts' ];417 } elseif (in_array($action, ['ignore_duplicate', 'ignore_suppliers', 'ignore_amount', 'ignore_shared_number'], true) && $key !== '') { 418 $types = ['ignore_duplicate' => 'duplicates', 'ignore_suppliers' => 'suppliers', 'ignore_amount' => 'amounts', 'ignore_shared_number' => 'shared_numbers']; 371 419 ultibuda_quality_ignore($types[$action], $key); 372 420 $message = __('Alert ignored.', 'ultimate-business-dashboard'); … … 384 432 $invoices = ultibuda_get_invoices(); 385 433 $duplicates = ultibuda_quality_duplicates($invoices); 434 $shared_numbers = ultibuda_quality_shared_numbers($invoices); 386 435 $uncategorized = ultibuda_quality_uncategorized_count($invoices); 387 436 $supplier_groups = ultibuda_quality_supplier_groups($invoices); … … 422 471 <?php 423 472 /* translators: %d: number of days */ 424 echo esc_html(sprintf(__('Same supplier with the same invoice number , or with the same total amount less than %d days apart.', 'ultimate-business-dashboard'), ULTIBUDA_DUPLICATE_DAYS));473 echo esc_html(sprintf(__('Same supplier with the same invoice number and amount, or with the same total amount less than %d days apart.', 'ultimate-business-dashboard'), ULTIBUDA_DUPLICATE_DAYS)); 425 474 ?> 426 475 </p> … … 438 487 <td><?php echo esc_html($pair['invoices'][0]['supplier']); ?></td> 439 488 <td> 440 <?php foreach ($pair['invoices'] as $invoice) : ?>441 <div>442 <?php echo wp_kses_post(ultibuda_quality_document_link($invoice));?>443 — <?php echo esc_html($invoice['date']); ?>444 — <?php echo esc_html($money($invoice['total_amount'])); ?>445 < ?php if (!empty($invoice['invoice_number']) && $invoice['invoice_number'] !== 'N/A') : ?>446 — <?php echo esc_html($invoice['invoice_number']); ?>447 < ?php endif; ?>448 < ?php $action_button('delete_invoice', $invoice['id'], __('Delete this one', 'ultimate-business-dashboard'), __('Delete this invoice? This cannot be undone.', 'ultimate-business-dashboard')); ?>489 <?php foreach ($pair['invoices'] as $invoice) : 490 $time = strtotime((string) $invoice['date']); 491 ?> 492 <div class="ultibuda-dup-line"> 493 <span><?php echo wp_kses_post(ultibuda_quality_document_link($invoice)); ?></span> 494 <span><?php echo esc_html($time ? date_i18n('j M Y', $time) : $invoice['date']); ?></span> 495 <span class="num"><?php echo esc_html($money($invoice['total_amount'])); ?></span> 496 <span class="ultibuda-muted"><?php echo esc_html((!empty($invoice['invoice_number']) && $invoice['invoice_number'] !== 'N/A') ? $invoice['invoice_number'] : '–'); ?></span> 497 <span><?php $action_button('delete_invoice', $invoice['id'], __('Delete this one', 'ultimate-business-dashboard'), __('Delete this invoice? This cannot be undone.', 'ultimate-business-dashboard')); ?></span> 449 498 </div> 450 499 <?php endforeach; ?> 451 500 </td> 452 <td><?php echo $pair['reason'] === 'number' ? esc_html__('Same invoice number ', 'ultimate-business-dashboard') : esc_html__('Same amount, close dates', 'ultimate-business-dashboard'); ?></td>501 <td><?php echo $pair['reason'] === 'number' ? esc_html__('Same invoice number and amount', 'ultimate-business-dashboard') : esc_html__('Same amount, close dates', 'ultimate-business-dashboard'); ?></td> 453 502 <td><?php $action_button('ignore_duplicate', $pair['key'], __('Not a duplicate', 'ultimate-business-dashboard')); ?></td> 454 503 </tr> … … 465 514 </p> 466 515 <?php endif; ?> 516 <?php endif; ?> 517 518 <?php if ($shared_numbers) : ?> 519 <h2> 520 <?php 521 /* translators: %d: number of suppliers */ 522 echo esc_html(sprintf(__('Same number, different amounts (%d)', 'ultimate-business-dashboard'), count($shared_numbers))); 523 ?> 524 </h2> 525 <p class="description"><?php esc_html_e('Several documents of these suppliers share the same number with different amounts. It is often normal (instalments, credit notes), but a payment statement imported next to the invoice it settles is counted twice as an expense: open an example and check that each document is a real invoice.', 'ultimate-business-dashboard'); ?></p> 526 <div class="ultibuda-quality-table-wrap"> 527 <table class="widefat striped"> 528 <thead><tr> 529 <th><?php esc_html_e('Supplier', 'ultimate-business-dashboard'); ?></th> 530 <th><?php esc_html_e('Numbers concerned', 'ultimate-business-dashboard'); ?></th> 531 <th><?php esc_html_e('Example', 'ultimate-business-dashboard'); ?></th> 532 <th><?php esc_html_e('Actions', 'ultimate-business-dashboard'); ?></th> 533 </tr></thead> 534 <tbody> 535 <?php foreach ($shared_numbers as $entry) : ?> 536 <tr> 537 <td><?php echo esc_html($entry['supplier']); ?></td> 538 <td> 539 <?php 540 /* translators: 1: number of invoice numbers, 2: number of invoices */ 541 echo esc_html(sprintf(_n('%1$s number (%2$s invoices)', '%1$s numbers (%2$s invoices)', $entry['numbers'], 'ultimate-business-dashboard'), ultibuda_number($entry['numbers'], 0), ultibuda_number($entry['invoices'], 0))); 542 ?> 543 </td> 544 <td><a href="<?php echo esc_url(add_query_arg(['page' => 'ultibuda-invoices', 's' => $entry['example']], admin_url('admin.php'))); ?>"><?php echo esc_html($entry['example']); ?></a></td> 545 <td> 546 <a class="button button-small" href="<?php echo esc_url(add_query_arg(['page' => 'ultibuda-invoices', 's' => $entry['supplier']], admin_url('admin.php'))); ?>"><?php esc_html_e('See the invoices', 'ultimate-business-dashboard'); ?></a> 547 <?php $action_button('ignore_shared_number', $entry['key'], __('This is normal', 'ultimate-business-dashboard')); ?> 548 </td> 549 </tr> 550 <?php endforeach; ?> 551 </tbody> 552 </table> 553 </div> 467 554 <?php endif; ?> 468 555 -
ultimate-business-dashboard/trunk/languages/ultimate-business-dashboard-fr_FR.po
r3803022 r3803495 4 4 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-business-" 5 5 "dashboard\n" 6 "POT-Creation-Date: 2026-11-15T 09:59:02+00:00\n"6 "POT-Creation-Date: 2026-11-15T15:30:11+00:00\n" 7 7 "PO-Revision-Date: 2025-11-22 17:17+0100\n" 8 8 "Last-Translator: \n" … … 77 77 #: includes/categories.php:17 includes/dashboard.php:263 includes/data.php:16 78 78 #: includes/imports.php:451 includes/imports.php:535 includes/invoices.php:133 79 #: includes/quality.php: 358includes/quickbooks.php:2579 #: includes/quality.php:406 includes/quickbooks.php:25 80 80 #: includes/quickbooks.php:511 includes/reports.php:17 includes/settings.php:44 81 81 #: includes/user-management.php:17 includes/zapier.php:17 … … 159 159 "Categories are created from your imports (Dext, CSV, QuickBooks). For each " 160 160 "one, choose how it is counted in your results." 161 msgstr "Les catégories sont créées à partir de vos imports (Dext, CSV, QuickBooks). Pour chacune, choisissez comment elle compte dans vos résultats." 161 msgstr "" 162 "Les catégories sont créées à partir de vos imports (Dext, CSV, QuickBooks). " 163 "Pour chacune, choisissez comment elle compte dans vos résultats." 162 164 163 165 #: includes/categories.php:209 … … 175 177 "of goods sold, adjusted by inventory), occupancy costs (rent, energy…), " 176 178 "other operating expenses, or exceptional expenses (excluded from the EBE)." 177 msgstr "la ligne du compte de résultat où apparaissent les factures : achats de marchandises (coût des marchandises vendues, corrigé du stock), coûts d’occupation (loyer, énergie…), autres charges d’exploitation, ou charges exceptionnelles (hors EBE)." 179 msgstr "" 180 "la ligne du compte de résultat où apparaissent les factures : achats de " 181 "marchandises (coût des marchandises vendues, corrigé du stock), coûts " 182 "d’occupation (loyer, énergie…), autres charges d’exploitation, ou charges " 183 "exceptionnelles (hors EBE)." 178 184 179 185 #: includes/categories.php:212 includes/categories.php:247 … … 187 193 "fixed or variable cost, used for the contribution margin and the break-even " 188 194 "point. Purchases of goods are always variable." 189 msgstr "coût fixe ou variable, utilisé pour la marge sur coûts variables et le point mort. Les achats de marchandises sont toujours variables." 195 msgstr "" 196 "coût fixe ou variable, utilisé pour la marge sur coûts variables et le point " 197 "mort. Les achats de marchandises sont toujours variables." 190 198 191 199 #: includes/categories.php:213 includes/categories.php:245 … … 207 215 "The Uncategorized category is the default for unassigned invoices and cannot " 208 216 "be deleted." 209 msgstr "La catégorie Non classé reçoit les factures sans catégorie et ne peut pas être supprimée." 217 msgstr "" 218 "La catégorie Non classé reçoit les factures sans catégorie et ne peut pas " 219 "être supprimée." 210 220 211 221 #: includes/categories.php:223 includes/categories.php:294 … … 257 267 258 268 #: includes/categories.php:244 includes/invoices.php:436 259 #: includes/quality.php:4 31ultimate-business-dashboard.php:138269 #: includes/quality.php:480 ultimate-business-dashboard.php:138 260 270 msgid "Invoices" 261 271 msgstr "Factures" … … 699 709 "Monthly amounts that do not come from invoices, excluding VAT. They feed the " 700 710 "Dashboard and the Ratios & Reports." 701 msgstr "Montants mensuels qui ne viennent pas des factures, hors TVA. Ils alimentent le tableau de bord et les Ratios et Rapports." 711 msgstr "" 712 "Montants mensuels qui ne viennent pas des factures, hors TVA. Ils alimentent " 713 "le tableau de bord et les Ratios et Rapports." 702 714 703 715 #: includes/data.php:136 … … 823 835 824 836 #. translators: %s: number. Percentage format; French uses a non-breaking space before the % sign. 825 #: includes/format.php: 93837 #: includes/format.php:110 826 838 msgctxt "percentage" 827 839 msgid "%s%%" 828 840 msgstr "%s %%" 829 841 830 #: includes/format.php:1 23842 #: includes/format.php:140 831 843 msgid "No comparison available" 832 844 msgstr "Pas de comparaison possible" 833 845 834 #: includes/format.php:126 ultimate-business-dashboard.php:352 846 #: includes/format.php:144 847 msgid "Variation too large to be meaningful (very small comparison base)" 848 msgstr "" 849 "Variation trop forte pour être significative (base de comparaison très " 850 "faible)" 851 852 #: includes/format.php:144 includes/format.php:147 853 msgid "n/m" 854 msgstr "n.s." 855 856 #: includes/format.php:147 ultimate-business-dashboard.php:352 835 857 msgid "Variation not meaningful (transition from loss to profit or vice versa)" 836 858 msgstr "" 837 859 "Variation non significative (transition d’une perte à un bénéfice ou vice " 838 860 "versa)" 839 840 #: includes/format.php:126841 msgid "n/m"842 msgstr "n.s."843 861 844 862 #: includes/import-header.php:12 ultimate-business-dashboard.php:142 … … 850 868 msgstr "Vue d’ensemble" 851 869 852 #: includes/import-tabs.php:13 ultimate-business-dashboard.php:53 2870 #: includes/import-tabs.php:13 ultimate-business-dashboard.php:537 853 871 msgid "Dext & Zapier" 854 872 msgstr "Dext & Zapier" 855 873 856 #: includes/import-tabs.php:14 ultimate-business-dashboard.php:53 3874 #: includes/import-tabs.php:14 ultimate-business-dashboard.php:538 857 875 msgid "Dext CSV" 858 876 msgstr "CSV Dext" 859 877 860 #: includes/import-tabs.php:15 ultimate-business-dashboard.php:53 4878 #: includes/import-tabs.php:15 ultimate-business-dashboard.php:539 861 879 msgid "Other CSV" 862 880 msgstr "Autre CSV" 863 881 864 #: includes/import-tabs.php:16 ultimate-business-dashboard.php:5 35882 #: includes/import-tabs.php:16 ultimate-business-dashboard.php:540 865 883 msgid "QuickBooks" 866 884 msgstr "QuickBooks" … … 1023 1041 1024 1042 #: includes/imports.php:488 includes/imports.php:567 includes/invoices.php:484 1025 #: includes/invoices.php:513 includes/quality.php:430 includes/quality.php:542 1043 #: includes/invoices.php:513 includes/quality.php:479 includes/quality.php:529 1044 #: includes/quality.php:629 1026 1045 msgid "Supplier" 1027 1046 msgstr "Fournisseur" … … 1051 1070 1052 1071 #: includes/imports.php:490 includes/imports.php:569 includes/invoices.php:486 1053 #: includes/invoices.php:537 includes/quality.php: 5441072 #: includes/invoices.php:537 includes/quality.php:631 1054 1073 msgid "Net Amount" 1055 1074 msgstr "Montant net" … … 1431 1450 msgstr "Sélectionner" 1432 1451 1433 #: includes/invoices.php:507 includes/quality.php:3 491452 #: includes/invoices.php:507 includes/quality.php:397 1434 1453 msgid "Open the invoice document" 1435 1454 msgstr "Ouvrir le document de la facture" … … 1464 1483 msgstr[1] "Amortie · %d mois" 1465 1484 1466 #: includes/quality.php: 3671485 #: includes/quality.php:415 1467 1486 msgid "Invoice deleted." 1468 1487 msgstr "Facture supprimée." 1469 1488 1470 #: includes/quality.php: 3721489 #: includes/quality.php:420 1471 1490 msgid "Alert ignored." 1472 1491 msgstr "Alerte ignorée." 1473 1492 1474 1493 #. translators: 1: number of invoices, 2: supplier name 1475 #: includes/quality.php: 3791494 #: includes/quality.php:427 1476 1495 msgid "%1$d invoice now uses the supplier name \"%2$s\"." 1477 1496 msgid_plural "%1$d invoices now use the supplier name \"%2$s\"." … … 1479 1498 msgstr[1] "%1$d factures portent désormais le nom de fournisseur « %2$s »." 1480 1499 1481 #: includes/quality.php:4 06ultimate-business-dashboard.php:1391500 #: includes/quality.php:455 ultimate-business-dashboard.php:139 1482 1501 msgid "Checks" 1483 1502 msgstr "Contrôles" 1484 1503 1485 #: includes/quality.php:4 071504 #: includes/quality.php:456 1486 1505 msgid "" 1487 1506 "Points to check before relying on your figures. Each alert can be ignored if " … … 1492 1511 1493 1512 #. translators: %d: number of alerts 1494 #: includes/quality.php:4 151513 #: includes/quality.php:464 1495 1514 msgid "Possible duplicates (%d)" 1496 1515 msgstr "Doublons probables (%d)" 1497 1516 1498 #: includes/quality.php:4 191517 #: includes/quality.php:468 1499 1518 msgid "No possible duplicate." 1500 1519 msgstr "Aucun doublon probable." 1501 1520 1502 1521 #. translators: %d: number of days 1503 #: includes/quality.php:4 241504 msgid "" 1505 "Same supplier with the same invoice number , or with the same total amount"1506 " less than %d days apart."1507 msgstr "" 1508 "Même fournisseur avec le même numéro de facture , ou avec le même montant TTC"1509 " à moins de %d jours d’écart."1510 1511 #: includes/quality.php:4 321522 #: includes/quality.php:473 1523 msgid "" 1524 "Same supplier with the same invoice number and amount, or with the same " 1525 "total amount less than %d days apart." 1526 msgstr "" 1527 "Même fournisseur avec le même numéro de facture et le même montant, ou avec " 1528 "le même montant TTC à moins de %d jours d’écart." 1529 1530 #: includes/quality.php:481 1512 1531 msgid "Reason" 1513 1532 msgstr "Motif" 1514 1533 1515 #: includes/quality.php:4 33 includes/quality.php:498 includes/quality.php:5461516 #: includes/ user-management.php:2131534 #: includes/quality.php:482 includes/quality.php:532 includes/quality.php:585 1535 #: includes/quality.php:633 includes/user-management.php:213 1517 1536 msgid "Actions" 1518 1537 msgstr "Actions" 1519 1538 1520 #: includes/quality.php:4 481539 #: includes/quality.php:497 1521 1540 msgid "Delete this one" 1522 1541 msgstr "Supprimer celle-ci" 1523 1542 1524 #: includes/quality.php:4 481543 #: includes/quality.php:497 1525 1544 msgid "Delete this invoice? This cannot be undone." 1526 1545 msgstr "Supprimer cette facture ? Cette action est irréversible." 1527 1546 1528 #: includes/quality.php: 4521529 msgid "Same invoice number "1530 msgstr "Même numéro de facture"1531 1532 #: includes/quality.php: 4521547 #: includes/quality.php:501 1548 msgid "Same invoice number and amount" 1549 msgstr "Même numéro et même montant" 1550 1551 #: includes/quality.php:501 1533 1552 msgid "Same amount, close dates" 1534 1553 msgstr "Même montant, dates proches" 1535 1554 1536 #: includes/quality.php: 4531555 #: includes/quality.php:502 1537 1556 msgid "Not a duplicate" 1538 1557 msgstr "Pas un doublon" 1539 1558 1540 1559 #. translators: %d: number of rows shown 1541 #: includes/quality.php: 4631560 #: includes/quality.php:512 1542 1561 msgid "Only the first %d are shown." 1543 1562 msgstr "Seuls les %d premiers sont affichés." 1544 1563 1564 #. translators: %d: number of suppliers 1565 #: includes/quality.php:522 1566 msgid "Same number, different amounts (%d)" 1567 msgstr "Même numéro, montants différents (%d)" 1568 1569 #: includes/quality.php:525 1570 msgid "" 1571 "Several documents of these suppliers share the same number with different " 1572 "amounts. It is often normal (instalments, credit notes), but a payment " 1573 "statement imported next to the invoice it settles is counted twice as an " 1574 "expense: open an example and check that each document is a real invoice." 1575 msgstr "" 1576 "Chez ces fournisseurs, plusieurs documents portent le même numéro avec des " 1577 "montants différents. C’est souvent normal (acomptes, avoirs), mais un relevé " 1578 "de paiement importé à côté de la facture qu’il règle compte deux fois en " 1579 "charge : ouvrez un exemple et vérifiez que chaque document est bien une " 1580 "facture." 1581 1582 #: includes/quality.php:530 1583 msgid "Numbers concerned" 1584 msgstr "Numéros concernés" 1585 1586 #: includes/quality.php:531 1587 msgid "Example" 1588 msgstr "Exemple" 1589 1590 #. translators: 1: number of invoice numbers, 2: number of invoices 1591 #: includes/quality.php:541 1592 msgid "%1$s number (%2$s invoices)" 1593 msgid_plural "%1$s numbers (%2$s invoices)" 1594 msgstr[0] "%1$s numéro (%2$s factures)" 1595 msgstr[1] "%1$s numéros (%2$s factures)" 1596 1597 #: includes/quality.php:546 1598 msgid "See the invoices" 1599 msgstr "Voir les factures" 1600 1601 #: includes/quality.php:547 1602 msgid "This is normal" 1603 msgstr "C’est normal" 1604 1545 1605 #. translators: %d: number of invoices 1546 #: includes/quality.php: 4721606 #: includes/quality.php:559 1547 1607 msgid "Uncategorized invoices (%d)" 1548 1608 msgstr "Factures non catégorisées (%d)" 1549 1609 1550 #: includes/quality.php: 4761610 #: includes/quality.php:563 1551 1611 msgid "All invoices have a category." 1552 1612 msgstr "Toutes les factures ont une catégorie." 1553 1613 1554 #: includes/quality.php: 4791614 #: includes/quality.php:566 1555 1615 msgid "" 1556 1616 "These invoices are counted in \"Other Invoices\" and as unclassified costs." … … 1558 1618 "Ces factures sont comptées dans « Autres factures » et en coûts non classés." 1559 1619 1560 #: includes/quality.php: 4801620 #: includes/quality.php:567 1561 1621 msgid "Show them" 1562 1622 msgstr "Les afficher" 1563 1623 1564 1624 #. translators: %d: number of groups 1565 #: includes/quality.php: 4871625 #: includes/quality.php:574 1566 1626 msgid "Suppliers written in several ways (%d)" 1567 1627 msgstr "Fournisseurs écrits de plusieurs façons (%d)" 1568 1628 1569 #: includes/quality.php: 4911629 #: includes/quality.php:578 1570 1630 msgid "No similar supplier names." 1571 1631 msgstr "Aucun nom de fournisseur similaire." 1572 1632 1573 #: includes/quality.php: 4931633 #: includes/quality.php:580 1574 1634 msgid "Choose the name to keep: all the invoices of the group will use it." 1575 1635 msgstr "" 1576 1636 "Choisissez le nom à garder : toutes les factures du groupe le prendront." 1577 1637 1578 #: includes/quality.php: 4971638 #: includes/quality.php:584 1579 1639 msgid "Names found (invoices)" 1580 1640 msgstr "Noms trouvés (factures)" 1581 1641 1582 #: includes/quality.php: 5191642 #: includes/quality.php:606 1583 1643 msgid "Use this name" 1584 1644 msgstr "Garder ce nom" 1585 1645 1586 #: includes/quality.php: 5201646 #: includes/quality.php:607 1587 1647 msgid "Different suppliers" 1588 1648 msgstr "Fournisseurs différents" 1589 1649 1590 1650 #. translators: %d: number of invoices 1591 #: includes/quality.php: 5321651 #: includes/quality.php:619 1592 1652 msgid "Unusual amounts (%d)" 1593 1653 msgstr "Montants inhabituels (%d)" 1594 1654 1595 #: includes/quality.php: 5361655 #: includes/quality.php:623 1596 1656 msgid "No unusual amount over the last 12 months." 1597 1657 msgstr "Aucun montant inhabituel sur les 12 derniers mois." 1598 1658 1599 #: includes/quality.php: 5381659 #: includes/quality.php:625 1600 1660 msgid "" 1601 1661 "Invoices of the last 12 months more than 3 times the usual amount (median) " … … 1605 1665 "(médiane) du fournisseur." 1606 1666 1607 #: includes/quality.php: 5431667 #: includes/quality.php:630 1608 1668 msgid "Invoice" 1609 1669 msgstr "Facture" 1610 1670 1611 #: includes/quality.php: 5451671 #: includes/quality.php:632 1612 1672 msgid "Usual amount" 1613 1673 msgstr "Montant habituel" 1614 1674 1615 #: includes/quality.php: 5551675 #: includes/quality.php:642 1616 1676 msgid "Checked" 1617 1677 msgstr "Vérifié" 1618 1678 1619 1679 #. translators: 1: number of points, 2: opening link, 3: closing link 1620 #: includes/quality.php: 5851680 #: includes/quality.php:672 1621 1681 msgid "" 1622 1682 "%1$d point to check in your data (duplicates, categories, suppliers, " … … 1977 2037 "The largest expense items of the period, including the costs entered in the " 1978 2038 "Data page." 1979 msgstr "Les principaux postes de dépenses de la période, y compris les charges saisies dans la page Données." 2039 msgstr "" 2040 "Les principaux postes de dépenses de la période, y compris les charges " 2041 "saisies dans la page Données." 1980 2042 1981 2043 #: includes/reports.php:277 ultimate-business-dashboard.php:360 … … 1991 2053 "Costs entered in the Data page, amortizations and provisions are fixed; the " 1992 2054 "cost of goods sold is variable. Invoices follow the type of their category." 1993 msgstr "Les charges saisies dans la page Données, les amortissements et les provisions sont fixes ; le coût des marchandises vendues est variable. Les factures suivent le type de leur catégorie." 2055 msgstr "" 2056 "Les charges saisies dans la page Données, les amortissements et les " 2057 "provisions sont fixes ; le coût des marchandises vendues est variable. Les " 2058 "factures suivent le type de leur catégorie." 1994 2059 1995 2060 #. translators: 1: break-even revenue, 2: percentage of the actual revenue 1996 2061 #: includes/reports.php:309 1997 2062 msgid "Break-even point: %1$s of revenue (%2$s of the actual revenue)." 1998 msgstr "Point mort : %1$s de chiffre d’affaires (%2$s du chiffre d’affaires réel)." 2063 msgstr "" 2064 "Point mort : %1$s de chiffre d’affaires (%2$s du chiffre d’affaires réel)." 1999 2065 2000 2066 #: includes/reports.php:314 … … 2633 2699 msgstr "Non connecté" 2634 2700 2635 #: ultimate-business-dashboard.php:532 2701 #: ultimate-business-dashboard.php:534 2702 msgctxt "import status" 2703 msgid "Configured" 2704 msgstr "Configuré" 2705 2706 #: ultimate-business-dashboard.php:537 2636 2707 msgid "" 2637 2708 "Automatic import: each invoice processed in Dext is sent here by Zapier." 2638 msgstr "Import automatique : chaque facture traitée dans Dext est envoyée ici par Zapier." 2639 2640 #: ultimate-business-dashboard.php:532 2709 msgstr "" 2710 "Import automatique : chaque facture traitée dans Dext est envoyée ici par " 2711 "Zapier." 2712 2713 #: ultimate-business-dashboard.php:537 ultimate-business-dashboard.php:540 2714 msgid "Manage" 2715 msgstr "Gérer" 2716 2717 #: ultimate-business-dashboard.php:537 2641 2718 msgid "Set up" 2642 2719 msgstr "Configurer" 2643 2720 2644 #: ultimate-business-dashboard.php:53 32721 #: ultimate-business-dashboard.php:538 2645 2722 msgid "Import a CSV export from Dext (\"Dext Prepare Default\" format)." 2646 2723 msgstr "Importer un export CSV de Dext (format « Dext Prepare Default »)." 2647 2724 2648 #: ultimate-business-dashboard.php:53 3 ultimate-business-dashboard.php:5342725 #: ultimate-business-dashboard.php:538 ultimate-business-dashboard.php:539 2649 2726 msgid "Import a file" 2650 2727 msgstr "Importer un fichier" 2651 2728 2652 #: ultimate-business-dashboard.php:53 42729 #: ultimate-business-dashboard.php:539 2653 2730 msgid "Import invoices from any other tool with a simple CSV file." 2654 2731 msgstr "Importer les factures de tout autre outil avec un simple fichier CSV." 2655 2732 2656 #: ultimate-business-dashboard.php:5 352733 #: ultimate-business-dashboard.php:540 2657 2734 msgid "Connect QuickBooks Online to import supplier bills every hour." 2658 msgstr "Connecter QuickBooks Online pour importer les factures fournisseurs toutes les heures." 2659 2660 #: ultimate-business-dashboard.php:535 2661 msgid "Manage" 2662 msgstr "Gérer" 2663 2664 #: ultimate-business-dashboard.php:535 2735 msgstr "" 2736 "Connecter QuickBooks Online pour importer les factures fournisseurs toutes " 2737 "les heures." 2738 2739 #: ultimate-business-dashboard.php:540 2665 2740 msgid "Connect" 2666 2741 msgstr "Connecter" 2667 2742 2668 #: ultimate-business-dashboard.php:54 02743 #: ultimate-business-dashboard.php:545 2669 2744 msgid "" 2670 2745 "Choose how your supplier invoices reach the dashboard. Duplicates are " 2671 2746 "ignored automatically, whatever the method." 2672 msgstr "Choisissez comment vos factures fournisseurs arrivent dans le tableau de bord. Les doublons sont ignorés automatiquement, quelle que soit la méthode." 2747 msgstr "" 2748 "Choisissez comment vos factures fournisseurs arrivent dans le tableau de " 2749 "bord. Les doublons sont ignorés automatiquement, quelle que soit la méthode." 2750 2751 #. translators: 1: date and time, 2: total number of invoices 2752 #: ultimate-business-dashboard.php:551 2753 msgid "Last invoice added on %1$s · %2$s invoices in total" 2754 msgstr "Dernière facture ajoutée le %1$s · %2$s factures au total" 2673 2755 2674 2756 #~ msgid "" -
ultimate-business-dashboard/trunk/languages/ultimate-business-dashboard.pot
r3803022 r3803495 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Ultimate Business Dashboard 2. 6\n"5 "Project-Id-Version: Ultimate Business Dashboard 2.7.1\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-business-dashboard\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2026-11-15T 09:59:02+00:00\n"12 "POT-Creation-Date: 2026-11-15T15:30:11+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.11.0\n" … … 85 85 #: includes/imports.php:535 86 86 #: includes/invoices.php:133 87 #: includes/quality.php: 35887 #: includes/quality.php:406 88 88 #: includes/quickbooks.php:25 89 89 #: includes/quickbooks.php:511 … … 237 237 #: includes/categories.php:244 238 238 #: includes/invoices.php:436 239 #: includes/quality.php:4 31239 #: includes/quality.php:480 240 240 #: ultimate-business-dashboard.php:138 241 241 msgid "Invoices" … … 839 839 840 840 #. translators: %s: number. Percentage format; French uses a non-breaking space before the % sign. 841 #: includes/format.php: 93841 #: includes/format.php:110 842 842 msgctxt "percentage" 843 843 msgid "%s%%" 844 844 msgstr "" 845 845 846 #: includes/format.php:1 23846 #: includes/format.php:140 847 847 msgid "No comparison available" 848 848 msgstr "" 849 849 850 #: includes/format.php:126 850 #: includes/format.php:144 851 msgid "Variation too large to be meaningful (very small comparison base)" 852 msgstr "" 853 854 #: includes/format.php:144 855 #: includes/format.php:147 856 msgid "n/m" 857 msgstr "" 858 859 #: includes/format.php:147 851 860 #: ultimate-business-dashboard.php:352 852 861 msgid "Variation not meaningful (transition from loss to profit or vice versa)" 853 msgstr ""854 855 #: includes/format.php:126856 msgid "n/m"857 862 msgstr "" 858 863 … … 867 872 868 873 #: includes/import-tabs.php:13 869 #: ultimate-business-dashboard.php:53 2874 #: ultimate-business-dashboard.php:537 870 875 msgid "Dext & Zapier" 871 876 msgstr "" 872 877 873 878 #: includes/import-tabs.php:14 874 #: ultimate-business-dashboard.php:53 3879 #: ultimate-business-dashboard.php:538 875 880 msgid "Dext CSV" 876 881 msgstr "" 877 882 878 883 #: includes/import-tabs.php:15 879 #: ultimate-business-dashboard.php:53 4884 #: ultimate-business-dashboard.php:539 880 885 msgid "Other CSV" 881 886 msgstr "" 882 887 883 888 #: includes/import-tabs.php:16 884 #: ultimate-business-dashboard.php:5 35889 #: ultimate-business-dashboard.php:540 885 890 msgid "QuickBooks" 886 891 msgstr "" … … 1036 1041 #: includes/invoices.php:484 1037 1042 #: includes/invoices.php:513 1038 #: includes/quality.php:430 1039 #: includes/quality.php:542 1043 #: includes/quality.php:479 1044 #: includes/quality.php:529 1045 #: includes/quality.php:629 1040 1046 msgid "Supplier" 1041 1047 msgstr "" … … 1072 1078 #: includes/invoices.php:486 1073 1079 #: includes/invoices.php:537 1074 #: includes/quality.php: 5441080 #: includes/quality.php:631 1075 1081 msgid "Net Amount" 1076 1082 msgstr "" … … 1411 1417 1412 1418 #: includes/invoices.php:507 1413 #: includes/quality.php:3 491419 #: includes/quality.php:397 1414 1420 msgid "Open the invoice document" 1415 1421 msgstr "" … … 1446 1452 msgstr[1] "" 1447 1453 1448 #: includes/quality.php: 3671454 #: includes/quality.php:415 1449 1455 msgid "Invoice deleted." 1450 1456 msgstr "" 1451 1457 1452 #: includes/quality.php: 3721458 #: includes/quality.php:420 1453 1459 msgid "Alert ignored." 1454 1460 msgstr "" 1455 1461 1456 1462 #. translators: 1: number of invoices, 2: supplier name 1457 #: includes/quality.php: 3791463 #: includes/quality.php:427 1458 1464 msgid "%1$d invoice now uses the supplier name \"%2$s\"." 1459 1465 msgid_plural "%1$d invoices now use the supplier name \"%2$s\"." … … 1461 1467 msgstr[1] "" 1462 1468 1463 #: includes/quality.php:4 061469 #: includes/quality.php:455 1464 1470 #: ultimate-business-dashboard.php:139 1465 1471 msgid "Checks" 1466 1472 msgstr "" 1467 1473 1468 #: includes/quality.php:4 071474 #: includes/quality.php:456 1469 1475 msgid "Points to check before relying on your figures. Each alert can be ignored if it is not a problem." 1470 1476 msgstr "" 1471 1477 1472 1478 #. translators: %d: number of alerts 1473 #: includes/quality.php:4 151479 #: includes/quality.php:464 1474 1480 msgid "Possible duplicates (%d)" 1475 1481 msgstr "" 1476 1482 1477 #: includes/quality.php:4 191483 #: includes/quality.php:468 1478 1484 msgid "No possible duplicate." 1479 1485 msgstr "" 1480 1486 1481 1487 #. translators: %d: number of days 1482 #: includes/quality.php:4 241483 msgid "Same supplier with the same invoice number , or with the same total amount less than %d days apart."1484 msgstr "" 1485 1486 #: includes/quality.php:4 321488 #: includes/quality.php:473 1489 msgid "Same supplier with the same invoice number and amount, or with the same total amount less than %d days apart." 1490 msgstr "" 1491 1492 #: includes/quality.php:481 1487 1493 msgid "Reason" 1488 1494 msgstr "" 1489 1495 1490 #: includes/quality.php:433 1491 #: includes/quality.php:498 1492 #: includes/quality.php:546 1496 #: includes/quality.php:482 1497 #: includes/quality.php:532 1498 #: includes/quality.php:585 1499 #: includes/quality.php:633 1493 1500 #: includes/user-management.php:213 1494 1501 msgid "Actions" 1495 1502 msgstr "" 1496 1503 1497 #: includes/quality.php:4 481504 #: includes/quality.php:497 1498 1505 msgid "Delete this one" 1499 1506 msgstr "" 1500 1507 1501 #: includes/quality.php:4 481508 #: includes/quality.php:497 1502 1509 msgid "Delete this invoice? This cannot be undone." 1503 1510 msgstr "" 1504 1511 1505 #: includes/quality.php: 4521506 msgid "Same invoice number "1507 msgstr "" 1508 1509 #: includes/quality.php: 4521512 #: includes/quality.php:501 1513 msgid "Same invoice number and amount" 1514 msgstr "" 1515 1516 #: includes/quality.php:501 1510 1517 msgid "Same amount, close dates" 1511 1518 msgstr "" 1512 1519 1513 #: includes/quality.php: 4531520 #: includes/quality.php:502 1514 1521 msgid "Not a duplicate" 1515 1522 msgstr "" 1516 1523 1517 1524 #. translators: %d: number of rows shown 1518 #: includes/quality.php: 4631525 #: includes/quality.php:512 1519 1526 msgid "Only the first %d are shown." 1520 1527 msgstr "" 1521 1528 1529 #. translators: %d: number of suppliers 1530 #: includes/quality.php:522 1531 msgid "Same number, different amounts (%d)" 1532 msgstr "" 1533 1534 #: includes/quality.php:525 1535 msgid "Several documents of these suppliers share the same number with different amounts. It is often normal (instalments, credit notes), but a payment statement imported next to the invoice it settles is counted twice as an expense: open an example and check that each document is a real invoice." 1536 msgstr "" 1537 1538 #: includes/quality.php:530 1539 msgid "Numbers concerned" 1540 msgstr "" 1541 1542 #: includes/quality.php:531 1543 msgid "Example" 1544 msgstr "" 1545 1546 #. translators: 1: number of invoice numbers, 2: number of invoices 1547 #: includes/quality.php:541 1548 msgid "%1$s number (%2$s invoices)" 1549 msgid_plural "%1$s numbers (%2$s invoices)" 1550 msgstr[0] "" 1551 msgstr[1] "" 1552 1553 #: includes/quality.php:546 1554 msgid "See the invoices" 1555 msgstr "" 1556 1557 #: includes/quality.php:547 1558 msgid "This is normal" 1559 msgstr "" 1560 1522 1561 #. translators: %d: number of invoices 1523 #: includes/quality.php: 4721562 #: includes/quality.php:559 1524 1563 msgid "Uncategorized invoices (%d)" 1525 1564 msgstr "" 1526 1565 1527 #: includes/quality.php: 4761566 #: includes/quality.php:563 1528 1567 msgid "All invoices have a category." 1529 1568 msgstr "" 1530 1569 1531 #: includes/quality.php: 4791570 #: includes/quality.php:566 1532 1571 msgid "These invoices are counted in \"Other Invoices\" and as unclassified costs." 1533 1572 msgstr "" 1534 1573 1535 #: includes/quality.php: 4801574 #: includes/quality.php:567 1536 1575 msgid "Show them" 1537 1576 msgstr "" 1538 1577 1539 1578 #. translators: %d: number of groups 1540 #: includes/quality.php: 4871579 #: includes/quality.php:574 1541 1580 msgid "Suppliers written in several ways (%d)" 1542 1581 msgstr "" 1543 1582 1544 #: includes/quality.php: 4911583 #: includes/quality.php:578 1545 1584 msgid "No similar supplier names." 1546 1585 msgstr "" 1547 1586 1548 #: includes/quality.php: 4931587 #: includes/quality.php:580 1549 1588 msgid "Choose the name to keep: all the invoices of the group will use it." 1550 1589 msgstr "" 1551 1590 1552 #: includes/quality.php: 4971591 #: includes/quality.php:584 1553 1592 msgid "Names found (invoices)" 1554 1593 msgstr "" 1555 1594 1556 #: includes/quality.php: 5191595 #: includes/quality.php:606 1557 1596 msgid "Use this name" 1558 1597 msgstr "" 1559 1598 1560 #: includes/quality.php: 5201599 #: includes/quality.php:607 1561 1600 msgid "Different suppliers" 1562 1601 msgstr "" 1563 1602 1564 1603 #. translators: %d: number of invoices 1565 #: includes/quality.php: 5321604 #: includes/quality.php:619 1566 1605 msgid "Unusual amounts (%d)" 1567 1606 msgstr "" 1568 1607 1569 #: includes/quality.php: 5361608 #: includes/quality.php:623 1570 1609 msgid "No unusual amount over the last 12 months." 1571 1610 msgstr "" 1572 1611 1573 #: includes/quality.php: 5381612 #: includes/quality.php:625 1574 1613 msgid "Invoices of the last 12 months more than 3 times the usual amount (median) of the supplier." 1575 1614 msgstr "" 1576 1615 1577 #: includes/quality.php: 5431616 #: includes/quality.php:630 1578 1617 msgid "Invoice" 1579 1618 msgstr "" 1580 1619 1581 #: includes/quality.php: 5451620 #: includes/quality.php:632 1582 1621 msgid "Usual amount" 1583 1622 msgstr "" 1584 1623 1585 #: includes/quality.php: 5551624 #: includes/quality.php:642 1586 1625 msgid "Checked" 1587 1626 msgstr "" 1588 1627 1589 1628 #. translators: 1: number of points, 2: opening link, 3: closing link 1590 #: includes/quality.php: 5851629 #: includes/quality.php:672 1591 1630 msgid "%1$d point to check in your data (duplicates, categories, suppliers, amounts). %2$sSee the checks%3$s" 1592 1631 msgid_plural "%1$d points to check in your data (duplicates, categories, suppliers, amounts). %2$sSee the checks%3$s" … … 2420 2459 msgstr "" 2421 2460 2422 #: ultimate-business-dashboard.php:532 2461 #: ultimate-business-dashboard.php:534 2462 msgctxt "import status" 2463 msgid "Configured" 2464 msgstr "" 2465 2466 #: ultimate-business-dashboard.php:537 2423 2467 msgid "Automatic import: each invoice processed in Dext is sent here by Zapier." 2424 2468 msgstr "" 2425 2469 2426 #: ultimate-business-dashboard.php:532 2470 #: ultimate-business-dashboard.php:537 2471 #: ultimate-business-dashboard.php:540 2472 msgid "Manage" 2473 msgstr "" 2474 2475 #: ultimate-business-dashboard.php:537 2427 2476 msgid "Set up" 2428 2477 msgstr "" 2429 2478 2430 #: ultimate-business-dashboard.php:53 32479 #: ultimate-business-dashboard.php:538 2431 2480 msgid "Import a CSV export from Dext (\"Dext Prepare Default\" format)." 2432 2481 msgstr "" 2433 2482 2434 #: ultimate-business-dashboard.php:53 32435 #: ultimate-business-dashboard.php:53 42483 #: ultimate-business-dashboard.php:538 2484 #: ultimate-business-dashboard.php:539 2436 2485 msgid "Import a file" 2437 2486 msgstr "" 2438 2487 2439 #: ultimate-business-dashboard.php:53 42488 #: ultimate-business-dashboard.php:539 2440 2489 msgid "Import invoices from any other tool with a simple CSV file." 2441 2490 msgstr "" 2442 2491 2443 #: ultimate-business-dashboard.php:5 352492 #: ultimate-business-dashboard.php:540 2444 2493 msgid "Connect QuickBooks Online to import supplier bills every hour." 2445 2494 msgstr "" 2446 2495 2447 #: ultimate-business-dashboard.php:535 2448 msgid "Manage" 2449 msgstr "" 2450 2451 #: ultimate-business-dashboard.php:535 2496 #: ultimate-business-dashboard.php:540 2452 2497 msgid "Connect" 2453 2498 msgstr "" 2454 2499 2455 #: ultimate-business-dashboard.php:54 02500 #: ultimate-business-dashboard.php:545 2456 2501 msgid "Choose how your supplier invoices reach the dashboard. Duplicates are ignored automatically, whatever the method." 2457 2502 msgstr "" 2503 2504 #. translators: 1: date and time, 2: total number of invoices 2505 #: ultimate-business-dashboard.php:551 2506 msgid "Last invoice added on %1$s · %2$s invoices in total" 2507 msgstr "" -
ultimate-business-dashboard/trunk/readme.txt
r3803022 r3803495 5 5 Requires at least: 5.5 6 6 Tested up to: 7.1 7 Stable tag: 2.7 7 Stable tag: 2.7.1 8 8 Requires PHP: 7.4 9 9 License: GPLv2 or later … … 96 96 97 97 == Changelog == 98 = 2.7.1 - 15 November 2026 = 99 * Fixed: The EBITDA line of the dashboard chart was hidden behind the net result line when both were close 100 * Fixed: The currency symbol follows the user's language when its position is automatic (100 € in French, €100 in English), whatever the site language 101 * Fixed: Variations above 1,000 % (very small comparison base) are shown as "n/m" 102 * Improved: Checks: invoices with the same number but different amounts are no longer listed one pair at a time among duplicates, but in a separate "Same number, different amounts" section, one line per supplier (a payment statement imported next to its invoice would be counted twice) 103 * Improved: Icons and text centered in the buttons, wider category column on the Invoices page, aligned duplicate lines on the Checks page 104 * Improved: Imports page shows Dext & Zapier as configured and the date of the last invoice added 105 98 106 = 2.7 - 15 November 2026 = 99 107 * Improved: Ratios & Reports redesigned: key figures as tiles compared with the same period of the previous year, ratios with the previous year, expense breakdown as sorted bars (top 8 + others) instead of a pie chart, fixed vs variable costs as a single bar with amounts and the break-even point, cleaner print / PDF … … 232 240 233 241 == Upgrade Notice == 242 = 2.7.1 = 243 Visual fixes (chart, buttons, invoices, checks) and clearer duplicate checks. 244 234 245 = 2.7 = 235 246 Redesigned Reports, Invoices (with mobile cards), Data (spreadsheet), Imports, Settings and Categories pages. -
ultimate-business-dashboard/trunk/ultimate-business-dashboard.php
r3803022 r3803495 4 4 * Plugin URI: https://tulipemedia.com/en/ultimate-business-dashboard/ 5 5 * Description: Turn your WordPress dashboard into a Financial Powerhouse. 6 * Version: 2.7 6 * Version: 2.7.1 7 7 * Author: Ziyad Bachalany 8 8 * Author URI: https://tulipemedia.com … … 17 17 18 18 // Define plugin constants 19 define('ULTIBUDA_VERSION', '2.7 ');19 define('ULTIBUDA_VERSION', '2.7.1'); 20 20 define('ULTIBUDA_PLUGIN_DIR', plugin_dir_path(__FILE__)); 21 21 define('ULTIBUDA_PLUGIN_URL', plugin_dir_url(__FILE__)); … … 529 529 $qb_status = ['', __('Not connected', 'ultimate-business-dashboard')]; 530 530 } 531 // Zapier : envois antérieurs à la 2.7 absents du journal ; la clé API indique qu'il est configuré 532 $zapier_status = $last('zapier'); 533 if ($zapier_status[0] === '' && get_option('ultibuda_webhook_api_key', '')) { 534 $zapier_status = ['ok', _x('Configured', 'import status', 'ultimate-business-dashboard')]; 535 } 531 536 $cards = [ 532 ['ultibuda-setup-zapier', 'dashicons-update', __('Dext & Zapier', 'ultimate-business-dashboard'), __('Automatic import: each invoice processed in Dext is sent here by Zapier.', 'ultimate-business-dashboard'), $ last('zapier'),__('Set up', 'ultimate-business-dashboard')],537 ['ultibuda-setup-zapier', 'dashicons-update', __('Dext & Zapier', 'ultimate-business-dashboard'), __('Automatic import: each invoice processed in Dext is sent here by Zapier.', 'ultimate-business-dashboard'), $zapier_status, $zapier_status[0] ? __('Manage', 'ultimate-business-dashboard') : __('Set up', 'ultimate-business-dashboard')], 533 538 ['ultibuda-dext-import', 'dashicons-media-spreadsheet', __('Dext CSV', 'ultimate-business-dashboard'), __('Import a CSV export from Dext ("Dext Prepare Default" format).', 'ultimate-business-dashboard'), $last('dext_csv'), __('Import a file', 'ultimate-business-dashboard')], 534 539 ['ultibuda-other-import', 'dashicons-media-text', __('Other CSV', 'ultimate-business-dashboard'), __('Import invoices from any other tool with a simple CSV file.', 'ultimate-business-dashboard'), $last('other_csv'), __('Import a file', 'ultimate-business-dashboard')], … … 539 544 ?> 540 545 <p class="description"><?php esc_html_e('Choose how your supplier invoices reach the dashboard. Duplicates are ignored automatically, whatever the method.', 'ultimate-business-dashboard'); ?></p> 546 <?php $last_added = ultibuda_last_invoice_added_time(); ?> 547 <?php if ($last_added) : ?> 548 <p> 549 <?php 550 /* translators: 1: date and time, 2: total number of invoices */ 551 echo esc_html(sprintf(__('Last invoice added on %1$s · %2$s invoices in total', 'ultimate-business-dashboard'), wp_date(get_option('date_format') . ' ' . get_option('time_format'), $last_added), number_format_i18n(ultibuda_count_invoices()))); 552 ?> 553 </p> 554 <?php endif; ?> 541 555 <div class="ultibuda-import-cards"> 542 556 <?php foreach ($cards as $card) : ?>
Note:
See TracChangeset
for help on using the changeset viewer.