Browse Source

Merge pull request #101 from andrewdwallo/development-3.x

Development 3.x
3.x
Andrew Wallo 8 months ago
parent
commit
b183b8ca87
No account linked to committer's email address
83 changed files with 3221 additions and 2553 deletions
  1. 10
    6
      README.md
  2. 2
    2
      app/Concerns/NotifiesOnDelete.php
  3. 8
    0
      app/Contracts/MoneyFormattableDTO.php
  4. 14
    1
      app/DTO/AccountBalanceDTO.php
  5. 38
    0
      app/DTO/AgingBucketDTO.php
  6. 12
    0
      app/DTO/ClientReportDTO.php
  7. 12
    0
      app/DTO/EntityReportDTO.php
  8. 1
    0
      app/DTO/ReportDTO.php
  9. 12
    0
      app/DTO/VendorReportDTO.php
  10. 24
    0
      app/Enums/Accounting/DocumentEntityType.php
  11. 0
    23
      app/Enums/Setting/RecordsPerPage.php
  12. 0
    18
      app/Enums/Setting/TableSortDirection.php
  13. 3
    3
      app/Filament/Company/Clusters/Settings/Pages/CompanyProfile.php
  14. 5
    5
      app/Filament/Company/Clusters/Settings/Pages/Invoice.php
  15. 5
    5
      app/Filament/Company/Clusters/Settings/Pages/Localization.php
  16. 6
    6
      app/Filament/Company/Clusters/Settings/Resources/CurrencyResource.php
  17. 2
    2
      app/Filament/Company/Pages/Accounting/AccountChart.php
  18. 60
    58
      app/Filament/Company/Pages/Accounting/Transactions.php
  19. 1
    1
      app/Filament/Company/Pages/Concerns/HasDeferredFiltersForm.php
  20. 2
    2
      app/Filament/Company/Pages/CreateCompany.php
  21. 48
    6
      app/Filament/Company/Pages/Reports.php
  22. 2
    2
      app/Filament/Company/Pages/Reports/AccountTransactions.php
  23. 13
    0
      app/Filament/Company/Pages/Reports/AccountsPayableAging.php
  24. 13
    0
      app/Filament/Company/Pages/Reports/AccountsReceivableAging.php
  25. 138
    0
      app/Filament/Company/Pages/Reports/BaseAgingReportPage.php
  26. 4
    4
      app/Filament/Company/Pages/Reports/BaseReportPage.php
  27. 1
    1
      app/Filament/Company/Pages/Reports/TrialBalance.php
  28. 1
    1
      app/Filament/Company/Pages/Service/ConnectedAccount.php
  29. 3
    3
      app/Filament/Company/Resources/Banking/AccountResource.php
  30. 6
    8
      app/Filament/Company/Resources/Common/OfferingResource.php
  31. 1
    1
      app/Filament/Company/Resources/Core/DepartmentResource.php
  32. 96
    94
      app/Filament/Company/Resources/Purchases/BillResource.php
  33. 8
    4
      app/Filament/Company/Resources/Purchases/BillResource/Pages/ViewBill.php
  34. 3
    3
      app/Filament/Company/Resources/Purchases/BillResource/RelationManagers/PaymentsRelationManager.php
  35. 14
    11
      app/Filament/Company/Resources/Purchases/VendorResource.php
  36. 34
    2
      app/Filament/Company/Resources/Purchases/VendorResource/Pages/ViewVendor.php
  37. 14
    11
      app/Filament/Company/Resources/Sales/ClientResource.php
  38. 48
    6
      app/Filament/Company/Resources/Sales/ClientResource/Pages/ViewClient.php
  39. 37
    35
      app/Filament/Company/Resources/Sales/EstimateResource.php
  40. 15
    11
      app/Filament/Company/Resources/Sales/EstimateResource/Pages/ViewEstimate.php
  41. 110
    108
      app/Filament/Company/Resources/Sales/InvoiceResource.php
  42. 1
    1
      app/Filament/Company/Resources/Sales/InvoiceResource/Pages/ListInvoices.php
  43. 12
    8
      app/Filament/Company/Resources/Sales/InvoiceResource/Pages/ViewInvoice.php
  44. 2
    2
      app/Filament/Company/Resources/Sales/InvoiceResource/RelationManagers/PaymentsRelationManager.php
  45. 12
    10
      app/Filament/Company/Resources/Sales/RecurringInvoiceResource.php
  46. 16
    12
      app/Filament/Company/Resources/Sales/RecurringInvoiceResource/Pages/ViewRecurringInvoice.php
  47. 3
    3
      app/Filament/Forms/Components/AddressFields.php
  48. 1
    1
      app/Filament/Forms/Components/CreateCurrencySelect.php
  49. 2
    2
      app/Filament/Forms/Components/DocumentTotals.php
  50. 7
    7
      app/Livewire/Company/Service/ConnectedAccount/ListInstitutions.php
  51. 6
    6
      app/Livewire/Company/Service/LiveCurrency/ListCompanyCurrencies.php
  52. 11
    11
      app/Models/Accounting/Estimate.php
  53. 5
    5
      app/Models/Accounting/Invoice.php
  54. 9
    9
      app/Models/Accounting/RecurringInvoice.php
  55. 2
    2
      app/Providers/Filament/CompanyPanelProvider.php
  56. 1
    1
      app/Providers/TranslationServiceProvider.php
  57. 34
    0
      app/Services/AccountService.php
  58. 10
    8
      app/Services/ExportService.php
  59. 97
    17
      app/Services/ReportService.php
  60. 85
    0
      app/Transformers/AgingReportTransformer.php
  61. 1
    1
      bootstrap/providers.php
  62. 396
    318
      composer.lock
  63. 85
    85
      package-lock.json
  64. 4
    0
      resources/css/filament/company/theme.css
  65. 174
    166
      resources/data/lang/ar.json
  66. 144
    136
      resources/data/lang/de.json
  67. 46
    74
      resources/data/lang/en.json
  68. 119
    149
      resources/data/lang/es.json
  69. 153
    145
      resources/data/lang/fr.json
  70. 161
    153
      resources/data/lang/id.json
  71. 152
    144
      resources/data/lang/it.json
  72. 160
    152
      resources/data/lang/nl.json
  73. 120
    143
      resources/data/lang/pt.json
  74. 158
    150
      resources/data/lang/tr.json
  75. 149
    141
      resources/data/lang/zh.json
  76. 1
    1
      resources/views/components/company/reports/layout.blade.php
  77. 23
    19
      resources/views/components/company/reports/report-pdf.blade.php
  78. 1
    1
      resources/views/components/company/tables/header.blade.php
  79. 19
    15
      resources/views/components/company/tables/reports/detailed-report.blade.php
  80. 3
    3
      resources/views/components/report-entry.blade.php
  81. 2
    2
      resources/views/livewire/company/service/connected-account/list-institutions.blade.php
  82. 6
    6
      tests/Feature/Accounting/TransactionTest.php
  83. 2
    1
      vite.config.js

+ 10
- 6
README.md View File

15
 
15
 
16
 
16
 
17
 
17
 
18
-This repo is currently a work in progress — PRs and issues welcome!
18
+A Laravel and Filament-powered accounting platform, crafting a modern and automated solution for financial management.
19
 
19
 
20
 # Getting started
20
 # Getting started
21
 
21
 
203
 
203
 
204
 ## Plaid Integration
204
 ## Plaid Integration
205
 
205
 
206
-To integrate [Plaid](https://plaid.com/) with your application for enhanced financial data connectivity, you must first create an account with Plaid and obtain your credentials. Set your credentials in the `.env` file as follows:
206
+To integrate [Plaid](https://plaid.com/) with your application for enhanced financial data connectivity, you must first
207
+create an account with Plaid and obtain your credentials. Set your credentials in the `.env` file as follows:
207
 
208
 
208
 ```env
209
 ```env
209
 PLAID_CLIENT_ID=your-client-id
210
 PLAID_CLIENT_ID=your-client-id
212
 PLAID_WEBHOOK_URL=https://my-static-domain.ngrok-free.app/api/plaid/webhook # Must have /api/plaid/webhook appended
213
 PLAID_WEBHOOK_URL=https://my-static-domain.ngrok-free.app/api/plaid/webhook # Must have /api/plaid/webhook appended
213
 ```
214
 ```
214
 
215
 
215
-The `PLAID_WEBHOOK_URL` is essential as it enables your application to receive real-time updates on transactions from connected bank accounts. This webhook URL must contain a static domain, which can be obtained from services like ngrok that offer a free static domain upon signup. Alternatively, you may use any other service that provides a static domain.
216
+The `PLAID_WEBHOOK_URL` is essential as it enables your application to receive real-time updates on transactions from
217
+connected bank accounts. This webhook URL must contain a static domain, which can be obtained from services like ngrok
218
+that offer a free static domain upon signup. Alternatively, you may use any other service that provides a static domain.
216
 
219
 
217
-After integrating Plaid, you can connect your account on the "Connected Accounts" page and link your financial institution. Before importing transactions, ensure to run the following command to process the queued transactions:
220
+After integrating Plaid, you can connect your account on the "Connected Accounts" page and link your financial
221
+institution. Before importing transactions, ensure to run the following command to process the queued transactions:
218
 
222
 
219
 ```bash
223
 ```bash
220
 php artisan queue:work --queue=transactions
224
 php artisan queue:work --queue=transactions
243
 migration is required. For more information on how to write and run tests using
247
 migration is required. For more information on how to write and run tests using
244
 Pest, refer to the official documentation: [Pest Documentation](https://pestphp.com/docs).
248
 Pest, refer to the official documentation: [Pest Documentation](https://pestphp.com/docs).
245
 
249
 
246
-
247
 ## Dependencies
250
 ## Dependencies
248
 
251
 
249
 - [filamentphp/filament](https://github.com/filamentphp/filament) - A collection of beautiful full-stack components
252
 - [filamentphp/filament](https://github.com/filamentphp/filament) - A collection of beautiful full-stack components
254
 - [akaunting/laravel-money](https://github.com/akaunting/laravel-money) - Currency formatting and conversion package for
257
 - [akaunting/laravel-money](https://github.com/akaunting/laravel-money) - Currency formatting and conversion package for
255
   Laravel
258
   Laravel
256
 - [squirephp/squire](https://github.com/squirephp/squire) - A library of static Eloquent models for common fixture data
259
 - [squirephp/squire](https://github.com/squirephp/squire) - A library of static Eloquent models for common fixture data
257
-- [awcodes/filament-table-repeater](https://github.com/awcodes/filament-table-repeater) - A modified version of the Filament Forms Repeater to display it as a table. 
260
+- [awcodes/filament-table-repeater](https://github.com/awcodes/filament-table-repeater) - A modified version of the
261
+  Filament Forms Repeater to display it as a table.
258
 
262
 
259
 ***Note*** : It is recommended to read the documentation for all dependencies to get yourself familiar with how the
263
 ***Note*** : It is recommended to read the documentation for all dependencies to get yourself familiar with how the
260
 application works.
264
 application works.

+ 2
- 2
app/Concerns/NotifiesOnDelete.php View File

14
 
14
 
15
         Notification::make()
15
         Notification::make()
16
             ->danger()
16
             ->danger()
17
-            ->title(translate('Action Denied'))
17
+            ->title(translate('Action denied'))
18
             ->body(translate(':Name cannot be deleted because it is :reason. Please update settings before deletion.', [
18
             ->body(translate(':Name cannot be deleted because it is :reason. Please update settings before deletion.', [
19
                 'Name' => $record->getAttribute('name'),
19
                 'Name' => $record->getAttribute('name'),
20
                 'reason' => $reason,
20
                 'reason' => $reason,
37
 
37
 
38
         Notification::make()
38
         Notification::make()
39
             ->danger()
39
             ->danger()
40
-            ->title(translate('Action Denied'))
40
+            ->title(translate('Action denied'))
41
             ->body($message)
41
             ->body($message)
42
             ->persistent()
42
             ->persistent()
43
             ->send();
43
             ->send();

+ 8
- 0
app/Contracts/MoneyFormattableDTO.php View File

1
+<?php
2
+
3
+namespace App\Contracts;
4
+
5
+interface MoneyFormattableDTO
6
+{
7
+    public static function fromArray(array $balances): static;
8
+}

+ 14
- 1
app/DTO/AccountBalanceDTO.php View File

2
 
2
 
3
 namespace App\DTO;
3
 namespace App\DTO;
4
 
4
 
5
-class AccountBalanceDTO
5
+use App\Contracts\MoneyFormattableDTO;
6
+
7
+class AccountBalanceDTO implements MoneyFormattableDTO
6
 {
8
 {
7
     public function __construct(
9
     public function __construct(
8
         public ?string $startingBalance,
10
         public ?string $startingBalance,
11
         public ?string $netMovement,
13
         public ?string $netMovement,
12
         public ?string $endingBalance,
14
         public ?string $endingBalance,
13
     ) {}
15
     ) {}
16
+
17
+    public static function fromArray(array $balances): static
18
+    {
19
+        return new static(
20
+            startingBalance: $balances['starting_balance'] ?? null,
21
+            debitBalance: $balances['debit_balance'] ?? null,
22
+            creditBalance: $balances['credit_balance'] ?? null,
23
+            netMovement: $balances['net_movement'] ?? null,
24
+            endingBalance: $balances['ending_balance'] ?? null,
25
+        );
26
+    }
14
 }
27
 }

+ 38
- 0
app/DTO/AgingBucketDTO.php View File

1
+<?php
2
+
3
+namespace App\DTO;
4
+
5
+use App\Contracts\MoneyFormattableDTO;
6
+
7
+readonly class AgingBucketDTO implements MoneyFormattableDTO
8
+{
9
+    /**
10
+     * @param  array<string, string>  $periods
11
+     */
12
+    public function __construct(
13
+        public string $current,
14
+        public array $periods,
15
+        public string $overPeriods,
16
+        public string $total,
17
+    ) {}
18
+
19
+    public static function fromArray(array $balances): static
20
+    {
21
+        $periods = [];
22
+
23
+        // Extract all period balances
24
+        foreach ($balances as $key => $value) {
25
+            if (str_starts_with($key, 'period_')) {
26
+                $periods[$key] = $value;
27
+                unset($balances[$key]);
28
+            }
29
+        }
30
+
31
+        return new static(
32
+            current: $balances['current'],
33
+            periods: $periods,
34
+            overPeriods: $balances['over_periods'],
35
+            total: $balances['total'],
36
+        );
37
+    }
38
+}

+ 12
- 0
app/DTO/ClientReportDTO.php View File

1
+<?php
2
+
3
+namespace App\DTO;
4
+
5
+readonly class ClientReportDTO
6
+{
7
+    public function __construct(
8
+        public string $clientName,
9
+        public string $clientId,
10
+        public AgingBucketDTO $aging,
11
+    ) {}
12
+}

+ 12
- 0
app/DTO/EntityReportDTO.php View File

1
+<?php
2
+
3
+namespace App\DTO;
4
+
5
+readonly class EntityReportDTO
6
+{
7
+    public function __construct(
8
+        public string $name,
9
+        public string $id,
10
+        public AgingBucketDTO $aging,
11
+    ) {}
12
+}

+ 1
- 0
app/DTO/ReportDTO.php View File

12
          */
12
          */
13
         public array $categories,
13
         public array $categories,
14
         public ?AccountBalanceDTO $overallTotal = null,
14
         public ?AccountBalanceDTO $overallTotal = null,
15
+        public ?AgingBucketDTO $agingSummary = null,
15
         public array $fields = [],
16
         public array $fields = [],
16
         public ?string $reportType = null,
17
         public ?string $reportType = null,
17
         public ?CashFlowOverviewDTO $overview = null,
18
         public ?CashFlowOverviewDTO $overview = null,

+ 12
- 0
app/DTO/VendorReportDTO.php View File

1
+<?php
2
+
3
+namespace App\DTO;
4
+
5
+readonly class VendorReportDTO
6
+{
7
+    public function __construct(
8
+        public string $vendorName,
9
+        public string $vendorId,
10
+        public AgingBucketDTO $aging,
11
+    ) {}
12
+}

+ 24
- 0
app/Enums/Accounting/DocumentEntityType.php View File

1
+<?php
2
+
3
+namespace App\Enums\Accounting;
4
+
5
+use Filament\Support\Contracts\HasLabel;
6
+
7
+enum DocumentEntityType: string implements HasLabel
8
+{
9
+    case Client = 'client';
10
+    case Vendor = 'vendor';
11
+
12
+    public function getLabel(): ?string
13
+    {
14
+        return $this->name;
15
+    }
16
+
17
+    public function getReportTitle(): string
18
+    {
19
+        return match ($this) {
20
+            self::Client => 'Accounts Receivable Aging',
21
+            self::Vendor => 'Accounts Payable Aging',
22
+        };
23
+    }
24
+}

+ 0
- 23
app/Enums/Setting/RecordsPerPage.php View File

1
-<?php
2
-
3
-namespace App\Enums\Setting;
4
-
5
-use App\Enums\Concerns\Utilities;
6
-use Filament\Support\Contracts\HasLabel;
7
-
8
-enum RecordsPerPage: int implements HasLabel
9
-{
10
-    use Utilities;
11
-    case Five = 5;
12
-    case Ten = 10;
13
-    case TwentyFive = 25;
14
-    case Fifty = 50;
15
-    case OneHundred = 100;
16
-
17
-    public const DEFAULT = self::Ten->value;
18
-
19
-    public function getLabel(): ?string
20
-    {
21
-        return (string) $this->value;
22
-    }
23
-}

+ 0
- 18
app/Enums/Setting/TableSortDirection.php View File

1
-<?php
2
-
3
-namespace App\Enums\Setting;
4
-
5
-use Filament\Support\Contracts\HasLabel;
6
-
7
-enum TableSortDirection: string implements HasLabel
8
-{
9
-    case Ascending = 'asc';
10
-    case Descending = 'desc';
11
-
12
-    public const DEFAULT = self::Ascending->value;
13
-
14
-    public function getLabel(): ?string
15
-    {
16
-        return translate($this->name);
17
-    }
18
-}

+ 3
- 3
app/Filament/Company/Clusters/Settings/Pages/CompanyProfile.php View File

113
     {
113
     {
114
         return Notification::make()
114
         return Notification::make()
115
             ->info()
115
             ->info()
116
-            ->title('Timezone Update Required')
116
+            ->title('Timezone update required')
117
             ->body('You have changed your country or state. Please update your timezone to ensure accurate date and time information.')
117
             ->body('You have changed your country or state. Please update your timezone to ensure accurate date and time information.')
118
             ->actions([
118
             ->actions([
119
                 \Filament\Notifications\Actions\Action::make('updateTimezone')
119
                 \Filament\Notifications\Actions\Action::make('updateTimezone')
120
-                    ->label('Update Timezone')
120
+                    ->label('Update timezone')
121
                     ->url(Localization::getUrl()),
121
                     ->url(Localization::getUrl()),
122
             ])
122
             ])
123
             ->persistent()
123
             ->persistent()
187
     {
187
     {
188
         return Banner::make('needsAddressCompletion')
188
         return Banner::make('needsAddressCompletion')
189
             ->warning()
189
             ->warning()
190
-            ->title('Address Information Incomplete')
190
+            ->title('Address information incomplete')
191
             ->description('Please complete the required address information for proper business operations.')
191
             ->description('Please complete the required address information for proper business operations.')
192
             ->visible(fn (CompanyProfileModel $record) => $record->address->isIncomplete())
192
             ->visible(fn (CompanyProfileModel $record) => $record->address->isIncomplete())
193
             ->columnSpanFull();
193
             ->columnSpanFull();

+ 5
- 5
app/Filament/Company/Clusters/Settings/Pages/Invoice.php View File

168
                     ->localizeLabel()
168
                     ->localizeLabel()
169
                     ->nullable(),
169
                     ->nullable(),
170
                 Textarea::make('footer')
170
                 Textarea::make('footer')
171
-                    ->localizeLabel('Footer / Notes')
171
+                    ->localizeLabel('Footer')
172
                     ->nullable(),
172
                     ->nullable(),
173
             ])->columns();
173
             ])->columns();
174
     }
174
     }
222
                             ->options(Template::class),
222
                             ->options(Template::class),
223
                         Select::make('item_name.option')
223
                         Select::make('item_name.option')
224
                             ->softRequired()
224
                             ->softRequired()
225
-                            ->localizeLabel('Item Name')
225
+                            ->localizeLabel('Item name')
226
                             ->options(InvoiceModel::getAvailableItemNameOptions())
226
                             ->options(InvoiceModel::getAvailableItemNameOptions())
227
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
227
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
228
                                 if ($state !== 'other' && $old === 'other' && filled($get('item_name.custom'))) {
228
                                 if ($state !== 'other' && $old === 'other' && filled($get('item_name.custom'))) {
240
                             ->nullable(),
240
                             ->nullable(),
241
                         Select::make('unit_name.option')
241
                         Select::make('unit_name.option')
242
                             ->softRequired()
242
                             ->softRequired()
243
-                            ->localizeLabel('Unit Name')
243
+                            ->localizeLabel('Unit name')
244
                             ->options(InvoiceModel::getAvailableUnitNameOptions())
244
                             ->options(InvoiceModel::getAvailableUnitNameOptions())
245
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
245
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
246
                                 if ($state !== 'other' && $old === 'other' && filled($get('unit_name.custom'))) {
246
                                 if ($state !== 'other' && $old === 'other' && filled($get('unit_name.custom'))) {
258
                             ->nullable(),
258
                             ->nullable(),
259
                         Select::make('price_name.option')
259
                         Select::make('price_name.option')
260
                             ->softRequired()
260
                             ->softRequired()
261
-                            ->localizeLabel('Price Name')
261
+                            ->localizeLabel('Price name')
262
                             ->options(InvoiceModel::getAvailablePriceNameOptions())
262
                             ->options(InvoiceModel::getAvailablePriceNameOptions())
263
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
263
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
264
                                 if ($state !== 'other' && $old === 'other' && filled($get('price_name.custom'))) {
264
                                 if ($state !== 'other' && $old === 'other' && filled($get('price_name.custom'))) {
276
                             ->nullable(),
276
                             ->nullable(),
277
                         Select::make('amount_name.option')
277
                         Select::make('amount_name.option')
278
                             ->softRequired()
278
                             ->softRequired()
279
-                            ->localizeLabel('Amount Name')
279
+                            ->localizeLabel('Amount name')
280
                             ->options(InvoiceModel::getAvailableAmountNameOptions())
280
                             ->options(InvoiceModel::getAvailableAmountNameOptions())
281
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
281
                             ->afterStateUpdated(static function (Get $get, Set $set, $state, $old) {
282
                                 if ($state !== 'other' && $old === 'other' && filled($get('amount_name.custom'))) {
282
                                 if ($state !== 'other' && $old === 'other' && filled($get('amount_name.custom'))) {

+ 5
- 5
app/Filament/Company/Clusters/Settings/Pages/Localization.php View File

157
 
157
 
158
     protected function getFinancialAndFiscalSection(): Component
158
     protected function getFinancialAndFiscalSection(): Component
159
     {
159
     {
160
-        $beforeNumber = translate('Before Number');
161
-        $afterNumber = translate('After Number');
162
-        $selectPosition = translate('Select Position');
160
+        $beforeNumber = translate('Before number');
161
+        $afterNumber = translate('After number');
162
+        $selectPosition = translate('Select position');
163
 
163
 
164
         return Section::make('Financial & Fiscal')
164
         return Section::make('Financial & Fiscal')
165
             ->schema([
165
             ->schema([
169
                     ->options(NumberFormat::class),
169
                     ->options(NumberFormat::class),
170
                 Select::make('percent_first')
170
                 Select::make('percent_first')
171
                     ->softRequired()
171
                     ->softRequired()
172
-                    ->localizeLabel('Percent Position')
172
+                    ->localizeLabel('Percent position')
173
                     ->boolean($beforeNumber, $afterNumber, $selectPosition),
173
                     ->boolean($beforeNumber, $afterNumber, $selectPosition),
174
                 Group::make()
174
                 Group::make()
175
                     ->schema([
175
                     ->schema([
197
                             ->columnSpan(2)
197
                             ->columnSpan(2)
198
                             ->required()
198
                             ->required()
199
                             ->markAsRequired(false)
199
                             ->markAsRequired(false)
200
-                            ->label('Fiscal Year End'),
200
+                            ->label('Fiscal year end'),
201
                     ])->columns(3),
201
                     ])->columns(3),
202
             ])->columns();
202
             ])->columns();
203
     }
203
     }

+ 6
- 6
app/Filament/Company/Clusters/Settings/Resources/CurrencyResource.php View File

27
 
27
 
28
     protected static ?string $model = CurrencyModel::class;
28
     protected static ?string $model = CurrencyModel::class;
29
 
29
 
30
-    protected static ?string $modelLabel = 'Currency';
30
+    protected static ?string $modelLabel = 'currency';
31
 
31
 
32
     protected static ?string $cluster = Settings::class;
32
     protected static ?string $cluster = Settings::class;
33
 
33
 
88
                             ->maxLength(5)
88
                             ->maxLength(5)
89
                             ->required(),
89
                             ->required(),
90
                         Forms\Components\Select::make('symbol_first')
90
                         Forms\Components\Select::make('symbol_first')
91
-                            ->localizeLabel('Symbol Position')
92
-                            ->boolean(translate('Before Amount'), translate('After Amount'), translate('Select a symbol position'))
91
+                            ->localizeLabel('Symbol position')
92
+                            ->boolean(translate('Before amount'), translate('After amount'), translate('Select a symbol position'))
93
                             ->required(),
93
                             ->required(),
94
                         Forms\Components\TextInput::make('decimal_mark')
94
                         Forms\Components\TextInput::make('decimal_mark')
95
-                            ->localizeLabel('Decimal Separator')
95
+                            ->localizeLabel('Decimal separator')
96
                             ->maxLength(1)
96
                             ->maxLength(1)
97
                             ->rule(static function (Forms\Get $get): Closure {
97
                             ->rule(static function (Forms\Get $get): Closure {
98
                                 return static function ($attribute, $value, Closure $fail) use ($get) {
98
                                 return static function ($attribute, $value, Closure $fail) use ($get) {
126
                     ->weight(FontWeight::Medium)
126
                     ->weight(FontWeight::Medium)
127
                     ->icon(static fn (CurrencyModel $record) => $record->isEnabled() ? 'heroicon-o-lock-closed' : null)
127
                     ->icon(static fn (CurrencyModel $record) => $record->isEnabled() ? 'heroicon-o-lock-closed' : null)
128
                     ->tooltip(static function (CurrencyModel $record) {
128
                     ->tooltip(static function (CurrencyModel $record) {
129
-                        $tooltipMessage = translate('Default :Record', [
130
-                            'Record' => static::getModelLabel(),
129
+                        $tooltipMessage = translate('Default :record', [
130
+                            'record' => static::getModelLabel(),
131
                         ]);
131
                         ]);
132
 
132
 
133
                         return $record->isEnabled() ? $tooltipMessage : null;
133
                         return $record->isEnabled() ? $tooltipMessage : null;

+ 2
- 2
app/Filament/Company/Pages/Accounting/AccountChart.php View File

163
     protected function getArchiveFormComponent(): Component
163
     protected function getArchiveFormComponent(): Component
164
     {
164
     {
165
         return Checkbox::make('archived')
165
         return Checkbox::make('archived')
166
-            ->label('Archive Account')
166
+            ->label('Archive account')
167
             ->helperText('Archived accounts will not be available for selection in transactions.')
167
             ->helperText('Archived accounts will not be available for selection in transactions.')
168
             ->hidden(static function (string $operation): bool {
168
             ->hidden(static function (string $operation): bool {
169
                 return $operation === 'create';
169
                 return $operation === 'create';
186
         return [
186
         return [
187
             CreateAction::make()
187
             CreateAction::make()
188
                 ->button()
188
                 ->button()
189
-                ->label('Add New Account')
189
+                ->label('Add new account')
190
                 ->model(Account::class)
190
                 ->model(Account::class)
191
                 ->form(fn (Form $form) => $this->getChartForm($form, false)->operation('create')),
191
                 ->form(fn (Form $form) => $this->getChartForm($form, false)->operation('create')),
192
         ];
192
         ];

+ 60
- 58
app/Filament/Company/Pages/Accounting/Transactions.php View File

95
     protected function getHeaderActions(): array
95
     protected function getHeaderActions(): array
96
     {
96
     {
97
         return [
97
         return [
98
-            $this->buildTransactionAction('addIncome', 'Add Income', TransactionType::Deposit),
99
-            $this->buildTransactionAction('addExpense', 'Add Expense', TransactionType::Withdrawal),
98
+            $this->buildTransactionAction('addIncome', 'Add income', TransactionType::Deposit),
99
+            $this->buildTransactionAction('addExpense', 'Add expense', TransactionType::Withdrawal),
100
             Actions\CreateAction::make('addTransfer')
100
             Actions\CreateAction::make('addTransfer')
101
-                ->label('Add Transfer')
101
+                ->label('Add transfer')
102
                 ->modalHeading('Add Transfer')
102
                 ->modalHeading('Add Transfer')
103
                 ->modalWidth(MaxWidth::ThreeExtraLarge)
103
                 ->modalWidth(MaxWidth::ThreeExtraLarge)
104
                 ->model(static::getModel())
104
                 ->model(static::getModel())
108
                 ->outlined(),
108
                 ->outlined(),
109
             Actions\ActionGroup::make([
109
             Actions\ActionGroup::make([
110
                 Actions\CreateAction::make('addJournalTransaction')
110
                 Actions\CreateAction::make('addJournalTransaction')
111
-                    ->label('Add Journal Transaction')
111
+                    ->label('Add journal transaction')
112
                     ->fillForm(fn (): array => $this->getFormDefaultsForType(TransactionType::Journal))
112
                     ->fillForm(fn (): array => $this->getFormDefaultsForType(TransactionType::Journal))
113
                     ->modalWidth(MaxWidth::Screen)
113
                     ->modalWidth(MaxWidth::Screen)
114
                     ->model(static::getModel())
114
                     ->model(static::getModel())
120
                     ->afterFormFilled(fn () => $this->resetJournalEntryAmounts())
120
                     ->afterFormFilled(fn () => $this->resetJournalEntryAmounts())
121
                     ->after(fn (Transaction $transaction) => $transaction->updateAmountIfBalanced()),
121
                     ->after(fn (Transaction $transaction) => $transaction->updateAmountIfBalanced()),
122
                 Actions\Action::make('connectBank')
122
                 Actions\Action::make('connectBank')
123
-                    ->label('Connect Your Bank')
123
+                    ->label('Connect your bank')
124
                     ->url(ConnectedAccount::getUrl()),
124
                     ->url(ConnectedAccount::getUrl()),
125
             ])
125
             ])
126
                 ->label('More')
126
                 ->label('More')
144
                 Forms\Components\TextInput::make('description')
144
                 Forms\Components\TextInput::make('description')
145
                     ->label('Description'),
145
                     ->label('Description'),
146
                 Forms\Components\Select::make('bank_account_id')
146
                 Forms\Components\Select::make('bank_account_id')
147
-                    ->label('From Account')
147
+                    ->label('From account')
148
                     ->options(fn (Get $get, ?Transaction $transaction) => $this->getBankAccountOptions(excludedAccountId: $get('account_id'), currentBankAccountId: $transaction?->bank_account_id))
148
                     ->options(fn (Get $get, ?Transaction $transaction) => $this->getBankAccountOptions(excludedAccountId: $get('account_id'), currentBankAccountId: $transaction?->bank_account_id))
149
                     ->live()
149
                     ->live()
150
                     ->searchable()
150
                     ->searchable()
173
                     ->money(static fn (Forms\Get $get) => BankAccount::find($get('bank_account_id'))?->account?->currency_code ?? CurrencyAccessor::getDefaultCurrency())
173
                     ->money(static fn (Forms\Get $get) => BankAccount::find($get('bank_account_id'))?->account?->currency_code ?? CurrencyAccessor::getDefaultCurrency())
174
                     ->required(),
174
                     ->required(),
175
                 Forms\Components\Select::make('account_id')
175
                 Forms\Components\Select::make('account_id')
176
-                    ->label('To Account')
176
+                    ->label('To account')
177
                     ->live()
177
                     ->live()
178
                     ->options(fn (Get $get, ?Transaction $transaction) => $this->getBankAccountAccountOptions(excludedBankAccountId: $get('bank_account_id'), currentAccountId: $transaction?->account_id))
178
                     ->options(fn (Get $get, ?Transaction $transaction) => $this->getBankAccountAccountOptions(excludedBankAccountId: $get('bank_account_id'), currentAccountId: $transaction?->account_id))
179
                     ->searchable()
179
                     ->searchable()
328
                     ->native(false)
328
                     ->native(false)
329
                     ->options(TransactionType::class),
329
                     ->options(TransactionType::class),
330
                 $this->buildDateRangeFilter('posted_at', 'Posted', true),
330
                 $this->buildDateRangeFilter('posted_at', 'Posted', true),
331
-                $this->buildDateRangeFilter('updated_at', 'Last Modified'),
331
+                $this->buildDateRangeFilter('updated_at', 'Last modified'),
332
             ])
332
             ])
333
             ->filtersFormSchema(fn (array $filters): array => [
333
             ->filtersFormSchema(fn (array $filters): array => [
334
                 Grid::make()
334
                 Grid::make()
361
                                 ->close()
361
                                 ->close()
362
                                 ->color('gray'),
362
                                 ->color('gray'),
363
                             Tables\Actions\Action::make('resetFilters')
363
                             Tables\Actions\Action::make('resetFilters')
364
-                                ->label(__('Clear All'))
364
+                                ->label(__('Clear all'))
365
                                 ->color('primary')
365
                                 ->color('primary')
366
                                 ->link()
366
                                 ->link()
367
                                 ->extraAttributes([
367
                                 ->extraAttributes([
373
             )
373
             )
374
             ->actions([
374
             ->actions([
375
                 Tables\Actions\Action::make('markAsReviewed')
375
                 Tables\Actions\Action::make('markAsReviewed')
376
-                    ->label('Mark as Reviewed')
376
+                    ->label('Mark as reviewed')
377
                     ->view('filament.company.components.tables.actions.mark-as-reviewed')
377
                     ->view('filament.company.components.tables.actions.mark-as-reviewed')
378
                     ->icon(static fn (Transaction $transaction) => $transaction->reviewed ? 'heroicon-s-check-circle' : 'heroicon-o-check-circle')
378
                     ->icon(static fn (Transaction $transaction) => $transaction->reviewed ? 'heroicon-s-check-circle' : 'heroicon-o-check-circle')
379
                     ->color(static fn (Transaction $transaction, Tables\Actions\Action $action) => match (static::determineTransactionState($transaction, $action)) {
379
                     ->color(static fn (Transaction $transaction, Tables\Actions\Action $action) => match (static::determineTransactionState($transaction, $action)) {
383
                     })
383
                     })
384
                     ->tooltip(static fn (Transaction $transaction, Tables\Actions\Action $action) => match (static::determineTransactionState($transaction, $action)) {
384
                     ->tooltip(static fn (Transaction $transaction, Tables\Actions\Action $action) => match (static::determineTransactionState($transaction, $action)) {
385
                         'reviewed' => 'Reviewed',
385
                         'reviewed' => 'Reviewed',
386
-                        'unreviewed' => 'Mark as Reviewed',
386
+                        'unreviewed' => 'Mark as reviewed',
387
                         'uncategorized' => 'Categorize first to mark as reviewed',
387
                         'uncategorized' => 'Categorize first to mark as reviewed',
388
                     })
388
                     })
389
                     ->disabled(fn (Transaction $transaction): bool => $transaction->isUncategorized())
389
                     ->disabled(fn (Transaction $transaction): bool => $transaction->isUncategorized())
390
                     ->action(fn (Transaction $transaction) => $transaction->update(['reviewed' => ! $transaction->reviewed])),
390
                     ->action(fn (Transaction $transaction) => $transaction->update(['reviewed' => ! $transaction->reviewed])),
391
                 Tables\Actions\ActionGroup::make([
391
                 Tables\Actions\ActionGroup::make([
392
-                    Tables\Actions\EditAction::make('updateTransaction')
393
-                        ->label('Edit Transaction')
394
-                        ->modalHeading('Edit Transaction')
395
-                        ->modalWidth(MaxWidth::ThreeExtraLarge)
396
-                        ->form(fn (Form $form) => $this->transactionForm($form))
397
-                        ->visible(static fn (Transaction $transaction) => $transaction->type->isStandard()),
398
-                    Tables\Actions\EditAction::make('updateTransfer')
399
-                        ->label('Edit Transfer')
400
-                        ->modalHeading('Edit Transfer')
401
-                        ->modalWidth(MaxWidth::ThreeExtraLarge)
402
-                        ->form(fn (Form $form) => $this->transferForm($form))
403
-                        ->visible(static fn (Transaction $transaction) => $transaction->type->isTransfer()),
404
-                    Tables\Actions\EditAction::make('updateJournalTransaction')
405
-                        ->label('Edit Journal Transaction')
406
-                        ->modalHeading('Journal Entry')
407
-                        ->modalWidth(MaxWidth::Screen)
408
-                        ->form(fn (Form $form) => $this->journalTransactionForm($form))
409
-                        ->afterFormFilled(function (Transaction $transaction) {
410
-                            $debitAmounts = $transaction->journalEntries->sumDebits()->getAmount();
411
-                            $creditAmounts = $transaction->journalEntries->sumCredits()->getAmount();
412
-
413
-                            $this->setDebitAmount($debitAmounts);
414
-                            $this->setCreditAmount($creditAmounts);
415
-                        })
416
-                        ->modalSubmitAction(fn (Actions\StaticAction $action) => $action->disabled(! $this->isJournalEntryBalanced()))
417
-                        ->after(fn (Transaction $transaction) => $transaction->updateAmountIfBalanced())
418
-                        ->visible(static fn (Transaction $transaction) => $transaction->type->isJournal()),
392
+                    Tables\Actions\ActionGroup::make([
393
+                        Tables\Actions\EditAction::make('editTransaction')
394
+                            ->label('Edit transaction')
395
+                            ->modalHeading('Edit Transaction')
396
+                            ->modalWidth(MaxWidth::ThreeExtraLarge)
397
+                            ->form(fn (Form $form) => $this->transactionForm($form))
398
+                            ->visible(static fn (Transaction $transaction) => $transaction->type->isStandard()),
399
+                        Tables\Actions\EditAction::make('editTransfer')
400
+                            ->label('Edit transfer')
401
+                            ->modalHeading('Edit Transfer')
402
+                            ->modalWidth(MaxWidth::ThreeExtraLarge)
403
+                            ->form(fn (Form $form) => $this->transferForm($form))
404
+                            ->visible(static fn (Transaction $transaction) => $transaction->type->isTransfer()),
405
+                        Tables\Actions\EditAction::make('editJournalTransaction')
406
+                            ->label('Edit journal transaction')
407
+                            ->modalHeading('Journal Entry')
408
+                            ->modalWidth(MaxWidth::Screen)
409
+                            ->form(fn (Form $form) => $this->journalTransactionForm($form))
410
+                            ->afterFormFilled(function (Transaction $transaction) {
411
+                                $debitAmounts = $transaction->journalEntries->sumDebits()->getAmount();
412
+                                $creditAmounts = $transaction->journalEntries->sumCredits()->getAmount();
413
+
414
+                                $this->setDebitAmount($debitAmounts);
415
+                                $this->setCreditAmount($creditAmounts);
416
+                            })
417
+                            ->modalSubmitAction(fn (Actions\StaticAction $action) => $action->disabled(! $this->isJournalEntryBalanced()))
418
+                            ->after(fn (Transaction $transaction) => $transaction->updateAmountIfBalanced())
419
+                            ->visible(static fn (Transaction $transaction) => $transaction->type->isJournal()),
420
+                        Tables\Actions\ReplicateAction::make()
421
+                            ->excludeAttributes(['created_by', 'updated_by', 'created_at', 'updated_at'])
422
+                            ->modal(false)
423
+                            ->beforeReplicaSaved(static function (Transaction $replica) {
424
+                                $replica->description = '(Copy of) ' . $replica->description;
425
+                            })
426
+                            ->after(static function (Transaction $original, Transaction $replica) {
427
+                                $original->journalEntries->each(function (JournalEntry $entry) use ($replica) {
428
+                                    $entry->replicate([
429
+                                        'transaction_id',
430
+                                    ])->fill([
431
+                                        'transaction_id' => $replica->id,
432
+                                    ])->save();
433
+                                });
434
+                            }),
435
+                    ])->dropdown(false),
419
                     Tables\Actions\DeleteAction::make(),
436
                     Tables\Actions\DeleteAction::make(),
420
-                    Tables\Actions\ReplicateAction::make()
421
-                        ->excludeAttributes(['created_by', 'updated_by', 'created_at', 'updated_at'])
422
-                        ->modal(false)
423
-                        ->beforeReplicaSaved(static function (Transaction $replica) {
424
-                            $replica->description = '(Copy of) ' . $replica->description;
425
-                        })
426
-                        ->after(static function (Transaction $original, Transaction $replica) {
427
-                            $original->journalEntries->each(function (JournalEntry $entry) use ($replica) {
428
-                                $entry->replicate([
429
-                                    'transaction_id',
430
-                                ])->fill([
431
-                                    'transaction_id' => $replica->id,
432
-                                ])->save();
433
-                            });
434
-                        }),
435
                 ]),
437
                 ]),
436
             ])
438
             ])
437
             ->bulkActions([
439
             ->bulkActions([
441
                         ->label('Replicate')
443
                         ->label('Replicate')
442
                         ->modalWidth(MaxWidth::Large)
444
                         ->modalWidth(MaxWidth::Large)
443
                         ->modalDescription('Replicating transactions will also replicate their journal entries. Are you sure you want to proceed?')
445
                         ->modalDescription('Replicating transactions will also replicate their journal entries. Are you sure you want to proceed?')
444
-                        ->successNotificationTitle('Transactions Replicated Successfully')
445
-                        ->failureNotificationTitle('Failed to Replicate Transactions')
446
+                        ->successNotificationTitle('Transactions replicated successfully')
447
+                        ->failureNotificationTitle('Failed to replicate transactions')
446
                         ->deselectRecordsAfterCompletion()
448
                         ->deselectRecordsAfterCompletion()
447
                         ->excludeAttributes(['created_by', 'updated_by', 'created_at', 'updated_at'])
449
                         ->excludeAttributes(['created_by', 'updated_by', 'created_at', 'updated_at'])
448
                         ->beforeReplicaSaved(static function (Transaction $replica) {
450
                         ->beforeReplicaSaved(static function (Transaction $replica) {
649
         $typeLabel = $type->getLabel();
651
         $typeLabel = $type->getLabel();
650
 
652
 
651
         return FormAction::make("add{$typeLabel}Entry")
653
         return FormAction::make("add{$typeLabel}Entry")
652
-            ->label("Add {$typeLabel} Entry")
654
+            ->label("Add {$typeLabel} entry")
653
             ->button()
655
             ->button()
654
             ->outlined()
656
             ->outlined()
655
             ->color($type->isDebit() ? 'primary' : 'gray')
657
             ->color($type->isDebit() ? 'primary' : 'gray')
695
                             ->startDateField("{$fieldPrefix}_start_date")
697
                             ->startDateField("{$fieldPrefix}_start_date")
696
                             ->endDateField("{$fieldPrefix}_end_date"),
698
                             ->endDateField("{$fieldPrefix}_end_date"),
697
                         DatePicker::make("{$fieldPrefix}_start_date")
699
                         DatePicker::make("{$fieldPrefix}_start_date")
698
-                            ->label("{$label} From")
700
+                            ->label("{$label} from")
699
                             ->columnStart(1)
701
                             ->columnStart(1)
700
                             ->afterStateUpdated(static function (Set $set) use ($fieldPrefix) {
702
                             ->afterStateUpdated(static function (Set $set) use ($fieldPrefix) {
701
                                 $set("{$fieldPrefix}_date_range", 'Custom');
703
                                 $set("{$fieldPrefix}_date_range", 'Custom');
702
                             }),
704
                             }),
703
                         DatePicker::make("{$fieldPrefix}_end_date")
705
                         DatePicker::make("{$fieldPrefix}_end_date")
704
-                            ->label("{$label} To")
706
+                            ->label("{$label} to")
705
                             ->afterStateUpdated(static function (Set $set) use ($fieldPrefix) {
707
                             ->afterStateUpdated(static function (Set $set) use ($fieldPrefix) {
706
                                 $set("{$fieldPrefix}_date_range", 'Custom');
708
                                 $set("{$fieldPrefix}_date_range", 'Custom');
707
                             }),
709
                             }),

+ 1
- 1
app/Filament/Company/Pages/Concerns/HasDeferredFiltersForm.php View File

79
     public function applyFiltersAction(): Action
79
     public function applyFiltersAction(): Action
80
     {
80
     {
81
         return Action::make('applyFilters')
81
         return Action::make('applyFilters')
82
-            ->label('Update Report')
82
+            ->label('Update report')
83
             ->action('applyFilters')
83
             ->action('applyFilters')
84
             ->keyBindings(['mod+s'])
84
             ->keyBindings(['mod+s'])
85
             ->button();
85
             ->button();

+ 2
- 2
app/Filament/Company/Pages/CreateCompany.php View File

55
                     ->maxLength(255)
55
                     ->maxLength(255)
56
                     ->softRequired(),
56
                     ->softRequired(),
57
                 TextInput::make('profile.email')
57
                 TextInput::make('profile.email')
58
-                    ->label('Company Email')
58
+                    ->label('Company email')
59
                     ->email()
59
                     ->email()
60
                     ->softRequired(),
60
                     ->softRequired(),
61
                 Select::make('profile.entity_type')
61
                 Select::make('profile.entity_type')
62
-                    ->label('Entity Type')
62
+                    ->label('Entity type')
63
                     ->options(EntityType::class)
63
                     ->options(EntityType::class)
64
                     ->softRequired(),
64
                     ->softRequired(),
65
                 Select::make('profile.country')
65
                 Select::make('profile.country')

+ 48
- 6
app/Filament/Company/Pages/Reports.php View File

3
 namespace App\Filament\Company\Pages;
3
 namespace App\Filament\Company\Pages;
4
 
4
 
5
 use App\Filament\Company\Pages\Reports\AccountBalances;
5
 use App\Filament\Company\Pages\Reports\AccountBalances;
6
+use App\Filament\Company\Pages\Reports\AccountsPayableAging;
7
+use App\Filament\Company\Pages\Reports\AccountsReceivableAging;
6
 use App\Filament\Company\Pages\Reports\AccountTransactions;
8
 use App\Filament\Company\Pages\Reports\AccountTransactions;
7
 use App\Filament\Company\Pages\Reports\BalanceSheet;
9
 use App\Filament\Company\Pages\Reports\BalanceSheet;
8
 use App\Filament\Company\Pages\Reports\CashFlowStatement;
10
 use App\Filament\Company\Pages\Reports\CashFlowStatement;
55
                             ->heading('Income Statement')
57
                             ->heading('Income Statement')
56
                             ->description('Shows revenue, expenses, and net earnings over a period, indicating overall financial performance.')
58
                             ->description('Shows revenue, expenses, and net earnings over a period, indicating overall financial performance.')
57
                             ->icon('heroicon-o-chart-bar')
59
                             ->icon('heroicon-o-chart-bar')
58
-                            ->iconColor(Color::Indigo)
60
+                            ->iconColor(Color::Purple)
59
                             ->url(IncomeStatement::getUrl()),
61
                             ->url(IncomeStatement::getUrl()),
60
                         ReportEntry::make('balance_sheet')
62
                         ReportEntry::make('balance_sheet')
61
                             ->hiddenLabel()
63
                             ->hiddenLabel()
62
                             ->heading('Balance Sheet')
64
                             ->heading('Balance Sheet')
63
                             ->description('Displays your company’s assets, liabilities, and equity at a single point in time, showing overall financial health and stability.')
65
                             ->description('Displays your company’s assets, liabilities, and equity at a single point in time, showing overall financial health and stability.')
64
                             ->icon('heroicon-o-clipboard-document-list')
66
                             ->icon('heroicon-o-clipboard-document-list')
65
-                            ->iconColor(Color::Emerald)
67
+                            ->iconColor(Color::Teal)
66
                             ->url(BalanceSheet::getUrl()),
68
                             ->url(BalanceSheet::getUrl()),
67
                         ReportEntry::make('cash_flow_statement')
69
                         ReportEntry::make('cash_flow_statement')
68
                             ->hiddenLabel()
70
                             ->hiddenLabel()
72
                             ->iconColor(Color::Cyan)
74
                             ->iconColor(Color::Cyan)
73
                             ->url(CashFlowStatement::getUrl()),
75
                             ->url(CashFlowStatement::getUrl()),
74
                     ]),
76
                     ]),
77
+                Section::make('Customer Reports')
78
+                    ->aside()
79
+                    ->description('Reports that provide detailed information on your company’s customer transactions and balances.')
80
+                    ->extraAttributes(['class' => 'es-report-card'])
81
+                    ->schema([
82
+                        ReportEntry::make('ar_aging')
83
+                            ->hiddenLabel()
84
+                            ->heading('Accounts Receivable Aging')
85
+                            ->description('Lists outstanding receivables by customer, showing how long invoices have been unpaid.')
86
+                            ->icon('heroicon-o-calendar-date-range')
87
+                            ->iconColor(Color::Indigo)
88
+                            ->url(AccountsReceivableAging::getUrl()),
89
+                        ReportEntry::make('income_by_customer')
90
+                            ->hiddenLabel()
91
+                            ->heading('Income by Customer')
92
+                            ->description('Shows revenue generated by each customer, helping identify top customers and opportunities for growth.')
93
+                            ->icon('heroicon-o-arrow-trending-up')
94
+                            ->iconColor(Color::Emerald)
95
+                            ->url('#'),
96
+                    ]),
97
+                Section::make('Vendor Reports')
98
+                    ->aside()
99
+                    ->description('Reports that provide detailed information on your company’s vendor transactions and balances.')
100
+                    ->extraAttributes(['class' => 'es-report-card'])
101
+                    ->schema([
102
+                        ReportEntry::make('ap_aging')
103
+                            ->hiddenLabel()
104
+                            ->heading('Accounts Payable Aging')
105
+                            ->description('Lists outstanding payables by vendor, showing how long invoices have been unpaid.')
106
+                            ->icon('heroicon-o-clock')
107
+                            ->iconColor(Color::Rose)
108
+                            ->url(AccountsPayableAging::getUrl()),
109
+                        ReportEntry::make('expenses_by_vendor')
110
+                            ->hiddenLabel()
111
+                            ->heading('Expenses by Vendor')
112
+                            ->description('Shows expenses incurred with each vendor, helping identify top vendors and opportunities for cost savings.')
113
+                            ->icon('heroicon-o-arrow-trending-down')
114
+                            ->iconColor(Color::Orange)
115
+                            ->url('#'),
116
+                    ]),
75
                 Section::make('Detailed Reports')
117
                 Section::make('Detailed Reports')
76
                     ->aside()
118
                     ->aside()
77
                     ->description('Detailed reports that provide a comprehensive view of your company’s financial transactions and account balances.')
119
                     ->description('Detailed reports that provide a comprehensive view of your company’s financial transactions and account balances.')
81
                             ->hiddenLabel()
123
                             ->hiddenLabel()
82
                             ->heading('Account Balances')
124
                             ->heading('Account Balances')
83
                             ->description('Lists all accounts and their balances, including starting, debit, credit, net movement, and ending balances.')
125
                             ->description('Lists all accounts and their balances, including starting, debit, credit, net movement, and ending balances.')
84
-                            ->icon('heroicon-o-currency-dollar')
85
-                            ->iconColor(Color::Teal)
126
+                            ->icon('heroicon-o-calculator')
127
+                            ->iconColor(Color::Slate)
86
                             ->url(AccountBalances::getUrl()),
128
                             ->url(AccountBalances::getUrl()),
87
                         ReportEntry::make('trial_balance')
129
                         ReportEntry::make('trial_balance')
88
                             ->hiddenLabel()
130
                             ->hiddenLabel()
95
                             ->hiddenLabel()
137
                             ->hiddenLabel()
96
                             ->heading('Account Transactions')
138
                             ->heading('Account Transactions')
97
                             ->description('A record of all transactions, essential for monitoring and reconciling financial activity in the ledger.')
139
                             ->description('A record of all transactions, essential for monitoring and reconciling financial activity in the ledger.')
98
-                            ->icon('heroicon-o-adjustments-horizontal')
99
-                            ->iconColor(Color::Amber)
140
+                            ->icon('heroicon-o-list-bullet')
141
+                            ->iconColor(Color::Yellow)
100
                             ->url(AccountTransactions::getUrl()),
142
                             ->url(AccountTransactions::getUrl()),
101
                     ]),
143
                     ]),
102
             ]);
144
             ]);

+ 2
- 2
app/Filament/Company/Pages/Reports/AccountTransactions.php View File

102
                     ->selectablePlaceholder(false),
102
                     ->selectablePlaceholder(false),
103
                 Actions::make([
103
                 Actions::make([
104
                     Actions\Action::make('applyFilters')
104
                     Actions\Action::make('applyFilters')
105
-                        ->label('Update Report')
105
+                        ->label('Update report')
106
                         ->action('applyFilters')
106
                         ->action('applyFilters')
107
                         ->keyBindings(['mod+s'])
107
                         ->keyBindings(['mod+s'])
108
                         ->button(),
108
                         ->button(),
193
     {
193
     {
194
         return [
194
         return [
195
             Action::make('createTransaction')
195
             Action::make('createTransaction')
196
-                ->label('Create Transaction')
196
+                ->label('Create transaction')
197
                 ->url(Transactions::getUrl()),
197
                 ->url(Transactions::getUrl()),
198
         ];
198
         ];
199
     }
199
     }

+ 13
- 0
app/Filament/Company/Pages/Reports/AccountsPayableAging.php View File

1
+<?php
2
+
3
+namespace App\Filament\Company\Pages\Reports;
4
+
5
+use App\Enums\Accounting\DocumentEntityType;
6
+
7
+class AccountsPayableAging extends BaseAgingReportPage
8
+{
9
+    protected function getEntityType(): DocumentEntityType
10
+    {
11
+        return DocumentEntityType::Vendor;
12
+    }
13
+}

+ 13
- 0
app/Filament/Company/Pages/Reports/AccountsReceivableAging.php View File

1
+<?php
2
+
3
+namespace App\Filament\Company\Pages\Reports;
4
+
5
+use App\Enums\Accounting\DocumentEntityType;
6
+
7
+class AccountsReceivableAging extends BaseAgingReportPage
8
+{
9
+    protected function getEntityType(): DocumentEntityType
10
+    {
11
+        return DocumentEntityType::Client;
12
+    }
13
+}

+ 138
- 0
app/Filament/Company/Pages/Reports/BaseAgingReportPage.php View File

1
+<?php
2
+
3
+namespace App\Filament\Company\Pages\Reports;
4
+
5
+use App\Contracts\ExportableReport;
6
+use App\DTO\ReportDTO;
7
+use App\Enums\Accounting\DocumentEntityType;
8
+use App\Filament\Forms\Components\DateRangeSelect;
9
+use App\Services\ExportService;
10
+use App\Services\ReportService;
11
+use App\Support\Column;
12
+use App\Transformers\AgingReportTransformer;
13
+use Filament\Forms\Components\TextInput;
14
+use Filament\Forms\Form;
15
+use Filament\Support\Enums\Alignment;
16
+use Filament\Support\RawJs;
17
+use Symfony\Component\HttpFoundation\StreamedResponse;
18
+
19
+abstract class BaseAgingReportPage extends BaseReportPage
20
+{
21
+    protected static string $view = 'filament.company.pages.reports.trial-balance';
22
+
23
+    protected ReportService $reportService;
24
+
25
+    protected ExportService $exportService;
26
+
27
+    abstract protected function getEntityType(): DocumentEntityType;
28
+
29
+    public function boot(ReportService $reportService, ExportService $exportService): void
30
+    {
31
+        $this->reportService = $reportService;
32
+        $this->exportService = $exportService;
33
+    }
34
+
35
+    protected function initializeDefaultFilters(): void
36
+    {
37
+        if (empty($this->getFilterState('days_per_period'))) {
38
+            $this->setFilterState('days_per_period', 30);
39
+        }
40
+
41
+        if (empty($this->getFilterState('number_of_periods'))) {
42
+            $this->setFilterState('number_of_periods', 4);
43
+        }
44
+    }
45
+
46
+    public function getTable(): array
47
+    {
48
+        $daysPerPeriod = $this->getFilterState('days_per_period');
49
+        $numberOfPeriods = $this->getFilterState('number_of_periods');
50
+
51
+        $columns = [
52
+            Column::make('entity_name')
53
+                ->label($this->getEntityType()->getLabel())
54
+                ->alignment(Alignment::Left),
55
+            Column::make('current')
56
+                ->label('Current')
57
+                ->alignment(Alignment::Right),
58
+        ];
59
+
60
+        for ($i = 1; $i < $numberOfPeriods; $i++) {
61
+            $start = ($i - 1) * $daysPerPeriod + 1;
62
+            $end = $i * $daysPerPeriod;
63
+
64
+            $columns[] = Column::make("period_{$i}")
65
+                ->label("{$start} to {$end}")
66
+                ->alignment(Alignment::Right);
67
+        }
68
+
69
+        $columns[] = Column::make('over_periods')
70
+            ->label('Over ' . (($numberOfPeriods - 1) * $daysPerPeriod))
71
+            ->alignment(Alignment::Right);
72
+
73
+        $columns[] = Column::make('total')
74
+            ->label('Total')
75
+            ->alignment(Alignment::Right);
76
+
77
+        return $columns;
78
+    }
79
+
80
+    public function filtersForm(Form $form): Form
81
+    {
82
+        return $form
83
+            ->columns(4)
84
+            ->schema([
85
+                DateRangeSelect::make('dateRange')
86
+                    ->label('As of')
87
+                    ->selectablePlaceholder(false)
88
+                    ->endDateField('asOfDate'),
89
+                $this->getAsOfDateFormComponent(),
90
+                TextInput::make('days_per_period')
91
+                    ->label('Days per period')
92
+                    ->integer()
93
+                    ->mask(RawJs::make(<<<'JS'
94
+                        $input > 365 ? '365' : '999'
95
+                    JS)),
96
+                TextInput::make('number_of_periods')
97
+                    ->label('Number of periods')
98
+                    ->integer()
99
+                    ->mask(RawJs::make(<<<'JS'
100
+                        $input > 10 ? '10' : '99'
101
+                    JS)),
102
+            ]);
103
+    }
104
+
105
+    protected function buildReport(array $columns): ReportDTO
106
+    {
107
+        return $this->reportService->buildAgingReport(
108
+            $this->getFormattedAsOfDate(),
109
+            $this->getEntityType(),
110
+            $columns,
111
+            $this->getFilterState('days_per_period'),
112
+            $this->getFilterState('number_of_periods')
113
+        );
114
+    }
115
+
116
+    protected function getTransformer(ReportDTO $reportDTO): ExportableReport
117
+    {
118
+        return new AgingReportTransformer($reportDTO, $this->getEntityType());
119
+    }
120
+
121
+    public function exportCSV(): StreamedResponse
122
+    {
123
+        return $this->exportService->exportToCsv(
124
+            $this->company,
125
+            $this->report,
126
+            endDate: $this->getFilterState('asOfDate')
127
+        );
128
+    }
129
+
130
+    public function exportPDF(): StreamedResponse
131
+    {
132
+        return $this->exportService->exportToPdf(
133
+            $this->company,
134
+            $this->report,
135
+            endDate: $this->getFilterState('asOfDate')
136
+        );
137
+    }
138
+}

+ 4
- 4
app/Filament/Company/Pages/Reports/BaseReportPage.php View File

243
     protected function getDateRangeFormComponent(): DateRangeSelect
243
     protected function getDateRangeFormComponent(): DateRangeSelect
244
     {
244
     {
245
         return DateRangeSelect::make('dateRange')
245
         return DateRangeSelect::make('dateRange')
246
-            ->label('Date Range')
246
+            ->label('Date range')
247
             ->selectablePlaceholder(false)
247
             ->selectablePlaceholder(false)
248
             ->startDateField('startDate')
248
             ->startDateField('startDate')
249
             ->endDateField('endDate');
249
             ->endDateField('endDate');
252
     protected function getStartDateFormComponent(): DatePicker
252
     protected function getStartDateFormComponent(): DatePicker
253
     {
253
     {
254
         return DatePicker::make('startDate')
254
         return DatePicker::make('startDate')
255
-            ->label('Start Date')
255
+            ->label('Start date')
256
             ->live()
256
             ->live()
257
             ->afterStateUpdated(static function ($state, Set $set) {
257
             ->afterStateUpdated(static function ($state, Set $set) {
258
                 $set('dateRange', 'Custom');
258
                 $set('dateRange', 'Custom');
262
     protected function getEndDateFormComponent(): DatePicker
262
     protected function getEndDateFormComponent(): DatePicker
263
     {
263
     {
264
         return DatePicker::make('endDate')
264
         return DatePicker::make('endDate')
265
-            ->label('End Date')
265
+            ->label('End date')
266
             ->live()
266
             ->live()
267
             ->afterStateUpdated(static function (Set $set) {
267
             ->afterStateUpdated(static function (Set $set) {
268
                 $set('dateRange', 'Custom');
268
                 $set('dateRange', 'Custom');
272
     protected function getAsOfDateFormComponent(): DatePicker
272
     protected function getAsOfDateFormComponent(): DatePicker
273
     {
273
     {
274
         return DatePicker::make('asOfDate')
274
         return DatePicker::make('asOfDate')
275
-            ->label('As of Date')
275
+            ->label('As of date')
276
             ->live()
276
             ->live()
277
             ->afterStateUpdated(static function (Set $set) {
277
             ->afterStateUpdated(static function (Set $set) {
278
                 $set('dateRange', 'Custom');
278
                 $set('dateRange', 'Custom');

+ 1
- 1
app/Filament/Company/Pages/Reports/TrialBalance.php View File

60
             ->columns(4)
60
             ->columns(4)
61
             ->schema([
61
             ->schema([
62
                 Select::make('reportType')
62
                 Select::make('reportType')
63
-                    ->label('Report Type')
63
+                    ->label('Report type')
64
                     ->options([
64
                     ->options([
65
                         'standard' => 'Standard',
65
                         'standard' => 'Standard',
66
                         'postClosing' => 'Post-Closing',
66
                         'postClosing' => 'Post-Closing',

+ 1
- 1
app/Filament/Company/Pages/Service/ConnectedAccount.php View File

29
     {
29
     {
30
         return [
30
         return [
31
             Action::make('connect')
31
             Action::make('connect')
32
-                ->label('Connect Account')
32
+                ->label('Connect account')
33
                 ->dispatch('createToken'),
33
                 ->dispatch('createToken'),
34
         ];
34
         ];
35
     }
35
     }

+ 3
- 3
app/Filament/Company/Resources/Banking/AccountResource.php View File

25
 {
25
 {
26
     protected static ?string $model = BankAccount::class;
26
     protected static ?string $model = BankAccount::class;
27
 
27
 
28
-    protected static ?string $modelLabel = 'Account';
28
+    protected static ?string $modelLabel = 'account';
29
 
29
 
30
     public static function getModelLabel(): string
30
     public static function getModelLabel(): string
31
     {
31
     {
89
                             ->columnSpanFull()
89
                             ->columnSpanFull()
90
                             ->schema([
90
                             ->schema([
91
                                 Forms\Components\TextInput::make('number')
91
                                 Forms\Components\TextInput::make('number')
92
-                                    ->localizeLabel('Account Number')
92
+                                    ->localizeLabel('Account number')
93
                                     ->unique(ignoreRecord: true, modifyRuleUsing: static function (Unique $rule, $state) {
93
                                     ->unique(ignoreRecord: true, modifyRuleUsing: static function (Unique $rule, $state) {
94
                                         $companyId = Auth::user()->currentCompany->id;
94
                                         $companyId = Auth::user()->currentCompany->id;
95
 
95
 
127
                     ->sortable()
127
                     ->sortable()
128
                     ->toggleable(),
128
                     ->toggleable(),
129
                 Tables\Columns\TextColumn::make('account.ending_balance')
129
                 Tables\Columns\TextColumn::make('account.ending_balance')
130
-                    ->localizeLabel('Ending Balance')
130
+                    ->localizeLabel('Ending balance')
131
                     ->state(static fn (BankAccount $record) => $record->account->ending_balance->convert()->formatWithCode())
131
                     ->state(static fn (BankAccount $record) => $record->account->ending_balance->convert()->formatWithCode())
132
                     ->toggleable()
132
                     ->toggleable()
133
                     ->alignment(Alignment::End),
133
                     ->alignment(Alignment::End),

+ 6
- 8
app/Filament/Company/Resources/Common/OfferingResource.php View File

22
 {
22
 {
23
     protected static ?string $model = Offering::class;
23
     protected static ?string $model = Offering::class;
24
 
24
 
25
-    protected static ?string $modelLabel = 'Offering';
26
-
27
     protected static ?string $navigationIcon = 'heroicon-o-square-3-stack-3d';
25
     protected static ?string $navigationIcon = 'heroicon-o-square-3-stack-3d';
28
 
26
 
29
     public static function form(Form $form): Form
27
     public static function form(Form $form): Form
68
                 Forms\Components\Section::make('Sale Information')
66
                 Forms\Components\Section::make('Sale Information')
69
                     ->schema([
67
                     ->schema([
70
                         Forms\Components\Select::make('income_account_id')
68
                         Forms\Components\Select::make('income_account_id')
71
-                            ->label('Income Account')
69
+                            ->label('Income account')
72
                             ->options(Account::query()
70
                             ->options(Account::query()
73
                                 ->where('category', AccountCategory::Revenue)
71
                                 ->where('category', AccountCategory::Revenue)
74
                                 ->where('type', AccountType::OperatingRevenue)
72
                                 ->where('type', AccountType::OperatingRevenue)
81
                                 'required' => 'The income account is required for sellable offerings.',
79
                                 'required' => 'The income account is required for sellable offerings.',
82
                             ]),
80
                             ]),
83
                         Forms\Components\Select::make('salesTaxes')
81
                         Forms\Components\Select::make('salesTaxes')
84
-                            ->label('Sales Tax')
82
+                            ->label('Sales tax')
85
                             ->relationship('salesTaxes', 'name')
83
                             ->relationship('salesTaxes', 'name')
86
                             ->preload()
84
                             ->preload()
87
                             ->multiple(),
85
                             ->multiple(),
88
                         Forms\Components\Select::make('salesDiscounts')
86
                         Forms\Components\Select::make('salesDiscounts')
89
-                            ->label('Sales Discount')
87
+                            ->label('Sales discount')
90
                             ->relationship('salesDiscounts', 'name')
88
                             ->relationship('salesDiscounts', 'name')
91
                             ->preload()
89
                             ->preload()
92
                             ->multiple(),
90
                             ->multiple(),
98
                 Forms\Components\Section::make('Purchase Information')
96
                 Forms\Components\Section::make('Purchase Information')
99
                     ->schema([
97
                     ->schema([
100
                         Forms\Components\Select::make('expense_account_id')
98
                         Forms\Components\Select::make('expense_account_id')
101
-                            ->label('Expense Account')
99
+                            ->label('Expense account')
102
                             ->options(Account::query()
100
                             ->options(Account::query()
103
                                 ->where('category', AccountCategory::Expense)
101
                                 ->where('category', AccountCategory::Expense)
104
                                 ->where('type', AccountType::OperatingExpense)
102
                                 ->where('type', AccountType::OperatingExpense)
112
                                 'required' => 'The expense account is required for purchasable offerings.',
110
                                 'required' => 'The expense account is required for purchasable offerings.',
113
                             ]),
111
                             ]),
114
                         Forms\Components\Select::make('purchaseTaxes')
112
                         Forms\Components\Select::make('purchaseTaxes')
115
-                            ->label('Purchase Tax')
113
+                            ->label('Purchase tax')
116
                             ->relationship('purchaseTaxes', 'name')
114
                             ->relationship('purchaseTaxes', 'name')
117
                             ->preload()
115
                             ->preload()
118
                             ->multiple(),
116
                             ->multiple(),
119
                         Forms\Components\Select::make('purchaseDiscounts')
117
                         Forms\Components\Select::make('purchaseDiscounts')
120
-                            ->label('Purchase Discount')
118
+                            ->label('Purchase discount')
121
                             ->relationship('purchaseDiscounts', 'name')
119
                             ->relationship('purchaseDiscounts', 'name')
122
                             ->preload()
120
                             ->preload()
123
                             ->multiple(),
121
                             ->multiple(),

+ 1
- 1
app/Filament/Company/Resources/Core/DepartmentResource.php View File

56
                         Forms\Components\Group::make()
56
                         Forms\Components\Group::make()
57
                             ->schema([
57
                             ->schema([
58
                                 Forms\Components\Select::make('parent_id')
58
                                 Forms\Components\Select::make('parent_id')
59
-                                    ->localizeLabel('Parent Department')
59
+                                    ->localizeLabel('Parent department')
60
                                     ->relationship('parent', 'name')
60
                                     ->relationship('parent', 'name')
61
                                     ->preload()
61
                                     ->preload()
62
                                     ->searchable()
62
                                     ->searchable()

+ 96
- 94
app/Filament/Company/Resources/Purchases/BillResource.php View File

71
                             ]),
71
                             ]),
72
                             Forms\Components\Group::make([
72
                             Forms\Components\Group::make([
73
                                 Forms\Components\TextInput::make('bill_number')
73
                                 Forms\Components\TextInput::make('bill_number')
74
-                                    ->label('Bill Number')
74
+                                    ->label('Bill number')
75
                                     ->default(fn () => Bill::getNextDocumentNumber())
75
                                     ->default(fn () => Bill::getNextDocumentNumber())
76
                                     ->required(),
76
                                     ->required(),
77
                                 Forms\Components\TextInput::make('order_number')
77
                                 Forms\Components\TextInput::make('order_number')
78
                                     ->label('P.O/S.O Number'),
78
                                     ->label('P.O/S.O Number'),
79
                                 Forms\Components\DatePicker::make('date')
79
                                 Forms\Components\DatePicker::make('date')
80
-                                    ->label('Bill Date')
80
+                                    ->label('Bill date')
81
                                     ->default(now())
81
                                     ->default(now())
82
                                     ->disabled(function (?Bill $record) {
82
                                     ->disabled(function (?Bill $record) {
83
                                         return $record?->hasPayments();
83
                                         return $record?->hasPayments();
84
                                     })
84
                                     })
85
                                     ->required(),
85
                                     ->required(),
86
                                 Forms\Components\DatePicker::make('due_date')
86
                                 Forms\Components\DatePicker::make('due_date')
87
-                                    ->label('Due Date')
87
+                                    ->label('Due date')
88
                                     ->default(function () use ($company) {
88
                                     ->default(function () use ($company) {
89
                                         return now()->addDays($company->defaultBill->payment_terms->getDays());
89
                                         return now()->addDays($company->defaultBill->payment_terms->getDays());
90
                                     })
90
                                     })
91
                                     ->required(),
91
                                     ->required(),
92
                                 Forms\Components\Select::make('discount_method')
92
                                 Forms\Components\Select::make('discount_method')
93
-                                    ->label('Discount Method')
93
+                                    ->label('Discount method')
94
                                     ->options(DocumentDiscountMethod::class)
94
                                     ->options(DocumentDiscountMethod::class)
95
                                     ->selectablePlaceholder(false)
95
                                     ->selectablePlaceholder(false)
96
                                     ->default(DocumentDiscountMethod::PerLineItem)
96
                                     ->default(DocumentDiscountMethod::PerLineItem)
260
                     ->sortable()
260
                     ->sortable()
261
                     ->toggleable(),
261
                     ->toggleable(),
262
                 Tables\Columns\TextColumn::make('amount_paid')
262
                 Tables\Columns\TextColumn::make('amount_paid')
263
-                    ->label('Amount Paid')
263
+                    ->label('Amount paid')
264
                     ->currencyWithConversion(static fn (Bill $record) => $record->currency_code)
264
                     ->currencyWithConversion(static fn (Bill $record) => $record->currency_code)
265
                     ->sortable()
265
                     ->sortable()
266
                     ->toggleable(),
266
                     ->toggleable(),
267
                 Tables\Columns\TextColumn::make('amount_due')
267
                 Tables\Columns\TextColumn::make('amount_due')
268
-                    ->label('Amount Due')
268
+                    ->label('Amount due')
269
                     ->currencyWithConversion(static fn (Bill $record) => $record->currency_code)
269
                     ->currencyWithConversion(static fn (Bill $record) => $record->currency_code)
270
                     ->sortable(),
270
                     ->sortable(),
271
             ])
271
             ])
278
                     ->options(BillStatus::class)
278
                     ->options(BillStatus::class)
279
                     ->native(false),
279
                     ->native(false),
280
                 Tables\Filters\TernaryFilter::make('has_payments')
280
                 Tables\Filters\TernaryFilter::make('has_payments')
281
-                    ->label('Has Payments')
281
+                    ->label('Has payments')
282
                     ->queries(
282
                     ->queries(
283
                         true: fn (Builder $query) => $query->whereHas('payments'),
283
                         true: fn (Builder $query) => $query->whereHas('payments'),
284
                         false: fn (Builder $query) => $query->whereDoesntHave('payments'),
284
                         false: fn (Builder $query) => $query->whereDoesntHave('payments'),
285
                     ),
285
                     ),
286
                 DateRangeFilter::make('date')
286
                 DateRangeFilter::make('date')
287
-                    ->fromLabel('From Date')
288
-                    ->untilLabel('To Date')
287
+                    ->fromLabel('From date')
288
+                    ->untilLabel('To date')
289
                     ->indicatorLabel('Date'),
289
                     ->indicatorLabel('Date'),
290
                 DateRangeFilter::make('due_date')
290
                 DateRangeFilter::make('due_date')
291
-                    ->fromLabel('From Due Date')
292
-                    ->untilLabel('To Due Date')
291
+                    ->fromLabel('From due date')
292
+                    ->untilLabel('To due date')
293
                     ->indicatorLabel('Due'),
293
                     ->indicatorLabel('Due'),
294
             ])
294
             ])
295
             ->actions([
295
             ->actions([
296
                 Tables\Actions\ActionGroup::make([
296
                 Tables\Actions\ActionGroup::make([
297
-                    Tables\Actions\EditAction::make(),
298
-                    Tables\Actions\ViewAction::make(),
299
-                    Tables\Actions\DeleteAction::make(),
300
-                    Bill::getReplicateAction(Tables\Actions\ReplicateAction::class),
301
-                    Tables\Actions\Action::make('recordPayment')
302
-                        ->label('Record Payment')
303
-                        ->stickyModalHeader()
304
-                        ->stickyModalFooter()
305
-                        ->modalFooterActionsAlignment(Alignment::End)
306
-                        ->modalWidth(MaxWidth::TwoExtraLarge)
307
-                        ->icon('heroicon-o-credit-card')
308
-                        ->visible(function (Bill $record) {
309
-                            return $record->canRecordPayment();
310
-                        })
311
-                        ->mountUsing(function (Bill $record, Form $form) {
312
-                            $form->fill([
313
-                                'posted_at' => now(),
314
-                                'amount' => $record->amount_due,
315
-                            ]);
316
-                        })
317
-                        ->databaseTransaction()
318
-                        ->successNotificationTitle('Payment Recorded')
319
-                        ->form([
320
-                            Forms\Components\DatePicker::make('posted_at')
321
-                                ->label('Date'),
322
-                            Forms\Components\TextInput::make('amount')
323
-                                ->label('Amount')
324
-                                ->required()
325
-                                ->money(fn (Bill $record) => $record->currency_code)
326
-                                ->live(onBlur: true)
327
-                                ->helperText(function (Bill $record, $state) {
328
-                                    $billCurrency = $record->currency_code;
329
-                                    if (! CurrencyConverter::isValidAmount($state, $billCurrency)) {
330
-                                        return null;
331
-                                    }
332
-
333
-                                    $amountDue = $record->getRawOriginal('amount_due');
334
-                                    $amount = CurrencyConverter::convertToCents($state, $billCurrency);
335
-
336
-                                    if ($amount <= 0) {
337
-                                        return 'Please enter a valid positive amount';
338
-                                    }
339
-
340
-                                    $newAmountDue = $amountDue - $amount;
341
-
342
-                                    return match (true) {
343
-                                        $newAmountDue > 0 => 'Amount due after payment will be ' . CurrencyConverter::formatCentsToMoney($newAmountDue, $billCurrency),
344
-                                        $newAmountDue === 0 => 'Bill will be fully paid',
345
-                                        default => 'Amount exceeds bill total by ' . CurrencyConverter::formatCentsToMoney(abs($newAmountDue), $billCurrency),
346
-                                    };
347
-                                })
348
-                                ->rules([
349
-                                    static fn (Bill $record): Closure => static function (string $attribute, $value, Closure $fail) use ($record) {
350
-                                        if (! CurrencyConverter::isValidAmount($value, $record->currency_code)) {
351
-                                            $fail('Please enter a valid amount');
297
+                    Tables\Actions\ActionGroup::make([
298
+                        Tables\Actions\EditAction::make(),
299
+                        Tables\Actions\ViewAction::make(),
300
+                        Bill::getReplicateAction(Tables\Actions\ReplicateAction::class),
301
+                        Tables\Actions\Action::make('recordPayment')
302
+                            ->label('Record payment')
303
+                            ->stickyModalHeader()
304
+                            ->stickyModalFooter()
305
+                            ->modalFooterActionsAlignment(Alignment::End)
306
+                            ->modalWidth(MaxWidth::TwoExtraLarge)
307
+                            ->icon('heroicon-o-credit-card')
308
+                            ->visible(function (Bill $record) {
309
+                                return $record->canRecordPayment();
310
+                            })
311
+                            ->mountUsing(function (Bill $record, Form $form) {
312
+                                $form->fill([
313
+                                    'posted_at' => now(),
314
+                                    'amount' => $record->amount_due,
315
+                                ]);
316
+                            })
317
+                            ->databaseTransaction()
318
+                            ->successNotificationTitle('Payment recorded')
319
+                            ->form([
320
+                                Forms\Components\DatePicker::make('posted_at')
321
+                                    ->label('Date'),
322
+                                Forms\Components\TextInput::make('amount')
323
+                                    ->label('Amount')
324
+                                    ->required()
325
+                                    ->money(fn (Bill $record) => $record->currency_code)
326
+                                    ->live(onBlur: true)
327
+                                    ->helperText(function (Bill $record, $state) {
328
+                                        $billCurrency = $record->currency_code;
329
+                                        if (! CurrencyConverter::isValidAmount($state, $billCurrency)) {
330
+                                            return null;
352
                                         }
331
                                         }
353
-                                    },
354
-                                ]),
355
-                            Forms\Components\Select::make('payment_method')
356
-                                ->label('Payment Method')
357
-                                ->required()
358
-                                ->options(PaymentMethod::class),
359
-                            Forms\Components\Select::make('bank_account_id')
360
-                                ->label('Account')
361
-                                ->required()
362
-                                ->options(BankAccount::query()
363
-                                    ->get()
364
-                                    ->pluck('account.name', 'id'))
365
-                                ->searchable(),
366
-                            Forms\Components\Textarea::make('notes')
367
-                                ->label('Notes'),
368
-                        ])
369
-                        ->action(function (Bill $record, Tables\Actions\Action $action, array $data) {
370
-                            $record->recordPayment($data);
371
 
332
 
372
-                            $action->success();
373
-                        }),
333
+                                        $amountDue = $record->getRawOriginal('amount_due');
334
+                                        $amount = CurrencyConverter::convertToCents($state, $billCurrency);
335
+
336
+                                        if ($amount <= 0) {
337
+                                            return 'Please enter a valid positive amount';
338
+                                        }
339
+
340
+                                        $newAmountDue = $amountDue - $amount;
341
+
342
+                                        return match (true) {
343
+                                            $newAmountDue > 0 => 'Amount due after payment will be ' . CurrencyConverter::formatCentsToMoney($newAmountDue, $billCurrency),
344
+                                            $newAmountDue === 0 => 'Bill will be fully paid',
345
+                                            default => 'Amount exceeds bill total by ' . CurrencyConverter::formatCentsToMoney(abs($newAmountDue), $billCurrency),
346
+                                        };
347
+                                    })
348
+                                    ->rules([
349
+                                        static fn (Bill $record): Closure => static function (string $attribute, $value, Closure $fail) use ($record) {
350
+                                            if (! CurrencyConverter::isValidAmount($value, $record->currency_code)) {
351
+                                                $fail('Please enter a valid amount');
352
+                                            }
353
+                                        },
354
+                                    ]),
355
+                                Forms\Components\Select::make('payment_method')
356
+                                    ->label('Payment method')
357
+                                    ->required()
358
+                                    ->options(PaymentMethod::class),
359
+                                Forms\Components\Select::make('bank_account_id')
360
+                                    ->label('Account')
361
+                                    ->required()
362
+                                    ->options(BankAccount::query()
363
+                                        ->get()
364
+                                        ->pluck('account.name', 'id'))
365
+                                    ->searchable(),
366
+                                Forms\Components\Textarea::make('notes')
367
+                                    ->label('Notes'),
368
+                            ])
369
+                            ->action(function (Bill $record, Tables\Actions\Action $action, array $data) {
370
+                                $record->recordPayment($data);
371
+
372
+                                $action->success();
373
+                            }),
374
+                    ])->dropdown(false),
375
+                    Tables\Actions\DeleteAction::make(),
374
                 ]),
376
                 ]),
375
             ])
377
             ])
376
             ->bulkActions([
378
             ->bulkActions([
380
                         ->label('Replicate')
382
                         ->label('Replicate')
381
                         ->modalWidth(MaxWidth::Large)
383
                         ->modalWidth(MaxWidth::Large)
382
                         ->modalDescription('Replicating bills will also replicate their line items. Are you sure you want to proceed?')
384
                         ->modalDescription('Replicating bills will also replicate their line items. Are you sure you want to proceed?')
383
-                        ->successNotificationTitle('Bills Replicated Successfully')
384
-                        ->failureNotificationTitle('Failed to Replicate Bills')
385
+                        ->successNotificationTitle('Bills replicated successfully')
386
+                        ->failureNotificationTitle('Failed to replicate bills')
385
                         ->databaseTransaction()
387
                         ->databaseTransaction()
386
                         ->deselectRecordsAfterCompletion()
388
                         ->deselectRecordsAfterCompletion()
387
                         ->excludeAttributes([
389
                         ->excludeAttributes([
413
                             'updated_at',
415
                             'updated_at',
414
                         ]),
416
                         ]),
415
                     Tables\Actions\BulkAction::make('recordPayments')
417
                     Tables\Actions\BulkAction::make('recordPayments')
416
-                        ->label('Record Payments')
418
+                        ->label('Record payments')
417
                         ->icon('heroicon-o-credit-card')
419
                         ->icon('heroicon-o-credit-card')
418
                         ->stickyModalHeader()
420
                         ->stickyModalHeader()
419
                         ->stickyModalFooter()
421
                         ->stickyModalFooter()
420
                         ->modalFooterActionsAlignment(Alignment::End)
422
                         ->modalFooterActionsAlignment(Alignment::End)
421
                         ->modalWidth(MaxWidth::TwoExtraLarge)
423
                         ->modalWidth(MaxWidth::TwoExtraLarge)
422
                         ->databaseTransaction()
424
                         ->databaseTransaction()
423
-                        ->successNotificationTitle('Payments Recorded')
424
-                        ->failureNotificationTitle('Failed to Record Payments')
425
+                        ->successNotificationTitle('Payments recorded')
426
+                        ->failureNotificationTitle('Failed to record payments')
425
                         ->deselectRecordsAfterCompletion()
427
                         ->deselectRecordsAfterCompletion()
426
                         ->beforeFormFilled(function (Collection $records, Tables\Actions\BulkAction $action) {
428
                         ->beforeFormFilled(function (Collection $records, Tables\Actions\BulkAction $action) {
427
                             $isInvalid = $records->contains(fn (Bill $bill) => ! $bill->canRecordPayment());
429
                             $isInvalid = $records->contains(fn (Bill $bill) => ! $bill->canRecordPayment());
428
 
430
 
429
                             if ($isInvalid) {
431
                             if ($isInvalid) {
430
                                 Notification::make()
432
                                 Notification::make()
431
-                                    ->title('Payment Recording Failed')
433
+                                    ->title('Payment recording failed')
432
                                     ->body('Bills that are either paid, voided, or are in a foreign currency cannot be processed through bulk payments. Please adjust your selection and try again.')
434
                                     ->body('Bills that are either paid, voided, or are in a foreign currency cannot be processed through bulk payments. Please adjust your selection and try again.')
433
                                     ->persistent()
435
                                     ->persistent()
434
                                     ->danger()
436
                                     ->danger()
460
                                     },
462
                                     },
461
                                 ]),
463
                                 ]),
462
                             Forms\Components\Select::make('payment_method')
464
                             Forms\Components\Select::make('payment_method')
463
-                                ->label('Payment Method')
465
+                                ->label('Payment method')
464
                                 ->required()
466
                                 ->required()
465
                                 ->options(PaymentMethod::class),
467
                                 ->options(PaymentMethod::class),
466
                             Forms\Components\Select::make('bank_account_id')
468
                             Forms\Components\Select::make('bank_account_id')
481
                                 $formattedTotalAmountDue = CurrencyConverter::formatCentsToMoney($totalAmountDue);
483
                                 $formattedTotalAmountDue = CurrencyConverter::formatCentsToMoney($totalAmountDue);
482
 
484
 
483
                                 Notification::make()
485
                                 Notification::make()
484
-                                    ->title('Excess Payment Amount')
486
+                                    ->title('Excess payment amount')
485
                                     ->body("The payment amount exceeds the total amount due of {$formattedTotalAmountDue}. Please adjust the payment amount and try again.")
487
                                     ->body("The payment amount exceeds the total amount due of {$formattedTotalAmountDue}. Please adjust the payment amount and try again.")
486
                                     ->persistent()
488
                                     ->persistent()
487
                                     ->warning()
489
                                     ->warning()

+ 8
- 4
app/Filament/Company/Resources/Purchases/BillResource/Pages/ViewBill.php View File

25
     protected function getHeaderActions(): array
25
     protected function getHeaderActions(): array
26
     {
26
     {
27
         return [
27
         return [
28
+            Actions\EditAction::make()
29
+                ->label('Edit bill')
30
+                ->outlined(),
28
             Actions\ActionGroup::make([
31
             Actions\ActionGroup::make([
29
-                Actions\EditAction::make(),
32
+                Actions\ActionGroup::make([
33
+                    Bill::getReplicateAction(),
34
+                ])->dropdown(false),
30
                 Actions\DeleteAction::make(),
35
                 Actions\DeleteAction::make(),
31
-                Bill::getReplicateAction(),
32
             ])
36
             ])
33
                 ->label('Actions')
37
                 ->label('Actions')
34
                 ->button()
38
                 ->button()
60
                             ->label('Total')
64
                             ->label('Total')
61
                             ->money(),
65
                             ->money(),
62
                         TextEntry::make('amount_due')
66
                         TextEntry::make('amount_due')
63
-                            ->label('Amount Due')
67
+                            ->label('Amount due')
64
                             ->money(),
68
                             ->money(),
65
                         TextEntry::make('date')
69
                         TextEntry::make('date')
66
                             ->label('Date')
70
                             ->label('Date')
69
                             ->label('Due')
73
                             ->label('Due')
70
                             ->asRelativeDay(),
74
                             ->asRelativeDay(),
71
                         TextEntry::make('paid_at')
75
                         TextEntry::make('paid_at')
72
-                            ->label('Paid At')
76
+                            ->label('Paid at')
73
                             ->placeholder('Not Paid')
77
                             ->placeholder('Not Paid')
74
                             ->date(),
78
                             ->date(),
75
                     ]),
79
                     ]),

+ 3
- 3
app/Filament/Company/Resources/Purchases/BillResource/RelationManagers/PaymentsRelationManager.php View File

87
                         },
87
                         },
88
                     ]),
88
                     ]),
89
                 Forms\Components\Select::make('payment_method')
89
                 Forms\Components\Select::make('payment_method')
90
-                    ->label('Payment Method')
90
+                    ->label('Payment method')
91
                     ->required()
91
                     ->required()
92
                     ->options(PaymentMethod::class),
92
                     ->options(PaymentMethod::class),
93
                 Forms\Components\Select::make('bank_account_id')
93
                 Forms\Components\Select::make('bank_account_id')
140
             ])
140
             ])
141
             ->headerActions([
141
             ->headerActions([
142
                 Tables\Actions\CreateAction::make()
142
                 Tables\Actions\CreateAction::make()
143
-                    ->label('Record Payment')
143
+                    ->label('Record payment')
144
                     ->modalHeading(fn (Tables\Actions\CreateAction $action) => $action->getLabel())
144
                     ->modalHeading(fn (Tables\Actions\CreateAction $action) => $action->getLabel())
145
                     ->modalWidth(MaxWidth::TwoExtraLarge)
145
                     ->modalWidth(MaxWidth::TwoExtraLarge)
146
                     ->visible(function () {
146
                     ->visible(function () {
154
                         ]);
154
                         ]);
155
                     })
155
                     })
156
                     ->databaseTransaction()
156
                     ->databaseTransaction()
157
-                    ->successNotificationTitle('Payment Recorded')
157
+                    ->successNotificationTitle('Payment recorded')
158
                     ->action(function (Tables\Actions\CreateAction $action, array $data) {
158
                     ->action(function (Tables\Actions\CreateAction $action, array $data) {
159
                         /** @var Bill $record */
159
                         /** @var Bill $record */
160
                         $record = $this->getOwnerRecord();
160
                         $record = $this->getOwnerRecord();

+ 14
- 11
app/Filament/Company/Resources/Purchases/VendorResource.php View File

34
                             ->columns(2)
34
                             ->columns(2)
35
                             ->schema([
35
                             ->schema([
36
                                 Forms\Components\TextInput::make('name')
36
                                 Forms\Components\TextInput::make('name')
37
-                                    ->label('Vendor Name')
37
+                                    ->label('Vendor name')
38
                                     ->required()
38
                                     ->required()
39
                                     ->maxLength(255),
39
                                     ->maxLength(255),
40
                                 Forms\Components\Radio::make('type')
40
                                 Forms\Components\Radio::make('type')
41
-                                    ->label('Vendor Type')
41
+                                    ->label('Vendor type')
42
                                     ->required()
42
                                     ->required()
43
                                     ->live()
43
                                     ->live()
44
                                     ->options(VendorType::class)
44
                                     ->options(VendorType::class)
48
                                     ->nullable()
48
                                     ->nullable()
49
                                     ->visible(static fn (Forms\Get $get) => VendorType::parse($get('type')) === VendorType::Regular),
49
                                     ->visible(static fn (Forms\Get $get) => VendorType::parse($get('type')) === VendorType::Regular),
50
                                 Forms\Components\Select::make('contractor_type')
50
                                 Forms\Components\Select::make('contractor_type')
51
-                                    ->label('Contractor Type')
51
+                                    ->label('Contractor type')
52
                                     ->required()
52
                                     ->required()
53
                                     ->live()
53
                                     ->live()
54
                                     ->visible(static fn (Forms\Get $get) => VendorType::parse($get('type')) === VendorType::Contractor)
54
                                     ->visible(static fn (Forms\Get $get) => VendorType::parse($get('type')) === VendorType::Contractor)
55
                                     ->options(ContractorType::class),
55
                                     ->options(ContractorType::class),
56
                                 Forms\Components\TextInput::make('ssn')
56
                                 Forms\Components\TextInput::make('ssn')
57
-                                    ->label('Social Security Number')
57
+                                    ->label('Social security number')
58
                                     ->required()
58
                                     ->required()
59
                                     ->live()
59
                                     ->live()
60
                                     ->mask('999-99-9999')
60
                                     ->mask('999-99-9999')
63
                                     ->visible(static fn (Forms\Get $get) => ContractorType::parse($get('contractor_type')) === ContractorType::Individual)
63
                                     ->visible(static fn (Forms\Get $get) => ContractorType::parse($get('contractor_type')) === ContractorType::Individual)
64
                                     ->maxLength(255),
64
                                     ->maxLength(255),
65
                                 Forms\Components\TextInput::make('ein')
65
                                 Forms\Components\TextInput::make('ein')
66
-                                    ->label('Employer Identification Number')
66
+                                    ->label('Employer identification number')
67
                                     ->required()
67
                                     ->required()
68
                                     ->live()
68
                                     ->live()
69
                                     ->mask('99-9999999')
69
                                     ->mask('99-9999999')
85
                                 Forms\Components\Hidden::make('is_primary')
85
                                 Forms\Components\Hidden::make('is_primary')
86
                                     ->default(true),
86
                                     ->default(true),
87
                                 Forms\Components\TextInput::make('first_name')
87
                                 Forms\Components\TextInput::make('first_name')
88
-                                    ->label('First Name')
88
+                                    ->label('First name')
89
                                     ->required()
89
                                     ->required()
90
                                     ->maxLength(255),
90
                                     ->maxLength(255),
91
                                 Forms\Components\TextInput::make('last_name')
91
                                 Forms\Components\TextInput::make('last_name')
92
-                                    ->label('Last Name')
92
+                                    ->label('Last name')
93
                                     ->required()
93
                                     ->required()
94
                                     ->maxLength(255),
94
                                     ->maxLength(255),
95
                                 Forms\Components\TextInput::make('email')
95
                                 Forms\Components\TextInput::make('email')
123
                                         Forms\Components\Builder\Block::make('toll_free')
123
                                         Forms\Components\Builder\Block::make('toll_free')
124
                                             ->schema([
124
                                             ->schema([
125
                                                 Forms\Components\TextInput::make('number')
125
                                                 Forms\Components\TextInput::make('number')
126
-                                                    ->label('Toll Free')
126
+                                                    ->label('Toll free')
127
                                                     ->required()
127
                                                     ->required()
128
                                                     ->maxLength(15),
128
                                                     ->maxLength(15),
129
                                             ])->maxItems(1),
129
                                             ])->maxItems(1),
177
                     ->toggleable(isToggledHiddenByDefault: true)
177
                     ->toggleable(isToggledHiddenByDefault: true)
178
                     ->listWithLineBreaks(),
178
                     ->listWithLineBreaks(),
179
                 Tables\Columns\TextColumn::make('payable_balance')
179
                 Tables\Columns\TextColumn::make('payable_balance')
180
-                    ->label('Payable Balance')
180
+                    ->label('Payable balance')
181
                     ->getStateUsing(function (Vendor $vendor) {
181
                     ->getStateUsing(function (Vendor $vendor) {
182
                         return $vendor->bills()
182
                         return $vendor->bills()
183
                             ->outstanding()
183
                             ->outstanding()
212
             ])
212
             ])
213
             ->actions([
213
             ->actions([
214
                 Tables\Actions\ActionGroup::make([
214
                 Tables\Actions\ActionGroup::make([
215
-                    Tables\Actions\EditAction::make(),
216
-                    Tables\Actions\ViewAction::make(),
215
+                    Tables\Actions\ActionGroup::make([
216
+                        Tables\Actions\EditAction::make(),
217
+                        Tables\Actions\ViewAction::make(),
218
+                    ])->dropdown(false),
219
+                    Tables\Actions\DeleteAction::make(),
217
                 ]),
220
                 ]),
218
             ])
221
             ])
219
             ->bulkActions([
222
             ->bulkActions([

+ 34
- 2
app/Filament/Company/Resources/Purchases/VendorResource/Pages/ViewVendor.php View File

2
 
2
 
3
 namespace App\Filament\Company\Resources\Purchases\VendorResource\Pages;
3
 namespace App\Filament\Company\Resources\Purchases\VendorResource\Pages;
4
 
4
 
5
+use App\Filament\Company\Resources\Purchases\BillResource\Pages\CreateBill;
5
 use App\Filament\Company\Resources\Purchases\VendorResource;
6
 use App\Filament\Company\Resources\Purchases\VendorResource;
6
 use App\Filament\Company\Resources\Purchases\VendorResource\RelationManagers;
7
 use App\Filament\Company\Resources\Purchases\VendorResource\RelationManagers;
8
+use Filament\Actions\Action;
9
+use Filament\Actions\ActionGroup;
10
+use Filament\Actions\DeleteAction;
11
+use Filament\Actions\EditAction;
7
 use Filament\Infolists\Components\Section;
12
 use Filament\Infolists\Components\Section;
8
 use Filament\Infolists\Components\TextEntry;
13
 use Filament\Infolists\Components\TextEntry;
9
 use Filament\Infolists\Infolist;
14
 use Filament\Infolists\Infolist;
10
 use Filament\Resources\Pages\ViewRecord;
15
 use Filament\Resources\Pages\ViewRecord;
16
+use Filament\Support\Enums\IconPosition;
17
+use Filament\Support\Enums\IconSize;
11
 
18
 
12
 class ViewVendor extends ViewRecord
19
 class ViewVendor extends ViewRecord
13
 {
20
 {
25
         return $this->record->name;
32
         return $this->record->name;
26
     }
33
     }
27
 
34
 
35
+    protected function getHeaderActions(): array
36
+    {
37
+        return [
38
+            EditAction::make()
39
+                ->label('Edit vendor')
40
+                ->outlined(),
41
+            ActionGroup::make([
42
+                ActionGroup::make([
43
+                    Action::make('newBill')
44
+                        ->label('New bill')
45
+                        ->icon('heroicon-m-document-plus')
46
+                        ->url(CreateBill::getUrl(['vendor' => $this->record->getKey()])),
47
+                ])->dropdown(false),
48
+                DeleteAction::make(),
49
+            ])
50
+                ->label('Actions')
51
+                ->button()
52
+                ->outlined()
53
+                ->dropdownPlacement('bottom-end')
54
+                ->icon('heroicon-c-chevron-down')
55
+                ->iconSize(IconSize::Small)
56
+                ->iconPosition(IconPosition::After),
57
+        ];
58
+    }
59
+
28
     protected function getHeaderWidgets(): array
60
     protected function getHeaderWidgets(): array
29
     {
61
     {
30
         return [
62
         return [
44
                         TextEntry::make('contact.email')
76
                         TextEntry::make('contact.email')
45
                             ->label('Email'),
77
                             ->label('Email'),
46
                         TextEntry::make('contact.first_available_phone')
78
                         TextEntry::make('contact.first_available_phone')
47
-                            ->label('Primary Phone'),
79
+                            ->label('Primary phone'),
48
                         TextEntry::make('website')
80
                         TextEntry::make('website')
49
                             ->label('Website')
81
                             ->label('Website')
50
                             ->url(static fn ($state) => $state, true),
82
                             ->url(static fn ($state) => $state, true),
53
                     ->columns()
85
                     ->columns()
54
                     ->schema([
86
                     ->schema([
55
                         TextEntry::make('address.address_string')
87
                         TextEntry::make('address.address_string')
56
-                            ->label('Billing Address')
88
+                            ->label('Billing address')
57
                             ->listWithLineBreaks(),
89
                             ->listWithLineBreaks(),
58
                         TextEntry::make('notes'),
90
                         TextEntry::make('notes'),
59
                     ]),
91
                     ]),

+ 14
- 11
app/Filament/Company/Resources/Sales/ClientResource.php View File

34
                             ->columns()
34
                             ->columns()
35
                             ->schema([
35
                             ->schema([
36
                                 Forms\Components\TextInput::make('name')
36
                                 Forms\Components\TextInput::make('name')
37
-                                    ->label('Client Name')
37
+                                    ->label('Client name')
38
                                     ->required()
38
                                     ->required()
39
                                     ->maxLength(255),
39
                                     ->maxLength(255),
40
                                 Forms\Components\TextInput::make('account_number')
40
                                 Forms\Components\TextInput::make('account_number')
52
                                 Forms\Components\Hidden::make('is_primary')
52
                                 Forms\Components\Hidden::make('is_primary')
53
                                     ->default(true),
53
                                     ->default(true),
54
                                 Forms\Components\TextInput::make('first_name')
54
                                 Forms\Components\TextInput::make('first_name')
55
-                                    ->label('First Name')
55
+                                    ->label('First name')
56
                                     ->required()
56
                                     ->required()
57
                                     ->maxLength(255),
57
                                     ->maxLength(255),
58
                                 Forms\Components\TextInput::make('last_name')
58
                                 Forms\Components\TextInput::make('last_name')
59
-                                    ->label('Last Name')
59
+                                    ->label('Last name')
60
                                     ->required()
60
                                     ->required()
61
                                     ->maxLength(255),
61
                                     ->maxLength(255),
62
                                 Forms\Components\TextInput::make('email')
62
                                 Forms\Components\TextInput::make('email')
90
                                         Forms\Components\Builder\Block::make('toll_free')
90
                                         Forms\Components\Builder\Block::make('toll_free')
91
                                             ->schema([
91
                                             ->schema([
92
                                                 Forms\Components\TextInput::make('number')
92
                                                 Forms\Components\TextInput::make('number')
93
-                                                    ->label('Toll Free')
93
+                                                    ->label('Toll free')
94
                                                     ->required()
94
                                                     ->required()
95
                                                     ->maxLength(15),
95
                                                     ->maxLength(15),
96
                                             ])->maxItems(1),
96
                                             ])->maxItems(1),
137
                             ->addActionLabel('Add Contact')
137
                             ->addActionLabel('Add Contact')
138
                             ->schema([
138
                             ->schema([
139
                                 Forms\Components\TextInput::make('first_name')
139
                                 Forms\Components\TextInput::make('first_name')
140
-                                    ->label('First Name')
140
+                                    ->label('First name')
141
                                     ->required()
141
                                     ->required()
142
                                     ->live(onBlur: true)
142
                                     ->live(onBlur: true)
143
                                     ->maxLength(255),
143
                                     ->maxLength(255),
144
                                 Forms\Components\TextInput::make('last_name')
144
                                 Forms\Components\TextInput::make('last_name')
145
-                                    ->label('Last Name')
145
+                                    ->label('Last name')
146
                                     ->required()
146
                                     ->required()
147
                                     ->live(onBlur: true)
147
                                     ->live(onBlur: true)
148
                                     ->maxLength(255),
148
                                     ->maxLength(255),
206
                             ->contained(false)
206
                             ->contained(false)
207
                             ->schema([
207
                             ->schema([
208
                                 Forms\Components\Checkbox::make('same_as_billing')
208
                                 Forms\Components\Checkbox::make('same_as_billing')
209
-                                    ->label('Same as Billing Address')
209
+                                    ->label('Same as billing address')
210
                                     ->live()
210
                                     ->live()
211
                                     ->afterStateHydrated(function (?Address $record, Forms\Components\Checkbox $component) {
211
                                     ->afterStateHydrated(function (?Address $record, Forms\Components\Checkbox $component) {
212
                                         if (! $record || $record->parent_address_id) {
212
                                         if (! $record || $record->parent_address_id) {
239
                                 AddressFields::make()
239
                                 AddressFields::make()
240
                                     ->visible(static fn (Get $get) => ! $get('same_as_billing')),
240
                                     ->visible(static fn (Get $get) => ! $get('same_as_billing')),
241
                                 Forms\Components\Textarea::make('notes')
241
                                 Forms\Components\Textarea::make('notes')
242
-                                    ->label('Delivery Instructions')
242
+                                    ->label('Delivery instructions')
243
                                     ->maxLength(255)
243
                                     ->maxLength(255)
244
                                     ->columnSpanFull(),
244
                                     ->columnSpanFull(),
245
                             ])->columns(),
245
                             ])->columns(),
265
                     ->toggleable()
265
                     ->toggleable()
266
                     ->state(static fn (Client $client) => $client->primaryContact->first_available_phone),
266
                     ->state(static fn (Client $client) => $client->primaryContact->first_available_phone),
267
                 Tables\Columns\TextColumn::make('billingAddress.address_string')
267
                 Tables\Columns\TextColumn::make('billingAddress.address_string')
268
-                    ->label('Billing Address')
268
+                    ->label('Billing address')
269
                     ->searchable()
269
                     ->searchable()
270
                     ->toggleable(isToggledHiddenByDefault: true)
270
                     ->toggleable(isToggledHiddenByDefault: true)
271
                     ->listWithLineBreaks(),
271
                     ->listWithLineBreaks(),
304
             ])
304
             ])
305
             ->actions([
305
             ->actions([
306
                 Tables\Actions\ActionGroup::make([
306
                 Tables\Actions\ActionGroup::make([
307
-                    Tables\Actions\EditAction::make(),
308
-                    Tables\Actions\ViewAction::make(),
307
+                    Tables\Actions\ActionGroup::make([
308
+                        Tables\Actions\EditAction::make(),
309
+                        Tables\Actions\ViewAction::make(),
310
+                    ])->dropdown(false),
311
+                    Tables\Actions\DeleteAction::make(),
309
                 ]),
312
                 ]),
310
             ])
313
             ])
311
             ->bulkActions([
314
             ->bulkActions([

+ 48
- 6
app/Filament/Company/Resources/Sales/ClientResource/Pages/ViewClient.php View File

4
 
4
 
5
 use App\Filament\Company\Resources\Sales\ClientResource;
5
 use App\Filament\Company\Resources\Sales\ClientResource;
6
 use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers;
6
 use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers;
7
+use App\Filament\Company\Resources\Sales\EstimateResource\Pages\CreateEstimate;
8
+use App\Filament\Company\Resources\Sales\InvoiceResource\Pages\CreateInvoice;
9
+use App\Filament\Company\Resources\Sales\RecurringInvoiceResource\Pages\CreateRecurringInvoice;
10
+use Filament\Actions\Action;
11
+use Filament\Actions\ActionGroup;
12
+use Filament\Actions\DeleteAction;
13
+use Filament\Actions\EditAction;
7
 use Filament\Infolists\Components\Section;
14
 use Filament\Infolists\Components\Section;
8
 use Filament\Infolists\Components\TextEntry;
15
 use Filament\Infolists\Components\TextEntry;
9
 use Filament\Infolists\Infolist;
16
 use Filament\Infolists\Infolist;
10
 use Filament\Resources\Pages\ViewRecord;
17
 use Filament\Resources\Pages\ViewRecord;
18
+use Filament\Support\Enums\IconPosition;
19
+use Filament\Support\Enums\IconSize;
11
 use Illuminate\Contracts\Support\Htmlable;
20
 use Illuminate\Contracts\Support\Htmlable;
12
 
21
 
13
 class ViewClient extends ViewRecord
22
 class ViewClient extends ViewRecord
28
         return $this->record->name;
37
         return $this->record->name;
29
     }
38
     }
30
 
39
 
40
+    protected function getHeaderActions(): array
41
+    {
42
+        return [
43
+            EditAction::make()
44
+                ->label('Edit client')
45
+                ->outlined(),
46
+            ActionGroup::make([
47
+                ActionGroup::make([
48
+                    Action::make('newInvoice')
49
+                        ->label('New invoice')
50
+                        ->icon('heroicon-m-document-plus')
51
+                        ->url(CreateInvoice::getUrl(['client' => $this->record->getKey()])),
52
+                    Action::make('newEstimate')
53
+                        ->label('New estimate')
54
+                        ->icon('heroicon-m-document-duplicate')
55
+                        ->url(CreateEstimate::getUrl(['client' => $this->record->getKey()])),
56
+                    Action::make('newRecurringInvoice')
57
+                        ->label('New recurring invoice')
58
+                        ->icon('heroicon-m-arrow-path')
59
+                        ->url(CreateRecurringInvoice::getUrl(['client' => $this->record->getKey()])),
60
+                ])->dropdown(false),
61
+                DeleteAction::make(),
62
+            ])
63
+                ->label('Actions')
64
+                ->button()
65
+                ->outlined()
66
+                ->dropdownPlacement('bottom-end')
67
+                ->icon('heroicon-c-chevron-down')
68
+                ->iconSize(IconSize::Small)
69
+                ->iconPosition(IconPosition::After),
70
+        ];
71
+    }
72
+
31
     protected function getHeaderWidgets(): array
73
     protected function getHeaderWidgets(): array
32
     {
74
     {
33
         return [
75
         return [
43
                     ->columns()
85
                     ->columns()
44
                     ->schema([
86
                     ->schema([
45
                         TextEntry::make('primaryContact.full_name')
87
                         TextEntry::make('primaryContact.full_name')
46
-                            ->label('Primary Contact'),
88
+                            ->label('Primary contact'),
47
                         TextEntry::make('primaryContact.email')
89
                         TextEntry::make('primaryContact.email')
48
-                            ->label('Primary Email'),
90
+                            ->label('Primary email'),
49
                         TextEntry::make('primaryContact.first_available_phone')
91
                         TextEntry::make('primaryContact.first_available_phone')
50
-                            ->label('Primary Phone'),
92
+                            ->label('Primary phone'),
51
                         TextEntry::make('website')
93
                         TextEntry::make('website')
52
                             ->label('Website')
94
                             ->label('Website')
53
                             ->url(static fn ($state) => $state, true),
95
                             ->url(static fn ($state) => $state, true),
56
                     ->columns()
98
                     ->columns()
57
                     ->schema([
99
                     ->schema([
58
                         TextEntry::make('billingAddress.address_string')
100
                         TextEntry::make('billingAddress.address_string')
59
-                            ->label('Billing Address')
101
+                            ->label('Billing address')
60
                             ->listWithLineBreaks(),
102
                             ->listWithLineBreaks(),
61
                         TextEntry::make('shippingAddress.address_string')
103
                         TextEntry::make('shippingAddress.address_string')
62
-                            ->label('Shipping Address')
104
+                            ->label('Shipping address')
63
                             ->listWithLineBreaks(),
105
                             ->listWithLineBreaks(),
64
                         TextEntry::make('notes')
106
                         TextEntry::make('notes')
65
-                            ->label('Delivery Instructions'),
107
+                            ->label('Delivery instructions'),
66
                     ]),
108
                     ]),
67
             ]);
109
             ]);
68
     }
110
     }

+ 37
- 35
app/Filament/Company/Resources/Sales/EstimateResource.php View File

111
                             ]),
111
                             ]),
112
                             Forms\Components\Group::make([
112
                             Forms\Components\Group::make([
113
                                 Forms\Components\TextInput::make('estimate_number')
113
                                 Forms\Components\TextInput::make('estimate_number')
114
-                                    ->label('Estimate Number')
114
+                                    ->label('Estimate number')
115
                                     ->default(fn () => Estimate::getNextDocumentNumber()),
115
                                     ->default(fn () => Estimate::getNextDocumentNumber()),
116
                                 Forms\Components\TextInput::make('reference_number')
116
                                 Forms\Components\TextInput::make('reference_number')
117
-                                    ->label('Reference Number'),
117
+                                    ->label('Reference number'),
118
                                 Forms\Components\DatePicker::make('date')
118
                                 Forms\Components\DatePicker::make('date')
119
-                                    ->label('Estimate Date')
119
+                                    ->label('Estimate date')
120
                                     ->live()
120
                                     ->live()
121
                                     ->default(now())
121
                                     ->default(now())
122
                                     ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state) {
122
                                     ->afterStateUpdated(function (Forms\Set $set, Forms\Get $get, $state) {
128
                                         }
128
                                         }
129
                                     }),
129
                                     }),
130
                                 Forms\Components\DatePicker::make('expiration_date')
130
                                 Forms\Components\DatePicker::make('expiration_date')
131
-                                    ->label('Expiration Date')
131
+                                    ->label('Expiration date')
132
                                     ->default(function () use ($company) {
132
                                     ->default(function () use ($company) {
133
                                         return now()->addDays($company->defaultInvoice->payment_terms->getDays());
133
                                         return now()->addDays($company->defaultInvoice->payment_terms->getDays());
134
                                     })
134
                                     })
136
                                         return $get('date') ?? now();
136
                                         return $get('date') ?? now();
137
                                     }),
137
                                     }),
138
                                 Forms\Components\Select::make('discount_method')
138
                                 Forms\Components\Select::make('discount_method')
139
-                                    ->label('Discount Method')
139
+                                    ->label('Discount method')
140
                                     ->options(DocumentDiscountMethod::class)
140
                                     ->options(DocumentDiscountMethod::class)
141
                                     ->selectablePlaceholder(false)
141
                                     ->selectablePlaceholder(false)
142
                                     ->default(DocumentDiscountMethod::PerLineItem)
142
                                     ->default(DocumentDiscountMethod::PerLineItem)
292
                     ->badge()
292
                     ->badge()
293
                     ->searchable(),
293
                     ->searchable(),
294
                 Tables\Columns\TextColumn::make('expiration_date')
294
                 Tables\Columns\TextColumn::make('expiration_date')
295
-                    ->label('Expiration Date')
295
+                    ->label('Expiration date')
296
                     ->asRelativeDay()
296
                     ->asRelativeDay()
297
                     ->sortable(),
297
                     ->sortable(),
298
                 Tables\Columns\TextColumn::make('date')
298
                 Tables\Columns\TextColumn::make('date')
319
                     ->options(EstimateStatus::class)
319
                     ->options(EstimateStatus::class)
320
                     ->native(false),
320
                     ->native(false),
321
                 DateRangeFilter::make('date')
321
                 DateRangeFilter::make('date')
322
-                    ->fromLabel('From Date')
323
-                    ->untilLabel('To Date')
322
+                    ->fromLabel('From date')
323
+                    ->untilLabel('To date')
324
                     ->indicatorLabel('Date'),
324
                     ->indicatorLabel('Date'),
325
                 DateRangeFilter::make('expiration_date')
325
                 DateRangeFilter::make('expiration_date')
326
-                    ->fromLabel('From Expiration Date')
327
-                    ->untilLabel('To Expiration Date')
326
+                    ->fromLabel('From expiration date')
327
+                    ->untilLabel('To expiration date')
328
                     ->indicatorLabel('Due'),
328
                     ->indicatorLabel('Due'),
329
             ])
329
             ])
330
             ->actions([
330
             ->actions([
331
                 Tables\Actions\ActionGroup::make([
331
                 Tables\Actions\ActionGroup::make([
332
-                    Tables\Actions\EditAction::make(),
333
-                    Tables\Actions\ViewAction::make(),
332
+                    Tables\Actions\ActionGroup::make([
333
+                        Tables\Actions\EditAction::make(),
334
+                        Tables\Actions\ViewAction::make(),
335
+                        Estimate::getReplicateAction(Tables\Actions\ReplicateAction::class),
336
+                        Estimate::getApproveDraftAction(Tables\Actions\Action::class),
337
+                        Estimate::getMarkAsSentAction(Tables\Actions\Action::class),
338
+                        Estimate::getMarkAsAcceptedAction(Tables\Actions\Action::class),
339
+                        Estimate::getMarkAsDeclinedAction(Tables\Actions\Action::class),
340
+                        Estimate::getConvertToInvoiceAction(Tables\Actions\Action::class),
341
+                    ])->dropdown(false),
334
                     Tables\Actions\DeleteAction::make(),
342
                     Tables\Actions\DeleteAction::make(),
335
-                    Estimate::getReplicateAction(Tables\Actions\ReplicateAction::class),
336
-                    Estimate::getApproveDraftAction(Tables\Actions\Action::class),
337
-                    Estimate::getMarkAsSentAction(Tables\Actions\Action::class),
338
-                    Estimate::getMarkAsAcceptedAction(Tables\Actions\Action::class),
339
-                    Estimate::getMarkAsDeclinedAction(Tables\Actions\Action::class),
340
-                    Estimate::getConvertToInvoiceAction(Tables\Actions\Action::class),
341
                 ]),
343
                 ]),
342
             ])
344
             ])
343
             ->bulkActions([
345
             ->bulkActions([
347
                         ->label('Replicate')
349
                         ->label('Replicate')
348
                         ->modalWidth(MaxWidth::Large)
350
                         ->modalWidth(MaxWidth::Large)
349
                         ->modalDescription('Replicating estimates will also replicate their line items. Are you sure you want to proceed?')
351
                         ->modalDescription('Replicating estimates will also replicate their line items. Are you sure you want to proceed?')
350
-                        ->successNotificationTitle('Estimates Replicated Successfully')
351
-                        ->failureNotificationTitle('Failed to Replicate Estimates')
352
+                        ->successNotificationTitle('Estimates replicated successfully')
353
+                        ->failureNotificationTitle('Failed to replicate estimates')
352
                         ->databaseTransaction()
354
                         ->databaseTransaction()
353
                         ->deselectRecordsAfterCompletion()
355
                         ->deselectRecordsAfterCompletion()
354
                         ->excludeAttributes([
356
                         ->excludeAttributes([
386
                         ->label('Approve')
388
                         ->label('Approve')
387
                         ->icon('heroicon-o-check-circle')
389
                         ->icon('heroicon-o-check-circle')
388
                         ->databaseTransaction()
390
                         ->databaseTransaction()
389
-                        ->successNotificationTitle('Estimates Approved')
390
-                        ->failureNotificationTitle('Failed to Approve Estimates')
391
+                        ->successNotificationTitle('Estimates approved')
392
+                        ->failureNotificationTitle('Failed to approve estimates')
391
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
393
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
392
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeApproved());
394
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeApproved());
393
 
395
 
394
                             if ($isInvalid) {
396
                             if ($isInvalid) {
395
                                 Notification::make()
397
                                 Notification::make()
396
-                                    ->title('Approval Failed')
398
+                                    ->title('Approval failed')
397
                                     ->body('Only draft estimates can be approved. Please adjust your selection and try again.')
399
                                     ->body('Only draft estimates can be approved. Please adjust your selection and try again.')
398
                                     ->persistent()
400
                                     ->persistent()
399
                                     ->danger()
401
                                     ->danger()
410
                             $action->success();
412
                             $action->success();
411
                         }),
413
                         }),
412
                     Tables\Actions\BulkAction::make('markAsSent')
414
                     Tables\Actions\BulkAction::make('markAsSent')
413
-                        ->label('Mark as Sent')
415
+                        ->label('Mark as sent')
414
                         ->icon('heroicon-o-paper-airplane')
416
                         ->icon('heroicon-o-paper-airplane')
415
                         ->databaseTransaction()
417
                         ->databaseTransaction()
416
-                        ->successNotificationTitle('Estimates Sent')
417
-                        ->failureNotificationTitle('Failed to Mark Estimates as Sent')
418
+                        ->successNotificationTitle('Estimates sent')
419
+                        ->failureNotificationTitle('Failed to mark estimates as sent')
418
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
420
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
419
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeMarkedAsSent());
421
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeMarkedAsSent());
420
 
422
 
421
                             if ($isInvalid) {
423
                             if ($isInvalid) {
422
                                 Notification::make()
424
                                 Notification::make()
423
-                                    ->title('Sending Failed')
425
+                                    ->title('Sending failed')
424
                                     ->body('Only unsent estimates can be marked as sent. Please adjust your selection and try again.')
426
                                     ->body('Only unsent estimates can be marked as sent. Please adjust your selection and try again.')
425
                                     ->persistent()
427
                                     ->persistent()
426
                                     ->danger()
428
                                     ->danger()
437
                             $action->success();
439
                             $action->success();
438
                         }),
440
                         }),
439
                     Tables\Actions\BulkAction::make('markAsAccepted')
441
                     Tables\Actions\BulkAction::make('markAsAccepted')
440
-                        ->label('Mark as Accepted')
442
+                        ->label('Mark as accepted')
441
                         ->icon('heroicon-o-check-badge')
443
                         ->icon('heroicon-o-check-badge')
442
                         ->databaseTransaction()
444
                         ->databaseTransaction()
443
-                        ->successNotificationTitle('Estimates Accepted')
444
-                        ->failureNotificationTitle('Failed to Mark Estimates as Accepted')
445
+                        ->successNotificationTitle('Estimates accepted')
446
+                        ->failureNotificationTitle('Failed to mark estimates as accepted')
445
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
447
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
446
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeMarkedAsAccepted());
448
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeMarkedAsAccepted());
447
 
449
 
448
                             if ($isInvalid) {
450
                             if ($isInvalid) {
449
                                 Notification::make()
451
                                 Notification::make()
450
-                                    ->title('Acceptance Failed')
452
+                                    ->title('Acceptance failed')
451
                                     ->body('Only sent estimates that haven\'t been accepted can be marked as accepted. Please adjust your selection and try again.')
453
                                     ->body('Only sent estimates that haven\'t been accepted can be marked as accepted. Please adjust your selection and try again.')
452
                                     ->persistent()
454
                                     ->persistent()
453
                                     ->danger()
455
                                     ->danger()
464
                             $action->success();
466
                             $action->success();
465
                         }),
467
                         }),
466
                     Tables\Actions\BulkAction::make('markAsDeclined')
468
                     Tables\Actions\BulkAction::make('markAsDeclined')
467
-                        ->label('Mark as Declined')
469
+                        ->label('Mark as declined')
468
                         ->icon('heroicon-o-x-circle')
470
                         ->icon('heroicon-o-x-circle')
469
                         ->requiresConfirmation()
471
                         ->requiresConfirmation()
470
                         ->databaseTransaction()
472
                         ->databaseTransaction()
471
                         ->color('danger')
473
                         ->color('danger')
472
                         ->modalHeading('Mark Estimates as Declined')
474
                         ->modalHeading('Mark Estimates as Declined')
473
                         ->modalDescription('Are you sure you want to mark the selected estimates as declined? This action cannot be undone.')
475
                         ->modalDescription('Are you sure you want to mark the selected estimates as declined? This action cannot be undone.')
474
-                        ->successNotificationTitle('Estimates Declined')
475
-                        ->failureNotificationTitle('Failed to Mark Estimates as Declined')
476
+                        ->successNotificationTitle('Estimates declined')
477
+                        ->failureNotificationTitle('Failed to mark estimates as declined')
476
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
478
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
477
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeMarkedAsDeclined());
479
                             $isInvalid = $records->contains(fn (Estimate $record) => ! $record->canBeMarkedAsDeclined());
478
 
480
 
479
                             if ($isInvalid) {
481
                             if ($isInvalid) {
480
                                 Notification::make()
482
                                 Notification::make()
481
-                                    ->title('Declination Failed')
483
+                                    ->title('Declination failed')
482
                                     ->body('Only sent estimates that haven\'t been declined can be marked as declined. Please adjust your selection and try again.')
484
                                     ->body('Only sent estimates that haven\'t been declined can be marked as declined. Please adjust your selection and try again.')
483
                                     ->persistent()
485
                                     ->persistent()
484
                                     ->danger()
486
                                     ->danger()

+ 15
- 11
app/Filament/Company/Resources/Sales/EstimateResource/Pages/ViewEstimate.php View File

34
     protected function getHeaderActions(): array
34
     protected function getHeaderActions(): array
35
     {
35
     {
36
         return [
36
         return [
37
+            Actions\EditAction::make()
38
+                ->label('Edit estimate')
39
+                ->outlined(),
37
             Actions\ActionGroup::make([
40
             Actions\ActionGroup::make([
38
-                Actions\EditAction::make(),
41
+                Actions\ActionGroup::make([
42
+                    Estimate::getApproveDraftAction(),
43
+                    Estimate::getMarkAsSentAction(),
44
+                    Estimate::getMarkAsAcceptedAction(),
45
+                    Estimate::getMarkAsDeclinedAction(),
46
+                    Estimate::getReplicateAction(),
47
+                    Estimate::getConvertToInvoiceAction(),
48
+                ])->dropdown(false),
39
                 Actions\DeleteAction::make(),
49
                 Actions\DeleteAction::make(),
40
-                Estimate::getApproveDraftAction(),
41
-                Estimate::getMarkAsSentAction(),
42
-                Estimate::getMarkAsAcceptedAction(),
43
-                Estimate::getMarkAsDeclinedAction(),
44
-                Estimate::getReplicateAction(),
45
-                Estimate::getConvertToInvoiceAction(),
46
             ])
50
             ])
47
                 ->label('Actions')
51
                 ->label('Actions')
48
                 ->button()
52
                 ->button()
73
                                     ->weight(FontWeight::SemiBold)
77
                                     ->weight(FontWeight::SemiBold)
74
                                     ->url(static fn (Estimate $record) => ClientResource::getUrl('edit', ['record' => $record->client_id])),
78
                                     ->url(static fn (Estimate $record) => ClientResource::getUrl('edit', ['record' => $record->client_id])),
75
                                 TextEntry::make('expiration_date')
79
                                 TextEntry::make('expiration_date')
76
-                                    ->label('Expiration Date')
80
+                                    ->label('Expiration date')
77
                                     ->asRelativeDay(),
81
                                     ->asRelativeDay(),
78
                                 TextEntry::make('approved_at')
82
                                 TextEntry::make('approved_at')
79
-                                    ->label('Approved At')
83
+                                    ->label('Approved at')
80
                                     ->placeholder('Not Approved')
84
                                     ->placeholder('Not Approved')
81
                                     ->date(),
85
                                     ->date(),
82
                                 TextEntry::make('last_sent_at')
86
                                 TextEntry::make('last_sent_at')
83
-                                    ->label('Last Sent')
87
+                                    ->label('Last sent')
84
                                     ->placeholder('Never')
88
                                     ->placeholder('Never')
85
                                     ->date(),
89
                                     ->date(),
86
                                 TextEntry::make('accepted_at')
90
                                 TextEntry::make('accepted_at')
87
-                                    ->label('Accepted At')
91
+                                    ->label('Accepted at')
88
                                     ->placeholder('Not Accepted')
92
                                     ->placeholder('Not Accepted')
89
                                     ->date(),
93
                                     ->date(),
90
                             ])->columnSpan(1),
94
                             ])->columnSpan(1),

+ 110
- 108
app/Filament/Company/Resources/Sales/InvoiceResource.php View File

123
                             ]),
123
                             ]),
124
                             Forms\Components\Group::make([
124
                             Forms\Components\Group::make([
125
                                 Forms\Components\TextInput::make('invoice_number')
125
                                 Forms\Components\TextInput::make('invoice_number')
126
-                                    ->label('Invoice Number')
126
+                                    ->label('Invoice number')
127
                                     ->default(fn () => Invoice::getNextDocumentNumber()),
127
                                     ->default(fn () => Invoice::getNextDocumentNumber()),
128
                                 Forms\Components\TextInput::make('order_number')
128
                                 Forms\Components\TextInput::make('order_number')
129
                                     ->label('P.O/S.O Number'),
129
                                     ->label('P.O/S.O Number'),
130
                                 Forms\Components\DatePicker::make('date')
130
                                 Forms\Components\DatePicker::make('date')
131
-                                    ->label('Invoice Date')
131
+                                    ->label('Invoice date')
132
                                     ->live()
132
                                     ->live()
133
                                     ->default(now())
133
                                     ->default(now())
134
                                     ->disabled(function (?Invoice $record) {
134
                                     ->disabled(function (?Invoice $record) {
143
                                         }
143
                                         }
144
                                     }),
144
                                     }),
145
                                 Forms\Components\DatePicker::make('due_date')
145
                                 Forms\Components\DatePicker::make('due_date')
146
-                                    ->label('Payment Due')
146
+                                    ->label('Payment due')
147
                                     ->default(function () use ($company) {
147
                                     ->default(function () use ($company) {
148
                                         return now()->addDays($company->defaultInvoice->payment_terms->getDays());
148
                                         return now()->addDays($company->defaultInvoice->payment_terms->getDays());
149
                                     })
149
                                     })
151
                                         return $get('date') ?? now();
151
                                         return $get('date') ?? now();
152
                                     }),
152
                                     }),
153
                                 Forms\Components\Select::make('discount_method')
153
                                 Forms\Components\Select::make('discount_method')
154
-                                    ->label('Discount Method')
154
+                                    ->label('Discount method')
155
                                     ->options(DocumentDiscountMethod::class)
155
                                     ->options(DocumentDiscountMethod::class)
156
                                     ->selectablePlaceholder(false)
156
                                     ->selectablePlaceholder(false)
157
                                     ->default(DocumentDiscountMethod::PerLineItem)
157
                                     ->default(DocumentDiscountMethod::PerLineItem)
342
                     ->toggleable()
342
                     ->toggleable()
343
                     ->alignEnd(),
343
                     ->alignEnd(),
344
                 Tables\Columns\TextColumn::make('amount_paid')
344
                 Tables\Columns\TextColumn::make('amount_paid')
345
-                    ->label('Amount Paid')
345
+                    ->label('Amount paid')
346
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
346
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
347
                     ->sortable()
347
                     ->sortable()
348
                     ->alignEnd()
348
                     ->alignEnd()
349
                     ->showOnTabs(['unpaid']),
349
                     ->showOnTabs(['unpaid']),
350
                 Tables\Columns\TextColumn::make('amount_due')
350
                 Tables\Columns\TextColumn::make('amount_due')
351
-                    ->label('Amount Due')
351
+                    ->label('Amount due')
352
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
352
                     ->currencyWithConversion(static fn (Invoice $record) => $record->currency_code)
353
                     ->sortable()
353
                     ->sortable()
354
                     ->alignEnd()
354
                     ->alignEnd()
363
                     ->options(InvoiceStatus::class)
363
                     ->options(InvoiceStatus::class)
364
                     ->native(false),
364
                     ->native(false),
365
                 Tables\Filters\TernaryFilter::make('has_payments')
365
                 Tables\Filters\TernaryFilter::make('has_payments')
366
-                    ->label('Has Payments')
366
+                    ->label('Has payments')
367
                     ->queries(
367
                     ->queries(
368
                         true: fn (Builder $query) => $query->whereHas('payments'),
368
                         true: fn (Builder $query) => $query->whereHas('payments'),
369
                         false: fn (Builder $query) => $query->whereDoesntHave('payments'),
369
                         false: fn (Builder $query) => $query->whereDoesntHave('payments'),
370
                     ),
370
                     ),
371
                 Tables\Filters\SelectFilter::make('source_type')
371
                 Tables\Filters\SelectFilter::make('source_type')
372
-                    ->label('Source Type')
372
+                    ->label('Source type')
373
                     ->options([
373
                     ->options([
374
                         DocumentType::Estimate->value => DocumentType::Estimate->getLabel(),
374
                         DocumentType::Estimate->value => DocumentType::Estimate->getLabel(),
375
                         DocumentType::RecurringInvoice->value => DocumentType::RecurringInvoice->getLabel(),
375
                         DocumentType::RecurringInvoice->value => DocumentType::RecurringInvoice->getLabel(),
385
                         };
385
                         };
386
                     }),
386
                     }),
387
                 DateRangeFilter::make('date')
387
                 DateRangeFilter::make('date')
388
-                    ->fromLabel('From Date')
389
-                    ->untilLabel('To Date')
388
+                    ->fromLabel('From date')
389
+                    ->untilLabel('To date')
390
                     ->indicatorLabel('Date'),
390
                     ->indicatorLabel('Date'),
391
                 DateRangeFilter::make('due_date')
391
                 DateRangeFilter::make('due_date')
392
-                    ->fromLabel('From Due Date')
393
-                    ->untilLabel('To Due Date')
392
+                    ->fromLabel('From due date')
393
+                    ->untilLabel('To due date')
394
                     ->indicatorLabel('Due'),
394
                     ->indicatorLabel('Due'),
395
             ])
395
             ])
396
             ->actions([
396
             ->actions([
397
                 Tables\Actions\ActionGroup::make([
397
                 Tables\Actions\ActionGroup::make([
398
-                    Tables\Actions\EditAction::make()
399
-                        ->url(static fn (Invoice $record) => Pages\EditInvoice::getUrl(['record' => $record])),
400
-                    Tables\Actions\ViewAction::make()
401
-                        ->url(static fn (Invoice $record) => Pages\ViewInvoice::getUrl(['record' => $record])),
402
-                    Tables\Actions\DeleteAction::make(),
403
-                    Invoice::getReplicateAction(Tables\Actions\ReplicateAction::class),
404
-                    Invoice::getApproveDraftAction(Tables\Actions\Action::class),
405
-                    Invoice::getMarkAsSentAction(Tables\Actions\Action::class),
406
-                    Tables\Actions\Action::make('recordPayment')
407
-                        ->label(fn (Invoice $record) => $record->status === InvoiceStatus::Overpaid ? 'Refund Overpayment' : 'Record Payment')
408
-                        ->stickyModalHeader()
409
-                        ->stickyModalFooter()
410
-                        ->modalFooterActionsAlignment(Alignment::End)
411
-                        ->modalWidth(MaxWidth::TwoExtraLarge)
412
-                        ->icon('heroicon-o-credit-card')
413
-                        ->visible(function (Invoice $record) {
414
-                            return $record->canRecordPayment();
415
-                        })
416
-                        ->mountUsing(function (Invoice $record, Form $form) {
417
-                            $form->fill([
418
-                                'posted_at' => now(),
419
-                                'amount' => $record->status === InvoiceStatus::Overpaid ? ltrim($record->amount_due, '-') : $record->amount_due,
420
-                            ]);
421
-                        })
422
-                        ->databaseTransaction()
423
-                        ->successNotificationTitle('Payment Recorded')
424
-                        ->form([
425
-                            Forms\Components\DatePicker::make('posted_at')
426
-                                ->label('Date'),
427
-                            Forms\Components\TextInput::make('amount')
428
-                                ->label('Amount')
429
-                                ->required()
430
-                                ->money(fn (Invoice $record) => $record->currency_code)
431
-                                ->live(onBlur: true)
432
-                                ->helperText(function (Invoice $record, $state) {
433
-                                    $invoiceCurrency = $record->currency_code;
434
-                                    if (! CurrencyConverter::isValidAmount($state, $invoiceCurrency)) {
435
-                                        return null;
436
-                                    }
437
-
438
-                                    $amountDue = $record->getRawOriginal('amount_due');
439
-
440
-                                    $amount = CurrencyConverter::convertToCents($state, $invoiceCurrency);
441
-
442
-                                    if ($amount <= 0) {
443
-                                        return 'Please enter a valid positive amount';
444
-                                    }
445
-
446
-                                    if ($record->status === InvoiceStatus::Overpaid) {
447
-                                        $newAmountDue = $amountDue + $amount;
448
-                                    } else {
449
-                                        $newAmountDue = $amountDue - $amount;
450
-                                    }
451
-
452
-                                    return match (true) {
453
-                                        $newAmountDue > 0 => 'Amount due after payment will be ' . CurrencyConverter::formatCentsToMoney($newAmountDue, $invoiceCurrency),
454
-                                        $newAmountDue === 0 => 'Invoice will be fully paid',
455
-                                        default => 'Invoice will be overpaid by ' . CurrencyConverter::formatCentsToMoney(abs($newAmountDue), $invoiceCurrency),
456
-                                    };
457
-                                })
458
-                                ->rules([
459
-                                    static fn (Invoice $record): Closure => static function (string $attribute, $value, Closure $fail) use ($record) {
460
-                                        if (! CurrencyConverter::isValidAmount($value, $record->currency_code)) {
461
-                                            $fail('Please enter a valid amount');
398
+                    Tables\Actions\ActionGroup::make([
399
+                        Tables\Actions\EditAction::make()
400
+                            ->url(static fn (Invoice $record) => Pages\EditInvoice::getUrl(['record' => $record])),
401
+                        Tables\Actions\ViewAction::make()
402
+                            ->url(static fn (Invoice $record) => Pages\ViewInvoice::getUrl(['record' => $record])),
403
+                        Invoice::getReplicateAction(Tables\Actions\ReplicateAction::class),
404
+                        Invoice::getApproveDraftAction(Tables\Actions\Action::class),
405
+                        Invoice::getMarkAsSentAction(Tables\Actions\Action::class),
406
+                        Tables\Actions\Action::make('recordPayment')
407
+                            ->label(fn (Invoice $record) => $record->status === InvoiceStatus::Overpaid ? 'Refund Overpayment' : 'Record Payment')
408
+                            ->stickyModalHeader()
409
+                            ->stickyModalFooter()
410
+                            ->modalFooterActionsAlignment(Alignment::End)
411
+                            ->modalWidth(MaxWidth::TwoExtraLarge)
412
+                            ->icon('heroicon-o-credit-card')
413
+                            ->visible(function (Invoice $record) {
414
+                                return $record->canRecordPayment();
415
+                            })
416
+                            ->mountUsing(function (Invoice $record, Form $form) {
417
+                                $form->fill([
418
+                                    'posted_at' => now(),
419
+                                    'amount' => $record->status === InvoiceStatus::Overpaid ? ltrim($record->amount_due, '-') : $record->amount_due,
420
+                                ]);
421
+                            })
422
+                            ->databaseTransaction()
423
+                            ->successNotificationTitle('Payment recorded')
424
+                            ->form([
425
+                                Forms\Components\DatePicker::make('posted_at')
426
+                                    ->label('Date'),
427
+                                Forms\Components\TextInput::make('amount')
428
+                                    ->label('Amount')
429
+                                    ->required()
430
+                                    ->money(fn (Invoice $record) => $record->currency_code)
431
+                                    ->live(onBlur: true)
432
+                                    ->helperText(function (Invoice $record, $state) {
433
+                                        $invoiceCurrency = $record->currency_code;
434
+                                        if (! CurrencyConverter::isValidAmount($state, $invoiceCurrency)) {
435
+                                            return null;
462
                                         }
436
                                         }
463
-                                    },
464
-                                ]),
465
-                            Forms\Components\Select::make('payment_method')
466
-                                ->label('Payment Method')
467
-                                ->required()
468
-                                ->options(PaymentMethod::class),
469
-                            Forms\Components\Select::make('bank_account_id')
470
-                                ->label('Account')
471
-                                ->required()
472
-                                ->options(BankAccount::query()
473
-                                    ->get()
474
-                                    ->pluck('account.name', 'id'))
475
-                                ->searchable(),
476
-                            Forms\Components\Textarea::make('notes')
477
-                                ->label('Notes'),
478
-                        ])
479
-                        ->action(function (Invoice $record, Tables\Actions\Action $action, array $data) {
480
-                            $record->recordPayment($data);
481
 
437
 
482
-                            $action->success();
483
-                        }),
438
+                                        $amountDue = $record->getRawOriginal('amount_due');
439
+
440
+                                        $amount = CurrencyConverter::convertToCents($state, $invoiceCurrency);
441
+
442
+                                        if ($amount <= 0) {
443
+                                            return 'Please enter a valid positive amount';
444
+                                        }
445
+
446
+                                        if ($record->status === InvoiceStatus::Overpaid) {
447
+                                            $newAmountDue = $amountDue + $amount;
448
+                                        } else {
449
+                                            $newAmountDue = $amountDue - $amount;
450
+                                        }
451
+
452
+                                        return match (true) {
453
+                                            $newAmountDue > 0 => 'Amount due after payment will be ' . CurrencyConverter::formatCentsToMoney($newAmountDue, $invoiceCurrency),
454
+                                            $newAmountDue === 0 => 'Invoice will be fully paid',
455
+                                            default => 'Invoice will be overpaid by ' . CurrencyConverter::formatCentsToMoney(abs($newAmountDue), $invoiceCurrency),
456
+                                        };
457
+                                    })
458
+                                    ->rules([
459
+                                        static fn (Invoice $record): Closure => static function (string $attribute, $value, Closure $fail) use ($record) {
460
+                                            if (! CurrencyConverter::isValidAmount($value, $record->currency_code)) {
461
+                                                $fail('Please enter a valid amount');
462
+                                            }
463
+                                        },
464
+                                    ]),
465
+                                Forms\Components\Select::make('payment_method')
466
+                                    ->label('Payment method')
467
+                                    ->required()
468
+                                    ->options(PaymentMethod::class),
469
+                                Forms\Components\Select::make('bank_account_id')
470
+                                    ->label('Account')
471
+                                    ->required()
472
+                                    ->options(BankAccount::query()
473
+                                        ->get()
474
+                                        ->pluck('account.name', 'id'))
475
+                                    ->searchable(),
476
+                                Forms\Components\Textarea::make('notes')
477
+                                    ->label('Notes'),
478
+                            ])
479
+                            ->action(function (Invoice $record, Tables\Actions\Action $action, array $data) {
480
+                                $record->recordPayment($data);
481
+
482
+                                $action->success();
483
+                            }),
484
+                    ])->dropdown(false),
485
+                    Tables\Actions\DeleteAction::make(),
484
                 ]),
486
                 ]),
485
             ])
487
             ])
486
             ->bulkActions([
488
             ->bulkActions([
490
                         ->label('Replicate')
492
                         ->label('Replicate')
491
                         ->modalWidth(MaxWidth::Large)
493
                         ->modalWidth(MaxWidth::Large)
492
                         ->modalDescription('Replicating invoices will also replicate their line items. Are you sure you want to proceed?')
494
                         ->modalDescription('Replicating invoices will also replicate their line items. Are you sure you want to proceed?')
493
-                        ->successNotificationTitle('Invoices Replicated Successfully')
494
-                        ->failureNotificationTitle('Failed to Replicate Invoices')
495
+                        ->successNotificationTitle('Invoices replicated successfully')
496
+                        ->failureNotificationTitle('Failed to replicate invoices')
495
                         ->databaseTransaction()
497
                         ->databaseTransaction()
496
                         ->deselectRecordsAfterCompletion()
498
                         ->deselectRecordsAfterCompletion()
497
                         ->excludeAttributes([
499
                         ->excludeAttributes([
529
                         ->label('Approve')
531
                         ->label('Approve')
530
                         ->icon('heroicon-o-check-circle')
532
                         ->icon('heroicon-o-check-circle')
531
                         ->databaseTransaction()
533
                         ->databaseTransaction()
532
-                        ->successNotificationTitle('Invoices Approved')
534
+                        ->successNotificationTitle('Invoices approved')
533
                         ->failureNotificationTitle('Failed to Approve Invoices')
535
                         ->failureNotificationTitle('Failed to Approve Invoices')
534
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
536
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
535
                             $isInvalid = $records->contains(fn (Invoice $record) => ! $record->canBeApproved());
537
                             $isInvalid = $records->contains(fn (Invoice $record) => ! $record->canBeApproved());
536
 
538
 
537
                             if ($isInvalid) {
539
                             if ($isInvalid) {
538
                                 Notification::make()
540
                                 Notification::make()
539
-                                    ->title('Approval Failed')
541
+                                    ->title('Approval failed')
540
                                     ->body('Only draft invoices can be approved. Please adjust your selection and try again.')
542
                                     ->body('Only draft invoices can be approved. Please adjust your selection and try again.')
541
                                     ->persistent()
543
                                     ->persistent()
542
                                     ->danger()
544
                                     ->danger()
553
                             $action->success();
555
                             $action->success();
554
                         }),
556
                         }),
555
                     Tables\Actions\BulkAction::make('markAsSent')
557
                     Tables\Actions\BulkAction::make('markAsSent')
556
-                        ->label('Mark as Sent')
558
+                        ->label('Mark as sent')
557
                         ->icon('heroicon-o-paper-airplane')
559
                         ->icon('heroicon-o-paper-airplane')
558
                         ->databaseTransaction()
560
                         ->databaseTransaction()
559
-                        ->successNotificationTitle('Invoices Sent')
561
+                        ->successNotificationTitle('Invoices sent')
560
                         ->failureNotificationTitle('Failed to Mark Invoices as Sent')
562
                         ->failureNotificationTitle('Failed to Mark Invoices as Sent')
561
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
563
                         ->before(function (Collection $records, Tables\Actions\BulkAction $action) {
562
                             $isInvalid = $records->contains(fn (Invoice $record) => ! $record->canBeMarkedAsSent());
564
                             $isInvalid = $records->contains(fn (Invoice $record) => ! $record->canBeMarkedAsSent());
563
 
565
 
564
                             if ($isInvalid) {
566
                             if ($isInvalid) {
565
                                 Notification::make()
567
                                 Notification::make()
566
-                                    ->title('Sending Failed')
568
+                                    ->title('Sending failed')
567
                                     ->body('Only unsent invoices can be marked as sent. Please adjust your selection and try again.')
569
                                     ->body('Only unsent invoices can be marked as sent. Please adjust your selection and try again.')
568
                                     ->persistent()
570
                                     ->persistent()
569
                                     ->danger()
571
                                     ->danger()
580
                             $action->success();
582
                             $action->success();
581
                         }),
583
                         }),
582
                     Tables\Actions\BulkAction::make('recordPayments')
584
                     Tables\Actions\BulkAction::make('recordPayments')
583
-                        ->label('Record Payments')
585
+                        ->label('Record payments')
584
                         ->icon('heroicon-o-credit-card')
586
                         ->icon('heroicon-o-credit-card')
585
                         ->stickyModalHeader()
587
                         ->stickyModalHeader()
586
                         ->stickyModalFooter()
588
                         ->stickyModalFooter()
587
                         ->modalFooterActionsAlignment(Alignment::End)
589
                         ->modalFooterActionsAlignment(Alignment::End)
588
                         ->modalWidth(MaxWidth::TwoExtraLarge)
590
                         ->modalWidth(MaxWidth::TwoExtraLarge)
589
                         ->databaseTransaction()
591
                         ->databaseTransaction()
590
-                        ->successNotificationTitle('Payments Recorded')
592
+                        ->successNotificationTitle('Payments recorded')
591
                         ->failureNotificationTitle('Failed to Record Payments')
593
                         ->failureNotificationTitle('Failed to Record Payments')
592
                         ->deselectRecordsAfterCompletion()
594
                         ->deselectRecordsAfterCompletion()
593
                         ->beforeFormFilled(function (Collection $records, Tables\Actions\BulkAction $action) {
595
                         ->beforeFormFilled(function (Collection $records, Tables\Actions\BulkAction $action) {
595
 
597
 
596
                             if ($isInvalid) {
598
                             if ($isInvalid) {
597
                                 Notification::make()
599
                                 Notification::make()
598
-                                    ->title('Payment Recording Failed')
600
+                                    ->title('Payment recording failed')
599
                                     ->body('Invoices that are either draft, paid, overpaid, voided, or are in a foreign currency cannot be processed through bulk payments. Please adjust your selection and try again.')
601
                                     ->body('Invoices that are either draft, paid, overpaid, voided, or are in a foreign currency cannot be processed through bulk payments. Please adjust your selection and try again.')
600
                                     ->persistent()
602
                                     ->persistent()
601
                                     ->danger()
603
                                     ->danger()
627
                                     },
629
                                     },
628
                                 ]),
630
                                 ]),
629
                             Forms\Components\Select::make('payment_method')
631
                             Forms\Components\Select::make('payment_method')
630
-                                ->label('Payment Method')
632
+                                ->label('Payment method')
631
                                 ->required()
633
                                 ->required()
632
                                 ->options(PaymentMethod::class),
634
                                 ->options(PaymentMethod::class),
633
                             Forms\Components\Select::make('bank_account_id')
635
                             Forms\Components\Select::make('bank_account_id')
648
                                 $formattedTotalAmountDue = CurrencyConverter::formatCentsToMoney($totalAmountDue);
650
                                 $formattedTotalAmountDue = CurrencyConverter::formatCentsToMoney($totalAmountDue);
649
 
651
 
650
                                 Notification::make()
652
                                 Notification::make()
651
-                                    ->title('Excess Payment Amount')
653
+                                    ->title('Excess payment amount')
652
                                     ->body("The payment amount exceeds the total amount due of {$formattedTotalAmountDue}. Please adjust the payment amount and try again.")
654
                                     ->body("The payment amount exceeds the total amount due of {$formattedTotalAmountDue}. Please adjust the payment amount and try again.")
653
                                     ->persistent()
655
                                     ->persistent()
654
                                     ->warning()
656
                                     ->warning()

+ 1
- 1
app/Filament/Company/Resources/Sales/InvoiceResource/Pages/ListInvoices.php View File

68
                     ->visible(fn () => ! empty($this->recurringInvoice))
68
                     ->visible(fn () => ! empty($this->recurringInvoice))
69
                     ->actions([
69
                     ->actions([
70
                         Action::make('clearFilter')
70
                         Action::make('clearFilter')
71
-                            ->label('Clear Filter')
71
+                            ->label('Clear filter')
72
                             ->button()
72
                             ->button()
73
                             ->outlined()
73
                             ->outlined()
74
                             ->action('clearFilter'),
74
                             ->action('clearFilter'),

+ 12
- 8
app/Filament/Company/Resources/Sales/InvoiceResource/Pages/ViewInvoice.php View File

34
     protected function getHeaderActions(): array
34
     protected function getHeaderActions(): array
35
     {
35
     {
36
         return [
36
         return [
37
+            Actions\EditAction::make()
38
+                ->label('Edit invoice')
39
+                ->outlined(),
37
             Actions\ActionGroup::make([
40
             Actions\ActionGroup::make([
38
-                Actions\EditAction::make(),
41
+                Actions\ActionGroup::make([
42
+                    Invoice::getApproveDraftAction(),
43
+                    Invoice::getMarkAsSentAction(),
44
+                    Invoice::getReplicateAction(),
45
+                ])->dropdown(false),
39
                 Actions\DeleteAction::make(),
46
                 Actions\DeleteAction::make(),
40
-                Invoice::getApproveDraftAction(),
41
-                Invoice::getMarkAsSentAction(),
42
-                Invoice::getReplicateAction(),
43
             ])
47
             ])
44
                 ->label('Actions')
48
                 ->label('Actions')
45
                 ->button()
49
                 ->button()
70
                                     ->weight(FontWeight::SemiBold)
74
                                     ->weight(FontWeight::SemiBold)
71
                                     ->url(static fn (Invoice $record) => ClientResource::getUrl('edit', ['record' => $record->client_id])),
75
                                     ->url(static fn (Invoice $record) => ClientResource::getUrl('edit', ['record' => $record->client_id])),
72
                                 TextEntry::make('amount_due')
76
                                 TextEntry::make('amount_due')
73
-                                    ->label('Amount Due')
77
+                                    ->label('Amount due')
74
                                     ->currency(static fn (Invoice $record) => $record->currency_code),
78
                                     ->currency(static fn (Invoice $record) => $record->currency_code),
75
                                 TextEntry::make('due_date')
79
                                 TextEntry::make('due_date')
76
                                     ->label('Due')
80
                                     ->label('Due')
77
                                     ->asRelativeDay(),
81
                                     ->asRelativeDay(),
78
                                 TextEntry::make('approved_at')
82
                                 TextEntry::make('approved_at')
79
-                                    ->label('Approved At')
83
+                                    ->label('Approved at')
80
                                     ->placeholder('Not Approved')
84
                                     ->placeholder('Not Approved')
81
                                     ->date(),
85
                                     ->date(),
82
                                 TextEntry::make('last_sent_at')
86
                                 TextEntry::make('last_sent_at')
83
-                                    ->label('Last Sent')
87
+                                    ->label('Last sent')
84
                                     ->placeholder('Never')
88
                                     ->placeholder('Never')
85
                                     ->date(),
89
                                     ->date(),
86
                                 TextEntry::make('paid_at')
90
                                 TextEntry::make('paid_at')
87
-                                    ->label('Paid At')
91
+                                    ->label('Paid at')
88
                                     ->placeholder('Not Paid')
92
                                     ->placeholder('Not Paid')
89
                                     ->date(),
93
                                     ->date(),
90
                             ])->columnSpan(1),
94
                             ])->columnSpan(1),

+ 2
- 2
app/Filament/Company/Resources/Sales/InvoiceResource/RelationManagers/PaymentsRelationManager.php View File

94
                         },
94
                         },
95
                     ]),
95
                     ]),
96
                 Forms\Components\Select::make('payment_method')
96
                 Forms\Components\Select::make('payment_method')
97
-                    ->label('Payment Method')
97
+                    ->label('Payment method')
98
                     ->required()
98
                     ->required()
99
                     ->options(PaymentMethod::class),
99
                     ->options(PaymentMethod::class),
100
                 Forms\Components\Select::make('bank_account_id')
100
                 Forms\Components\Select::make('bank_account_id')
161
                         ]);
161
                         ]);
162
                     })
162
                     })
163
                     ->databaseTransaction()
163
                     ->databaseTransaction()
164
-                    ->successNotificationTitle('Payment Recorded')
164
+                    ->successNotificationTitle('Payment recorded')
165
                     ->action(function (Tables\Actions\CreateAction $action, array $data) {
165
                     ->action(function (Tables\Actions\CreateAction $action, array $data) {
166
                         /** @var Invoice $record */
166
                         /** @var Invoice $record */
167
                         $record = $this->getOwnerRecord();
167
                         $record = $this->getOwnerRecord();

+ 12
- 10
app/Filament/Company/Resources/Sales/RecurringInvoiceResource.php View File

108
                             ]),
108
                             ]),
109
                             Forms\Components\Group::make([
109
                             Forms\Components\Group::make([
110
                                 Forms\Components\Placeholder::make('invoice_number')
110
                                 Forms\Components\Placeholder::make('invoice_number')
111
-                                    ->label('Invoice Number')
111
+                                    ->label('Invoice number')
112
                                     ->content('Auto-generated'),
112
                                     ->content('Auto-generated'),
113
                                 Forms\Components\TextInput::make('order_number')
113
                                 Forms\Components\TextInput::make('order_number')
114
                                     ->label('P.O/S.O Number'),
114
                                     ->label('P.O/S.O Number'),
115
                                 Forms\Components\Placeholder::make('date')
115
                                 Forms\Components\Placeholder::make('date')
116
-                                    ->label('Invoice Date')
116
+                                    ->label('Invoice date')
117
                                     ->content('Auto-generated'),
117
                                     ->content('Auto-generated'),
118
                                 Forms\Components\Select::make('payment_terms')
118
                                 Forms\Components\Select::make('payment_terms')
119
-                                    ->label('Payment Due')
119
+                                    ->label('Payment due')
120
                                     ->options(PaymentTerms::class)
120
                                     ->options(PaymentTerms::class)
121
                                     ->softRequired()
121
                                     ->softRequired()
122
                                     ->default($company->defaultInvoice->payment_terms)
122
                                     ->default($company->defaultInvoice->payment_terms)
123
                                     ->live(),
123
                                     ->live(),
124
                                 Forms\Components\Select::make('discount_method')
124
                                 Forms\Components\Select::make('discount_method')
125
-                                    ->label('Discount Method')
125
+                                    ->label('Discount method')
126
                                     ->options(DocumentDiscountMethod::class)
126
                                     ->options(DocumentDiscountMethod::class)
127
                                     ->selectablePlaceholder(false)
127
                                     ->selectablePlaceholder(false)
128
                                     ->default(DocumentDiscountMethod::PerLineItem)
128
                                     ->default(DocumentDiscountMethod::PerLineItem)
294
                     ->sortable()
294
                     ->sortable()
295
                     ->showOnTabs(['draft']),
295
                     ->showOnTabs(['draft']),
296
                 Tables\Columns\TextColumn::make('start_date')
296
                 Tables\Columns\TextColumn::make('start_date')
297
-                    ->label('First Invoice')
297
+                    ->label('First invoice')
298
                     ->date()
298
                     ->date()
299
                     ->sortable()
299
                     ->sortable()
300
                     ->showOnTabs(['draft']),
300
                     ->showOnTabs(['draft']),
301
                 Tables\Columns\TextColumn::make('last_date')
301
                 Tables\Columns\TextColumn::make('last_date')
302
-                    ->label('Last Invoice')
302
+                    ->label('Last invoice')
303
                     ->date()
303
                     ->date()
304
                     ->sortable()
304
                     ->sortable()
305
                     ->hideOnTabs(['draft']),
305
                     ->hideOnTabs(['draft']),
306
                 Tables\Columns\TextColumn::make('next_date')
306
                 Tables\Columns\TextColumn::make('next_date')
307
-                    ->label('Next Invoice')
307
+                    ->label('Next invoice')
308
                     ->date()
308
                     ->date()
309
                     ->sortable()
309
                     ->sortable()
310
                     ->hideOnTabs(['draft']),
310
                     ->hideOnTabs(['draft']),
325
             ])
325
             ])
326
             ->actions([
326
             ->actions([
327
                 Tables\Actions\ActionGroup::make([
327
                 Tables\Actions\ActionGroup::make([
328
-                    Tables\Actions\EditAction::make(),
329
-                    Tables\Actions\ViewAction::make(),
328
+                    Tables\Actions\ActionGroup::make([
329
+                        Tables\Actions\EditAction::make(),
330
+                        Tables\Actions\ViewAction::make(),
331
+                        RecurringInvoice::getManageScheduleAction(Tables\Actions\Action::class),
332
+                    ])->dropdown(false),
330
                     Tables\Actions\DeleteAction::make(),
333
                     Tables\Actions\DeleteAction::make(),
331
-                    RecurringInvoice::getUpdateScheduleAction(Tables\Actions\Action::class),
332
                 ]),
334
                 ]),
333
             ])
335
             ])
334
             ->bulkActions([
336
             ->bulkActions([

+ 16
- 12
app/Filament/Company/Resources/Sales/RecurringInvoiceResource/Pages/ViewRecurringInvoice.php View File

34
     protected function getHeaderActions(): array
34
     protected function getHeaderActions(): array
35
     {
35
     {
36
         return [
36
         return [
37
+            Actions\EditAction::make()
38
+                ->label('Edit recurring invoice')
39
+                ->outlined(),
37
             Actions\ActionGroup::make([
40
             Actions\ActionGroup::make([
38
-                Actions\EditAction::make(),
41
+                Actions\ActionGroup::make([
42
+                    RecurringInvoice::getManageScheduleAction(),
43
+                    RecurringInvoice::getApproveDraftAction(),
44
+                ])->dropdown(false),
39
                 Actions\DeleteAction::make(),
45
                 Actions\DeleteAction::make(),
40
-                RecurringInvoice::getUpdateScheduleAction(),
41
-                RecurringInvoice::getApproveDraftAction(),
42
             ])
46
             ])
43
                 ->label('Actions')
47
                 ->label('Actions')
44
                 ->button()
48
                 ->button()
56
             ->schema([
60
             ->schema([
57
                 BannerEntry::make('scheduleIsNotSet')
61
                 BannerEntry::make('scheduleIsNotSet')
58
                     ->info()
62
                     ->info()
59
-                    ->title('Schedule Not Set')
63
+                    ->title('Schedule not set')
60
                     ->description('The schedule for this recurring invoice has not been set. You must set a schedule before you can approve this draft and start creating invoices.')
64
                     ->description('The schedule for this recurring invoice has not been set. You must set a schedule before you can approve this draft and start creating invoices.')
61
                     ->visible(fn (RecurringInvoice $record) => ! $record->hasValidStartDate())
65
                     ->visible(fn (RecurringInvoice $record) => ! $record->hasValidStartDate())
62
                     ->columnSpanFull()
66
                     ->columnSpanFull()
63
                     ->actions([
67
                     ->actions([
64
-                        RecurringInvoice::getUpdateScheduleAction(Action::class)
68
+                        RecurringInvoice::getManageScheduleAction(Action::class)
65
                             ->outlined(),
69
                             ->outlined(),
66
                     ]),
70
                     ]),
67
                 BannerEntry::make('readyToApprove')
71
                 BannerEntry::make('readyToApprove')
87
                                     ->weight(FontWeight::SemiBold)
91
                                     ->weight(FontWeight::SemiBold)
88
                                     ->url(static fn (RecurringInvoice $record) => ClientResource::getUrl('edit', ['record' => $record->client_id])),
92
                                     ->url(static fn (RecurringInvoice $record) => ClientResource::getUrl('edit', ['record' => $record->client_id])),
89
                                 TextEntry::make('last_date')
93
                                 TextEntry::make('last_date')
90
-                                    ->label('Last Invoice')
94
+                                    ->label('Last invoice')
91
                                     ->date()
95
                                     ->date()
92
                                     ->placeholder('Not Created'),
96
                                     ->placeholder('Not Created'),
93
                                 TextEntry::make('next_date')
97
                                 TextEntry::make('next_date')
94
-                                    ->label('Next Invoice')
98
+                                    ->label('Next invoice')
95
                                     ->placeholder('Not Scheduled')
99
                                     ->placeholder('Not Scheduled')
96
                                     ->date(),
100
                                     ->date(),
97
                                 TextEntry::make('schedule')
101
                                 TextEntry::make('schedule')
103
                                         return $record->getTimelineDescription();
107
                                         return $record->getTimelineDescription();
104
                                     }),
108
                                     }),
105
                                 TextEntry::make('occurrences_count')
109
                                 TextEntry::make('occurrences_count')
106
-                                    ->label('Created to Date')
110
+                                    ->label('Created to date')
107
                                     ->visible(static fn (RecurringInvoice $record) => $record->occurrences_count > 0)
111
                                     ->visible(static fn (RecurringInvoice $record) => $record->occurrences_count > 0)
108
                                     ->color('primary')
112
                                     ->color('primary')
109
                                     ->weight(FontWeight::SemiBold)
113
                                     ->weight(FontWeight::SemiBold)
112
                                         return ListInvoices::getUrl(['recurringInvoice' => $record->id]);
116
                                         return ListInvoices::getUrl(['recurringInvoice' => $record->id]);
113
                                     }),
117
                                     }),
114
                                 TextEntry::make('end_date')
118
                                 TextEntry::make('end_date')
115
-                                    ->label('Ends On')
119
+                                    ->label('Ends on')
116
                                     ->date()
120
                                     ->date()
117
                                     ->visible(fn (RecurringInvoice $record) => $record->end_type?->isOn()),
121
                                     ->visible(fn (RecurringInvoice $record) => $record->end_type?->isOn()),
118
                                 TextEntry::make('approved_at')
122
                                 TextEntry::make('approved_at')
119
-                                    ->label('Approved At')
123
+                                    ->label('Approved at')
120
                                     ->placeholder('Not Approved')
124
                                     ->placeholder('Not Approved')
121
                                     ->date(),
125
                                     ->date(),
122
                                 TextEntry::make('ended_at')
126
                                 TextEntry::make('ended_at')
123
-                                    ->label('Ended At')
127
+                                    ->label('Ended at')
124
                                     ->date()
128
                                     ->date()
125
                                     ->visible(fn (RecurringInvoice $record) => $record->ended_at),
129
                                     ->visible(fn (RecurringInvoice $record) => $record->ended_at),
126
                                 TextEntry::make('total')
130
                                 TextEntry::make('total')
127
-                                    ->label('Invoice Amount')
131
+                                    ->label('Invoice amount')
128
                                     ->currency(static fn (RecurringInvoice $record) => $record->currency_code),
132
                                     ->currency(static fn (RecurringInvoice $record) => $record->currency_code),
129
                             ])->columnSpan(1),
133
                             ])->columnSpan(1),
130
                         DocumentPreview::make()
134
                         DocumentPreview::make()

+ 3
- 3
app/Filament/Forms/Components/AddressFields.php View File

16
 
16
 
17
         $this->schema([
17
         $this->schema([
18
             TextInput::make('address_line_1')
18
             TextInput::make('address_line_1')
19
-                ->label('Address Line 1')
19
+                ->label('Address line 1')
20
                 ->required()
20
                 ->required()
21
                 ->maxLength(255),
21
                 ->maxLength(255),
22
             TextInput::make('address_line_2')
22
             TextInput::make('address_line_2')
23
-                ->label('Address Line 2')
23
+                ->label('Address line 2')
24
                 ->maxLength(255),
24
                 ->maxLength(255),
25
             CountrySelect::make('country_code')
25
             CountrySelect::make('country_code')
26
                 ->clearStateField()
26
                 ->clearStateField()
31
                 ->required()
31
                 ->required()
32
                 ->maxLength(255),
32
                 ->maxLength(255),
33
             TextInput::make('postal_code')
33
             TextInput::make('postal_code')
34
-                ->label('Postal Code / Zip Code')
34
+                ->label('Postal code')
35
                 ->maxLength(255),
35
                 ->maxLength(255),
36
         ]);
36
         ]);
37
     }
37
     }

+ 1
- 1
app/Filament/Forms/Components/CreateCurrencySelect.php View File

68
     protected function createCurrencyAction(Action $action): Action
68
     protected function createCurrencyAction(Action $action): Action
69
     {
69
     {
70
         return $action
70
         return $action
71
-            ->label('Add Currency')
71
+            ->label('Add currency')
72
             ->slideOver()
72
             ->slideOver()
73
             ->modalWidth(MaxWidth::Medium);
73
             ->modalWidth(MaxWidth::Medium);
74
     }
74
     }

+ 2
- 2
app/Filament/Forms/Components/DocumentTotals.php View File

21
 
21
 
22
         $this->schema([
22
         $this->schema([
23
             Select::make('discount_computation')
23
             Select::make('discount_computation')
24
-                ->label('Discount Computation')
24
+                ->label('Discount computation')
25
                 ->hiddenLabel()
25
                 ->hiddenLabel()
26
                 ->options(AdjustmentComputation::class)
26
                 ->options(AdjustmentComputation::class)
27
                 ->default(AdjustmentComputation::Percentage)
27
                 ->default(AdjustmentComputation::Percentage)
28
                 ->selectablePlaceholder(false)
28
                 ->selectablePlaceholder(false)
29
                 ->live(),
29
                 ->live(),
30
             TextInput::make('discount_rate')
30
             TextInput::make('discount_rate')
31
-                ->label('Discount Rate')
31
+                ->label('Discount rate')
32
                 ->hiddenLabel()
32
                 ->hiddenLabel()
33
                 ->live()
33
                 ->live()
34
                 ->extraInputAttributes(['class' => 'text-right'])
34
                 ->extraInputAttributes(['class' => 'text-right'])

+ 7
- 7
app/Livewire/Company/Service/ConnectedAccount/ListInstitutions.php View File

64
         return Action::make('startImportingTransactions')
64
         return Action::make('startImportingTransactions')
65
             ->link()
65
             ->link()
66
             ->icon('heroicon-o-cloud-arrow-down')
66
             ->icon('heroicon-o-cloud-arrow-down')
67
-            ->label('Start Importing Transactions')
67
+            ->label('Start importing transactions')
68
             ->modalWidth(fn () => $this->modalWidth)
68
             ->modalWidth(fn () => $this->modalWidth)
69
             ->modalFooterActionsAlignment(fn () => $this->modalWidth === 'screen' ? Alignment::Center : Alignment::Start)
69
             ->modalFooterActionsAlignment(fn () => $this->modalWidth === 'screen' ? Alignment::Center : Alignment::Start)
70
             ->stickyModalHeader()
70
             ->stickyModalHeader()
72
             ->record(fn (array $arguments) => ConnectedBankAccount::find($arguments['connectedBankAccount']))
72
             ->record(fn (array $arguments) => ConnectedBankAccount::find($arguments['connectedBankAccount']))
73
             ->form([
73
             ->form([
74
                 Placeholder::make('import_from')
74
                 Placeholder::make('import_from')
75
-                    ->label('Import Transactions From')
75
+                    ->label('Import transactions from')
76
                     ->content(static fn (ConnectedBankAccount $connectedBankAccount): View => view(
76
                     ->content(static fn (ConnectedBankAccount $connectedBankAccount): View => view(
77
                         'components.actions.transaction-import-modal',
77
                         'components.actions.transaction-import-modal',
78
                         compact('connectedBankAccount')
78
                         compact('connectedBankAccount')
82
                     ->visible(static fn (ConnectedBankAccount $connectedBankAccount) => $connectedBankAccount->bank_account_id === null)
82
                     ->visible(static fn (ConnectedBankAccount $connectedBankAccount) => $connectedBankAccount->bank_account_id === null)
83
                     ->content(static fn (ConnectedBankAccount $connectedBankAccount) => 'If ' . $connectedBankAccount->name . ' already has transactions for an existing account, select the account to import transactions into.'),
83
                     ->content(static fn (ConnectedBankAccount $connectedBankAccount) => 'If ' . $connectedBankAccount->name . ' already has transactions for an existing account, select the account to import transactions into.'),
84
                 Select::make('bank_account_id')
84
                 Select::make('bank_account_id')
85
-                    ->label('Select Account')
85
+                    ->label('Select account')
86
                     ->visible(static fn (ConnectedBankAccount $connectedBankAccount) => $connectedBankAccount->bank_account_id === null)
86
                     ->visible(static fn (ConnectedBankAccount $connectedBankAccount) => $connectedBankAccount->bank_account_id === null)
87
                     ->options(fn (ConnectedBankAccount $connectedBankAccount) => $this->getBankAccountOptions($connectedBankAccount))
87
                     ->options(fn (ConnectedBankAccount $connectedBankAccount) => $this->getBankAccountOptions($connectedBankAccount))
88
                     ->required(),
88
                     ->required(),
89
                 DatePicker::make('start_date')
89
                 DatePicker::make('start_date')
90
-                    ->label('Start Date')
90
+                    ->label('Start date')
91
                     ->required()
91
                     ->required()
92
                     ->placeholder('Select a start date for importing transactions.'),
92
                     ->placeholder('Select a start date for importing transactions.'),
93
             ])
93
             ])
126
         return Action::make('stopImportingTransactions')
126
         return Action::make('stopImportingTransactions')
127
             ->link()
127
             ->link()
128
             ->icon('heroicon-o-stop-circle')
128
             ->icon('heroicon-o-stop-circle')
129
-            ->label('Stop Importing Transactions')
129
+            ->label('Stop importing transactions')
130
             ->color('danger')
130
             ->color('danger')
131
             ->requiresConfirmation()
131
             ->requiresConfirmation()
132
             ->modalHeading('Stop Importing Transactions')
132
             ->modalHeading('Stop Importing Transactions')
164
                     ->hiddenLabel()
164
                     ->hiddenLabel()
165
                     ->content('Refreshing transactions will update the selected account with the latest transactions from the bank if there are any new transactions available. This may take a few moments.'),
165
                     ->content('Refreshing transactions will update the selected account with the latest transactions from the bank if there are any new transactions available. This may take a few moments.'),
166
                 Select::make('connected_bank_account_id')
166
                 Select::make('connected_bank_account_id')
167
-                    ->label('Select Account')
167
+                    ->label('Select account')
168
                     ->softRequired()
168
                     ->softRequired()
169
                     ->selectablePlaceholder(false)
169
                     ->selectablePlaceholder(false)
170
                     ->hint(
170
                     ->hint(
278
     public function sendErrorNotification(string $message): void
278
     public function sendErrorNotification(string $message): void
279
     {
279
     {
280
         Notification::make()
280
         Notification::make()
281
-            ->title('Hold On...')
281
+            ->title('Hold on...')
282
             ->danger()
282
             ->danger()
283
             ->body($message)
283
             ->body($message)
284
             ->persistent()
284
             ->persistent()

+ 6
- 6
app/Livewire/Company/Service/LiveCurrency/ListCompanyCurrencies.php View File

39
                     ->weight(FontWeight::Medium)
39
                     ->weight(FontWeight::Medium)
40
                     ->icon(static fn (Currency $record) => $record->isEnabled() ? 'heroicon-o-lock-closed' : null)
40
                     ->icon(static fn (Currency $record) => $record->isEnabled() ? 'heroicon-o-lock-closed' : null)
41
                     ->tooltip(function (Currency $record) {
41
                     ->tooltip(function (Currency $record) {
42
-                        $tooltipMessage = translate('Default :Record', [
43
-                            'Record' => $this->getTableModelLabel(),
42
+                        $tooltipMessage = translate('Default :record', [
43
+                            'record' => $this->getTableModelLabel(),
44
                         ]);
44
                         ]);
45
 
45
 
46
                         if ($record->isEnabled()) {
46
                         if ($record->isEnabled()) {
70
             ])
70
             ])
71
             ->actions([
71
             ->actions([
72
                 Tables\Actions\Action::make('update_rate')
72
                 Tables\Actions\Action::make('update_rate')
73
-                    ->label('Update Rate')
73
+                    ->label('Update rate')
74
                     ->icon('heroicon-o-arrow-path')
74
                     ->icon('heroicon-o-arrow-path')
75
                     ->hidden(static fn (Currency $record): bool => $record->isEnabled() || ($record->rate === $record->live_rate))
75
                     ->hidden(static fn (Currency $record): bool => $record->isEnabled() || ($record->rate === $record->live_rate))
76
                     ->requiresConfirmation()
76
                     ->requiresConfirmation()
82
 
82
 
83
                             Notification::make()
83
                             Notification::make()
84
                                 ->success()
84
                                 ->success()
85
-                                ->title('Exchange Rate Updated')
85
+                                ->title('Exchange rate updated')
86
                                 ->body(__('The exchange rate for :currency has been updated to reflect the current market rate.', [
86
                                 ->body(__('The exchange rate for :currency has been updated to reflect the current market rate.', [
87
                                     'currency' => $record->name,
87
                                     'currency' => $record->name,
88
                                 ]))
88
                                 ]))
92
             ])
92
             ])
93
             ->bulkActions([
93
             ->bulkActions([
94
                 Tables\Actions\BulkAction::make('update_rate')
94
                 Tables\Actions\BulkAction::make('update_rate')
95
-                    ->label('Update Rate')
95
+                    ->label('Update rate')
96
                     ->icon('heroicon-o-arrow-path')
96
                     ->icon('heroicon-o-arrow-path')
97
                     ->requiresConfirmation()
97
                     ->requiresConfirmation()
98
                     ->deselectRecordsAfterCompletion()
98
                     ->deselectRecordsAfterCompletion()
120
 
120
 
121
                             Notification::make()
121
                             Notification::make()
122
                                 ->success()
122
                                 ->success()
123
-                                ->title('Exchange Rates Updated')
123
+                                ->title('Exchange rates updated')
124
                                 ->body($message)
124
                                 ->body($message)
125
                                 ->send();
125
                                 ->send();
126
                         }
126
                         }

+ 11
- 11
app/Models/Accounting/Estimate.php View File

263
     {
263
     {
264
         return $action::make('approveDraft')
264
         return $action::make('approveDraft')
265
             ->label('Approve')
265
             ->label('Approve')
266
-            ->icon('heroicon-o-check-circle')
266
+            ->icon('heroicon-m-check-circle')
267
             ->visible(function (self $record) {
267
             ->visible(function (self $record) {
268
                 return $record->canBeApproved();
268
                 return $record->canBeApproved();
269
             })
269
             })
270
             ->databaseTransaction()
270
             ->databaseTransaction()
271
-            ->successNotificationTitle('Estimate Approved')
271
+            ->successNotificationTitle('Estimate approved')
272
             ->action(function (self $record, MountableAction $action) {
272
             ->action(function (self $record, MountableAction $action) {
273
                 $record->approveDraft();
273
                 $record->approveDraft();
274
 
274
 
279
     public static function getMarkAsSentAction(string $action = Action::class): MountableAction
279
     public static function getMarkAsSentAction(string $action = Action::class): MountableAction
280
     {
280
     {
281
         return $action::make('markAsSent')
281
         return $action::make('markAsSent')
282
-            ->label('Mark as Sent')
283
-            ->icon('heroicon-o-paper-airplane')
282
+            ->label('Mark as sent')
283
+            ->icon('heroicon-m-paper-airplane')
284
             ->visible(static function (self $record) {
284
             ->visible(static function (self $record) {
285
                 return $record->canBeMarkedAsSent();
285
                 return $record->canBeMarkedAsSent();
286
             })
286
             })
287
-            ->successNotificationTitle('Estimate Sent')
287
+            ->successNotificationTitle('Estimate sent')
288
             ->action(function (self $record, MountableAction $action) {
288
             ->action(function (self $record, MountableAction $action) {
289
                 $record->markAsSent();
289
                 $record->markAsSent();
290
 
290
 
351
     {
351
     {
352
         return $action::make('markAsAccepted')
352
         return $action::make('markAsAccepted')
353
             ->label('Mark as Accepted')
353
             ->label('Mark as Accepted')
354
-            ->icon('heroicon-o-check-badge')
354
+            ->icon('heroicon-m-check-badge')
355
             ->visible(static function (self $record) {
355
             ->visible(static function (self $record) {
356
                 return $record->canBeMarkedAsAccepted();
356
                 return $record->canBeMarkedAsAccepted();
357
             })
357
             })
358
             ->databaseTransaction()
358
             ->databaseTransaction()
359
-            ->successNotificationTitle('Estimate Accepted')
359
+            ->successNotificationTitle('Estimate accepted')
360
             ->action(function (self $record, MountableAction $action) {
360
             ->action(function (self $record, MountableAction $action) {
361
                 $record->markAsAccepted();
361
                 $record->markAsAccepted();
362
 
362
 
378
     {
378
     {
379
         return $action::make('markAsDeclined')
379
         return $action::make('markAsDeclined')
380
             ->label('Mark as Declined')
380
             ->label('Mark as Declined')
381
-            ->icon('heroicon-o-x-circle')
381
+            ->icon('heroicon-m-x-circle')
382
             ->visible(static function (self $record) {
382
             ->visible(static function (self $record) {
383
                 return $record->canBeMarkedAsDeclined();
383
                 return $record->canBeMarkedAsDeclined();
384
             })
384
             })
385
             ->color('danger')
385
             ->color('danger')
386
             ->requiresConfirmation()
386
             ->requiresConfirmation()
387
             ->databaseTransaction()
387
             ->databaseTransaction()
388
-            ->successNotificationTitle('Estimate Declined')
388
+            ->successNotificationTitle('Estimate declined')
389
             ->action(function (self $record, MountableAction $action) {
389
             ->action(function (self $record, MountableAction $action) {
390
                 $record->markAsDeclined();
390
                 $record->markAsDeclined();
391
 
391
 
407
     {
407
     {
408
         return $action::make('convertToInvoice')
408
         return $action::make('convertToInvoice')
409
             ->label('Convert to Invoice')
409
             ->label('Convert to Invoice')
410
-            ->icon('heroicon-o-arrow-right-on-rectangle')
410
+            ->icon('heroicon-m-arrow-right-on-rectangle')
411
             ->visible(static function (self $record) {
411
             ->visible(static function (self $record) {
412
                 return $record->canBeConverted();
412
                 return $record->canBeConverted();
413
             })
413
             })
414
             ->databaseTransaction()
414
             ->databaseTransaction()
415
-            ->successNotificationTitle('Estimate Converted to Invoice')
415
+            ->successNotificationTitle('Estimate converted to invoice')
416
             ->action(function (self $record, MountableAction $action) {
416
             ->action(function (self $record, MountableAction $action) {
417
                 $record->convertToInvoice();
417
                 $record->convertToInvoice();
418
 
418
 

+ 5
- 5
app/Models/Accounting/Invoice.php View File

465
     {
465
     {
466
         return $action::make('approveDraft')
466
         return $action::make('approveDraft')
467
             ->label('Approve')
467
             ->label('Approve')
468
-            ->icon('heroicon-o-check-circle')
468
+            ->icon('heroicon-m-check-circle')
469
             ->visible(function (self $record) {
469
             ->visible(function (self $record) {
470
                 return $record->canBeApproved();
470
                 return $record->canBeApproved();
471
             })
471
             })
472
             ->databaseTransaction()
472
             ->databaseTransaction()
473
-            ->successNotificationTitle('Invoice Approved')
473
+            ->successNotificationTitle('Invoice approved')
474
             ->action(function (self $record, MountableAction $action) {
474
             ->action(function (self $record, MountableAction $action) {
475
                 $record->approveDraft();
475
                 $record->approveDraft();
476
 
476
 
481
     public static function getMarkAsSentAction(string $action = Action::class): MountableAction
481
     public static function getMarkAsSentAction(string $action = Action::class): MountableAction
482
     {
482
     {
483
         return $action::make('markAsSent')
483
         return $action::make('markAsSent')
484
-            ->label('Mark as Sent')
485
-            ->icon('heroicon-o-paper-airplane')
484
+            ->label('Mark as sent')
485
+            ->icon('heroicon-m-paper-airplane')
486
             ->visible(static function (self $record) {
486
             ->visible(static function (self $record) {
487
                 return $record->canBeMarkedAsSent();
487
                 return $record->canBeMarkedAsSent();
488
             })
488
             })
489
-            ->successNotificationTitle('Invoice Sent')
489
+            ->successNotificationTitle('Invoice sent')
490
             ->action(function (self $record, MountableAction $action) {
490
             ->action(function (self $record, MountableAction $action) {
491
                 $record->markAsSent();
491
                 $record->markAsSent();
492
 
492
 

+ 9
- 9
app/Models/Accounting/RecurringInvoice.php View File

379
         };
379
         };
380
     }
380
     }
381
 
381
 
382
-    public static function getUpdateScheduleAction(string $action = Action::class): MountableAction
382
+    public static function getManageScheduleAction(string $action = Action::class): MountableAction
383
     {
383
     {
384
-        return $action::make('updateSchedule')
385
-            ->label(fn (self $record) => $record->hasSchedule() ? 'Update Schedule' : 'Set Schedule')
386
-            ->icon('heroicon-o-calendar-date-range')
384
+        return $action::make('manageSchedule')
385
+            ->label(fn (self $record) => $record->hasSchedule() ? 'Edit schedule' : 'Set schedule')
386
+            ->icon('heroicon-m-calendar-date-range')
387
             ->slideOver()
387
             ->slideOver()
388
-            ->successNotificationTitle('Schedule Updated')
388
+            ->successNotificationTitle('Schedule saved')
389
             ->mountUsing(function (self $record, Form $form) {
389
             ->mountUsing(function (self $record, Form $form) {
390
                 $data = $record->attributesToArray();
390
                 $data = $record->attributesToArray();
391
 
391
 
492
                     ->contained(false)
492
                     ->contained(false)
493
                     ->schema([
493
                     ->schema([
494
                         Forms\Components\DatePicker::make('start_date')
494
                         Forms\Components\DatePicker::make('start_date')
495
-                            ->label('First Invoice Date')
495
+                            ->label('First invoice date')
496
                             ->softRequired()
496
                             ->softRequired()
497
                             ->live()
497
                             ->live()
498
                             ->minDate(today())
498
                             ->minDate(today())
506
                             $components = [];
506
                             $components = [];
507
 
507
 
508
                             $components[] = Forms\Components\Select::make('end_type')
508
                             $components[] = Forms\Components\Select::make('end_type')
509
-                                ->label('End Schedule')
509
+                                ->label('End schedule')
510
                                 ->options(EndType::class)
510
                                 ->options(EndType::class)
511
                                 ->softRequired()
511
                                 ->softRequired()
512
                                 ->live()
512
                                 ->live()
533
 
533
 
534
                             return [
534
                             return [
535
                                 Cluster::make($components)
535
                                 Cluster::make($components)
536
-                                    ->label('Schedule Ends')
536
+                                    ->label('Schedule ends')
537
                                     ->required()
537
                                     ->required()
538
                                     ->markAsRequired(false),
538
                                     ->markAsRequired(false),
539
                             ];
539
                             ];
562
                 return $record->canBeApproved();
562
                 return $record->canBeApproved();
563
             })
563
             })
564
             ->databaseTransaction()
564
             ->databaseTransaction()
565
-            ->successNotificationTitle('Recurring Invoice Approved')
565
+            ->successNotificationTitle('Recurring invoice approved')
566
             ->action(function (self $record, MountableAction $action) {
566
             ->action(function (self $record, MountableAction $action) {
567
                 $record->approveDraft();
567
                 $record->approveDraft();
568
 
568
 

app/Providers/FilamentCompaniesServiceProvider.php → app/Providers/Filament/CompanyPanelProvider.php View File

1
 <?php
1
 <?php
2
 
2
 
3
-namespace App\Providers;
3
+namespace App\Providers\Filament;
4
 
4
 
5
 use App\Actions\FilamentCompanies\AddCompanyEmployee;
5
 use App\Actions\FilamentCompanies\AddCompanyEmployee;
6
 use App\Actions\FilamentCompanies\CreateConnectedAccount;
6
 use App\Actions\FilamentCompanies\CreateConnectedAccount;
71
 use Wallo\FilamentCompanies\Pages\Auth\Login;
71
 use Wallo\FilamentCompanies\Pages\Auth\Login;
72
 use Wallo\FilamentCompanies\Pages\Auth\Register;
72
 use Wallo\FilamentCompanies\Pages\Auth\Register;
73
 
73
 
74
-class FilamentCompaniesServiceProvider extends PanelProvider
74
+class CompanyPanelProvider extends PanelProvider
75
 {
75
 {
76
     /**
76
     /**
77
      * @throws Exception
77
      * @throws Exception

+ 1
- 1
app/Providers/TranslationServiceProvider.php View File

71
             $label = str_replace(' id', '', $label);
71
             $label = str_replace(' id', '', $label);
72
         }
72
         }
73
 
73
 
74
-        return ucwords($label);
74
+        return ucfirst($label);
75
     }
75
     }
76
 }
76
 }

+ 34
- 0
app/Services/AccountService.php View File

370
 
370
 
371
         return $earliestDate ?? today()->toDateTimeString();
371
         return $earliestDate ?? today()->toDateTimeString();
372
     }
372
     }
373
+
374
+    public function getUnpaidClientInvoices(?string $asOfDate = null): Builder
375
+    {
376
+        $asOfDate = $asOfDate ?? now()->toDateString();
377
+
378
+        return Invoice::query()
379
+            ->select([
380
+                'invoices.id',
381
+                'invoices.client_id',
382
+                'invoices.due_date',
383
+                'invoices.amount_due',
384
+                DB::raw('DATEDIFF(?, invoices.due_date) as days_overdue'),
385
+            ])
386
+            ->addBinding([$asOfDate], 'select')
387
+            ->unpaid()
388
+            ->where('amount_due', '>', 0);
389
+    }
390
+
391
+    public function getUnpaidVendorBills(?string $asOfDate = null): Builder
392
+    {
393
+        $asOfDate = $asOfDate ?? now()->toDateString();
394
+
395
+        return Bill::query()
396
+            ->select([
397
+                'bills.id',
398
+                'bills.vendor_id',
399
+                'bills.due_date',
400
+                'bills.amount_due',
401
+                DB::raw('DATEDIFF(?, bills.due_date) as days_overdue'),
402
+            ])
403
+            ->addBinding([$asOfDate], 'select')
404
+            ->outstanding()
405
+            ->where('amount_due', '>', 0);
406
+    }
373
 }
407
 }

+ 10
- 8
app/Services/ExportService.php View File

125
 
125
 
126
             if (filled($category->summary)) {
126
             if (filled($category->summary)) {
127
                 $csv->insertOne($category->summary);
127
                 $csv->insertOne($category->summary);
128
-            }
129
 
128
 
130
-            $csv->insertOne([]);
129
+                $csv->insertOne([]);
130
+            }
131
         }
131
         }
132
 
132
 
133
         if (method_exists($report, 'getOverviewHeaders') && filled($report->getOverviewHeaders())) {
133
         if (method_exists($report, 'getOverviewHeaders') && filled($report->getOverviewHeaders())) {
221
      * @throws CannotInsertRecord
221
      * @throws CannotInsertRecord
222
      * @throws Exception
222
      * @throws Exception
223
      */
223
      */
224
-    protected function writeDataRowsToCsv(Writer $csv, array $header, array $data, array $columns): void
224
+    protected function writeDataRowsToCsv(Writer $csv, ?array $header, array $data, array $columns): void
225
     {
225
     {
226
-        if (isset($header[0]) && is_array($header[0])) {
227
-            foreach ($header as $headerRow) {
228
-                $csv->insertOne($headerRow);
226
+        if ($header) {
227
+            if (isset($header[0]) && is_array($header[0])) {
228
+                foreach ($header as $headerRow) {
229
+                    $csv->insertOne($headerRow);
230
+                }
231
+            } else {
232
+                $csv->insertOne($header);
229
             }
233
             }
230
-        } else {
231
-            $csv->insertOne($header);
232
         }
234
         }
233
 
235
 
234
         // Output data rows
236
         // Output data rows

+ 97
- 17
app/Services/ReportService.php View File

2
 
2
 
3
 namespace App\Services;
3
 namespace App\Services;
4
 
4
 
5
+use App\Contracts\MoneyFormattableDTO;
5
 use App\DTO\AccountBalanceDTO;
6
 use App\DTO\AccountBalanceDTO;
6
 use App\DTO\AccountCategoryDTO;
7
 use App\DTO\AccountCategoryDTO;
7
 use App\DTO\AccountDTO;
8
 use App\DTO\AccountDTO;
8
 use App\DTO\AccountTransactionDTO;
9
 use App\DTO\AccountTransactionDTO;
9
 use App\DTO\AccountTypeDTO;
10
 use App\DTO\AccountTypeDTO;
11
+use App\DTO\AgingBucketDTO;
10
 use App\DTO\CashFlowOverviewDTO;
12
 use App\DTO\CashFlowOverviewDTO;
13
+use App\DTO\EntityReportDTO;
11
 use App\DTO\ReportDTO;
14
 use App\DTO\ReportDTO;
12
 use App\Enums\Accounting\AccountCategory;
15
 use App\Enums\Accounting\AccountCategory;
13
 use App\Enums\Accounting\AccountType;
16
 use App\Enums\Accounting\AccountType;
17
+use App\Enums\Accounting\DocumentEntityType;
14
 use App\Enums\Accounting\TransactionType;
18
 use App\Enums\Accounting\TransactionType;
15
 use App\Models\Accounting\Account;
19
 use App\Models\Accounting\Account;
16
 use App\Models\Accounting\Transaction;
20
 use App\Models\Accounting\Transaction;
27
         protected AccountService $accountService,
31
         protected AccountService $accountService,
28
     ) {}
32
     ) {}
29
 
33
 
30
-    public function formatBalances(array $balances): AccountBalanceDTO
34
+    /**
35
+     * @param  class-string<MoneyFormattableDTO>|null  $dtoClass
36
+     */
37
+    public function formatBalances(array $balances, ?string $dtoClass = null, bool $formatZeros = true): MoneyFormattableDTO | array
31
     {
38
     {
32
-        $defaultCurrency = CurrencyAccessor::getDefaultCurrency();
39
+        $dtoClass ??= AccountBalanceDTO::class;
40
+
41
+        $formattedBalances = array_map(static function ($balance) use ($formatZeros) {
42
+            if (! $formatZeros && $balance === 0) {
43
+                return '';
44
+            }
33
 
45
 
34
-        foreach ($balances as $key => $balance) {
35
-            $balances[$key] = money($balance, $defaultCurrency)->format();
46
+            return CurrencyConverter::formatCentsToMoney($balance);
47
+        }, $balances);
48
+
49
+        if (! $dtoClass) {
50
+            return $formattedBalances;
36
         }
51
         }
37
 
52
 
38
-        return new AccountBalanceDTO(
39
-            startingBalance: $balances['starting_balance'] ?? null,
40
-            debitBalance: $balances['debit_balance'] ?? null,
41
-            creditBalance: $balances['credit_balance'] ?? null,
42
-            netMovement: $balances['net_movement'] ?? null,
43
-            endingBalance: $balances['ending_balance'] ?? null,
44
-        );
53
+        return $dtoClass::fromArray($formattedBalances);
45
     }
54
     }
46
 
55
 
47
     public function buildAccountBalanceReport(string $startDate, string $endDate, array $columns = []): ReportDTO
56
     public function buildAccountBalanceReport(string $startDate, string $endDate, array $columns = []): ReportDTO
263
             return [
272
             return [
264
                 'type' => 'transaction',
273
                 'type' => 'transaction',
265
                 'action' => match ($transaction->type) {
274
                 'action' => match ($transaction->type) {
266
-                    TransactionType::Journal => 'updateJournalTransaction',
267
-                    TransactionType::Transfer => 'updateTransfer',
268
-                    default => 'updateTransaction',
275
+                    TransactionType::Journal => 'editJournalTransaction',
276
+                    TransactionType::Transfer => 'editTransfer',
277
+                    default => 'editTransaction',
269
                 },
278
                 },
270
                 'id' => $transaction->id,
279
                 'id' => $transaction->id,
271
             ];
280
             ];
361
 
370
 
362
         $formattedReportTotalBalances = $this->formatBalances($reportTotalBalances);
371
         $formattedReportTotalBalances = $this->formatBalances($reportTotalBalances);
363
 
372
 
364
-        return new ReportDTO($accountCategories, $formattedReportTotalBalances, $columns, $trialBalanceType);
373
+        return new ReportDTO(categories: $accountCategories, overallTotal: $formattedReportTotalBalances, fields: $columns, reportType: $trialBalanceType);
365
     }
374
     }
366
 
375
 
367
-    public function getRetainedEarningsBalances(string $startDate, string $endDate): AccountBalanceDTO
376
+    public function getRetainedEarningsBalances(string $startDate, string $endDate): MoneyFormattableDTO | array
368
     {
377
     {
369
         $retainedEarningsAmount = $this->calculateRetainedEarnings($startDate, $endDate)->getAmount();
378
         $retainedEarningsAmount = $this->calculateRetainedEarnings($startDate, $endDate)->getAmount();
370
 
379
 
507
         );
516
         );
508
     }
517
     }
509
 
518
 
510
-    private function calculateTotalCashFlows(array $sections, string $startDate): AccountBalanceDTO
519
+    private function calculateTotalCashFlows(array $sections, string $startDate): MoneyFormattableDTO | array
511
     {
520
     {
512
         $totalInflow = 0;
521
         $totalInflow = 0;
513
         $totalOutflow = 0;
522
         $totalOutflow = 0;
819
             endDate: $asOfDateCarbon,
828
             endDate: $asOfDateCarbon,
820
         );
829
         );
821
     }
830
     }
831
+
832
+    public function buildAgingReport(
833
+        string $asOfDate,
834
+        DocumentEntityType $entityType,
835
+        array $columns = [],
836
+        int $daysPerPeriod = 30,
837
+        int $numberOfPeriods = 4
838
+    ): ReportDTO {
839
+        $asOfDateCarbon = Carbon::parse($asOfDate);
840
+
841
+        $documents = $entityType === DocumentEntityType::Client
842
+            ? $this->accountService->getUnpaidClientInvoices($asOfDate)->with(['client:id,name'])->get()->groupBy('client_id')
843
+            : $this->accountService->getUnpaidVendorBills($asOfDate)->with(['vendor:id,name'])->get()->groupBy('vendor_id');
844
+
845
+        $categories = [];
846
+
847
+        $agingBuckets = ['current' => 0];
848
+
849
+        for ($i = 1; $i <= $numberOfPeriods; $i++) {
850
+            $agingBuckets["period_{$i}"] = 0;
851
+        }
852
+
853
+        $agingBuckets['over_periods'] = 0;
854
+        $agingBuckets['total'] = 0;
855
+
856
+        $totalAging = $agingBuckets;
857
+
858
+        foreach ($documents as $entityId => $entityDocuments) {
859
+            $aging = $agingBuckets;
860
+
861
+            foreach ($entityDocuments as $document) {
862
+                $daysOverdue = $document->days_overdue ?? 0;
863
+                $balance = $document->getRawOriginal('amount_due');
864
+
865
+                if ($daysOverdue <= 0) {
866
+                    $aging['current'] += $balance;
867
+                } else {
868
+                    $period = ceil($daysOverdue / $daysPerPeriod);
869
+
870
+                    if ($period <= $numberOfPeriods) {
871
+                        $aging["period_{$period}"] += $balance;
872
+                    } else {
873
+                        $aging['over_periods'] += $balance;
874
+                    }
875
+                }
876
+            }
877
+
878
+            $aging['total'] = array_sum($aging);
879
+
880
+            foreach ($aging as $bucket => $amount) {
881
+                $totalAging[$bucket] += $amount;
882
+            }
883
+
884
+            $entity = $entityDocuments->first()->{$entityType->value};
885
+
886
+            $categories[] = new EntityReportDTO(
887
+                name: $entity->name,
888
+                id: $entityId,
889
+                aging: $this->formatBalances($aging, AgingBucketDTO::class, false),
890
+            );
891
+        }
892
+
893
+        $totalAging['total'] = array_sum($totalAging);
894
+
895
+        return new ReportDTO(
896
+            categories: ['Entities' => $categories],
897
+            agingSummary: $this->formatBalances($totalAging, AgingBucketDTO::class),
898
+            fields: $columns,
899
+            endDate: $asOfDateCarbon,
900
+        );
901
+    }
822
 }
902
 }

+ 85
- 0
app/Transformers/AgingReportTransformer.php View File

1
+<?php
2
+
3
+namespace App\Transformers;
4
+
5
+use App\DTO\EntityReportDTO;
6
+use App\DTO\ReportCategoryDTO;
7
+use App\DTO\ReportDTO;
8
+use App\Enums\Accounting\DocumentEntityType;
9
+
10
+class AgingReportTransformer extends BaseReportTransformer
11
+{
12
+    public function __construct(
13
+        ReportDTO $report,
14
+        private readonly DocumentEntityType $entityType,
15
+    ) {
16
+        parent::__construct($report);
17
+    }
18
+
19
+    public function getTitle(): string
20
+    {
21
+        return $this->entityType->getReportTitle();
22
+    }
23
+
24
+    /**
25
+     * @return ReportCategoryDTO[]
26
+     */
27
+    public function getCategories(): array
28
+    {
29
+        $categories = [];
30
+
31
+        foreach ($this->report->categories as $category) {
32
+            $data = array_map(function (EntityReportDTO $entity) {
33
+                $row = [];
34
+
35
+                foreach ($this->getColumns() as $column) {
36
+                    $columnName = $column->getName();
37
+
38
+                    $row[$columnName] = match ($columnName) {
39
+                        'entity_name' => [
40
+                            'name' => $entity->name,
41
+                            'id' => $entity->id,
42
+                        ],
43
+                        'current' => $entity->aging->current,
44
+                        'over_periods' => $entity->aging->overPeriods,
45
+                        'total' => $entity->aging->total,
46
+                        default => str_starts_with($columnName, 'period_')
47
+                            ? $entity->aging->periods[$columnName] ?? null
48
+                            : '',
49
+                    };
50
+                }
51
+
52
+                return $row;
53
+            }, $category);
54
+
55
+            $categories[] = new ReportCategoryDTO(
56
+                header: null,
57
+                data: $data,
58
+                summary: null,
59
+            );
60
+        }
61
+
62
+        return $categories;
63
+    }
64
+
65
+    public function getOverallTotals(): array
66
+    {
67
+        $totals = [];
68
+
69
+        foreach ($this->getColumns() as $column) {
70
+            $columnName = $column->getName();
71
+
72
+            $totals[$columnName] = match ($columnName) {
73
+                'entity_name' => 'Total',
74
+                'current' => $this->report->agingSummary->current,
75
+                'over_periods' => $this->report->agingSummary->overPeriods,
76
+                'total' => $this->report->agingSummary->total,
77
+                default => str_starts_with($columnName, 'period_')
78
+                    ? $this->report->agingSummary->periods[$columnName] ?? null
79
+                    : '',
80
+            };
81
+        }
82
+
83
+        return $totals;
84
+    }
85
+}

+ 1
- 1
bootstrap/providers.php View File

4
     App\Providers\AppServiceProvider::class,
4
     App\Providers\AppServiceProvider::class,
5
     App\Providers\AuthServiceProvider::class,
5
     App\Providers\AuthServiceProvider::class,
6
     App\Providers\Filament\AdminPanelProvider::class,
6
     App\Providers\Filament\AdminPanelProvider::class,
7
-    App\Providers\FilamentCompaniesServiceProvider::class,
7
+    App\Providers\Filament\CompanyPanelProvider::class,
8
     App\Providers\Filament\UserPanelProvider::class,
8
     App\Providers\Filament\UserPanelProvider::class,
9
     App\Providers\Faker\FakerServiceProvider::class,
9
     App\Providers\Faker\FakerServiceProvider::class,
10
     App\Providers\MacroServiceProvider::class,
10
     App\Providers\MacroServiceProvider::class,

+ 396
- 318
composer.lock
File diff suppressed because it is too large
View File


+ 85
- 85
package-lock.json View File

575
             }
575
             }
576
         },
576
         },
577
         "node_modules/@rollup/rollup-android-arm-eabi": {
577
         "node_modules/@rollup/rollup-android-arm-eabi": {
578
-            "version": "4.31.0",
579
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz",
580
-            "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==",
578
+            "version": "4.32.1",
579
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz",
580
+            "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==",
581
             "cpu": [
581
             "cpu": [
582
                 "arm"
582
                 "arm"
583
             ],
583
             ],
589
             ]
589
             ]
590
         },
590
         },
591
         "node_modules/@rollup/rollup-android-arm64": {
591
         "node_modules/@rollup/rollup-android-arm64": {
592
-            "version": "4.31.0",
593
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz",
594
-            "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==",
592
+            "version": "4.32.1",
593
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz",
594
+            "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==",
595
             "cpu": [
595
             "cpu": [
596
                 "arm64"
596
                 "arm64"
597
             ],
597
             ],
603
             ]
603
             ]
604
         },
604
         },
605
         "node_modules/@rollup/rollup-darwin-arm64": {
605
         "node_modules/@rollup/rollup-darwin-arm64": {
606
-            "version": "4.31.0",
607
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz",
608
-            "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==",
606
+            "version": "4.32.1",
607
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz",
608
+            "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==",
609
             "cpu": [
609
             "cpu": [
610
                 "arm64"
610
                 "arm64"
611
             ],
611
             ],
617
             ]
617
             ]
618
         },
618
         },
619
         "node_modules/@rollup/rollup-darwin-x64": {
619
         "node_modules/@rollup/rollup-darwin-x64": {
620
-            "version": "4.31.0",
621
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz",
622
-            "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==",
620
+            "version": "4.32.1",
621
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz",
622
+            "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==",
623
             "cpu": [
623
             "cpu": [
624
                 "x64"
624
                 "x64"
625
             ],
625
             ],
631
             ]
631
             ]
632
         },
632
         },
633
         "node_modules/@rollup/rollup-freebsd-arm64": {
633
         "node_modules/@rollup/rollup-freebsd-arm64": {
634
-            "version": "4.31.0",
635
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz",
636
-            "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==",
634
+            "version": "4.32.1",
635
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz",
636
+            "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==",
637
             "cpu": [
637
             "cpu": [
638
                 "arm64"
638
                 "arm64"
639
             ],
639
             ],
645
             ]
645
             ]
646
         },
646
         },
647
         "node_modules/@rollup/rollup-freebsd-x64": {
647
         "node_modules/@rollup/rollup-freebsd-x64": {
648
-            "version": "4.31.0",
649
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz",
650
-            "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==",
648
+            "version": "4.32.1",
649
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz",
650
+            "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==",
651
             "cpu": [
651
             "cpu": [
652
                 "x64"
652
                 "x64"
653
             ],
653
             ],
659
             ]
659
             ]
660
         },
660
         },
661
         "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
661
         "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
662
-            "version": "4.31.0",
663
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz",
664
-            "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==",
662
+            "version": "4.32.1",
663
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz",
664
+            "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==",
665
             "cpu": [
665
             "cpu": [
666
                 "arm"
666
                 "arm"
667
             ],
667
             ],
673
             ]
673
             ]
674
         },
674
         },
675
         "node_modules/@rollup/rollup-linux-arm-musleabihf": {
675
         "node_modules/@rollup/rollup-linux-arm-musleabihf": {
676
-            "version": "4.31.0",
677
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz",
678
-            "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==",
676
+            "version": "4.32.1",
677
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz",
678
+            "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==",
679
             "cpu": [
679
             "cpu": [
680
                 "arm"
680
                 "arm"
681
             ],
681
             ],
687
             ]
687
             ]
688
         },
688
         },
689
         "node_modules/@rollup/rollup-linux-arm64-gnu": {
689
         "node_modules/@rollup/rollup-linux-arm64-gnu": {
690
-            "version": "4.31.0",
691
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz",
692
-            "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==",
690
+            "version": "4.32.1",
691
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz",
692
+            "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==",
693
             "cpu": [
693
             "cpu": [
694
                 "arm64"
694
                 "arm64"
695
             ],
695
             ],
701
             ]
701
             ]
702
         },
702
         },
703
         "node_modules/@rollup/rollup-linux-arm64-musl": {
703
         "node_modules/@rollup/rollup-linux-arm64-musl": {
704
-            "version": "4.31.0",
705
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz",
706
-            "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==",
704
+            "version": "4.32.1",
705
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz",
706
+            "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==",
707
             "cpu": [
707
             "cpu": [
708
                 "arm64"
708
                 "arm64"
709
             ],
709
             ],
715
             ]
715
             ]
716
         },
716
         },
717
         "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
717
         "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
718
-            "version": "4.31.0",
719
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz",
720
-            "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==",
718
+            "version": "4.32.1",
719
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz",
720
+            "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==",
721
             "cpu": [
721
             "cpu": [
722
                 "loong64"
722
                 "loong64"
723
             ],
723
             ],
729
             ]
729
             ]
730
         },
730
         },
731
         "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
731
         "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
732
-            "version": "4.31.0",
733
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz",
734
-            "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==",
732
+            "version": "4.32.1",
733
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz",
734
+            "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==",
735
             "cpu": [
735
             "cpu": [
736
                 "ppc64"
736
                 "ppc64"
737
             ],
737
             ],
743
             ]
743
             ]
744
         },
744
         },
745
         "node_modules/@rollup/rollup-linux-riscv64-gnu": {
745
         "node_modules/@rollup/rollup-linux-riscv64-gnu": {
746
-            "version": "4.31.0",
747
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz",
748
-            "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==",
746
+            "version": "4.32.1",
747
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz",
748
+            "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==",
749
             "cpu": [
749
             "cpu": [
750
                 "riscv64"
750
                 "riscv64"
751
             ],
751
             ],
757
             ]
757
             ]
758
         },
758
         },
759
         "node_modules/@rollup/rollup-linux-s390x-gnu": {
759
         "node_modules/@rollup/rollup-linux-s390x-gnu": {
760
-            "version": "4.31.0",
761
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz",
762
-            "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==",
760
+            "version": "4.32.1",
761
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz",
762
+            "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==",
763
             "cpu": [
763
             "cpu": [
764
                 "s390x"
764
                 "s390x"
765
             ],
765
             ],
771
             ]
771
             ]
772
         },
772
         },
773
         "node_modules/@rollup/rollup-linux-x64-gnu": {
773
         "node_modules/@rollup/rollup-linux-x64-gnu": {
774
-            "version": "4.31.0",
775
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz",
776
-            "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==",
774
+            "version": "4.32.1",
775
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz",
776
+            "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==",
777
             "cpu": [
777
             "cpu": [
778
                 "x64"
778
                 "x64"
779
             ],
779
             ],
785
             ]
785
             ]
786
         },
786
         },
787
         "node_modules/@rollup/rollup-linux-x64-musl": {
787
         "node_modules/@rollup/rollup-linux-x64-musl": {
788
-            "version": "4.31.0",
789
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz",
790
-            "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==",
788
+            "version": "4.32.1",
789
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz",
790
+            "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==",
791
             "cpu": [
791
             "cpu": [
792
                 "x64"
792
                 "x64"
793
             ],
793
             ],
799
             ]
799
             ]
800
         },
800
         },
801
         "node_modules/@rollup/rollup-win32-arm64-msvc": {
801
         "node_modules/@rollup/rollup-win32-arm64-msvc": {
802
-            "version": "4.31.0",
803
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz",
804
-            "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==",
802
+            "version": "4.32.1",
803
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz",
804
+            "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==",
805
             "cpu": [
805
             "cpu": [
806
                 "arm64"
806
                 "arm64"
807
             ],
807
             ],
813
             ]
813
             ]
814
         },
814
         },
815
         "node_modules/@rollup/rollup-win32-ia32-msvc": {
815
         "node_modules/@rollup/rollup-win32-ia32-msvc": {
816
-            "version": "4.31.0",
817
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz",
818
-            "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==",
816
+            "version": "4.32.1",
817
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz",
818
+            "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==",
819
             "cpu": [
819
             "cpu": [
820
                 "ia32"
820
                 "ia32"
821
             ],
821
             ],
827
             ]
827
             ]
828
         },
828
         },
829
         "node_modules/@rollup/rollup-win32-x64-msvc": {
829
         "node_modules/@rollup/rollup-win32-x64-msvc": {
830
-            "version": "4.31.0",
831
-            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz",
832
-            "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==",
830
+            "version": "4.32.1",
831
+            "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz",
832
+            "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==",
833
             "cpu": [
833
             "cpu": [
834
                 "x64"
834
                 "x64"
835
             ],
835
             ],
1074
             }
1074
             }
1075
         },
1075
         },
1076
         "node_modules/caniuse-lite": {
1076
         "node_modules/caniuse-lite": {
1077
-            "version": "1.0.30001695",
1078
-            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
1079
-            "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==",
1077
+            "version": "1.0.30001696",
1078
+            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz",
1079
+            "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==",
1080
             "dev": true,
1080
             "dev": true,
1081
             "funding": [
1081
             "funding": [
1082
                 {
1082
                 {
1235
             "license": "MIT"
1235
             "license": "MIT"
1236
         },
1236
         },
1237
         "node_modules/electron-to-chromium": {
1237
         "node_modules/electron-to-chromium": {
1238
-            "version": "1.5.84",
1239
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz",
1240
-            "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==",
1238
+            "version": "1.5.89",
1239
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.89.tgz",
1240
+            "integrity": "sha512-okLMJSmbI+XHr8aG+wCK+VPH+d38sHMED6/q1CTsCNkqfdOZL3k2ThWnh44HL6bJKj9cabPCSVLDv9ynsIm8qg==",
1241
             "dev": true,
1241
             "dev": true,
1242
             "license": "ISC"
1242
             "license": "ISC"
1243
         },
1243
         },
2242
             }
2242
             }
2243
         },
2243
         },
2244
         "node_modules/rollup": {
2244
         "node_modules/rollup": {
2245
-            "version": "4.31.0",
2246
-            "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz",
2247
-            "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==",
2245
+            "version": "4.32.1",
2246
+            "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz",
2247
+            "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==",
2248
             "dev": true,
2248
             "dev": true,
2249
             "license": "MIT",
2249
             "license": "MIT",
2250
             "dependencies": {
2250
             "dependencies": {
2258
                 "npm": ">=8.0.0"
2258
                 "npm": ">=8.0.0"
2259
             },
2259
             },
2260
             "optionalDependencies": {
2260
             "optionalDependencies": {
2261
-                "@rollup/rollup-android-arm-eabi": "4.31.0",
2262
-                "@rollup/rollup-android-arm64": "4.31.0",
2263
-                "@rollup/rollup-darwin-arm64": "4.31.0",
2264
-                "@rollup/rollup-darwin-x64": "4.31.0",
2265
-                "@rollup/rollup-freebsd-arm64": "4.31.0",
2266
-                "@rollup/rollup-freebsd-x64": "4.31.0",
2267
-                "@rollup/rollup-linux-arm-gnueabihf": "4.31.0",
2268
-                "@rollup/rollup-linux-arm-musleabihf": "4.31.0",
2269
-                "@rollup/rollup-linux-arm64-gnu": "4.31.0",
2270
-                "@rollup/rollup-linux-arm64-musl": "4.31.0",
2271
-                "@rollup/rollup-linux-loongarch64-gnu": "4.31.0",
2272
-                "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0",
2273
-                "@rollup/rollup-linux-riscv64-gnu": "4.31.0",
2274
-                "@rollup/rollup-linux-s390x-gnu": "4.31.0",
2275
-                "@rollup/rollup-linux-x64-gnu": "4.31.0",
2276
-                "@rollup/rollup-linux-x64-musl": "4.31.0",
2277
-                "@rollup/rollup-win32-arm64-msvc": "4.31.0",
2278
-                "@rollup/rollup-win32-ia32-msvc": "4.31.0",
2279
-                "@rollup/rollup-win32-x64-msvc": "4.31.0",
2261
+                "@rollup/rollup-android-arm-eabi": "4.32.1",
2262
+                "@rollup/rollup-android-arm64": "4.32.1",
2263
+                "@rollup/rollup-darwin-arm64": "4.32.1",
2264
+                "@rollup/rollup-darwin-x64": "4.32.1",
2265
+                "@rollup/rollup-freebsd-arm64": "4.32.1",
2266
+                "@rollup/rollup-freebsd-x64": "4.32.1",
2267
+                "@rollup/rollup-linux-arm-gnueabihf": "4.32.1",
2268
+                "@rollup/rollup-linux-arm-musleabihf": "4.32.1",
2269
+                "@rollup/rollup-linux-arm64-gnu": "4.32.1",
2270
+                "@rollup/rollup-linux-arm64-musl": "4.32.1",
2271
+                "@rollup/rollup-linux-loongarch64-gnu": "4.32.1",
2272
+                "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1",
2273
+                "@rollup/rollup-linux-riscv64-gnu": "4.32.1",
2274
+                "@rollup/rollup-linux-s390x-gnu": "4.32.1",
2275
+                "@rollup/rollup-linux-x64-gnu": "4.32.1",
2276
+                "@rollup/rollup-linux-x64-musl": "4.32.1",
2277
+                "@rollup/rollup-win32-arm64-msvc": "4.32.1",
2278
+                "@rollup/rollup-win32-ia32-msvc": "4.32.1",
2279
+                "@rollup/rollup-win32-x64-msvc": "4.32.1",
2280
                 "fsevents": "~2.3.2"
2280
                 "fsevents": "~2.3.2"
2281
             }
2281
             }
2282
         },
2282
         },

+ 4
- 0
resources/css/filament/company/theme.css View File

14
     @apply bg-platinum;
14
     @apply bg-platinum;
15
 }
15
 }
16
 
16
 
17
+.fi-dropdown-panel {
18
+    @apply divide-gray-200/80;
19
+}
20
+
17
 .fi-badge {
21
 .fi-badge {
18
     display: inline-flex;
22
     display: inline-flex;
19
 }
23
 }

+ 174
- 166
resources/data/lang/ar.json View File

1
 {
1
 {
2
     "General": "جنرال لواء",
2
     "General": "جنرال لواء",
3
-    "Number Prefix": "بادئة الأرقام",
4
-    "Number Digits": "أرقام الأرقام",
5
-    "Content": "المحتوى",
6
-    "Header": "رأس الصفحة",
7
-    "Template": "القالب",
8
-    "Number Next": "الرقم التالي",
9
-    "Accent Color": "لون أكسنت",
10
-    "Item Name": "اسم العنصر",
11
-    "Unit Name": "اسم الوحدة",
12
-    "Quantity": "الكمية",
13
-    "Symbol": "الرمز",
14
-    "Sales Tax": "ضريبة المبيعات",
15
-    "teal": "البط البري",
16
-    "Investment": "الاستثمار",
17
-    "sky": "سماء",
18
-    "Screen Extra Large": "شاشة كبيرة جدًا",
19
-    "General Partnership": "شراكة عامة",
20
-    "Sales": "المبيعات",
21
-    "Max Content Width": "عرض المحتوى الأقصى",
22
-    "yellow": "الأصفر",
23
-    "Phone Number": "رقم الهاتف",
24
-    "Code": "الكود",
25
-    "Yes": "نعم",
26
-    "Hours": "ساعات",
27
-    "gray": "رمادي",
28
-    "3X Large": "مقاس كبير 3 مرات",
29
-    "Tax": "ضريبة",
30
-    "Timezone": "المنطقة الزمنية",
31
-    "Type": "النوع",
32
-    "Primary Color": "اللون الأساسي",
33
-    "Top Navigation": "التنقل العلوي",
34
-    "Date Format": "صيغة التاريخ",
35
-    "Price Name": "اسم السعر",
36
-    "Credit": "الائتمان",
37
-    "Department": "قسم",
38
-    "Precision": "الدقة",
39
-    "Entity Type": "نوع الكيان",
40
-    "Before Number": "قبل الرقم",
41
-    "Net 10": "نت 10",
42
-    "Number Format": "صيغة الأرقام",
43
-    "Company Profile": "ملف الشركة",
44
-    "Purchase": "شراء",
45
-    "Select Position": "حدد الوظيفة",
46
-    "Due Upon Receipt": "تستحق عند الاستلام",
47
-    "zinc": "زنك",
48
-    "Rate": "معدل",
49
-    "Amount Name": "اسم المبلغ",
50
-    "Company Currencies": "عملات الشركة",
51
-    "Before Amount": "قبل المبلغ",
52
-    "Enabled": "تم تمكينه",
53
-    "Net 15": "شبكة 15",
54
-    "State \/ Province": "الولاية\/المقاطعة",
55
-    "Striped Tables": "طاولات مخططة",
56
-    "Net 90": "نت 90",
57
-    "Date & Time": "التاريخ والوقت",
58
-    "Entity": "الكيان",
3
+    "Bank account": "حساب بنكي",
4
+    "Currency": "العملة",
5
+    "Taxes & Discounts": "الضرائب والخصومات",
6
+    "Sales tax": "ضريبة المبيعات",
7
+    "Purchase tax": "ضريبة الشراء",
8
+    "Sales discount": "خصم المبيعات",
9
+    "Purchase discount": "خصم الشراء",
10
+    "Appearance": "المظهر",
59
     "Default": "إفتراضي",
11
     "Default": "إفتراضي",
60
-    "Bank Account": "حساب بنكي",
61
-    "Amount": "المبلغ",
12
+    "Company Profile": "ملف الشركة",
13
+    "Invoice": "الفاتورة",
14
+    "Localization": "التعريب",
15
+    "Discount": "الخصم",
16
+    "Tax": "ضريبة",
62
     "Accounting": "المحاسبة",
17
     "Accounting": "المحاسبة",
63
     "Banking": "الخدمات المصرفية",
18
     "Banking": "الخدمات المصرفية",
64
-    "Service": "خدمة",
65
     "Account": "الحساب",
19
     "Account": "الحساب",
66
-    "Compound": "مركب",
67
-    "amber": "كهرمان",
68
-    "green": "خضراء",
69
-    "Loan": "قرض",
70
-    "Percent Position": "موضع النسبة المئوية",
71
-    "After Amount": "بعد المبلغ",
72
-    "neutral": "محايد",
73
-    "Main": "الرئيسية",
74
-    "Account Information": "معلومات الحساب",
75
-    "No": "لا",
76
-    "Classic": "كلاسيكي",
77
-    "Net 60": "نت 60",
78
-    "Computation": "الحساب",
79
-    "Symbol Position": "موضع الرمز",
80
-    "Select a symbol position": "حدد موضع الرمز",
81
-    "Default :Type :Record": "الخيار الافتراضي :Type :Record",
82
-    "Name": "الاسم",
20
+    "Department": "قسم",
83
     "Services": "خدمات",
21
     "Services": "خدمات",
84
-    "Financial & Fiscal": "المالية والمالية",
22
+    "Connected Accounts": "الحسابات المتصلة",
23
+    "Live Currency": "العملة الحية",
24
+    "Primary color": "اللون الأساسي",
25
+    "amber": "كهرمان",
85
     "blue": "أزرق",
26
     "blue": "أزرق",
86
     "cyan": "ازرق سماوي",
27
     "cyan": "ازرق سماوي",
87
-    "Screen 2X Large": "شاشة كبيرة 2X",
88
-    "Medium": "متوسط",
89
-    "Subheader": "عنوان فرعي",
90
-    "Limited Partnership (LP)": "شراكة محدودة (LP)",
91
-    "Children": "الأطفال",
92
-    "Available": "متاح",
93
-    "Show Logo": "عرض الشعار",
94
     "emerald": "زمرد",
28
     "emerald": "زمرد",
29
+    "fuchsia": "فوشيا",
30
+    "gray": "رمادي",
31
+    "green": "خضراء",
95
     "indigo": "نيلي",
32
     "indigo": "نيلي",
96
-    "Current Balance": "الرصيد الحالي",
97
-    "Tax ID": "معرف الضريبة",
98
-    "Modal Width": "عرض مشروط",
99
-    "Fixed": "ثابت",
100
-    "Start Date": "تاريخ البدء",
33
+    "lime": "جير",
34
+    "neutral": "محايد",
101
     "orange": "البرتقالي",
35
     "orange": "البرتقالي",
102
-    "Invoice": "الفاتورة",
103
-    "Account Number": "رقم الحساب",
104
-    "Manager": "مدير",
105
-    "Sales Discount": "خصم المبيعات",
106
-    "Currency": "العملة",
107
-    "Localization": "التعريب",
108
-    "Parent Department": "قسم أولياء الأمور",
109
-    "Default :Record": "الخيار الافتراضي :Record",
110
-    "Disabled": "معاق",
111
-    "Appearance": "المظهر",
112
-    "Price": "السعر",
113
-    "fuchsia": "فوشيا",
114
-    "Language": "اللغة",
115
-    "Total": "المجموع",
116
-    "red": "أحمر",
117
     "pink": "وردي",
36
     "pink": "وردي",
37
+    "purple": "أرجواني",
38
+    "red": "أحمر",
118
     "rose": "وردة",
39
     "rose": "وردة",
40
+    "sky": "سماء",
41
+    "slate": "أردواز",
42
+    "stone": "حجر",
43
+    "teal": "البط البري",
119
     "violet": "بنفسج",
44
     "violet": "بنفسج",
120
-    "Sole Proprietorship": "الملكية الفردية",
121
-    "All": "جميع",
122
-    "Layout": "التخطيط",
123
-    "Footer \/ Notes": "تذييل الصفحة\\ ملاحظات",
124
-    "Percentage": "النسبة المئوية",
125
-    "Purchase Tax": "ضريبة الشراء",
126
-    "Thousands Separator": "فاصل الآلاف",
127
-    "7X Large": "مقاس كبير 7 مرات",
128
-    "Side Navigation": "التنقل الجانبي",
129
-    "4X Large": "4 × كبير",
130
-    "Net 7": "نت 7",
131
-    "Live Rate": "السعر المباشر",
132
-    "Screen": "شاشة",
133
-    "Decimal Separator": "فاصل عشري",
134
-    "Currency List": "قائمة العملات",
135
-    "Zip \/ Postal Code": "الرمز البريدي\/الرمز البريدي",
136
-    "5X Large": "مقاس كبير 5 مرات",
137
-    "Purchase Discount": "خصم الشراء",
138
-    "Scope": "النطاق",
139
-    "lime": "جير",
140
-    "Subtype": "نوع فرعي",
141
-    "Extra Large": "مقاس كبير جدًا",
142
-    "Legal & Compliance": "الشؤون القانونية والامتثال",
143
-    "Navigation Layout": "تخطيط التنقل",
144
-    "Street Address": "عنوان الشارع",
145
-    "Description": "وصف",
146
-    "purple": "أرجواني",
45
+    "yellow": "الأصفر",
46
+    "zinc": "زنك",
147
     "Font": "الخط",
47
     "Font": "الخط",
148
-    "Small": "صغير",
149
-    "Corporation": "مؤسسة",
150
-    "stone": "حجر",
151
-    "slate": "أردواز",
152
-    "Live Currency": "العملة الحية",
153
-    "Screen Large": "شاشة كبيرة",
154
-    "6X Large": "مقاس كبير 6 مرات",
48
+    "Enabled": "تم تمكينه",
49
+    "Disabled": "معاق",
50
+    "Identification": "تحديد",
51
+    "Email": "البريد الإلكتروني",
52
+    "Phone number": "رقم الهاتف",
53
+    "Logo": "الشعار",
54
+    "Location Details": "تفاصيل الموقع",
55
+    "Country": "البلد",
56
+    "State \/ Province": "الولاية\/المقاطعة",
57
+    "Street Address": "عنوان الشارع",
155
     "City \/ Town": "المدينة\/المدينة",
58
     "City \/ Town": "المدينة\/المدينة",
59
+    "Zip \/ Postal Code": "الرمز البريدي\/الرمز البريدي",
60
+    "Legal & Compliance": "الشؤون القانونية والامتثال",
61
+    "Entity type": "نوع الكيان",
62
+    "Tax ID": "معرف الضريبة",
63
+    "Sole Proprietorship": "الملكية الفردية",
64
+    "General Partnership": "شراكة عامة",
65
+    "Limited Partnership (LP)": "شراكة محدودة (LP)",
156
     "Limited Liability Partnership (LLP)": "شراكة ذات مسؤولية محدودة (LLP)",
66
     "Limited Liability Partnership (LLP)": "شراكة ذات مسؤولية محدودة (LLP)",
157
-    "Payment Terms": "شروط الدفع",
158
-    "Data Presentation": "عرض البيانات",
159
-    "Connected Accounts": "الحسابات المتصلة",
160
-    "Modern": "حديث",
161
-    "Country": "البلد",
162
-    "Full": "كامل",
163
-    "Table Sort Direction": "اتجاه فرز الجدول",
67
+    "Limited Liability Company (LLC)": "شركة ذات مسؤولية محدودة (LLC)",
68
+    "Corporation": "مؤسسة",
164
     "Nonprofit": "غير ربحي",
69
     "Nonprofit": "غير ربحي",
165
-    "Records Per Page": "سجلات لكل صفحة",
166
-    "Location Details": "تفاصيل الموقع",
167
-    "Extra Small": "صغير جدًا",
168
-    "End Date": "تاريخ النهاية",
169
-    "Taxes & Discounts": "الضرائب والخصومات",
170
-    "After Number": "بعد الرقم",
171
-    "Time Format": "صيغة الوقت",
172
-    "Ascending": "تصاعدي",
70
+    "Number prefix": "بادئة الأرقام",
71
+    "Number digits": "أرقام الأرقام",
72
+    "Number next": "الرقم التالي",
73
+    "Payment terms": "شروط الدفع",
74
+    "Content": "المحتوى",
75
+    "Header": "رأس الصفحة",
76
+    "Subheader": "عنوان فرعي",
77
+    "Footer \/ notes": "تذييل الصفحة\\ ملاحظات",
78
+    "Template": "القالب",
79
+    "Show logo": "عرض الشعار",
80
+    "Accent color": "لون أكسنت",
81
+    "Item name": "اسم العنصر",
82
+    "Items": "العناصر",
83
+    "Products": "منتجات",
84
+    "Other": "أخرى",
85
+    "Unit name": "اسم الوحدة",
86
+    "Quantity": "الكمية",
87
+    "Hours": "ساعات",
88
+    "Price name": "اسم السعر",
89
+    "Price": "السعر",
90
+    "Rate": "معدل",
91
+    "Amount name": "اسم المبلغ",
92
+    "Amount": "المبلغ",
93
+    "Total": "المجموع",
94
+    "Due Upon Receipt": "تستحق عند الاستلام",
95
+    "Net 7": "نت 7",
96
+    "Net 10": "نت 10",
97
+    "Net 15": "شبكة 15",
173
     "Net 30": "شبكة 30",
98
     "Net 30": "شبكة 30",
174
-    "Identification": "تحديد",
175
-    "Email": "البريد الإلكتروني",
176
-    "2X Large": "2 × حجم كبير",
99
+    "Net 60": "نت 60",
100
+    "Net 90": "نت 90",
101
+    "Modern": "حديث",
102
+    "Classic": "كلاسيكي",
103
+    "Language": "اللغة",
104
+    "Timezone": "المنطقة الزمنية",
105
+    "Date & Time": "التاريخ والوقت",
106
+    "Date format": "صيغة التاريخ",
107
+    "Time format": "صيغة الوقت",
108
+    "Week start": "بداية الأسبوع",
109
+    "Before number": "قبل الرقم",
110
+    "After number": "بعد الرقم",
111
+    "Select position": "حدد الوظيفة",
112
+    "Financial & Fiscal": "المالية والمالية",
113
+    "Number format": "صيغة الأرقام",
114
+    "Percent position": "موضع النسبة المئوية",
115
+    "Name": "الاسم",
116
+    "Code": "الكود",
117
+    "Symbol": "الرمز",
118
+    "Default :record": "الخيار الافتراضي :record",
119
+    "Type": "النوع",
120
+    "Start date": "تاريخ البدء",
121
+    "End date": "تاريخ النهاية",
122
+    "Sales": "المبيعات",
123
+    "Default :type :record": "الخيار الافتراضي :type :record",
124
+    "Purchase": "شراء",
125
+    "Precision": "الدقة",
126
+    "Symbol position": "موضع الرمز",
127
+    "Before amount": "قبل المبلغ",
128
+    "After amount": "بعد المبلغ",
129
+    "Select a symbol position": "حدد موضع الرمز",
130
+    "Decimal separator": "فاصل عشري",
131
+    "Thousands separator": "فاصل الآلاف",
132
+    "Yes": "نعم",
133
+    "No": "لا",
134
+    "Description": "وصف",
135
+    "Computation": "الحساب",
136
+    "Scope": "النطاق",
137
+    "Percentage": "النسبة المئوية",
138
+    "Fixed": "ثابت",
177
     "None": "لا شيء",
139
     "None": "لا شيء",
178
-    "Discount": "الخصم",
179
-    "Depository": "جهة الإيداع",
180
-    "Week Start": "بداية الأسبوع",
181
     "Product": "المنتج",
140
     "Product": "المنتج",
182
-    "Items": "العناصر",
183
-    "Limited Liability Company (LLC)": "شركة ذات مسؤولية محدودة (LLC)",
184
-    "Large": "كبير",
185
-    "Descending": "تنازلي",
186
-    "Other": "أخرى",
187
-    "Logo": "الشعار",
188
-    "Products": "منتجات"
141
+    "Service": "خدمة",
142
+    "Compound": "مركب",
143
+    "Current balance": "الرصيد الحالي",
144
+    "Account Information": "معلومات الحساب",
145
+    "Subtype": "نوع فرعي",
146
+    "Account number": "رقم الحساب",
147
+    "Investment": "الاستثمار",
148
+    "Credit": "الائتمان",
149
+    "Depository": "جهة الإيداع",
150
+    "Loan": "قرض",
151
+    "Manager": "مدير",
152
+    "Children": "الأطفال",
153
+    "All": "جميع",
154
+    "Main": "الرئيسية",
155
+    "Parent department": "قسم أولياء الأمور",
156
+    "Currency List": "قائمة العملات",
157
+    "Company Currencies": "عملات الشركة",
158
+    "Entity": "الكيان",
159
+    "Available": "متاح",
160
+    "Live rate": "السعر المباشر",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 144
- 136
resources/data/lang/de.json View File

1
 {
1
 {
2
     "General": "Allgemeines",
2
     "General": "Allgemeines",
3
-    "Bank Account": "Bankkonto",
4
-    "slate": "Schiefer",
5
-    "indigo": "Indigoblau",
6
-    "lime": "Kalk",
7
-    "Extra Small": "Extra klein",
8
-    "Enabled": "Aktiviert",
9
-    "neutral": "neutral",
10
-    "Items": "Artikel",
11
-    "pink": "pink",
12
-    "Medium": "Mittel",
3
+    "Bank account": "Bankkonto",
4
+    "Currency": "Währung",
5
+    "Taxes & Discounts": "Steuern und Rabatte",
6
+    "Sales tax": "Umsatzsteuer",
7
+    "Purchase tax": "Umsatzsteuer",
8
+    "Sales discount": "Verkaufsrabatt",
9
+    "Purchase discount": "Rabatt beim Kauf",
10
+    "Appearance": "Aussehen",
11
+    "Default": "Standard",
12
+    "Company Profile": "Profil des Unternehmens",
13
+    "Invoice": "Rechnung",
14
+    "Localization": "Lokalisation",
15
+    "Discount": "Rabatt",
16
+    "Tax": "Steuer",
17
+    "Accounting": "Rechnungswesen",
18
+    "Banking": "Bankwesen",
13
     "Account": "Konto",
19
     "Account": "Konto",
14
-    "Other": "Andere",
15
-    "Sales Tax": "Umsatzsteuer",
16
     "Department": "Abteilung",
20
     "Department": "Abteilung",
17
-    "stone": "Stein",
18
-    "yellow": "gelb",
19
-    "Total": "Insgesamt",
20
-    "Zip \/ Postal Code": "PLZ\/PLZ",
21
-    "Price": "Preis",
22
-    "Content": "Inhalt",
23
-    "Accounting": "Rechnungswesen",
24
-    "Discount": "Rabatt",
21
+    "Services": "Dienstleistungen",
22
+    "Connected Accounts": "Verbundene Konten",
23
+    "Live Currency": "Live-Währung",
24
+    "Primary color": "Primäre Farbe",
25
+    "amber": "Bernstein",
26
+    "blue": "blau",
25
     "cyan": "Cyan",
27
     "cyan": "Cyan",
28
+    "emerald": "Smaragd",
29
+    "fuchsia": "Fuchsie",
26
     "gray": "grau",
30
     "gray": "grau",
31
+    "green": "grün",
32
+    "indigo": "Indigoblau",
33
+    "lime": "Kalk",
34
+    "neutral": "neutral",
27
     "orange": "orange",
35
     "orange": "orange",
28
-    "blue": "blau",
36
+    "pink": "pink",
37
+    "purple": "lila",
38
+    "red": "rot",
39
+    "rose": "Rose",
40
+    "sky": "Himmel",
41
+    "slate": "Schiefer",
42
+    "stone": "Stein",
43
+    "teal": "blaugrün",
29
     "violet": "violett",
44
     "violet": "violett",
45
+    "yellow": "gelb",
46
+    "zinc": "Zink",
30
     "Font": "Schrift",
47
     "Font": "Schrift",
31
-    "Screen": "Bildschirm",
32
-    "Banking": "Bankwesen",
33
-    "emerald": "Smaragd",
48
+    "Enabled": "Aktiviert",
34
     "Disabled": "Deaktiviert",
49
     "Disabled": "Deaktiviert",
35
-    "Extra Large": "Extra groß",
36
-    "Classic": "Klassisch",
37
-    "sky": "Himmel",
38
-    "Email": "E-Mail",
39
-    "State \/ Province": "Bundesstaat\/ Provinz",
40
-    "Language": "Sprache",
41
-    "zinc": "Zink",
42
-    "Layout": "Raumaufteilung",
43
-    "fuchsia": "Fuchsie",
44
-    "rose": "Rose",
45
-    "Large": "Groß",
46
-    "Ascending": "Aufsteigend",
47
-    "purple": "lila",
48
-    "Phone Number": "Telefonnummer",
49
-    "Quantity": "Menge",
50
-    "Localization": "Lokalisation",
51
-    "Tax": "Steuer",
52
-    "green": "grün",
53
-    "red": "rot",
54
-    "Small": "Klein",
55
     "Identification": "Identifikation",
50
     "Identification": "Identifikation",
56
-    "Products": "Produkte",
57
-    "Template": "Schablone",
58
-    "Modern": "modern",
59
-    "Date & Time": "Datum und Uhrzeit",
51
+    "Email": "E-Mail",
52
+    "Phone number": "Telefonnummer",
60
     "Logo": "Logo",
53
     "Logo": "Logo",
61
-    "Header": "Kopfzeile",
62
-    "Timezone": "Zeitzone",
63
-    "Full": "Voll",
54
+    "Location Details": "Angaben zum Standort",
64
     "Country": "Land",
55
     "Country": "Land",
65
-    "Services": "Dienstleistungen",
66
-    "Descending": "Absteigend",
67
-    "Amount": "Betrag",
68
-    "Appearance": "Aussehen",
69
-    "Invoice": "Rechnung",
70
-    "Entity Type": "Art der Entität",
71
-    "Corporation": "Korporation",
72
-    "Hours": "Stunden",
73
-    "Sales Discount": "Verkaufsrabatt",
74
-    "Rate": "Bewerte",
75
-    "2X Large": "2X Groß",
76
-    "Purchase Discount": "Rabatt beim Kauf",
77
-    "Navigation Layout": "Navigationslayout",
78
-    "Live Currency": "Live-Währung",
79
-    "Taxes & Discounts": "Steuern und Rabatte",
80
-    "Company Profile": "Profil des Unternehmens",
81
-    "General Partnership": "Allgemeine Partnerschaft",
82
-    "Net 7": "Netto 7",
83
-    "7X Large": "7X Groß",
84
-    "3X Large": "3X Groß",
85
-    "Number Prefix": "Nummernpräfix",
86
-    "Number Digits": "Anzahl Ziffern",
87
-    "Subheader": "Unterüberschrift",
88
-    "Accent Color": "Akzentfarbe",
89
-    "Due Upon Receipt": "Fällig bei Erhalt",
90
-    "Select Position": "Position wählen",
91
-    "Number Format": "Zahlenformat",
92
-    "Percent Position": "Prozentuale Position",
93
-    "Purchase Tax": "Umsatzsteuer",
94
-    "Connected Accounts": "Verbundene Konten",
95
-    "Max Content Width": "Max. Inhaltsbreite",
96
-    "Side Navigation": "Seitliche Navigation",
97
-    "Striped Tables": "Gestreifte Tische",
98
-    "4X Large": "4X Groß",
99
-    "6X Large": "6X Groß",
56
+    "State \/ Province": "Bundesstaat\/ Provinz",
57
+    "Street Address": "Straße & Adresse",
100
     "City \/ Town": "Stadt\/Stadt",
58
     "City \/ Town": "Stadt\/Stadt",
101
-    "Limited Liability Partnership (LLP)": "Partnerschaft mit beschränkter Haftung (LLP)",
102
-    "Primary Color": "Primäre Farbe",
59
+    "Zip \/ Postal Code": "PLZ\/PLZ",
103
     "Legal & Compliance": "Recht und Compliance",
60
     "Legal & Compliance": "Recht und Compliance",
104
-    "Default": "Standard",
61
+    "Entity type": "Art der Entität",
62
+    "Tax ID": "Steuer-ID",
105
     "Sole Proprietorship": "Einzelunternehmen",
63
     "Sole Proprietorship": "Einzelunternehmen",
64
+    "General Partnership": "Allgemeine Partnerschaft",
106
     "Limited Partnership (LP)": "Kommanditgesellschaft (LP)",
65
     "Limited Partnership (LP)": "Kommanditgesellschaft (LP)",
66
+    "Limited Liability Partnership (LLP)": "Partnerschaft mit beschränkter Haftung (LLP)",
107
     "Limited Liability Company (LLC)": "Gesellschaft mit beschränkter Haftung (LLC)",
67
     "Limited Liability Company (LLC)": "Gesellschaft mit beschränkter Haftung (LLC)",
68
+    "Corporation": "Korporation",
108
     "Nonprofit": "Gemeinnützig",
69
     "Nonprofit": "Gemeinnützig",
109
-    "Before Number": "Vor der Nummer",
110
-    "Currency": "Währung",
111
-    "Modal Width": "Modale Breite",
112
-    "Screen Extra Large": "Extragroßer Bildschirm",
113
-    "Show Logo": "Logo einblenden",
114
-    "Price Name": "Name des Preises",
115
-    "Amount Name": "Name des Betrags",
116
-    "Net 60": "Netto 60",
117
-    "Net 90": "Netto 90",
118
-    "Week Start": "Wochenstart",
119
-    "Street Address": "Straße & Adresse",
120
-    "Tax ID": "Steuer-ID",
121
-    "Date Format": "Datumsformat",
122
-    "Number Next": "Nummer Weiter",
70
+    "Number prefix": "Nummernpräfix",
71
+    "Number digits": "Anzahl Ziffern",
72
+    "Number next": "Nummer Weiter",
73
+    "Payment terms": "Zahlungsbedingungen",
74
+    "Content": "Inhalt",
75
+    "Header": "Kopfzeile",
76
+    "Subheader": "Unterüberschrift",
77
+    "Footer \/ notes": "Fußzeile\/\/Notizen",
78
+    "Template": "Schablone",
79
+    "Show logo": "Logo einblenden",
80
+    "Accent color": "Akzentfarbe",
81
+    "Item name": "Name des Artikels",
82
+    "Items": "Artikel",
83
+    "Products": "Produkte",
84
+    "Other": "Andere",
85
+    "Unit name": "Name der Einheit",
86
+    "Quantity": "Menge",
87
+    "Hours": "Stunden",
88
+    "Price name": "Name des Preises",
89
+    "Price": "Preis",
90
+    "Rate": "Bewerte",
91
+    "Amount name": "Name des Betrags",
92
+    "Amount": "Betrag",
93
+    "Total": "Insgesamt",
94
+    "Due Upon Receipt": "Fällig bei Erhalt",
95
+    "Net 7": "Netto 7",
123
     "Net 10": "Netto 10",
96
     "Net 10": "Netto 10",
124
     "Net 15": "Netto 15",
97
     "Net 15": "Netto 15",
125
-    "teal": "blaugrün",
126
-    "amber": "Bernstein",
127
-    "Location Details": "Angaben zum Standort",
128
-    "Item Name": "Name des Artikels",
129
-    "Time Format": "Zeitformat",
130
-    "Top Navigation": "Navigation nach oben",
131
-    "Screen Large": "Bildschirm groß",
132
-    "Unit Name": "Name der Einheit",
133
-    "Footer \/ Notes": "Fußzeile\/\/Notizen",
134
-    "5X Large": "5X Groß",
135
     "Net 30": "Netto 30",
98
     "Net 30": "Netto 30",
136
-    "Table Sort Direction": "Sortierrichtung der Tabelle",
137
-    "Screen 2X Large": "Bildschirm 2X groß",
138
-    "After Number": "Nach Nummer",
99
+    "Net 60": "Netto 60",
100
+    "Net 90": "Netto 90",
101
+    "Modern": "modern",
102
+    "Classic": "Klassisch",
103
+    "Language": "Sprache",
104
+    "Timezone": "Zeitzone",
105
+    "Date & Time": "Datum und Uhrzeit",
106
+    "Date format": "Datumsformat",
107
+    "Time format": "Zeitformat",
108
+    "Week start": "Wochenstart",
109
+    "Before number": "Vor der Nummer",
110
+    "After number": "Nach Nummer",
111
+    "Select position": "Position wählen",
139
     "Financial & Fiscal": "Finanziell und steuerlich",
112
     "Financial & Fiscal": "Finanziell und steuerlich",
140
-    "Data Presentation": "Präsentation der Daten",
141
-    "Payment Terms": "Zahlungsbedingungen",
142
-    "Records Per Page": "Datensätze pro Seite",
113
+    "Number format": "Zahlenformat",
114
+    "Percent position": "Prozentuale Position",
143
     "Name": "Name",
115
     "Name": "Name",
144
     "Code": "Kode",
116
     "Code": "Kode",
145
     "Symbol": "Symbol",
117
     "Symbol": "Symbol",
146
-    "Default :Record": "Standard :Record",
118
+    "Default :record": "Standard :record",
147
     "Type": "Typ",
119
     "Type": "Typ",
148
-    "Start Date": "Startdatum",
149
-    "End Date": "Enddatum",
120
+    "Start date": "Startdatum",
121
+    "End date": "Enddatum",
150
     "Sales": "Verkäufe",
122
     "Sales": "Verkäufe",
123
+    "Default :type :record": "Standard :type :record",
151
     "Purchase": "Kauf",
124
     "Purchase": "Kauf",
152
     "Precision": "Präzision",
125
     "Precision": "Präzision",
153
-    "Symbol Position": "Position des Symbols",
154
-    "Before Amount": "Vor dem Betrag",
155
-    "After Amount": "Nach Betrag",
126
+    "Symbol position": "Position des Symbols",
127
+    "Before amount": "Vor dem Betrag",
128
+    "After amount": "Nach Betrag",
156
     "Select a symbol position": "Wählen Sie eine Symbolposition",
129
     "Select a symbol position": "Wählen Sie eine Symbolposition",
157
-    "Decimal Separator": "Dezimaltrennzeichen",
158
-    "Thousands Separator": "Tausender-Trennzeichen",
130
+    "Decimal separator": "Dezimaltrennzeichen",
131
+    "Thousands separator": "Tausender-Trennzeichen",
159
     "Yes": "Ja",
132
     "Yes": "Ja",
160
     "No": "Nein",
133
     "No": "Nein",
161
     "Description": "Beschreibung",
134
     "Description": "Beschreibung",
167
     "Product": "Produkt",
140
     "Product": "Produkt",
168
     "Service": "Bedienung",
141
     "Service": "Bedienung",
169
     "Compound": "Verbindung",
142
     "Compound": "Verbindung",
170
-    "Current Balance": "Aktueller Saldo",
143
+    "Current balance": "Aktueller Saldo",
171
     "Account Information": "Informationen zum Konto",
144
     "Account Information": "Informationen zum Konto",
172
     "Subtype": "Subtyp",
145
     "Subtype": "Subtyp",
173
-    "Account Number": "Kontonummer",
146
+    "Account number": "Kontonummer",
147
+    "Investment": "Investition",
174
     "Credit": "Kredit",
148
     "Credit": "Kredit",
149
+    "Depository": "Verwahrstelle",
175
     "Loan": "Darlehen",
150
     "Loan": "Darlehen",
176
     "Manager": "Geschäftsführer",
151
     "Manager": "Geschäftsführer",
177
     "Children": "Kinder",
152
     "Children": "Kinder",
178
-    "Investment": "Investition",
179
-    "Depository": "Verwahrstelle",
180
     "All": "Alle",
153
     "All": "Alle",
181
     "Main": "Haupt",
154
     "Main": "Haupt",
182
-    "Entity": "Entität",
183
-    "Available": "Verfügbar",
184
-    "Parent Department": "Elternabteilung",
155
+    "Parent department": "Elternabteilung",
185
     "Currency List": "Liste der Währungen",
156
     "Currency List": "Liste der Währungen",
186
     "Company Currencies": "Währungen des Unternehmens",
157
     "Company Currencies": "Währungen des Unternehmens",
187
-    "Live Rate": "Live-Tarif",
188
-    "Default :Type :Record": "Standard :Type :Record"
158
+    "Entity": "Entität",
159
+    "Available": "Verfügbar",
160
+    "Live rate": "Live-Tarif",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 46
- 74
resources/data/lang/en.json View File

1
 {
1
 {
2
     "General": "General",
2
     "General": "General",
3
-    "Bank Account": "Bank Account",
3
+    "Bank account": "Bank account",
4
     "Currency": "Currency",
4
     "Currency": "Currency",
5
     "Taxes & Discounts": "Taxes & Discounts",
5
     "Taxes & Discounts": "Taxes & Discounts",
6
-    "Sales Tax": "Sales Tax",
7
-    "Purchase Tax": "Purchase Tax",
8
-    "Sales Discount": "Sales Discount",
9
-    "Purchase Discount": "Purchase Discount",
6
+    "Sales tax": "Sales tax",
7
+    "Purchase tax": "Purchase tax",
8
+    "Sales discount": "Sales discount",
9
+    "Purchase discount": "Purchase Discount",
10
     "Appearance": "Appearance",
10
     "Appearance": "Appearance",
11
     "Default": "Default",
11
     "Default": "Default",
12
     "Company Profile": "Company Profile",
12
     "Company Profile": "Company Profile",
21
     "Services": "Services",
21
     "Services": "Services",
22
     "Connected Accounts": "Connected Accounts",
22
     "Connected Accounts": "Connected Accounts",
23
     "Live Currency": "Live Currency",
23
     "Live Currency": "Live Currency",
24
-    "Primary Color": "Primary Color",
24
+    "Primary color": "Primary color",
25
     "amber": "amber",
25
     "amber": "amber",
26
     "blue": "blue",
26
     "blue": "blue",
27
     "cyan": "cyan",
27
     "cyan": "cyan",
45
     "yellow": "yellow",
45
     "yellow": "yellow",
46
     "zinc": "zinc",
46
     "zinc": "zinc",
47
     "Font": "Font",
47
     "Font": "Font",
48
-    "Layout": "Layout",
49
-    "Max Content Width": "Max Content Width",
50
-    "Modal Width": "Modal Width",
51
-    "Navigation Layout": "Navigation Layout",
52
-    "Top Navigation": "Top Navigation",
53
-    "Side Navigation": "Side Navigation",
54
-    "Striped Tables": "Striped Tables",
55
     "Enabled": "Enabled",
48
     "Enabled": "Enabled",
56
     "Disabled": "Disabled",
49
     "Disabled": "Disabled",
57
-    "Data Presentation": "Data Presentation",
58
-    "Table Sort Direction": "Table Sort Direction",
59
-    "Records Per Page": "Records Per Page",
60
-    "4X Large": "4X Large",
61
-    "5X Large": "5X Large",
62
-    "6X Large": "6X Large",
63
-    "7X Large": "7X Large",
64
-    "Screen Large": "Screen Large",
65
-    "Screen Extra Large": "Screen Extra Large",
66
-    "Screen 2X Large": "Screen 2X Large",
67
-    "Full": "Full",
68
-    "Extra Small": "Extra Small",
69
-    "Small": "Small",
70
-    "Medium": "Medium",
71
-    "Large": "Large",
72
-    "Extra Large": "Extra Large",
73
-    "2X Large": "2X Large",
74
-    "3X Large": "3X Large",
75
-    "Screen": "Screen",
76
-    "Ascending": "Ascending",
77
-    "Descending": "Descending",
78
     "Identification": "Identification",
50
     "Identification": "Identification",
79
     "Email": "Email",
51
     "Email": "Email",
80
-    "Phone Number": "Phone Number",
52
+    "Phone number": "Phone number",
81
     "Logo": "Logo",
53
     "Logo": "Logo",
82
     "Location Details": "Location Details",
54
     "Location Details": "Location Details",
83
     "Country": "Country",
55
     "Country": "Country",
86
     "City \/ Town": "City \/ Town",
58
     "City \/ Town": "City \/ Town",
87
     "Zip \/ Postal Code": "Zip \/ Postal Code",
59
     "Zip \/ Postal Code": "Zip \/ Postal Code",
88
     "Legal & Compliance": "Legal & Compliance",
60
     "Legal & Compliance": "Legal & Compliance",
89
-    "Entity Type": "Entity Type",
61
+    "Entity type": "Entity type",
90
     "Tax ID": "Tax ID",
62
     "Tax ID": "Tax ID",
91
     "Sole Proprietorship": "Sole Proprietorship",
63
     "Sole Proprietorship": "Sole Proprietorship",
92
     "General Partnership": "General Partnership",
64
     "General Partnership": "General Partnership",
95
     "Limited Liability Company (LLC)": "Limited Liability Company (LLC)",
67
     "Limited Liability Company (LLC)": "Limited Liability Company (LLC)",
96
     "Corporation": "Corporation",
68
     "Corporation": "Corporation",
97
     "Nonprofit": "Nonprofit",
69
     "Nonprofit": "Nonprofit",
98
-    "Number Prefix": "Number Prefix",
99
-    "Number Digits": "Number Digits",
100
-    "Number Next": "Number Next",
101
-    "Payment Terms": "Payment Terms",
70
+    "Number prefix": "Number prefix",
71
+    "Number digits": "Number digits",
72
+    "Number next": "Number next",
73
+    "Payment terms": "Payment terms",
102
     "Content": "Content",
74
     "Content": "Content",
103
     "Header": "Header",
75
     "Header": "Header",
104
     "Subheader": "Subheader",
76
     "Subheader": "Subheader",
105
-    "Footer \/ Notes": "Footer \/ Notes",
77
+    "Footer \/ notes": "Footer \/ notes",
106
     "Template": "Template",
78
     "Template": "Template",
107
-    "Show Logo": "Show Logo",
108
-    "Accent Color": "Accent Color",
109
-    "Item Name": "Item Name",
79
+    "Show logo": "Show logo",
80
+    "Accent color": "Accent color",
81
+    "Item name": "Item name",
110
     "Items": "Items",
82
     "Items": "Items",
111
     "Products": "Products",
83
     "Products": "Products",
112
     "Other": "Other",
84
     "Other": "Other",
113
-    "Unit Name": "Unit Name",
85
+    "Unit name": "Unit name",
114
     "Quantity": "Quantity",
86
     "Quantity": "Quantity",
115
     "Hours": "Hours",
87
     "Hours": "Hours",
116
-    "Price Name": "Price Name",
88
+    "Price name": "Price name",
117
     "Price": "Price",
89
     "Price": "Price",
118
     "Rate": "Rate",
90
     "Rate": "Rate",
119
-    "Amount Name": "Amount Name",
91
+    "Amount name": "Amount name",
120
     "Amount": "Amount",
92
     "Amount": "Amount",
121
     "Total": "Total",
93
     "Total": "Total",
122
     "Due Upon Receipt": "Due Upon Receipt",
94
     "Due Upon Receipt": "Due Upon Receipt",
131
     "Language": "Language",
103
     "Language": "Language",
132
     "Timezone": "Timezone",
104
     "Timezone": "Timezone",
133
     "Date & Time": "Date & Time",
105
     "Date & Time": "Date & Time",
134
-    "Date Format": "Date Format",
135
-    "Time Format": "Time Format",
136
-    "Week Start": "Week Start",
137
-    "Before Number": "Before Number",
138
-    "After Number": "After Number",
139
-    "Select Position": "Select Position",
106
+    "Date format": "Date format",
107
+    "Time format": "Time format",
108
+    "Week start": "Week start",
109
+    "Before number": "Before number",
110
+    "After number": "After number",
111
+    "Select position": "Select position",
140
     "Financial & Fiscal": "Financial & Fiscal",
112
     "Financial & Fiscal": "Financial & Fiscal",
141
-    "Number Format": "Number Format",
142
-    "Percent Position": "Percent Position",
113
+    "Number format": "Number format",
114
+    "Percent position": "Percent position",
143
     "Name": "Name",
115
     "Name": "Name",
144
     "Code": "Code",
116
     "Code": "Code",
145
     "Symbol": "Symbol",
117
     "Symbol": "Symbol",
146
-    "Default :Record": "Default :Record",
118
+    "Default :record": "Default :record",
147
     "Type": "Type",
119
     "Type": "Type",
148
-    "Start Date": "Start Date",
149
-    "End Date": "End Date",
120
+    "Start date": "Start date",
121
+    "End date": "End date",
150
     "Sales": "Sales",
122
     "Sales": "Sales",
151
-    "Default :Type :Record": "Default :Type :Record",
123
+    "Default :type :record": "Default :type :record",
152
     "Purchase": "Purchase",
124
     "Purchase": "Purchase",
153
     "Precision": "Precision",
125
     "Precision": "Precision",
154
-    "Symbol Position": "Symbol Position",
155
-    "Before Amount": "Before Amount",
156
-    "After Amount": "After Amount",
126
+    "Symbol position": "Symbol position",
127
+    "Before amount": "Before amount",
128
+    "After amount": "After amount",
157
     "Select a symbol position": "Select a symbol position",
129
     "Select a symbol position": "Select a symbol position",
158
-    "Decimal Separator": "Decimal Separator",
159
-    "Thousands Separator": "Thousands Separator",
130
+    "Decimal separator": "Decimal separator",
131
+    "Thousands separator": "Thousands separator",
160
     "Yes": "Yes",
132
     "Yes": "Yes",
161
     "No": "No",
133
     "No": "No",
162
     "Description": "Description",
134
     "Description": "Description",
168
     "Product": "Product",
140
     "Product": "Product",
169
     "Service": "Service",
141
     "Service": "Service",
170
     "Compound": "Compound",
142
     "Compound": "Compound",
171
-    "Current Balance": "Current Balance",
143
+    "Current balance": "Current balance",
172
     "Account Information": "Account Information",
144
     "Account Information": "Account Information",
173
     "Subtype": "Subtype",
145
     "Subtype": "Subtype",
174
-    "Account Number": "Account Number",
146
+    "Account number": "Account number",
175
     "Investment": "Investment",
147
     "Investment": "Investment",
176
     "Credit": "Credit",
148
     "Credit": "Credit",
177
     "Depository": "Depository",
149
     "Depository": "Depository",
180
     "Children": "Children",
152
     "Children": "Children",
181
     "All": "All",
153
     "All": "All",
182
     "Main": "Main",
154
     "Main": "Main",
183
-    "Parent Department": "Parent Department",
155
+    "Parent department": "Parent department",
184
     "Currency List": "Currency List",
156
     "Currency List": "Currency List",
185
     "Company Currencies": "Company Currencies",
157
     "Company Currencies": "Company Currencies",
186
     "Entity": "Entity",
158
     "Entity": "Entity",
187
     "Available": "Available",
159
     "Available": "Available",
188
-    "Live Rate": "Live Rate",
160
+    "Live rate": "Live rate",
189
     "Edit": "Edit",
161
     "Edit": "Edit",
190
     "Notes": "Notes",
162
     "Notes": "Notes",
191
     "Terms": "Terms",
163
     "Terms": "Terms",
192
-    "Ending Balance": "Ending Balance",
193
-    "Default :Type :Category": "Default :Type :Category",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
194
     "Category": "Category",
166
     "Category": "Category",
195
     "Configuration": "Configuration",
167
     "Configuration": "Configuration",
196
     "Dates": "Dates",
168
     "Dates": "Dates",
221
     "Scheduling Form": "Scheduling Form",
193
     "Scheduling Form": "Scheduling Form",
222
     "Approve": "Approve",
194
     "Approve": "Approve",
223
     "Frequency": "Frequency",
195
     "Frequency": "Frequency",
224
-    "Schedule Bounds": "Schedule Bounds",
225
-    "Time Zone": "Time Zone",
226
-    "Dates & Time": "Dates & Time"
227
-}
196
+    "Dates & Time": "Dates & Time",
197
+    "account": "account",
198
+    "currency": "currency"
199
+}

+ 119
- 149
resources/data/lang/es.json View File

1
 {
1
 {
2
     "General": "General",
2
     "General": "General",
3
+    "Bank account": "Cuenta bancaria",
4
+    "Currency": "Moneda",
5
+    "Taxes & Discounts": "Impuestos y descuentos",
6
+    "Sales tax": "Impuesto sobre las ventas",
7
+    "Purchase tax": "Impuesto de compra",
8
+    "Sales discount": "Descuento de ventas",
9
+    "Purchase discount": "Descuento de compra",
10
+    "Appearance": "Apariencia",
11
+    "Default": "Predeterminado",
12
+    "Company Profile": "Perfil de la empresa",
3
     "Invoice": "Factura",
13
     "Invoice": "Factura",
4
-    "neutral": "neutral",
5
-    "emerald": "esmeralda",
6
-    "slate": "pizarra",
7
-    "Bank Account": "Cuenta bancaria",
8
     "Localization": "Localización",
14
     "Localization": "Localización",
9
-    "zinc": "zinc",
10
-    "Disabled": "Discapacitado",
11
-    "Descending": "Descendiendo",
12
-    "Default": "Predeterminado",
13
-    "Account": "Cuenta",
14
-    "sky": "cielo",
15
-    "Country": "País",
16
-    "Modern": "Moderna",
17
-    "Currency": "Moneda",
18
-    "Sales Tax": "Impuesto sobre las ventas",
19
     "Discount": "Descuento",
15
     "Discount": "Descuento",
16
+    "Tax": "Impuesto",
17
+    "Accounting": "Contabilidad",
20
     "Banking": "Banca",
18
     "Banking": "Banca",
19
+    "Account": "Cuenta",
20
+    "Department": "Departamento",
21
+    "Services": "Servicios",
22
+    "Connected Accounts": "Cuentas conectadas",
23
+    "Live Currency": "Moneda en vivo",
24
+    "Primary color": "Color primario",
21
     "amber": "ámbar",
25
     "amber": "ámbar",
26
+    "blue": "azul",
27
+    "cyan": "cian",
28
+    "emerald": "esmeralda",
29
+    "fuchsia": "fucsia",
22
     "gray": "gris",
30
     "gray": "gris",
23
     "green": "verde",
31
     "green": "verde",
32
+    "indigo": "índigo",
24
     "lime": "cal",
33
     "lime": "cal",
34
+    "neutral": "neutral",
35
+    "orange": "naranja",
36
+    "pink": "rosa",
25
     "purple": "púrpura",
37
     "purple": "púrpura",
26
     "red": "rojo",
38
     "red": "rojo",
39
+    "rose": "rosa",
40
+    "sky": "cielo",
41
+    "slate": "pizarra",
42
+    "stone": "apedrear",
27
     "teal": "verde azulado",
43
     "teal": "verde azulado",
44
+    "violet": "violeta",
45
+    "yellow": "amarillo",
46
+    "zinc": "zinc",
28
     "Font": "Tipo de letra",
47
     "Font": "Tipo de letra",
29
-    "Full": "Lleno",
30
-    "Extra Small": "Extra pequeño",
31
-    "Medium": "Mediano",
32
-    "Large": "Grande",
33
-    "Extra Large": "Extra grande",
34
-    "Screen": "Pantalla",
35
-    "Ascending": "Ascendente",
48
+    "Enabled": "Habilitado",
49
+    "Disabled": "Discapacitado",
36
     "Identification": "Identificación",
50
     "Identification": "Identificación",
51
+    "Email": "Correo electrónico",
52
+    "Phone number": "Número de teléfono",
53
+    "Logo": "Logotipo",
54
+    "Location Details": "Detalles de ubicación",
55
+    "Country": "País",
37
     "State \/ Province": "Estado\/provincia",
56
     "State \/ Province": "Estado\/provincia",
38
     "Street Address": "Dirección postal",
57
     "Street Address": "Dirección postal",
58
+    "City \/ Town": "Ciudad\/pueblo",
39
     "Zip \/ Postal Code": "Código postal o postal",
59
     "Zip \/ Postal Code": "Código postal o postal",
60
+    "Legal & Compliance": "Legislación y cumplimiento",
61
+    "Entity type": "Tipo de entidad",
62
+    "Tax ID": "ID fiscal",
40
     "Sole Proprietorship": "Empresa unipersonal",
63
     "Sole Proprietorship": "Empresa unipersonal",
64
+    "General Partnership": "Colaboración general",
65
+    "Limited Partnership (LP)": "Sociedad en comandita (LP)",
66
+    "Limited Liability Partnership (LLP)": "Sociedad de responsabilidad limitada (LLP)",
67
+    "Limited Liability Company (LLC)": "Sociedad de responsabilidad limitada (LLC)",
68
+    "Corporation": "Corporación",
41
     "Nonprofit": "Organización sin fines",
69
     "Nonprofit": "Organización sin fines",
70
+    "Number prefix": "Prefijo numérico",
71
+    "Number digits": "Dígitos numéricos",
72
+    "Number next": "Número siguiente",
73
+    "Payment terms": "Condiciones de pago",
42
     "Content": "Contenido",
74
     "Content": "Contenido",
43
     "Header": "Cabecera",
75
     "Header": "Cabecera",
76
+    "Subheader": "Subtítulo",
77
+    "Footer \/ notes": "Pie de página\/Notas",
44
     "Template": "plantilla",
78
     "Template": "plantilla",
79
+    "Show logo": "Mostrar logotipo",
80
+    "Accent color": "Color de acento",
81
+    "Item name": "Nombre del artículo",
45
     "Items": "Artículos",
82
     "Items": "Artículos",
46
     "Products": "Productos",
83
     "Products": "Productos",
47
     "Other": "Otros",
84
     "Other": "Otros",
85
+    "Unit name": "Nombre de la unidad",
86
+    "Quantity": "Cantidad",
48
     "Hours": "Horas",
87
     "Hours": "Horas",
88
+    "Price name": "Nombre del precio",
49
     "Price": "Precio",
89
     "Price": "Precio",
50
     "Rate": "Tarifa",
90
     "Rate": "Tarifa",
91
+    "Amount name": "Nombre del importe",
51
     "Amount": "Monto",
92
     "Amount": "Monto",
93
+    "Total": "Total",
94
+    "Due Upon Receipt": "Vencimiento al recibirlo",
95
+    "Net 7": "Red 7",
96
+    "Net 10": "Neto 10",
97
+    "Net 15": "Neto 15",
98
+    "Net 30": "Neto 30",
99
+    "Net 60": "Neto 60",
100
+    "Net 90": "Neto 90",
101
+    "Modern": "Moderna",
102
+    "Classic": "Clásico",
52
     "Language": "Idioma",
103
     "Language": "Idioma",
53
     "Timezone": "Zona horaria",
104
     "Timezone": "Zona horaria",
54
     "Date & Time": "Fecha y hora",
105
     "Date & Time": "Fecha y hora",
55
-    "Select Position": "Seleccione posición",
106
+    "Date format": "Formato de fecha",
107
+    "Time format": "Formato de hora",
108
+    "Week start": "Inicio de semana",
109
+    "Before number": "Antes del número",
110
+    "After number": "Después del número",
111
+    "Select position": "Seleccione posición",
112
+    "Financial & Fiscal": "Financiero y fiscal",
113
+    "Number format": "Formato numérico",
114
+    "Percent position": "Posición porcentual",
56
     "Name": "Nombre",
115
     "Name": "Nombre",
57
     "Code": "Código",
116
     "Code": "Código",
58
     "Symbol": "Símbolo",
117
     "Symbol": "Símbolo",
118
+    "Default :record": "Predeterminado :record",
59
     "Type": "Tipo",
119
     "Type": "Tipo",
60
-    "Start Date": "Fecha de inicio",
61
-    "End Date": "Fecha de finalización",
120
+    "Start date": "Fecha de inicio",
121
+    "End date": "Fecha de finalización",
62
     "Sales": "Ventas",
122
     "Sales": "Ventas",
123
+    "Default :type :record": "Predeterminado :type :record",
63
     "Purchase": "Adquirir",
124
     "Purchase": "Adquirir",
64
     "Precision": "Precisión",
125
     "Precision": "Precisión",
126
+    "Symbol position": "Posición del símbolo",
127
+    "Before amount": "Cantidad anterior",
128
+    "After amount": "Después del importe",
129
+    "Select a symbol position": "Seleccione la posición de un símbolo",
130
+    "Decimal separator": "Separador decimal",
131
+    "Thousands separator": "Separador de miles",
65
     "Yes": "Sí",
132
     "Yes": "Sí",
66
     "No": "No",
133
     "No": "No",
67
     "Description": "Descripción",
134
     "Description": "Descripción",
68
-    "None": "Ninguna",
69
-    "Product": "Producto",
70
-    "Compound": "Compuesto",
71
-    "Account Information": "Información de la cuenta",
72
-    "Account Number": "Número de cuenta",
73
-    "Investment": "Inversión",
74
-    "Purchase Tax": "Impuesto de compra",
75
-    "Purchase Discount": "Descuento de compra",
76
-    "Appearance": "Apariencia",
77
-    "Company Profile": "Perfil de la empresa",
78
-    "Tax": "Impuesto",
79
-    "Department": "Departamento",
80
-    "Services": "Servicios",
81
-    "blue": "azul",
82
-    "cyan": "cian",
83
-    "fuchsia": "fucsia",
84
-    "indigo": "índigo",
85
-    "orange": "naranja",
86
-    "pink": "rosa",
87
-    "rose": "rosa",
88
-    "stone": "apedrear",
89
-    "violet": "violeta",
90
-    "yellow": "amarillo",
91
-    "Layout": "Disposición",
92
-    "Max Content Width": "Ancho máximo de contenido",
93
-    "Modal Width": "Anchura modal",
94
-    "Side Navigation": "Navegación lateral",
95
-    "Enabled": "Habilitado",
96
-    "Data Presentation": "Presentación de datos",
97
-    "5X Large": "5 veces más grande",
98
-    "6X Large": "6 veces más grande",
99
-    "Screen Large": "Pantalla grande",
100
-    "Screen Extra Large": "Pantalla extra grande",
101
-    "Small": "Pequeña",
102
-    "2X Large": "2 veces grande",
103
-    "Email": "Correo electrónico",
104
-    "Phone Number": "Número de teléfono",
105
-    "Logo": "Logotipo",
106
-    "Entity Type": "Tipo de entidad",
107
-    "Corporation": "Corporación",
108
-    "Item Name": "Nombre del artículo",
109
-    "Quantity": "Cantidad",
110
-    "Price Name": "Nombre del precio",
111
-    "Total": "Total",
112
-    "Net 7": "Red 7",
113
-    "Net 10": "Neto 10",
114
-    "Net 90": "Neto 90",
115
-    "Classic": "Clásico",
116
-    "Financial & Fiscal": "Financiero y fiscal",
117
     "Computation": "Computación",
135
     "Computation": "Computación",
136
+    "Scope": "Alcance",
118
     "Percentage": "Porcentaje",
137
     "Percentage": "Porcentaje",
119
     "Fixed": "Fijo",
138
     "Fixed": "Fijo",
139
+    "None": "Ninguna",
140
+    "Product": "Producto",
120
     "Service": "Servicio",
141
     "Service": "Servicio",
121
-    "Current Balance": "Saldo actual",
122
-    "Taxes & Discounts": "Impuestos y descuentos",
123
-    "Sales Discount": "Descuento de ventas",
124
-    "Accounting": "Contabilidad",
125
-    "Connected Accounts": "Cuentas conectadas",
126
-    "3X Large": "3 veces más grande",
127
-    "Footer \/ Notes": "Pie de página\/Notas",
128
-    "Decimal Separator": "Separador decimal",
129
-    "Scope": "Alcance",
130
-    "Top Navigation": "Navegación superior",
131
-    "Symbol Position": "Posición del símbolo",
132
-    "Striped Tables": "Mesas rayadas",
133
-    "Date Format": "Formato de fecha",
134
-    "Subheader": "Subtítulo",
135
-    "Default :Type :Record": "Predeterminado :Type :Record",
136
-    "Before Amount": "Cantidad anterior",
137
-    "Limited Partnership (LP)": "Sociedad en comandita (LP)",
138
-    "Tax ID": "ID fiscal",
139
-    "Show Logo": "Mostrar logotipo",
140
-    "Number Prefix": "Prefijo numérico",
141
-    "Net 15": "Neto 15",
142
-    "After Number": "Después del número",
143
-    "Number Format": "Formato numérico",
144
-    "Due Upon Receipt": "Vencimiento al recibirlo",
145
-    "7X Large": "7 veces más grande",
146
-    "Amount Name": "Nombre del importe",
147
-    "Default :Record": "Predeterminado :Record",
148
-    "Select a symbol position": "Seleccione la posición de un símbolo",
149
-    "Net 60": "Neto 60",
150
-    "Before Number": "Antes del número",
151
-    "4X Large": "4 veces más grande",
152
-    "Week Start": "Inicio de semana",
153
-    "City \/ Town": "Ciudad\/pueblo",
154
-    "Live Currency": "Moneda en vivo",
155
-    "Screen 2X Large": "Pantalla 2 veces grande",
156
-    "Payment Terms": "Condiciones de pago",
157
-    "Thousands Separator": "Separador de miles",
158
-    "Table Sort Direction": "Dirección de clasificación de tablas",
159
-    "General Partnership": "Colaboración general",
160
-    "Records Per Page": "Registros por página",
161
-    "Number Digits": "Dígitos numéricos",
162
-    "Navigation Layout": "Diseño de navegación",
163
-    "Location Details": "Detalles de ubicación",
164
-    "Primary Color": "Color primario",
165
-    "Net 30": "Neto 30",
166
-    "After Amount": "Después del importe",
167
-    "Limited Liability Partnership (LLP)": "Sociedad de responsabilidad limitada (LLP)",
168
-    "Limited Liability Company (LLC)": "Sociedad de responsabilidad limitada (LLC)",
169
-    "Unit Name": "Nombre de la unidad",
170
-    "Percent Position": "Posición porcentual",
171
-    "Legal & Compliance": "Legislación y cumplimiento",
172
-    "Number Next": "Número siguiente",
173
-    "Accent Color": "Color de acento",
142
+    "Compound": "Compuesto",
143
+    "Current balance": "Saldo actual",
144
+    "Account Information": "Información de la cuenta",
174
     "Subtype": "Subtipo",
145
     "Subtype": "Subtipo",
175
-    "Time Format": "Formato de hora",
176
-    "Loan": "préstamo",
146
+    "Account number": "Número de cuenta",
147
+    "Investment": "Inversión",
177
     "Credit": "Crédito",
148
     "Credit": "Crédito",
178
-    "Manager": "Gerente",
179
-    "All": "Todas",
180
     "Depository": "Depositario",
149
     "Depository": "Depositario",
150
+    "Loan": "préstamo",
151
+    "Manager": "Gerente",
181
     "Children": "Niños",
152
     "Children": "Niños",
182
-    "Company Currencies": "Monedas de la empresa",
153
+    "All": "Todas",
183
     "Main": "Principal",
154
     "Main": "Principal",
184
-    "Entity": "Entidad",
155
+    "Parent department": "Departamento de padres",
185
     "Currency List": "Lista de divisas",
156
     "Currency List": "Lista de divisas",
157
+    "Company Currencies": "Monedas de la empresa",
158
+    "Entity": "Entidad",
186
     "Available": "Disponible",
159
     "Available": "Disponible",
187
-    "Parent Department": "Departamento de padres",
188
-    "Live Rate": "Tarifa en vivo",
160
+    "Live rate": "Tarifa en vivo",
161
+    "Edit": "Editar",
162
+    "Notes": "Notas",
163
+    "Terms": "Términos",
164
+    "Ending balance": "Saldo final",
165
+    "Default :type :category": "Predeterminado :type :category",
189
     "Category": "Categoría",
166
     "Category": "Categoría",
190
     "Configuration": "Configuración",
167
     "Configuration": "Configuración",
191
     "Dates": "Fechas",
168
     "Dates": "Fechas",
201
     "Primary Contact": "Contacto principal",
178
     "Primary Contact": "Contacto principal",
202
     "Billing Address": "Dirección de facturación",
179
     "Billing Address": "Dirección de facturación",
203
     "Shipping Address": "Dirección de envío",
180
     "Shipping Address": "Dirección de envío",
181
+    "Secondary Contacts": "Contactos secundarios",
182
+    "Address Information": "Información de dirección",
204
     "Invoice Header": "Encabezado de factura",
183
     "Invoice Header": "Encabezado de factura",
205
     "Invoice Details": "Detalles de la factura",
184
     "Invoice Details": "Detalles de la factura",
206
-    "Secondary Contacts": "Contactos secundarios",
207
-    "Edit": "Editar",
185
+    "Footer": "Pie de página",
186
+    "Invoice Footer": "Pie de página de la factura",
208
     "Bill Details": "Detalles de la factura",
187
     "Bill Details": "Detalles de la factura",
209
-    "Frequency": "Frecuencia",
210
-    "Scheduling": "Programación",
211
-    "Notes": "Notas",
212
     "Create": "Crear",
188
     "Create": "Crear",
213
-    "Invoice Footer": "Pie de página de la factura",
214
-    "Time Zone": "Zona horaria",
215
-    "Footer": "Pie de página",
216
     "Estimate Header": "Encabezado de estimación",
189
     "Estimate Header": "Encabezado de estimación",
217
-    "Terms": "Términos",
190
+    "Estimate Details": "Detalles de la estimación",
218
     "Estimate Footer": "Estimar pie de página",
191
     "Estimate Footer": "Estimar pie de página",
192
+    "Scheduling": "Programación",
219
     "Scheduling Form": "Formulario de programación",
193
     "Scheduling Form": "Formulario de programación",
220
-    "Default :Type :Category": "Predeterminado :Type :Category",
221
     "Approve": "Aprobar",
194
     "Approve": "Aprobar",
222
-    "Dates & Time": "Fechas y hora",
223
-    "Schedule Bounds": "Límites de programación",
224
-    "Ending Balance": "Saldo final",
225
-    "Address Information": "Información de dirección",
226
-    "Estimate Details": "Detalles de la estimación"
195
+    "Frequency": "Frecuencia",
196
+    "Dates & Time": "Fechas y hora"
227
 }
197
 }

+ 153
- 145
resources/data/lang/fr.json View File

1
 {
1
 {
2
     "General": "Général",
2
     "General": "Général",
3
-    "stone": "pierre",
4
-    "fuchsia": "fuchsia",
5
-    "slate": "ardoise",
6
-    "cyan": "cyan",
3
+    "Bank account": "Compte bancaire",
7
     "Currency": "Devise",
4
     "Currency": "Devise",
8
-    "rose": "rose",
9
-    "Email": "Courrier électronique",
10
-    "Small": "Petit",
11
-    "Sales Tax": "Taxe de vente",
12
-    "red": "rouge",
13
-    "Discount": "Rabais",
5
+    "Taxes & Discounts": "Taxes et remises",
6
+    "Sales tax": "Taxe de vente",
7
+    "Purchase tax": "Taxe d'achat",
8
+    "Sales discount": "Rabais sur les ventes",
9
+    "Purchase discount": "Réduction d'achat",
10
+    "Appearance": "Apparence",
11
+    "Default": "Par défaut",
14
     "Company Profile": "Profil de l'entreprise",
12
     "Company Profile": "Profil de l'entreprise",
13
+    "Invoice": "Facture",
14
+    "Localization": "Localisation",
15
+    "Discount": "Rabais",
16
+    "Tax": "Impôt",
17
+    "Accounting": "Comptabilité",
18
+    "Banking": "Services bancaires",
19
+    "Account": "Compte",
20
+    "Department": "Département",
15
     "Services": "Services",
21
     "Services": "Services",
16
-    "Medium": "Moyen",
17
-    "orange": "orange",
18
-    "Ascending": "Ascendant",
19
-    "Template": "Modèle",
20
-    "Price": "Prix",
21
-    "yellow": "jaune",
22
-    "Large": "Grand",
23
-    "Modern": "Moderne",
22
+    "Connected Accounts": "Comptes connectés",
23
+    "Live Currency": "Devise en direct",
24
+    "Primary color": "Couleur primaire",
25
+    "amber": "ambre",
26
+    "blue": "bleu",
27
+    "cyan": "cyan",
28
+    "emerald": "émeraude",
29
+    "fuchsia": "fuchsia",
30
+    "gray": "gris",
24
     "green": "vert",
31
     "green": "vert",
25
-    "Hours": "Heures",
26
-    "Tax": "Impôt",
27
-    "Phone Number": "Numéro de téléphone",
28
-    "Zip \/ Postal Code": "Code postal\/Code postal",
29
-    "Sole Proprietorship": "Entreprise individuelle",
30
-    "Classic": "Classique",
31
-    "pink": "rose",
32
-    "zinc": "zinc",
32
+    "indigo": "indigo",
33
+    "lime": "citron vert",
33
     "neutral": "neutre",
34
     "neutral": "neutre",
34
-    "amber": "ambre",
35
+    "orange": "orange",
36
+    "pink": "rose",
35
     "purple": "pourpre",
37
     "purple": "pourpre",
36
-    "Logo": "Logo",
37
-    "Products": "Produits",
38
-    "gray": "gris",
39
-    "Disabled": "Désactivé",
40
-    "Full": "Complet",
41
-    "Descending": "Descendant",
42
-    "State \/ Province": "État\/province",
43
-    "Account": "Compte",
44
-    "Header": "En-tête",
45
-    "emerald": "émeraude",
38
+    "red": "rouge",
39
+    "rose": "rose",
40
+    "sky": "ciel",
41
+    "slate": "ardoise",
42
+    "stone": "pierre",
43
+    "teal": "sarcelle",
44
+    "violet": "violet",
45
+    "yellow": "jaune",
46
+    "zinc": "zinc",
46
     "Font": "Fonte",
47
     "Font": "Fonte",
48
+    "Enabled": "Activé",
49
+    "Disabled": "Désactivé",
47
     "Identification": "Identification",
50
     "Identification": "Identification",
51
+    "Email": "Courrier électronique",
52
+    "Phone number": "Numéro de téléphone",
53
+    "Logo": "Logo",
54
+    "Location Details": "Détails de l'emplacement",
55
+    "Country": "Pays",
56
+    "State \/ Province": "État\/province",
57
+    "Street Address": "Adresse de rue",
58
+    "City \/ Town": "Ville\/Localité",
59
+    "Zip \/ Postal Code": "Code postal\/Code postal",
60
+    "Legal & Compliance": "Juridique et conformité",
61
+    "Entity type": "Type d'entité",
62
+    "Tax ID": "Numéro fiscal",
63
+    "Sole Proprietorship": "Entreprise individuelle",
64
+    "General Partnership": "Partenariat général",
65
+    "Limited Partnership (LP)": "Société en commandite (LP)",
66
+    "Limited Liability Partnership (LLP)": "Partenariat à responsabilité limitée (LLP)",
67
+    "Limited Liability Company (LLC)": "Société à responsabilité limitée (LLC)",
48
     "Corporation": "Société",
68
     "Corporation": "Société",
69
+    "Nonprofit": "Sans but lucratif",
70
+    "Number prefix": "Préfixe numérique",
71
+    "Number digits": "Chiffres numériques",
72
+    "Number next": "Numéro suivant",
73
+    "Payment terms": "Modalités de paiement",
49
     "Content": "Contenu",
74
     "Content": "Contenu",
50
-    "Timezone": "Fuseau horaire",
51
-    "Invoice": "Facture",
52
-    "Department": "Département",
53
-    "Extra Large": "Très grand",
54
-    "Screen": "écran",
55
-    "violet": "violet",
56
-    "Name": "Nom",
57
-    "blue": "bleu",
58
-    "indigo": "indigo",
75
+    "Header": "En-tête",
76
+    "Subheader": "Sous-en-tête",
77
+    "Footer \/ notes": "Pied de page\/Remarques",
78
+    "Template": "Modèle",
79
+    "Show logo": "Afficher le logo",
80
+    "Accent color": "Couleur d'accent",
81
+    "Item name": "Nom de l'article",
82
+    "Items": "Objets",
83
+    "Products": "Produits",
59
     "Other": "Autres",
84
     "Other": "Autres",
60
-    "Appearance": "Apparence",
61
-    "Banking": "Services bancaires",
85
+    "Unit name": "Nom de l'unité",
86
+    "Quantity": "Quantité",
87
+    "Hours": "Heures",
88
+    "Price name": "Nom du prix",
89
+    "Price": "Prix",
90
+    "Rate": "Tarif",
91
+    "Amount name": "Nom du montant",
62
     "Amount": "Montant",
92
     "Amount": "Montant",
63
-    "sky": "ciel",
64
-    "Enabled": "Activé",
65
-    "Layout": "Disposition",
66
-    "Street Address": "Adresse de rue",
67
-    "Items": "Objets",
68
-    "Country": "Pays",
69
-    "Accounting": "Comptabilité",
70
-    "lime": "citron vert",
71
-    "Extra Small": "Très petit",
72
-    "Default": "Par défaut",
73
     "Total": "Total",
93
     "Total": "Total",
74
-    "Language": "Langue",
75
-    "Bank Account": "Compte bancaire",
76
-    "Screen Large": "Grand écran",
77
-    "Navigation Layout": "Disposition de navigation",
78
-    "Connected Accounts": "Comptes connectés",
79
-    "Top Navigation": "Navigation supérieure",
80
-    "Data Presentation": "Présentation des données",
81
-    "Sales Discount": "Rabais sur les ventes",
82
-    "Net 30": "30 % nets",
83
-    "Taxes & Discounts": "Taxes et remises",
84
-    "Striped Tables": "Tables à rayures",
85
-    "7X Large": "7 fois plus grand",
86
-    "2X Large": "2 fois plus grand",
87
-    "Location Details": "Détails de l'emplacement",
88
-    "Payment Terms": "Modalités de paiement",
89
-    "Unit Name": "Nom de l'unité",
90
-    "Date & Time": "Date et heure",
91
-    "Financial & Fiscal": "Financier et fiscal",
92
-    "Purchase Discount": "Réduction d'achat",
93
-    "Primary Color": "Couleur primaire",
94
-    "Side Navigation": "Navigation latérale",
95
-    "4X Large": "4 fois plus grand",
96
-    "5X Large": "5 fois plus grand",
97
-    "6X Large": "6 fois plus grand",
98
-    "Number Prefix": "Préfixe numérique",
99
-    "Footer \/ Notes": "Pied de page\/Remarques",
100
-    "Accent Color": "Couleur d'accent",
101
-    "Item Name": "Nom de l'article",
102
-    "Net 15": "15 % nets",
103
-    "Date Format": "Format de date",
104
-    "Before Number": "Avant le numéro",
105
-    "Percent Position": "Position en pourcentage",
106
-    "Purchase Tax": "Taxe d'achat",
107
-    "Screen Extra Large": "Écran extra large",
108
-    "Entity Type": "Type d'entité",
109
-    "General Partnership": "Partenariat général",
110
-    "Amount Name": "Nom du montant",
94
+    "Due Upon Receipt": "À payer à la réception",
95
+    "Net 7": "Net 7",
111
     "Net 10": "10 % nets",
96
     "Net 10": "10 % nets",
112
-    "Number Format": "Format numérique",
113
-    "3X Large": "3 fois plus grand",
114
-    "Limited Partnership (LP)": "Société en commandite (LP)",
115
-    "Number Next": "Numéro suivant",
116
-    "Week Start": "Début de semaine",
117
-    "Live Currency": "Devise en direct",
118
-    "Number Digits": "Chiffres numériques",
97
+    "Net 15": "15 % nets",
98
+    "Net 30": "30 % nets",
119
     "Net 60": "60 % nets",
99
     "Net 60": "60 % nets",
120
-    "Limited Liability Partnership (LLP)": "Partenariat à responsabilité limitée (LLP)",
121
-    "Show Logo": "Afficher le logo",
122
     "Net 90": "Net 90",
100
     "Net 90": "Net 90",
123
-    "Tax ID": "Numéro fiscal",
124
-    "Due Upon Receipt": "À payer à la réception",
125
-    "Screen 2X Large": "Écran 2 fois plus grand",
126
-    "Price Name": "Nom du prix",
127
-    "Rate": "Tarif",
128
-    "Localization": "Localisation",
129
-    "teal": "sarcelle",
130
-    "Modal Width": "Largeur modale",
131
-    "Quantity": "Quantité",
132
-    "After Number": "Après le numéro",
133
-    "Legal & Compliance": "Juridique et conformité",
134
-    "Select Position": "Sélectionnez la position",
135
-    "Subheader": "Sous-en-tête",
136
-    "Net 7": "Net 7",
137
-    "Max Content Width": "Largeur maximale du contenu",
138
-    "Limited Liability Company (LLC)": "Société à responsabilité limitée (LLC)",
139
-    "Table Sort Direction": "Direction du tri des tableaux",
140
-    "Nonprofit": "Sans but lucratif",
141
-    "Records Per Page": "Enregistrements par page",
142
-    "City \/ Town": "Ville\/Localité",
143
-    "Time Format": "Format de l'heure",
101
+    "Modern": "Moderne",
102
+    "Classic": "Classique",
103
+    "Language": "Langue",
104
+    "Timezone": "Fuseau horaire",
105
+    "Date & Time": "Date et heure",
106
+    "Date format": "Format de date",
107
+    "Time format": "Format de l'heure",
108
+    "Week start": "Début de semaine",
109
+    "Before number": "Avant le numéro",
110
+    "After number": "Après le numéro",
111
+    "Select position": "Sélectionnez la position",
112
+    "Financial & Fiscal": "Financier et fiscal",
113
+    "Number format": "Format numérique",
114
+    "Percent position": "Position en pourcentage",
115
+    "Name": "Nom",
116
+    "Code": "Code",
144
     "Symbol": "Symbole",
117
     "Symbol": "Symbole",
118
+    "Default :record": ":record par défaut",
145
     "Type": "Tapez",
119
     "Type": "Tapez",
146
-    "Start Date": "Date de début",
147
-    "End Date": "Date de fin",
120
+    "Start date": "Date de début",
121
+    "End date": "Date de fin",
148
     "Sales": "Ventes",
122
     "Sales": "Ventes",
149
-    "Default :Type :Record": "Par défaut :Type :Record",
123
+    "Default :type :record": "Par défaut :type :record",
150
     "Purchase": "Acheter",
124
     "Purchase": "Acheter",
151
     "Precision": "Précision",
125
     "Precision": "Précision",
152
-    "Symbol Position": "Position du symbole",
153
-    "Before Amount": "Avant le montant",
154
-    "After Amount": "Après le montant",
126
+    "Symbol position": "Position du symbole",
127
+    "Before amount": "Avant le montant",
128
+    "After amount": "Après le montant",
155
     "Select a symbol position": "Sélectionnez la position d'un symbole",
129
     "Select a symbol position": "Sélectionnez la position d'un symbole",
156
-    "Decimal Separator": "Séparateur décimal",
157
-    "Thousands Separator": "Séparateur de milliers",
130
+    "Decimal separator": "Séparateur décimal",
131
+    "Thousands separator": "Séparateur de milliers",
158
     "Yes": "Oui",
132
     "Yes": "Oui",
159
     "No": "Non",
133
     "No": "Non",
160
     "Description": "Descriptif",
134
     "Description": "Descriptif",
166
     "Product": "Produit",
140
     "Product": "Produit",
167
     "Service": "Service",
141
     "Service": "Service",
168
     "Compound": "Composé",
142
     "Compound": "Composé",
143
+    "Current balance": "Solde actuel",
169
     "Account Information": "Informations sur le compte",
144
     "Account Information": "Informations sur le compte",
170
     "Subtype": "Sous-type",
145
     "Subtype": "Sous-type",
171
-    "Account Number": "Numéro de compte",
146
+    "Account number": "Numéro de compte",
147
+    "Investment": "Investissement",
172
     "Credit": "Crédit",
148
     "Credit": "Crédit",
149
+    "Depository": "Dépositaire",
150
+    "Loan": "Prêt",
173
     "Manager": "Directeur",
151
     "Manager": "Directeur",
174
     "Children": "Enfants",
152
     "Children": "Enfants",
175
-    "Current Balance": "Solde actuel",
176
-    "Investment": "Investissement",
177
-    "Loan": "Prêt",
178
     "All": "Tous",
153
     "All": "Tous",
179
     "Main": "Principale",
154
     "Main": "Principale",
180
-    "Available": "Disponible",
181
-    "Parent Department": "Département parent",
182
-    "Entity": "Entité",
183
-    "Company Currencies": "Devises des entreprises",
184
-    "Default :Record": ":Record par défaut",
185
-    "Live Rate": "Tarif en direct",
155
+    "Parent department": "Département parent",
186
     "Currency List": "Liste des devises",
156
     "Currency List": "Liste des devises",
187
-    "Depository": "Dépositaire",
188
-    "Code": "Code"
157
+    "Company Currencies": "Devises des entreprises",
158
+    "Entity": "Entité",
159
+    "Available": "Disponible",
160
+    "Live rate": "Tarif en direct",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 161
- 153
resources/data/lang/id.json View File

1
 {
1
 {
2
+    "General": "Umum",
3
+    "Bank account": "Rekening Bank",
4
+    "Currency": "Mata uang",
5
+    "Taxes & Discounts": "Pajak & Diskon",
6
+    "Sales tax": "Pajak Penjualan",
7
+    "Purchase tax": "Pajak Pembelian",
8
+    "Sales discount": "Diskon Penjualan",
9
+    "Purchase discount": "Diskon Pembelian",
2
     "Appearance": "Penampilan",
10
     "Appearance": "Penampilan",
3
-    "red": "merah",
4
     "Default": "Default",
11
     "Default": "Default",
5
-    "blue": "biru",
6
-    "sky": "langit",
7
-    "violet": "ungu",
8
-    "rose": "mawar",
9
-    "Currency": "Mata uang",
10
-    "Template": "Template",
11
-    "General": "Umum",
12
-    "Country": "Negara",
13
-    "Banking": "Perbankan",
14
     "Company Profile": "Profil Perusahaan",
12
     "Company Profile": "Profil Perusahaan",
15
-    "Enabled": "Diaktifkan",
16
-    "Name": "Nama",
17
-    "Code": "Kode",
18
-    "cyan": "biru kehijau-hijauan",
19
-    "Medium": "Sedang",
20
-    "State \/ Province": "Negara Bagian\/Provinsi",
21
-    "Sales": "Penjualan",
22
-    "emerald": "zamrud",
23
-    "lime": "kapur",
24
-    "Small": "Kecil",
25
-    "Screen": "Layar",
26
-    "Content": "Konten",
27
-    "Quantity": "Kuantitas",
28
-    "Price": "Harga",
29
-    "Rate": "Nilai",
30
-    "Amount": "Jumlah",
31
-    "Start Date": "Tanggal Mulai",
32
-    "Precision": "Presisi",
33
-    "Yes": "ya",
34
-    "Fixed": "Tetap",
35
-    "Product": "Produk",
13
+    "Invoice": "Faktur",
14
+    "Localization": "Lokalisasi",
15
+    "Discount": "Diskon",
16
+    "Tax": "Pajak",
36
     "Accounting": "Akuntansi",
17
     "Accounting": "Akuntansi",
18
+    "Banking": "Perbankan",
37
     "Account": "Akun",
19
     "Account": "Akun",
38
     "Department": "Departemen",
20
     "Department": "Departemen",
21
+    "Services": "Jasa",
22
+    "Connected Accounts": "Akun Terhubung",
23
+    "Live Currency": "Mata Uang Langsung",
24
+    "Primary color": "Warna primer",
25
+    "amber": "kuning",
26
+    "blue": "biru",
27
+    "cyan": "biru kehijau-hijauan",
28
+    "emerald": "zamrud",
29
+    "fuchsia": "Fuchsia",
30
+    "gray": "abu-abu",
39
     "green": "hijau",
31
     "green": "hijau",
32
+    "indigo": "indigo",
33
+    "lime": "kapur",
40
     "neutral": "netral",
34
     "neutral": "netral",
35
+    "orange": "oranye",
41
     "pink": "merah muda",
36
     "pink": "merah muda",
42
     "purple": "ungu",
37
     "purple": "ungu",
38
+    "red": "merah",
39
+    "rose": "mawar",
40
+    "sky": "langit",
43
     "slate": "batu tulis",
41
     "slate": "batu tulis",
44
     "stone": "batu",
42
     "stone": "batu",
43
+    "teal": "teal",
44
+    "violet": "ungu",
45
     "yellow": "kuning",
45
     "yellow": "kuning",
46
     "zinc": "seng",
46
     "zinc": "seng",
47
     "Font": "Font",
47
     "Font": "Font",
48
-    "Large": "Besar",
48
+    "Enabled": "Diaktifkan",
49
+    "Disabled": "Dinonaktifkan",
50
+    "Identification": "Identifikasi",
49
     "Email": "E-Mail",
51
     "Email": "E-Mail",
50
-    "Phone Number": "Nomor Telepon",
52
+    "Phone number": "Nomor Telepon",
51
     "Logo": "Logo",
53
     "Logo": "Logo",
54
+    "Location Details": "Detail Lokasi",
55
+    "Country": "Negara",
56
+    "State \/ Province": "Negara Bagian\/Provinsi",
57
+    "Street Address": "Alamat Jalan",
58
+    "City \/ Town": "Kota\/Kota",
59
+    "Zip \/ Postal Code": "Post\/Kode Pos",
60
+    "Legal & Compliance": "Hukum & Kepatuhan",
61
+    "Entity type": "Tipe Entitas",
62
+    "Tax ID": "ID Pajak",
63
+    "Sole Proprietorship": "Kepemilikan Tunggal",
64
+    "General Partnership": "Kemitraan Umum",
65
+    "Limited Partnership (LP)": "Kemitraan Terbatas (LP)",
66
+    "Limited Liability Partnership (LLP)": "Kemitraan Tanggung Jawab Terbatas (LLP)",
67
+    "Limited Liability Company (LLC)": "Perseroan Terbatas (LLC)",
52
     "Corporation": "Perusahaan",
68
     "Corporation": "Perusahaan",
53
-    "Payment Terms": "Ketentuan Pembayaran",
69
+    "Nonprofit": "Nirlaba",
70
+    "Number prefix": "Awalan Angka",
71
+    "Number digits": "Angka Digit",
72
+    "Number next": "Nomor Berikutnya",
73
+    "Payment terms": "Ketentuan Pembayaran",
74
+    "Content": "Konten",
54
     "Header": "Header",
75
     "Header": "Header",
76
+    "Subheader": "Subheader",
77
+    "Footer \/ notes": "Footer\/Catatan",
78
+    "Template": "Template",
79
+    "Show logo": "Tampilkan Logo",
80
+    "Accent color": "Warna Aksen",
81
+    "Item name": "Nama Item",
55
     "Items": "Barang",
82
     "Items": "Barang",
83
+    "Products": "Produk",
56
     "Other": "Lainnya",
84
     "Other": "Lainnya",
57
-    "Language": "Bahasa",
58
-    "Timezone": "Zona Waktu",
59
-    "Purchase": "Pembelian",
60
-    "No": "Tidak",
61
-    "Description": "Deskripsi",
62
-    "Scope": "Lingkup",
63
-    "Type": "Mengetik",
64
-    "Disabled": "Dinonaktifkan",
85
+    "Unit name": "Nama Unit",
86
+    "Quantity": "Kuantitas",
87
+    "Hours": "Jam",
88
+    "Price name": "Nama Harga",
89
+    "Price": "Harga",
90
+    "Rate": "Nilai",
91
+    "Amount name": "Nama Jumlah",
92
+    "Amount": "Jumlah",
65
     "Total": "Total",
93
     "Total": "Total",
66
-    "None": "Tidak ada",
67
-    "gray": "abu-abu",
68
-    "Records Per Page": "Catatan Per Halaman",
69
-    "Connected Accounts": "Akun Terhubung",
70
-    "Primary Color": "Warna primer",
71
-    "Ascending": "Menaik",
72
-    "Item Name": "Nama Item",
73
-    "Localization": "Lokalisasi",
74
-    "indigo": "indigo",
75
-    "6X Large": "6X Besar",
76
-    "Screen Large": "Layar Besar",
77
-    "Full": "Penuh",
78
-    "Live Currency": "Mata Uang Langsung",
79
-    "Products": "Produk",
80
-    "Accent Color": "Warna Aksen",
81
-    "Net 15": "Bersih 15",
82
-    "After Number": "Setelah Nomor",
83
-    "Bank Account": "Rekening Bank",
84
-    "Taxes & Discounts": "Pajak & Diskon",
85
-    "Data Presentation": "Presentasi Data",
86
-    "5X Large": "5X Besar",
87
-    "Extra Large": "Ekstra Besar",
88
-    "orange": "oranye",
89
-    "Subheader": "Subheader",
94
+    "Due Upon Receipt": "Jangka Waktu Penerimaan",
95
+    "Net 7": "Bersih 7",
90
     "Net 10": "Bersih 10",
96
     "Net 10": "Bersih 10",
91
-    "teal": "teal",
92
-    "Hours": "Jam",
93
-    "Date Format": "Format Tanggal",
94
-    "Services": "Jasa",
95
-    "Max Content Width": "Lebar Konten Maks",
96
-    "Zip \/ Postal Code": "Post\/Kode Pos",
97
-    "Number Digits": "Angka Digit",
98
-    "amber": "kuning",
99
-    "fuchsia": "Fuchsia",
100
-    "Modal Width": "Lebar Modal",
101
-    "Legal & Compliance": "Hukum & Kepatuhan",
97
+    "Net 15": "Bersih 15",
98
+    "Net 30": "Bersih 30",
102
     "Net 60": "Bersih 60",
99
     "Net 60": "Bersih 60",
100
+    "Net 90": "Bersih 90",
103
     "Modern": "Modern",
101
     "Modern": "Modern",
104
-    "End Date": "Tanggal Akhir",
105
-    "Discount": "Diskon",
106
-    "Table Sort Direction": "Arah Urutan Tabel",
107
-    "Limited Liability Partnership (LLP)": "Kemitraan Tanggung Jawab Terbatas (LLP)",
108
-    "City \/ Town": "Kota\/Kota",
102
+    "Classic": "Klasik",
103
+    "Language": "Bahasa",
104
+    "Timezone": "Zona Waktu",
109
     "Date & Time": "Tanggal & Waktu",
105
     "Date & Time": "Tanggal & Waktu",
110
-    "Symbol Position": "Posisi Simbol",
111
-    "Striped Tables": "Meja Bergaris",
112
-    "Street Address": "Alamat Jalan",
113
-    "Number Prefix": "Awalan Angka",
114
-    "7X Large": "7X Besar",
115
-    "Number Format": "Format Angka",
116
-    "Percent Position": "Posisi Persentase",
117
-    "Descending": "Menurun",
118
-    "Price Name": "Nama Harga",
119
-    "Symbol": "Simbol",
120
-    "Percentage": "Persentase",
121
-    "Purchase Discount": "Diskon Pembelian",
122
-    "Invoice": "Faktur",
123
-    "Identification": "Identifikasi",
124
-    "After Amount": "Setelah Jumlah",
125
-    "2X Large": "2X Besar",
126
-    "Before Amount": "Sebelum Jumlah",
127
-    "Side Navigation": "Navigasi Samping",
128
-    "Net 7": "Bersih 7",
129
-    "Screen Extra Large": "Layar Ekstra Besar",
130
-    "Default :Type :Record": "Standar :Type :Record",
131
-    "Limited Partnership (LP)": "Kemitraan Terbatas (LP)",
132
-    "Navigation Layout": "Tata Letak Navigasi",
133
-    "Top Navigation": "Navigasi Teratas",
134
-    "Tax": "Pajak",
135
-    "Before Number": "Sebelum Nomor",
106
+    "Date format": "Format Tanggal",
107
+    "Time format": "Format Waktu",
108
+    "Week start": "Minggu Mulai",
109
+    "Before number": "Sebelum Nomor",
110
+    "After number": "Setelah Nomor",
111
+    "Select position": "Pilih Posisi",
136
     "Financial & Fiscal": "Keuangan & Fiskal",
112
     "Financial & Fiscal": "Keuangan & Fiskal",
113
+    "Number format": "Format Angka",
114
+    "Percent position": "Posisi Persentase",
115
+    "Name": "Nama",
116
+    "Code": "Kode",
117
+    "Symbol": "Simbol",
118
+    "Default :record": "Standar :record",
119
+    "Type": "Mengetik",
120
+    "Start date": "Tanggal Mulai",
121
+    "End date": "Tanggal Akhir",
122
+    "Sales": "Penjualan",
123
+    "Default :type :record": "Standar :type :record",
124
+    "Purchase": "Pembelian",
125
+    "Precision": "Presisi",
126
+    "Symbol position": "Posisi Simbol",
127
+    "Before amount": "Sebelum Jumlah",
128
+    "After amount": "Setelah Jumlah",
129
+    "Select a symbol position": "Pilih posisi simbol",
130
+    "Decimal separator": "Pemisah Desimal",
131
+    "Thousands separator": "Pemisah Ribuan",
132
+    "Yes": "ya",
133
+    "No": "Tidak",
134
+    "Description": "Deskripsi",
137
     "Computation": "Komputasi",
135
     "Computation": "Komputasi",
138
-    "Show Logo": "Tampilkan Logo",
139
-    "Thousands Separator": "Pemisah Ribuan",
140
-    "Purchase Tax": "Pajak Pembelian",
141
-    "Number Next": "Nomor Berikutnya",
142
-    "Sales Discount": "Diskon Penjualan",
143
-    "Screen 2X Large": "Layar 2X Besar",
144
-    "Due Upon Receipt": "Jangka Waktu Penerimaan",
145
-    "Decimal Separator": "Pemisah Desimal",
146
-    "Week Start": "Minggu Mulai",
147
-    "4X Large": "4X Besar",
148
-    "Select Position": "Pilih Posisi",
149
-    "Limited Liability Company (LLC)": "Perseroan Terbatas (LLC)",
150
-    "General Partnership": "Kemitraan Umum",
151
-    "Default :Record": "Standar :Record",
152
-    "Nonprofit": "Nirlaba",
153
-    "Net 90": "Bersih 90",
154
-    "Location Details": "Detail Lokasi",
155
-    "Entity Type": "Tipe Entitas",
156
-    "Classic": "Klasik",
157
-    "Sole Proprietorship": "Kepemilikan Tunggal",
158
-    "Footer \/ Notes": "Footer\/Catatan",
159
-    "Extra Small": "Ekstra Kecil",
160
-    "Time Format": "Format Waktu",
161
-    "Net 30": "Bersih 30",
162
-    "Amount Name": "Nama Jumlah",
163
-    "Unit Name": "Nama Unit",
164
-    "Subtype": "Subtipe",
165
-    "Account Number": "Nomor Rekening",
136
+    "Scope": "Lingkup",
137
+    "Percentage": "Persentase",
138
+    "Fixed": "Tetap",
139
+    "None": "Tidak ada",
140
+    "Product": "Produk",
166
     "Service": "Pelayanan",
141
     "Service": "Pelayanan",
167
-    "Manager": "pengelola",
168
-    "Account Information": "Informasi Akun",
169
-    "Children": "Anak-anak",
170
-    "Current Balance": "Saldo Saat Ini",
171
-    "Main": "Utama",
172
     "Compound": "Senyawa",
142
     "Compound": "Senyawa",
143
+    "Current balance": "Saldo Saat Ini",
144
+    "Account Information": "Informasi Akun",
145
+    "Subtype": "Subtipe",
146
+    "Account number": "Nomor Rekening",
147
+    "Investment": "Investasi",
173
     "Credit": "Kredit",
148
     "Credit": "Kredit",
174
-    "All": "Semua",
175
-    "Loan": "Pinjaman",
176
-    "Entity": "Entitas",
177
-    "Available": "Tersedia",
178
     "Depository": "Depository",
149
     "Depository": "Depository",
150
+    "Loan": "Pinjaman",
151
+    "Manager": "pengelola",
152
+    "Children": "Anak-anak",
153
+    "All": "Semua",
154
+    "Main": "Utama",
155
+    "Parent department": "Departemen Orang Tua",
179
     "Currency List": "Daftar Mata Uang",
156
     "Currency List": "Daftar Mata Uang",
180
     "Company Currencies": "Mata Uang Perusahaan",
157
     "Company Currencies": "Mata Uang Perusahaan",
181
-    "Parent Department": "Departemen Orang Tua",
182
-    "Live Rate": "Tarif Langsung",
183
-    "Investment": "Investasi",
184
-    "Sales Tax": "Pajak Penjualan",
185
-    "Layout": "Tata Letak",
186
-    "3X Large": "3X Besar",
187
-    "Select a symbol position": "Pilih posisi simbol",
188
-    "Tax ID": "ID Pajak"
158
+    "Entity": "Entitas",
159
+    "Available": "Tersedia",
160
+    "Live rate": "Tarif Langsung",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 152
- 144
resources/data/lang/it.json View File

1
 {
1
 {
2
     "General": "Generale",
2
     "General": "Generale",
3
+    "Bank account": "Conto bancario",
3
     "Currency": "Valuta",
4
     "Currency": "Valuta",
4
-    "rose": "rosa",
5
-    "indigo": "indaco",
6
-    "Rate": "Tariffa",
5
+    "Taxes & Discounts": "Tasse e sconti",
6
+    "Sales tax": "Imposta sulle vendite",
7
+    "Purchase tax": "Imposta sugli acquisti",
8
+    "Sales discount": "Sconto sulle vendite",
9
+    "Purchase discount": "Sconto sull'acquisto",
10
+    "Appearance": "Aspetto",
11
+    "Default": "Predefinito",
12
+    "Company Profile": "Profilo dell'azienda",
13
+    "Invoice": "Fattura",
7
     "Localization": "Localizzazione",
14
     "Localization": "Localizzazione",
8
-    "lime": "lime",
9
     "Discount": "Sconto",
15
     "Discount": "Sconto",
16
+    "Tax": "Imposta",
17
+    "Accounting": "Contabilità",
18
+    "Banking": "Bancario",
19
+    "Account": "Account",
20
+    "Department": "Dipartimento",
21
+    "Services": "Servizi",
22
+    "Connected Accounts": "Account connessi",
23
+    "Live Currency": "Valuta in tempo reale",
24
+    "Primary color": "Colore primario",
25
+    "amber": "ambra",
10
     "blue": "blu",
26
     "blue": "blu",
11
-    "Screen": "Schermo",
12
     "cyan": "ciano",
27
     "cyan": "ciano",
13
-    "yellow": "giallo",
14
-    "Ascending": "Ascendente",
15
-    "Zip \/ Postal Code": "Zip\/Codice postale",
16
-    "Disabled": "Disabili",
17
-    "Small": "Piccolo",
18
-    "Hours": "Ore",
19
-    "Descending": "Discendente",
20
-    "Default": "Predefinito",
21
-    "slate": "ardesia",
22
-    "purple": "viola",
23
-    "Code": "Codice",
24
-    "neutral": "neutro",
25
-    "Invoice": "Fattura",
26
-    "green": "verde",
27
-    "red": "rosso",
28
-    "Email": "E-mail",
28
+    "emerald": "smeraldo",
29
+    "fuchsia": "fucsia",
29
     "gray": "grigio",
30
     "gray": "grigio",
30
-    "Banking": "Bancario",
31
-    "Language": "Lingua",
32
-    "Department": "Dipartimento",
33
-    "Street Address": "Indirizzo",
34
-    "Account": "Account",
35
-    "Other": "Altro",
36
-    "Template": "Modello",
37
-    "Products": "Prodotti",
38
-    "zinc": "zinco",
39
-    "Layout": "Layout",
40
-    "Country": "Paese",
41
-    "Date & Time": "Data e ora",
42
-    "Name": "Nome",
31
+    "green": "verde",
32
+    "indigo": "indaco",
33
+    "lime": "lime",
34
+    "neutral": "neutro",
43
     "orange": "arancione",
35
     "orange": "arancione",
44
-    "teal": "verde acqua",
45
-    "Identification": "Identificazione",
46
-    "Extra Small": "Extra piccolo",
47
-    "Classic": "Classico",
48
-    "Appearance": "Aspetto",
49
-    "Phone Number": "Numero di telefono",
50
-    "State \/ Province": "Stato\/Provincia",
51
-    "Header": "Intestazione",
52
-    "Corporation": "società per azioni",
53
-    "Amount": "Importo",
54
-    "Font": "Font",
55
-    "Full": "Completo",
56
-    "Bank Account": "Conto bancario",
57
     "pink": "rosa",
36
     "pink": "rosa",
58
-    "Enabled": "Abilitato",
59
-    "Entity Type": "Tipo di entità",
60
-    "Services": "Servizi",
37
+    "purple": "viola",
38
+    "red": "rosso",
39
+    "rose": "rosa",
61
     "sky": "cielo",
40
     "sky": "cielo",
62
-    "violet": "viola",
63
-    "Large": "Grande",
64
-    "Timezone": "Fuso orario",
65
-    "Modern": "Moderno",
41
+    "slate": "ardesia",
66
     "stone": "pietra",
42
     "stone": "pietra",
67
-    "Content": "Contenuto",
68
-    "Sales Tax": "Imposta sulle vendite",
69
-    "Quantity": "Quantità",
70
-    "Total": "Totale",
71
-    "Medium": "Medio",
72
-    "Items": "Oggetti",
73
-    "Accounting": "Contabilità",
74
-    "amber": "ambra",
43
+    "teal": "verde acqua",
44
+    "violet": "viola",
45
+    "yellow": "giallo",
46
+    "zinc": "zinco",
47
+    "Font": "Font",
48
+    "Enabled": "Abilitato",
49
+    "Disabled": "Disabili",
50
+    "Identification": "Identificazione",
51
+    "Email": "E-mail",
52
+    "Phone number": "Numero di telefono",
75
     "Logo": "Logo",
53
     "Logo": "Logo",
76
-    "Price": "Prezzo",
77
-    "fuchsia": "fucsia",
78
-    "Screen Large": "Schermo grande",
79
-    "Taxes & Discounts": "Tasse e sconti",
80
-    "Date Format": "Formato data",
81
-    "6X Large": "6X Grande",
82
-    "Time Format": "Formato orario",
83
-    "Data Presentation": "Presentazione dei dati",
84
-    "Week Start": "Inizio settimana",
85
-    "Connected Accounts": "Account connessi",
86
-    "Live Currency": "Valuta in tempo reale",
87
-    "Primary Color": "Colore primario",
88
-    "Modal Width": "Larghezza modale",
89
-    "5X Large": "5X Grande",
90
-    "2X Large": "2X Grande",
91
-    "Show Logo": "Mostra logo",
92
-    "Net 60": "Rete 60",
93
-    "Net 90": "Rete 90",
94
-    "Select Position": "Seleziona posizione",
95
-    "Financial & Fiscal": "Finanziario e fiscale",
96
-    "Number Format": "Formato numerico",
97
-    "Purchase Tax": "Imposta sugli acquisti",
98
-    "Sales Discount": "Sconto sulle vendite",
99
-    "Purchase Discount": "Sconto sull'acquisto",
100
-    "Company Profile": "Profilo dell'azienda",
101
-    "Tax": "Imposta",
102
-    "emerald": "smeraldo",
103
-    "Navigation Layout": "Layout di navigazione",
104
-    "Records Per Page": "Record per pagina",
105
-    "4X Large": "4X Grande",
106
-    "7X Large": "7X Grande",
107
-    "Screen Extra Large": "Schermo extra grande",
108
-    "Screen 2X Large": "Schermo 2X grande",
109
-    "Extra Large": "Extra grande",
110
     "Location Details": "Dettagli sulla posizione",
54
     "Location Details": "Dettagli sulla posizione",
111
-    "General Partnership": "Collaborazione generale",
112
-    "Limited Partnership (LP)": "Società in accomandita semplice (LP)",
113
-    "Subheader": "Sottotitolo",
114
-    "Footer \/ Notes": "Piè di pagina\/Note",
115
-    "Accent Color": "Colore dell'accento",
116
-    "Item Name": "Nome dell'articolo",
117
-    "Unit Name": "Nome dell'unità",
118
-    "Amount Name": "Nome dell'importo",
119
-    "Before Number": "Prima del numero",
120
-    "After Number": "Dopo il numero",
121
-    "Percent Position": "Posizione percentuale",
122
-    "Side Navigation": "Navigazione laterale",
123
-    "Table Sort Direction": "Direzione di ordinamento della tabella",
55
+    "Country": "Paese",
56
+    "State \/ Province": "Stato\/Provincia",
57
+    "Street Address": "Indirizzo",
124
     "City \/ Town": "Città\/paese",
58
     "City \/ Town": "Città\/paese",
59
+    "Zip \/ Postal Code": "Zip\/Codice postale",
60
+    "Legal & Compliance": "Legale e conformità",
61
+    "Entity type": "Tipo di entità",
125
     "Tax ID": "ID fiscale",
62
     "Tax ID": "ID fiscale",
63
+    "Sole Proprietorship": "Ditta individuale",
64
+    "General Partnership": "Collaborazione generale",
65
+    "Limited Partnership (LP)": "Società in accomandita semplice (LP)",
126
     "Limited Liability Partnership (LLP)": "Società a responsabilità limitata (LLP)",
66
     "Limited Liability Partnership (LLP)": "Società a responsabilità limitata (LLP)",
127
-    "Payment Terms": "Termini di pagamento",
128
-    "Number Digits": "Cifre numeriche",
129
-    "Net 15": "Rete 15",
130
-    "Max Content Width": "Larghezza massima del contenuto",
131
-    "Net 7": "Rete 7",
67
+    "Limited Liability Company (LLC)": "Società a responsabilità limitata (LLC)",
68
+    "Corporation": "società per azioni",
69
+    "Nonprofit": "Senza scopo di lucro",
70
+    "Number prefix": "Prefisso numerico",
71
+    "Number digits": "Cifre numeriche",
72
+    "Number next": "Numero successivo",
73
+    "Payment terms": "Termini di pagamento",
74
+    "Content": "Contenuto",
75
+    "Header": "Intestazione",
76
+    "Subheader": "Sottotitolo",
77
+    "Footer \/ notes": "Piè di pagina\/Note",
78
+    "Template": "Modello",
79
+    "Show logo": "Mostra logo",
80
+    "Accent color": "Colore dell'accento",
81
+    "Item name": "Nome dell'articolo",
82
+    "Items": "Oggetti",
83
+    "Products": "Prodotti",
84
+    "Other": "Altro",
85
+    "Unit name": "Nome dell'unità",
86
+    "Quantity": "Quantità",
87
+    "Hours": "Ore",
88
+    "Price name": "Nome del prezzo",
89
+    "Price": "Prezzo",
90
+    "Rate": "Tariffa",
91
+    "Amount name": "Nome dell'importo",
92
+    "Amount": "Importo",
93
+    "Total": "Totale",
132
     "Due Upon Receipt": "Dovuto al ricevimento",
94
     "Due Upon Receipt": "Dovuto al ricevimento",
95
+    "Net 7": "Rete 7",
133
     "Net 10": "Rete 10",
96
     "Net 10": "Rete 10",
97
+    "Net 15": "Rete 15",
134
     "Net 30": "Rete 30",
98
     "Net 30": "Rete 30",
135
-    "Legal & Compliance": "Legale e conformità",
136
-    "Number Prefix": "Prefisso numerico",
137
-    "Number Next": "Numero successivo",
138
-    "Price Name": "Nome del prezzo",
139
-    "Nonprofit": "Senza scopo di lucro",
140
-    "Top Navigation": "Navigazione principale",
141
-    "Striped Tables": "Tavoli a righe",
142
-    "Sole Proprietorship": "Ditta individuale",
143
-    "Limited Liability Company (LLC)": "Società a responsabilità limitata (LLC)",
144
-    "3X Large": "3X Grande",
99
+    "Net 60": "Rete 60",
100
+    "Net 90": "Rete 90",
101
+    "Modern": "Moderno",
102
+    "Classic": "Classico",
103
+    "Language": "Lingua",
104
+    "Timezone": "Fuso orario",
105
+    "Date & Time": "Data e ora",
106
+    "Date format": "Formato data",
107
+    "Time format": "Formato orario",
108
+    "Week start": "Inizio settimana",
109
+    "Before number": "Prima del numero",
110
+    "After number": "Dopo il numero",
111
+    "Select position": "Seleziona posizione",
112
+    "Financial & Fiscal": "Finanziario e fiscale",
113
+    "Number format": "Formato numerico",
114
+    "Percent position": "Posizione percentuale",
115
+    "Name": "Nome",
116
+    "Code": "Codice",
145
     "Symbol": "Simbolo",
117
     "Symbol": "Simbolo",
146
-    "Default :Record": "Predefinito :Record",
118
+    "Default :record": "Predefinito :record",
147
     "Type": "Tipo",
119
     "Type": "Tipo",
148
-    "Start Date": "Data di inizio",
149
-    "End Date": "Data di fine",
120
+    "Start date": "Data di inizio",
121
+    "End date": "Data di fine",
150
     "Sales": "Vendite",
122
     "Sales": "Vendite",
151
-    "Default :Type :Record": "Predefinito :Type :Record",
123
+    "Default :type :record": "Predefinito :type :record",
152
     "Purchase": "Acquisto",
124
     "Purchase": "Acquisto",
153
     "Precision": "Precisione",
125
     "Precision": "Precisione",
154
-    "Symbol Position": "Posizione del simbolo",
155
-    "After Amount": "Dopo l'importo",
126
+    "Symbol position": "Posizione del simbolo",
127
+    "Before amount": "Prima dell'importo",
128
+    "After amount": "Dopo l'importo",
156
     "Select a symbol position": "Seleziona la posizione del simbolo",
129
     "Select a symbol position": "Seleziona la posizione del simbolo",
157
-    "Thousands Separator": "Separatore di migliaia",
130
+    "Decimal separator": "Separatore decimale",
131
+    "Thousands separator": "Separatore di migliaia",
158
     "Yes": "sì",
132
     "Yes": "sì",
159
     "No": "No",
133
     "No": "No",
160
     "Description": "Descrizione",
134
     "Description": "Descrizione",
165
     "None": "Nessuna",
139
     "None": "Nessuna",
166
     "Product": "Prodotto",
140
     "Product": "Prodotto",
167
     "Service": "Servizio",
141
     "Service": "Servizio",
168
-    "Account Information": "Informazioni sull'account",
169
-    "Investment": "Investimento",
170
-    "Decimal Separator": "Separatore decimale",
171
     "Compound": "Composto",
142
     "Compound": "Composto",
172
-    "Current Balance": "Saldo attuale",
143
+    "Current balance": "Saldo attuale",
144
+    "Account Information": "Informazioni sull'account",
173
     "Subtype": "Sottotipo",
145
     "Subtype": "Sottotipo",
174
-    "Account Number": "Numero di conto",
146
+    "Account number": "Numero di conto",
147
+    "Investment": "Investimento",
148
+    "Credit": "Credito",
149
+    "Depository": "Depositario",
150
+    "Loan": "Prestito",
175
     "Manager": "Manager",
151
     "Manager": "Manager",
176
     "Children": "Bambini",
152
     "Children": "Bambini",
177
     "All": "Tutti",
153
     "All": "Tutti",
178
     "Main": "Principale",
154
     "Main": "Principale",
179
-    "Credit": "Credito",
180
-    "Loan": "Prestito",
181
-    "Available": "Disponibile",
182
-    "Depository": "Depositario",
183
-    "Entity": "Entità",
184
-    "Parent Department": "Reparto genitori",
155
+    "Parent department": "Reparto genitori",
185
     "Currency List": "Elenco delle valute",
156
     "Currency List": "Elenco delle valute",
186
     "Company Currencies": "Valute aziendali",
157
     "Company Currencies": "Valute aziendali",
187
-    "Before Amount": "Prima dell'importo",
188
-    "Live Rate": "Tasso in tempo reale"
158
+    "Entity": "Entità",
159
+    "Available": "Disponibile",
160
+    "Live rate": "Tasso in tempo reale",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 160
- 152
resources/data/lang/nl.json View File

1
 {
1
 {
2
     "General": "Generaal",
2
     "General": "Generaal",
3
-    "Account": "Rekening",
4
-    "Department": "Afdeling",
5
-    "sky": "hemel",
6
-    "purple": "paars",
7
-    "Other": "Andere",
8
-    "gray": "grijs",
9
-    "Extra Small": "Extra klein",
10
-    "yellow": "geel",
11
-    "Default": "Standaard",
12
-    "Disabled": "Uitgeschakeld",
13
-    "Template": "Sjabloon",
14
-    "Total": "Totaal",
15
-    "stone": "steen",
16
-    "Ascending": "Oplopend",
17
-    "Logo": "Logo",
18
-    "Sales": "Verkoop",
3
+    "Bank account": "Bankrekening",
19
     "Currency": "Valuta",
4
     "Currency": "Valuta",
5
+    "Taxes & Discounts": "Belastingen en kortingen",
6
+    "Sales tax": "Omzetbelasting",
7
+    "Purchase tax": "Aankoopbelasting",
8
+    "Sales discount": "Verkoopkorting",
9
+    "Purchase discount": "Aankoopkorting",
10
+    "Appearance": "Verschijning",
11
+    "Default": "Standaard",
12
+    "Company Profile": "Bedrijfsprofiel",
13
+    "Invoice": "Factuur",
20
     "Localization": "Lokalisatie",
14
     "Localization": "Lokalisatie",
21
-    "red": "rood",
22
-    "Sales Tax": "Omzetbelasting",
23
-    "lime": "kalk",
24
-    "Phone Number": "Telefoonnummer",
25
-    "Products": "Producten",
26
-    "Hours": "Uren",
15
+    "Discount": "Korting",
16
+    "Tax": "Belasting",
17
+    "Accounting": "Boekhouding",
18
+    "Banking": "Bankieren",
19
+    "Account": "Rekening",
20
+    "Department": "Afdeling",
21
+    "Services": "Diensten",
22
+    "Connected Accounts": "Gekoppelde accounts",
23
+    "Live Currency": "Levende valuta",
24
+    "Primary color": "Primaire kleur",
25
+    "amber": "barnsteen",
27
     "blue": "blauw",
26
     "blue": "blauw",
27
+    "cyan": "cyaan",
28
+    "emerald": "smaragd",
29
+    "fuchsia": "fuchsia",
30
+    "gray": "grijs",
28
     "green": "groen",
31
     "green": "groen",
29
-    "Extra Large": "Extra groot",
30
-    "Date & Time": "Datum en tijd",
31
-    "Name": "Naam",
32
-    "Purchase": "Aankoop",
32
+    "indigo": "indigo",
33
+    "lime": "kalk",
33
     "neutral": "neutraal",
34
     "neutral": "neutraal",
34
     "orange": "oranje",
35
     "orange": "oranje",
35
-    "Header": "Koptekst",
36
-    "Symbol": "Symbool",
37
-    "Type": "Typ",
38
-    "Accounting": "Boekhouding",
39
-    "Timezone": "Tijdzone",
40
-    "Content": "Inhoud",
41
-    "Enabled": "Ingeschakeld",
42
-    "zinc": "zink",
36
+    "pink": "roze",
37
+    "purple": "paars",
38
+    "red": "rood",
43
     "rose": "roos",
39
     "rose": "roos",
44
-    "Quantity": "Hoeveelheid",
45
-    "Code": "Code",
46
-    "Medium": "Middelgroot",
47
-    "Amount": "Bedrag",
48
-    "Language": "taal",
40
+    "sky": "hemel",
41
+    "slate": "leisteen",
42
+    "stone": "steen",
43
+    "teal": "groenblauw",
49
     "violet": "paars",
44
     "violet": "paars",
50
-    "pink": "roze",
45
+    "yellow": "geel",
46
+    "zinc": "zink",
51
     "Font": "Lettertype",
47
     "Font": "Lettertype",
52
-    "Full": "Volledig",
53
-    "Large": "Groot",
54
-    "Screen": "Scherm",
55
-    "Descending": "Aflopend",
48
+    "Enabled": "Ingeschakeld",
49
+    "Disabled": "Uitgeschakeld",
50
+    "Identification": "Identificatie",
56
     "Email": "Email",
51
     "Email": "Email",
57
-    "Tax ID": "Fiscaal nummer",
58
-    "Price": "Prijs",
59
-    "Classic": "Klassiek",
60
-    "End Date": "Einddatum",
61
-    "Discount": "Korting",
62
-    "Layout": "Indeling",
52
+    "Phone number": "Telefoonnummer",
53
+    "Logo": "Logo",
54
+    "Location Details": "Details van de locatie",
63
     "Country": "Land",
55
     "Country": "Land",
56
+    "State \/ Province": "Staat\/provincie",
64
     "Street Address": "Adres",
57
     "Street Address": "Adres",
65
-    "Corporation": "corporatie",
66
-    "slate": "leisteen",
67
-    "7X Large": "7x groot",
68
-    "Rate": "Tarief",
69
-    "Start Date": "Startdatum",
70
-    "indigo": "indigo",
71
-    "fuchsia": "fuchsia",
72
-    "Small": "Klein",
73
-    "Banking": "Bankieren",
74
-    "6X Large": "6x groot",
58
+    "City \/ Town": "Stad\/stad",
75
     "Zip \/ Postal Code": "Postcode\/postcode",
59
     "Zip \/ Postal Code": "Postcode\/postcode",
76
-    "Show Logo": "Logo weergeven",
77
-    "Default :Type :Record": "Standaard :Type :Record",
78
-    "Precision": "Nauwkeurigheid",
79
-    "Default :Record": "Standaard :Record",
80
-    "Footer \/ Notes": "Voettekst\/Notities",
81
-    "Item Name": "Naam van het item",
82
-    "Week Start": "Begin van de week",
83
-    "After Number": "Na nummer",
84
-    "Side Navigation": "Zijdelingse navigatie",
85
-    "Due Upon Receipt": "Verschuldigd bij ontvangst",
86
-    "teal": "groenblauw",
87
-    "Screen 2X Large": "Scherm 2X groot",
88
-    "3X Large": "3X groot",
89
-    "Percent Position": "Positie in procenten",
90
-    "Sales Discount": "Verkoopkorting",
91
-    "Symbol Position": "Positie van het symbool",
92
-    "Entity Type": "Entiteitstype",
93
-    "cyan": "cyaan",
94
-    "emerald": "smaragd",
95
-    "Appearance": "Verschijning",
96
-    "Connected Accounts": "Gekoppelde accounts",
60
+    "Legal & Compliance": "Juridische zaken en naleving",
61
+    "Entity type": "Entiteitstype",
62
+    "Tax ID": "Fiscaal nummer",
63
+    "Sole Proprietorship": "Eenmanszaak",
64
+    "General Partnership": "Algemeen partnerschap",
65
+    "Limited Partnership (LP)": "Beperkte vennootschap (LP)",
66
+    "Limited Liability Partnership (LLP)": "Partnerschap met beperkte aansprakelijkheid (LLP)",
67
+    "Limited Liability Company (LLC)": "Vennootschap met beperkte aansprakelijkheid (LLC)",
68
+    "Corporation": "corporatie",
97
     "Nonprofit": "Non-profitorganisatie",
69
     "Nonprofit": "Non-profitorganisatie",
70
+    "Number prefix": "Voorvoegsel van het nummer",
71
+    "Number digits": "Aantal cijfers",
72
+    "Number next": "Nummer Volgende",
73
+    "Payment terms": "Betalingsvoorwaarden",
74
+    "Content": "Inhoud",
75
+    "Header": "Koptekst",
98
     "Subheader": "Subkop",
76
     "Subheader": "Subkop",
99
-    "Before Amount": "Vóór het bedrag",
100
-    "Location Details": "Details van de locatie",
101
-    "Net 10": "Netto 10",
102
-    "Before Number": "Voor het nummer",
103
-    "Live Currency": "Levende valuta",
104
-    "Max Content Width": "Maximale breedte van de inhoud",
105
-    "Data Presentation": "Presentatie van gegevens",
106
-    "4X Large": "4X groot",
107
-    "Modern": "Modern",
108
-    "Purchase Tax": "Aankoopbelasting",
109
-    "Number Prefix": "Voorvoegsel van het nummer",
110
-    "Select a symbol position": "Selecteer een symboolpositie",
111
-    "Screen Large": "Groot scherm",
112
-    "Identification": "Identificatie",
113
-    "Unit Name": "Naam van de eenheid",
114
-    "Price Name": "Naam van de prijs",
115
-    "Purchase Discount": "Aankoopkorting",
116
-    "Payment Terms": "Betalingsvoorwaarden",
117
-    "Number Format": "Nummerformaat",
77
+    "Footer \/ notes": "Voettekst\/Notities",
78
+    "Template": "Sjabloon",
79
+    "Show logo": "Logo weergeven",
80
+    "Accent color": "Accentkleur",
81
+    "Item name": "Naam van het item",
82
+    "Items": "Artikelen",
83
+    "Products": "Producten",
84
+    "Other": "Andere",
85
+    "Unit name": "Naam van de eenheid",
86
+    "Quantity": "Hoeveelheid",
87
+    "Hours": "Uren",
88
+    "Price name": "Naam van de prijs",
89
+    "Price": "Prijs",
90
+    "Rate": "Tarief",
91
+    "Amount name": "Naam van het bedrag",
92
+    "Amount": "Bedrag",
93
+    "Total": "Totaal",
94
+    "Due Upon Receipt": "Verschuldigd bij ontvangst",
118
     "Net 7": "Net 7",
95
     "Net 7": "Net 7",
96
+    "Net 10": "Netto 10",
119
     "Net 15": "Netto 15",
97
     "Net 15": "Netto 15",
120
-    "Decimal Separator": "Decimaal scheidingsteken",
121
-    "Thousands Separator": "Scheidingsteken voor duizenden",
122
-    "Limited Partnership (LP)": "Beperkte vennootschap (LP)",
123
-    "Navigation Layout": "Navigatie-indeling",
124
-    "Legal & Compliance": "Juridische zaken en naleving",
125
-    "Net 60": "Netto 60",
126
-    "Modal Width": "Modale breedte",
127
-    "Table Sort Direction": "Sorteerrichting van de tabel",
128
-    "Limited Liability Company (LLC)": "Vennootschap met beperkte aansprakelijkheid (LLC)",
129
-    "Bank Account": "Bankrekening",
130
-    "Time Format": "Tijdformaat",
131
-    "Company Profile": "Bedrijfsprofiel",
132
-    "City \/ Town": "Stad\/stad",
133
-    "Number Next": "Nummer Volgende",
134
-    "Amount Name": "Naam van het bedrag",
135
-    "Select Position": "Positie selecteren",
136
-    "Financial & Fiscal": "Financieel en fiscaal",
137
-    "Services": "Diensten",
138
-    "Number Digits": "Aantal cijfers",
139
-    "Records Per Page": "Records per pagina",
140
     "Net 30": "Netto 30",
98
     "Net 30": "Netto 30",
141
-    "Date Format": "Datumformaat",
142
-    "Taxes & Discounts": "Belastingen en kortingen",
143
-    "Striped Tables": "Gestreepte tafels",
144
-    "State \/ Province": "Staat\/provincie",
99
+    "Net 60": "Netto 60",
145
     "Net 90": "Netto 90",
100
     "Net 90": "Netto 90",
146
-    "General Partnership": "Algemeen partnerschap",
147
-    "Limited Liability Partnership (LLP)": "Partnerschap met beperkte aansprakelijkheid (LLP)",
148
-    "After Amount": "Na het bedrag",
149
-    "Accent Color": "Accentkleur",
150
-    "Invoice": "Factuur",
151
-    "Items": "Artikelen",
152
-    "2X Large": "2X groot",
153
-    "Tax": "Belasting",
154
-    "Primary Color": "Primaire kleur",
155
-    "5X Large": "5x groot",
156
-    "Sole Proprietorship": "Eenmanszaak",
157
-    "Top Navigation": "Navigatie bovenaan",
158
-    "amber": "barnsteen",
159
-    "Screen Extra Large": "Extra groot scherm",
160
-    "Description": "Omschrijving",
101
+    "Modern": "Modern",
102
+    "Classic": "Klassiek",
103
+    "Language": "taal",
104
+    "Timezone": "Tijdzone",
105
+    "Date & Time": "Datum en tijd",
106
+    "Date format": "Datumformaat",
107
+    "Time format": "Tijdformaat",
108
+    "Week start": "Begin van de week",
109
+    "Before number": "Voor het nummer",
110
+    "After number": "Na nummer",
111
+    "Select position": "Positie selecteren",
112
+    "Financial & Fiscal": "Financieel en fiscaal",
113
+    "Number format": "Nummerformaat",
114
+    "Percent position": "Positie in procenten",
115
+    "Name": "Naam",
116
+    "Code": "Code",
117
+    "Symbol": "Symbool",
118
+    "Default :record": "Standaard :record",
119
+    "Type": "Typ",
120
+    "Start date": "Startdatum",
121
+    "End date": "Einddatum",
122
+    "Sales": "Verkoop",
123
+    "Default :type :record": "Standaard :type :record",
124
+    "Purchase": "Aankoop",
125
+    "Precision": "Nauwkeurigheid",
126
+    "Symbol position": "Positie van het symbool",
127
+    "Before amount": "Vóór het bedrag",
128
+    "After amount": "Na het bedrag",
129
+    "Select a symbol position": "Selecteer een symboolpositie",
130
+    "Decimal separator": "Decimaal scheidingsteken",
131
+    "Thousands separator": "Scheidingsteken voor duizenden",
161
     "Yes": "Ja",
132
     "Yes": "Ja",
162
-    "Percentage": "Percentage",
163
-    "Scope": "Toepassingsgebied",
164
     "No": "Nee",
133
     "No": "Nee",
165
-    "Product": "Product",
166
-    "None": "Geen",
134
+    "Description": "Omschrijving",
135
+    "Computation": "Berekening",
136
+    "Scope": "Toepassingsgebied",
137
+    "Percentage": "Percentage",
167
     "Fixed": "Opgelost",
138
     "Fixed": "Opgelost",
139
+    "None": "Geen",
140
+    "Product": "Product",
168
     "Service": "Service",
141
     "Service": "Service",
169
     "Compound": "Samenstelling",
142
     "Compound": "Samenstelling",
170
-    "Computation": "Berekening",
171
-    "Current Balance": "Huidig saldo",
143
+    "Current balance": "Huidig saldo",
172
     "Account Information": "Accountgegevens",
144
     "Account Information": "Accountgegevens",
173
     "Subtype": "Subtype",
145
     "Subtype": "Subtype",
174
-    "Account Number": "Rekeningnummer",
146
+    "Account number": "Rekeningnummer",
175
     "Investment": "Investering",
147
     "Investment": "Investering",
176
     "Credit": "Krediet",
148
     "Credit": "Krediet",
177
     "Depository": "Depository",
149
     "Depository": "Depository",
150
+    "Loan": "Lening",
178
     "Manager": "Manager",
151
     "Manager": "Manager",
179
     "Children": "Kinderen",
152
     "Children": "Kinderen",
180
     "All": "Alles",
153
     "All": "Alles",
181
-    "Entity": "Entiteit",
182
-    "Available": "Beschikbaar",
183
     "Main": "Belangrijkste",
154
     "Main": "Belangrijkste",
184
-    "Parent Department": "Ouderafdeling",
185
-    "Loan": "Lening",
155
+    "Parent department": "Ouderafdeling",
156
+    "Currency List": "Valutalijst",
186
     "Company Currencies": "Valuta's van bedrijven",
157
     "Company Currencies": "Valuta's van bedrijven",
187
-    "Live Rate": "Tarief live",
188
-    "Currency List": "Valutalijst"
158
+    "Entity": "Entiteit",
159
+    "Available": "Beschikbaar",
160
+    "Live rate": "Tarief live",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 120
- 143
resources/data/lang/pt.json View File

1
 {
1
 {
2
     "General": "Geral",
2
     "General": "Geral",
3
-    "indigo": "índigo",
4
-    "slate": "ardósia",
5
-    "neutral": "neutro",
6
-    "purple": "roxo",
7
-    "orange": "laranja",
8
-    "Total": "Total",
9
-    "Email": "E-mail",
10
-    "Rate": "Tarifa",
11
-    "Discount": "Desconto",
12
-    "Font": "Fonte",
13
-    "State \/ Province": "Estado\/ Província",
14
-    "zinc": "zinco",
15
-    "Date & Time": "Data e hora",
3
+    "Bank account": "Conta bancária",
4
+    "Currency": "Moeda",
5
+    "Taxes & Discounts": "Impostos e descontos",
6
+    "Sales tax": "Imposto sobre vendas",
7
+    "Purchase tax": "Imposto de compra",
8
+    "Sales discount": "Desconto de vendas",
9
+    "Purchase discount": "Desconto na compra",
16
     "Appearance": "Aparência",
10
     "Appearance": "Aparência",
17
-    "rose": "rose",
18
-    "Phone Number": "Número de telefone",
19
-    "Department": "Departamento",
20
-    "Medium": "Médio",
21
-    "Price": "Preço",
22
-    "Tax": "Imposto",
23
-    "yellow": "amarelo",
24
-    "Screen": "Ecrã",
25
-    "Name": "Nome",
26
-    "red": "vermelho",
27
-    "sky": "céu",
28
-    "Full": "Completo",
29
-    "Other": "Outros",
11
+    "Default": "Padrão",
12
+    "Company Profile": "Perfil da empresa",
13
+    "Invoice": "Fatura",
30
     "Localization": "Localização",
14
     "Localization": "Localização",
31
-    "Items": "Itens",
32
-    "blue": "azul",
33
-    "Nonprofit": "Sem fins lucrativos",
34
-    "Content": "Conteúdo",
35
-    "Code": "Código",
15
+    "Discount": "Desconto",
16
+    "Tax": "Imposto",
17
+    "Accounting": "Contabilidade",
18
+    "Banking": "Serviços bancários",
19
+    "Account": "Conta",
20
+    "Department": "Departamento",
36
     "Services": "Serviços",
21
     "Services": "Serviços",
37
-    "Amount": "Quantia",
38
-    "Products": "Produtos",
39
-    "Modern": "Moderno",
40
-    "Quantity": "Quantidade",
41
-    "lime": "cal",
42
-    "stone": "pedra",
22
+    "Connected Accounts": "Contas conectadas",
23
+    "Live Currency": "Moeda ao vivo",
24
+    "Primary color": "Cor primária",
25
+    "amber": "âmbar",
26
+    "blue": "azul",
43
     "cyan": "ciano",
27
     "cyan": "ciano",
44
-    "Ascending": "Ascendente",
45
-    "Header": "cabeçalho",
46
-    "Net 30": "Rede 30",
47
-    "Descending": "Descendente",
48
-    "Logo": "Logotipo",
49
-    "Language": "Idioma",
50
-    "Large": "Grande",
51
-    "Account": "Conta",
52
-    "Entity Type": "Tipo de entidade",
53
-    "Extra Large": "Extra grande",
54
-    "Hours": "Horas",
55
-    "Invoice": "Fatura",
56
-    "Timezone": "Fuso horário",
57
-    "Company Profile": "Perfil da empresa",
58
-    "Sales Tax": "Imposto sobre vendas",
59
-    "Currency": "Moeda",
60
-    "Layout": "Layout",
61
-    "Accounting": "Contabilidade",
62
-    "Corporation": "Corporação",
63
-    "Default": "Padrão",
64
-    "violet": "violeta",
65
-    "green": "verde",
28
+    "emerald": "esmeralda",
66
     "fuchsia": "fúcsia",
29
     "fuchsia": "fúcsia",
67
     "gray": "cinzento",
30
     "gray": "cinzento",
68
-    "Street Address": "Endereço da rua",
69
-    "teal": "azul-petróleo",
70
-    "Tax ID": "Identificação fiscal",
71
-    "Template": "Modelo",
72
-    "Percent Position": "Posição percentual",
73
-    "Max Content Width": "Largura máxima do conteúdo",
74
-    "3X Large": "3X Grande",
75
-    "Banking": "Serviços bancários",
31
+    "green": "verde",
32
+    "indigo": "índigo",
33
+    "lime": "cal",
34
+    "neutral": "neutro",
35
+    "orange": "laranja",
76
     "pink": "rosa",
36
     "pink": "rosa",
77
-    "Classic": "clássico",
78
-    "Identification": "Identificação",
79
-    "Time Format": "Formato de hora",
80
-    "Select Position": "Selecionar posição",
81
-    "Records Per Page": "Registros por página",
82
-    "Subheader": "Sub-cabeçalho",
83
-    "Unit Name": "Nome da unidade",
84
-    "Net 7": "Rede 7",
85
-    "Net 10": "Rede 10",
86
-    "Week Start": "Início da semana",
87
-    "Taxes & Discounts": "Impostos e descontos",
88
-    "Purchase Tax": "Imposto de compra",
89
-    "Sales Discount": "Desconto de vendas",
90
-    "Purchase Discount": "Desconto na compra",
91
-    "amber": "âmbar",
92
-    "Top Navigation": "Navegação superior",
93
-    "Striped Tables": "Mesas listradas",
37
+    "purple": "roxo",
38
+    "red": "vermelho",
39
+    "rose": "rose",
40
+    "sky": "céu",
41
+    "slate": "ardósia",
42
+    "stone": "pedra",
43
+    "teal": "azul-petróleo",
44
+    "violet": "violeta",
45
+    "yellow": "amarelo",
46
+    "zinc": "zinco",
47
+    "Font": "Fonte",
94
     "Enabled": "Ativado",
48
     "Enabled": "Ativado",
95
     "Disabled": "Desativado",
49
     "Disabled": "Desativado",
96
-    "Table Sort Direction": "Direção de classificação da tabela",
97
-    "6X Large": "6X Grande",
98
-    "Screen Large": "Tela grande",
99
-    "Extra Small": "Extra pequeno",
50
+    "Identification": "Identificação",
51
+    "Email": "E-mail",
52
+    "Phone number": "Número de telefone",
53
+    "Logo": "Logotipo",
100
     "Location Details": "Detalhes da localização",
54
     "Location Details": "Detalhes da localização",
55
+    "Country": "País",
56
+    "State \/ Province": "Estado\/ Província",
57
+    "Street Address": "Endereço da rua",
101
     "City \/ Town": "Cidade\/Cidade",
58
     "City \/ Town": "Cidade\/Cidade",
102
     "Zip \/ Postal Code": "CEP\/Código postal",
59
     "Zip \/ Postal Code": "CEP\/Código postal",
103
     "Legal & Compliance": "Legal e conformidade",
60
     "Legal & Compliance": "Legal e conformidade",
61
+    "Entity type": "Tipo de entidade",
62
+    "Tax ID": "Identificação fiscal",
104
     "Sole Proprietorship": "Propriedade individual",
63
     "Sole Proprietorship": "Propriedade individual",
64
+    "General Partnership": "Parceria geral",
65
+    "Limited Partnership (LP)": "Parceria Limitada (LP)",
105
     "Limited Liability Partnership (LLP)": "Parceria de Responsabilidade Limitada (LLP)",
66
     "Limited Liability Partnership (LLP)": "Parceria de Responsabilidade Limitada (LLP)",
106
-    "Number Prefix": "Prefixo numérico",
107
-    "Number Next": "Número seguinte",
108
-    "Footer \/ Notes": "Rodapé\/\/Notas",
109
-    "Show Logo": "Mostrar logotipo",
110
-    "Price Name": "Nome do preço",
67
+    "Limited Liability Company (LLC)": "Companhia de Responsabilidade Limitada (LLC)",
68
+    "Corporation": "Corporação",
69
+    "Nonprofit": "Sem fins lucrativos",
70
+    "Number prefix": "Prefixo numérico",
71
+    "Number digits": "Dígitos numéricos",
72
+    "Number next": "Número seguinte",
73
+    "Payment terms": "Condições de pagamento",
74
+    "Content": "Conteúdo",
75
+    "Header": "cabeçalho",
76
+    "Subheader": "Sub-cabeçalho",
77
+    "Footer \/ notes": "Rodapé\/\/Notas",
78
+    "Template": "Modelo",
79
+    "Show logo": "Mostrar logotipo",
80
+    "Accent color": "Cor de destaque",
81
+    "Item name": "Nome do item",
82
+    "Items": "Itens",
83
+    "Products": "Produtos",
84
+    "Other": "Outros",
85
+    "Unit name": "Nome da unidade",
86
+    "Quantity": "Quantidade",
87
+    "Hours": "Horas",
88
+    "Price name": "Nome do preço",
89
+    "Price": "Preço",
90
+    "Rate": "Tarifa",
91
+    "Amount name": "Nome do valor",
92
+    "Amount": "Quantia",
93
+    "Total": "Total",
111
     "Due Upon Receipt": "Vencido após o recebimento",
94
     "Due Upon Receipt": "Vencido após o recebimento",
95
+    "Net 7": "Rede 7",
96
+    "Net 10": "Rede 10",
97
+    "Net 15": "Rede 15",
98
+    "Net 30": "Rede 30",
112
     "Net 60": "Rede 60",
99
     "Net 60": "Rede 60",
113
-    "Date Format": "Formato de data",
114
-    "Before Number": "Antes do número",
115
-    "Number Format": "Formato numérico",
116
-    "Bank Account": "Conta bancária",
117
-    "Screen 2X Large": "Tela 2X Grande",
118
-    "Limited Liability Company (LLC)": "Companhia de Responsabilidade Limitada (LLC)",
119
-    "Accent Color": "Cor de destaque",
120
-    "Amount Name": "Nome do valor",
121
-    "emerald": "esmeralda",
122
-    "Side Navigation": "Navegação lateral",
123
-    "7X Large": "7X Grande",
124
-    "2X Large": "2X Grande",
125
-    "Item Name": "Nome do item",
126
     "Net 90": "Rede 90",
100
     "Net 90": "Rede 90",
127
-    "Live Currency": "Moeda ao vivo",
128
-    "Number Digits": "Dígitos numéricos",
129
-    "4X Large": "4X Grande",
130
-    "Screen Extra Large": "Tela extra grande",
131
-    "Primary Color": "Cor primária",
132
-    "Modal Width": "Largura modal",
133
-    "General Partnership": "Parceria geral",
134
-    "Limited Partnership (LP)": "Parceria Limitada (LP)",
135
-    "After Number": "Depois do número",
136
-    "Small": "Pequeno",
137
-    "Payment Terms": "Condições de pagamento",
138
-    "Net 15": "Rede 15",
101
+    "Modern": "Moderno",
102
+    "Classic": "clássico",
103
+    "Language": "Idioma",
104
+    "Timezone": "Fuso horário",
105
+    "Date & Time": "Data e hora",
106
+    "Date format": "Formato de data",
107
+    "Time format": "Formato de hora",
108
+    "Week start": "Início da semana",
109
+    "Before number": "Antes do número",
110
+    "After number": "Depois do número",
111
+    "Select position": "Selecionar posição",
139
     "Financial & Fiscal": "Financeiro e fiscal",
112
     "Financial & Fiscal": "Financeiro e fiscal",
140
-    "Connected Accounts": "Contas conectadas",
141
-    "Navigation Layout": "Layout de navegação",
142
-    "5X Large": "5X Grande",
143
-    "Country": "País",
144
-    "Data Presentation": "Apresentação de dados",
113
+    "Number format": "Formato numérico",
114
+    "Percent position": "Posição percentual",
115
+    "Name": "Nome",
116
+    "Code": "Código",
145
     "Symbol": "Símbolo",
117
     "Symbol": "Símbolo",
146
-    "Default :Record": "Padrão :Record",
118
+    "Default :record": "Padrão :record",
147
     "Type": "Tipo",
119
     "Type": "Tipo",
148
-    "Start Date": "Data de início",
149
-    "End Date": "Data de término",
120
+    "Start date": "Data de início",
121
+    "End date": "Data de término",
150
     "Sales": "Vendas",
122
     "Sales": "Vendas",
151
-    "Default :Type :Record": "Padrão :Type :Record",
123
+    "Default :type :record": "Padrão :type :record",
152
     "Purchase": "Compra",
124
     "Purchase": "Compra",
153
     "Precision": "Precisão",
125
     "Precision": "Precisão",
154
-    "Symbol Position": "Posição do símbolo",
155
-    "Before Amount": "Antes do valor",
156
-    "After Amount": "Após o valor",
126
+    "Symbol position": "Posição do símbolo",
127
+    "Before amount": "Antes do valor",
128
+    "After amount": "Após o valor",
157
     "Select a symbol position": "Selecione a posição de um símbolo",
129
     "Select a symbol position": "Selecione a posição de um símbolo",
158
-    "Decimal Separator": "Separador decimal",
159
-    "Thousands Separator": "Separador de milhares",
130
+    "Decimal separator": "Separador decimal",
131
+    "Thousands separator": "Separador de milhares",
160
     "Yes": "sim",
132
     "Yes": "sim",
161
     "No": "Não",
133
     "No": "Não",
162
     "Description": "Descrição",
134
     "Description": "Descrição",
168
     "Product": "Produto",
140
     "Product": "Produto",
169
     "Service": "Serviço",
141
     "Service": "Serviço",
170
     "Compound": "Composto",
142
     "Compound": "Composto",
171
-    "Current Balance": "Saldo atual",
143
+    "Current balance": "Saldo atual",
172
     "Account Information": "Informações da conta",
144
     "Account Information": "Informações da conta",
173
     "Subtype": "Subtipo",
145
     "Subtype": "Subtipo",
174
-    "Account Number": "Número da conta",
146
+    "Account number": "Número da conta",
175
     "Investment": "Investimento",
147
     "Investment": "Investimento",
176
     "Credit": "Crédito",
148
     "Credit": "Crédito",
149
+    "Depository": "Depositário",
177
     "Loan": "Empréstimo",
150
     "Loan": "Empréstimo",
178
     "Manager": "Gestor",
151
     "Manager": "Gestor",
179
     "Children": "Crianças",
152
     "Children": "Crianças",
180
-    "Main": "Principal",
181
-    "Depository": "Depositário",
182
     "All": "Todos",
153
     "All": "Todos",
183
-    "Entity": "Entidade",
184
-    "Available": "Disponível",
185
-    "Parent Department": "Departamento de pais",
154
+    "Main": "Principal",
155
+    "Parent department": "Departamento de pais",
186
     "Currency List": "Lista de moedas",
156
     "Currency List": "Lista de moedas",
187
-    "Live Rate": "Tarifa ao vivo",
188
     "Company Currencies": "Moedas da empresa",
157
     "Company Currencies": "Moedas da empresa",
158
+    "Entity": "Entidade",
159
+    "Available": "Disponível",
160
+    "Live rate": "Tarifa ao vivo",
189
     "Edit": "Editar",
161
     "Edit": "Editar",
190
     "Notes": "Notas",
162
     "Notes": "Notas",
191
     "Terms": "Termos",
163
     "Terms": "Termos",
192
-    "Ending Balance": "Saldo Final",
193
-    "Default :Type :Category": "Padrão :Tipo :Categoria",
164
+    "Ending balance": "Saldo Final",
165
+    "Default :type :category": "Padrão :type :category",
194
     "Category": "Categoria",
166
     "Category": "Categoria",
195
     "Configuration": "Configuração",
167
     "Configuration": "Configuração",
196
     "Dates": "Datas",
168
     "Dates": "Datas",
216
     "Create": "Criar",
188
     "Create": "Criar",
217
     "Estimate Header": "Cabeçalho do Orçamento",
189
     "Estimate Header": "Cabeçalho do Orçamento",
218
     "Estimate Details": "Detalhes do Orçamento",
190
     "Estimate Details": "Detalhes do Orçamento",
219
-    "Estimate Footer": "Rodapé do Orçamento"
191
+    "Estimate Footer": "Rodapé do Orçamento",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
220
 }
197
 }

+ 158
- 150
resources/data/lang/tr.json View File

1
 {
1
 {
2
     "General": "General",
2
     "General": "General",
3
-    "violet": "menekşe",
4
-    "slate": "arduvaz",
5
-    "yellow": "sarı",
6
-    "stone": "taş",
7
-    "Layout": "Düzen",
8
-    "Large": "Büyük",
9
-    "teal": "deniz mavisi",
10
-    "Banking": "Bankacılık",
11
-    "green": "yeşil",
12
-    "Ascending": "Yükselen",
13
-    "Department": "Departman",
14
-    "blue": "mavi",
15
-    "red": "kırmızı",
16
-    "Descending": "Azalan",
17
-    "State \/ Province": "Eyalet\/İl",
18
-    "Price": "FİYAT",
19
-    "Classic": "Klasik",
20
-    "Invoice": "Fatura",
21
-    "Screen": "Ekranı",
22
-    "Phone Number": "Telefon Numarası",
23
-    "Total": "Toplam",
24
-    "rose": "gül",
25
-    "Font": "Yazı Tipi",
26
-    "Amount": "Miktar",
27
-    "End Date": "Bitiş Tarihi",
28
-    "Header": "Başlık",
29
-    "Account": "Hesap",
30
-    "pink": "pembe",
31
-    "zinc": "çinko",
32
-    "Full": "Dolu",
33
-    "Medium": "Orta",
34
-    "Country": "Ülke",
35
-    "Corporation": "şirket",
36
-    "Template": "Şablon",
37
-    "Products": "Ürünlerimiz",
38
-    "Modern": "Çağdaş",
39
-    "Timezone": "Saat dilimi",
40
-    "Yes": "Evet",
41
-    "Computation": "Hesaplama",
42
-    "Percentage": "Yüzde",
43
-    "Product": "Ürün",
44
-    "Sales Tax": "Satış Vergisi",
3
+    "Bank account": "Banka Hesabı",
4
+    "Currency": "Para Birimi",
5
+    "Taxes & Discounts": "Vergiler ve İndirimler",
6
+    "Sales tax": "Satış Vergisi",
7
+    "Purchase tax": "Satın Alma Vergisi",
8
+    "Sales discount": "Satış İndirimi",
9
+    "Purchase discount": "Satın Alma İndirimi",
45
     "Appearance": "Görünüm",
10
     "Appearance": "Görünüm",
46
     "Default": "Varsayılan",
11
     "Default": "Varsayılan",
12
+    "Company Profile": "Firma Profili",
13
+    "Invoice": "Fatura",
47
     "Localization": "Yerelleştirme",
14
     "Localization": "Yerelleştirme",
48
     "Discount": "İndirim",
15
     "Discount": "İndirim",
16
+    "Tax": "Vergi",
17
+    "Accounting": "Muhasebe",
18
+    "Banking": "Bankacılık",
19
+    "Account": "Hesap",
20
+    "Department": "Departman",
21
+    "Services": "HİZMETLER",
22
+    "Connected Accounts": "Bağlı Hesaplar",
23
+    "Live Currency": "Canlı Para Birimi",
24
+    "Primary color": "Ana Renk",
49
     "amber": "kehribar",
25
     "amber": "kehribar",
26
+    "blue": "mavi",
27
+    "cyan": "camgöbeği",
50
     "emerald": "zümrüt",
28
     "emerald": "zümrüt",
29
+    "fuchsia": "fuşya",
30
+    "gray": "gri",
31
+    "green": "yeşil",
32
+    "indigo": "çivit",
51
     "lime": "kireç",
33
     "lime": "kireç",
52
     "neutral": "nötr",
34
     "neutral": "nötr",
35
+    "orange": "turuncu",
36
+    "pink": "pembe",
53
     "purple": "mor",
37
     "purple": "mor",
38
+    "red": "kırmızı",
39
+    "rose": "gül",
40
+    "sky": "gökyüzü",
41
+    "slate": "arduvaz",
42
+    "stone": "taş",
43
+    "teal": "deniz mavisi",
44
+    "violet": "menekşe",
45
+    "yellow": "sarı",
46
+    "zinc": "çinko",
47
+    "Font": "Yazı Tipi",
54
     "Enabled": "Etkin",
48
     "Enabled": "Etkin",
55
-    "Extra Large": "Ekstra Büyük",
49
+    "Disabled": "Engelli",
50
+    "Identification": "Tanımlama",
56
     "Email": "E-posta",
51
     "Email": "E-posta",
52
+    "Phone number": "Telefon Numarası",
57
     "Logo": "Logo",
53
     "Logo": "Logo",
54
+    "Location Details": "Konum Ayrıntıları",
55
+    "Country": "Ülke",
56
+    "State \/ Province": "Eyalet\/İl",
57
+    "Street Address": "Sokak Adresi",
58
+    "City \/ Town": "Şehir\/Kasaba",
59
+    "Zip \/ Postal Code": "Posta Kodu\/Posta Kodu",
60
+    "Legal & Compliance": "Yasal ve Uyum",
61
+    "Entity type": "Varlık Türü",
58
     "Tax ID": "Vergi Kimliği",
62
     "Tax ID": "Vergi Kimliği",
59
-    "Payment Terms": "Ödeme Koşulları",
63
+    "Sole Proprietorship": "Tek mülkiyet",
64
+    "General Partnership": "Genel Ortaklık",
65
+    "Limited Partnership (LP)": "Sınırlı Ortaklık (LP)",
66
+    "Limited Liability Partnership (LLP)": "Sınırlı Sorumluluk Ortaklığı (LLP)",
67
+    "Limited Liability Company (LLC)": "Sınırlı Sorumluluk Şirketi (LLC)",
68
+    "Corporation": "şirket",
69
+    "Nonprofit": "kar amacı gütmeyen",
70
+    "Number prefix": "Numara Öneki",
71
+    "Number digits": "Sayı Rakamları",
72
+    "Number next": "Sonraki numara",
73
+    "Payment terms": "Ödeme Koşulları",
60
     "Content": "İçerik",
74
     "Content": "İçerik",
75
+    "Header": "Başlık",
76
+    "Subheader": "Alt başlık",
77
+    "Footer \/ notes": "Altbilgi\/Notlar",
78
+    "Template": "Şablon",
79
+    "Show logo": "Logoyu Göster",
80
+    "Accent color": "Vurgu Rengi",
81
+    "Item name": "Öğe Adı",
61
     "Items": "Öğeler",
82
     "Items": "Öğeler",
83
+    "Products": "Ürünlerimiz",
62
     "Other": "Diğer",
84
     "Other": "Diğer",
85
+    "Unit name": "Birim Adı",
63
     "Quantity": "Miktar",
86
     "Quantity": "Miktar",
64
     "Hours": "Saatler",
87
     "Hours": "Saatler",
88
+    "Price name": "Fiyat Adı",
89
+    "Price": "FİYAT",
90
+    "Rate": "Oranı",
91
+    "Amount name": "Miktar Adı",
92
+    "Amount": "Miktar",
93
+    "Total": "Toplam",
94
+    "Due Upon Receipt": "Alındıktan Sonra Ödenecek",
95
+    "Net 7": "Net 7",
96
+    "Net 10": "Net 10",
97
+    "Net 15": "Net 15",
98
+    "Net 30": "Net 30",
99
+    "Net 60": "Net 60",
100
+    "Net 90": "Net 90",
101
+    "Modern": "Çağdaş",
102
+    "Classic": "Klasik",
65
     "Language": "Dil",
103
     "Language": "Dil",
104
+    "Timezone": "Saat dilimi",
105
+    "Date & Time": "Tarih ve Saat",
106
+    "Date format": "Tarih Biçimi",
107
+    "Time format": "Zaman Biçimi",
108
+    "Week start": "Hafta Başlangıcı",
109
+    "Before number": "Numaradan Önce",
110
+    "After number": "Numaradan Sonra",
111
+    "Select position": "Pozisyon Seçiniz",
112
+    "Financial & Fiscal": "Finansal ve Mali",
113
+    "Number format": "Sayı Biçimi",
114
+    "Percent position": "Yüzde Pozisyonu",
66
     "Name": "İsim",
115
     "Name": "İsim",
67
     "Code": "Kod",
116
     "Code": "Kod",
68
     "Symbol": "Sembol",
117
     "Symbol": "Sembol",
118
+    "Default :record": "Varsayılan :record",
69
     "Type": "Tür",
119
     "Type": "Tür",
120
+    "Start date": "Başlangıç Tarihi",
121
+    "End date": "Bitiş Tarihi",
70
     "Sales": "Satışlar",
122
     "Sales": "Satışlar",
123
+    "Default :type :record": "Varsayılan :type :record",
124
+    "Purchase": "Satın alma",
71
     "Precision": "Hassasiyet",
125
     "Precision": "Hassasiyet",
126
+    "Symbol position": "Sembol Konumu",
127
+    "Before amount": "Miktardan Önce",
128
+    "After amount": "Miktardan Sonra",
129
+    "Select a symbol position": "Bir sembol konumu seçin",
130
+    "Decimal separator": "Ondalık Ayırıcı",
131
+    "Thousands separator": "Binlerce Ayırıcı",
132
+    "Yes": "Evet",
133
+    "No": "Hayır",
72
     "Description": "Açıklama",
134
     "Description": "Açıklama",
135
+    "Computation": "Hesaplama",
136
+    "Scope": "Kapsam",
137
+    "Percentage": "Yüzde",
73
     "Fixed": "Sabit",
138
     "Fixed": "Sabit",
74
     "None": "Yok",
139
     "None": "Yok",
75
-    "Currency": "Para Birimi",
76
-    "Services": "HİZMETLER",
77
-    "gray": "gri",
78
-    "sky": "gökyüzü",
79
-    "No": "Hayır",
80
-    "Live Currency": "Canlı Para Birimi",
81
-    "cyan": "camgöbeği",
82
-    "Net 7": "Net 7",
83
-    "orange": "turuncu",
140
+    "Product": "Ürün",
84
     "Service": "Hizmet",
141
     "Service": "Hizmet",
85
-    "Tax": "Vergi",
86
-    "fuchsia": "fuşya",
87
-    "indigo": "çivit",
88
-    "5X Large": "5X Büyük",
89
-    "Small": "Küçük",
90
-    "Unit Name": "Birim Adı",
91
-    "Net 10": "Net 10",
92
-    "Sales Discount": "Satış İndirimi",
93
-    "Decimal Separator": "Ondalık Ayırıcı",
94
-    "General Partnership": "Genel Ortaklık",
95
-    "Taxes & Discounts": "Vergiler ve İndirimler",
96
-    "Records Per Page": "Sayfa Başına Kayıtlar",
97
-    "Item Name": "Öğe Adı",
98
-    "Connected Accounts": "Bağlı Hesaplar",
99
-    "Primary Color": "Ana Renk",
100
-    "Entity Type": "Varlık Türü",
101
-    "Number Next": "Sonraki numara",
102
-    "Amount Name": "Miktar Adı",
103
-    "Striped Tables": "Çizgili Tablolar",
104
-    "Limited Partnership (LP)": "Sınırlı Ortaklık (LP)",
105
-    "Show Logo": "Logoyu Göster",
106
-    "Week Start": "Hafta Başlangıcı",
107
-    "After Amount": "Miktardan Sonra",
108
-    "Bank Account": "Banka Hesabı",
109
-    "Top Navigation": "Üst Navigasyon",
110
-    "Default :Type :Record": "Varsayılan :Type :Record",
111
-    "Disabled": "Engelli",
112
-    "Number Prefix": "Numara Öneki",
113
-    "Limited Liability Partnership (LLP)": "Sınırlı Sorumluluk Ortaklığı (LLP)",
114
-    "Street Address": "Sokak Adresi",
115
-    "Legal & Compliance": "Yasal ve Uyum",
116
-    "Scope": "Kapsam",
117
-    "Nonprofit": "kar amacı gütmeyen",
118
-    "Identification": "Tanımlama",
119
-    "After Number": "Numaradan Sonra",
120
-    "Purchase": "Satın alma",
121
-    "Price Name": "Fiyat Adı",
122
-    "Accent Color": "Vurgu Rengi",
123
-    "Net 15": "Net 15",
124
-    "Time Format": "Zaman Biçimi",
125
-    "Select Position": "Pozisyon Seçiniz",
126
-    "Date & Time": "Tarih ve Saat",
127
-    "Navigation Layout": "Navigasyon Düzeni",
128
-    "Accounting": "Muhasebe",
129
-    "4X Large": "4X Büyük",
130
-    "Table Sort Direction": "Tablo Sıralama Yönü",
131
-    "Screen 2X Large": "Ekran 2X Büyük",
132
-    "2X Large": "2X Büyük",
133
-    "Symbol Position": "Sembol Konumu",
134
-    "6X Large": "6X Büyük",
135
-    "Side Navigation": "Yan Navigasyon",
136
-    "Net 60": "Net 60",
137
-    "Start Date": "Başlangıç Tarihi",
138
-    "Before Number": "Numaradan Önce",
139
-    "Company Profile": "Firma Profili",
140
-    "Data Presentation": "Veri Sunumu",
141
-    "7X Large": "7X Büyük",
142
-    "City \/ Town": "Şehir\/Kasaba",
143
-    "Net 90": "Net 90",
144
-    "Footer \/ Notes": "Altbilgi\/Notlar",
145
-    "Purchase Tax": "Satın Alma Vergisi",
146
-    "Zip \/ Postal Code": "Posta Kodu\/Posta Kodu",
147
-    "Percent Position": "Yüzde Pozisyonu",
148
-    "Screen Large": "Geniş Ekran",
149
-    "Thousands Separator": "Binlerce Ayırıcı",
150
-    "Subheader": "Alt başlık",
151
-    "Net 30": "Net 30",
152
-    "Default :Record": "Varsayılan :Record",
153
-    "Max Content Width": "Maksimum İçerik Genişliği",
154
-    "Limited Liability Company (LLC)": "Sınırlı Sorumluluk Şirketi (LLC)",
155
-    "Location Details": "Konum Ayrıntıları",
156
-    "Purchase Discount": "Satın Alma İndirimi",
157
-    "Select a symbol position": "Bir sembol konumu seçin",
158
     "Compound": "Bileşik",
142
     "Compound": "Bileşik",
159
-    "Rate": "Oranı",
160
-    "3X Large": "3X Büyük",
161
-    "Number Digits": "Sayı Rakamları",
162
-    "Date Format": "Tarih Biçimi",
163
-    "Screen Extra Large": "Ekstra Büyük Ekran",
164
-    "Extra Small": "Ekstra Küçük",
165
-    "Due Upon Receipt": "Alındıktan Sonra Ödenecek",
166
-    "Number Format": "Sayı Biçimi",
167
-    "Before Amount": "Miktardan Önce",
168
-    "Sole Proprietorship": "Tek mülkiyet",
169
-    "Modal Width": "Modal Genişliği",
170
-    "Financial & Fiscal": "Finansal ve Mali",
171
-    "Account Number": "Hesap Numarası",
172
-    "Manager": "yönetici",
173
-    "Subtype": "Alt Tür",
174
-    "Credit": "Kredi",
175
-    "All": "Hepsi",
176
-    "Loan": "Kredi",
143
+    "Current balance": "Mevcut Bakiye",
177
     "Account Information": "Hesap Bilgileri",
144
     "Account Information": "Hesap Bilgileri",
145
+    "Subtype": "Alt Tür",
146
+    "Account number": "Hesap Numarası",
178
     "Investment": "Yatırım",
147
     "Investment": "Yatırım",
148
+    "Credit": "Kredi",
179
     "Depository": "Depozito",
149
     "Depository": "Depozito",
180
-    "Main": "Ana",
181
-    "Entity": "Varlık",
182
-    "Current Balance": "Mevcut Bakiye",
183
-    "Available": "Mevcut",
150
+    "Loan": "Kredi",
151
+    "Manager": "yönetici",
184
     "Children": "Çocuklar",
152
     "Children": "Çocuklar",
153
+    "All": "Hepsi",
154
+    "Main": "Ana",
155
+    "Parent department": "Ebeveyn Bölümü",
185
     "Currency List": "Para Birimi Listesi",
156
     "Currency List": "Para Birimi Listesi",
186
     "Company Currencies": "Şirket Para Birimleri",
157
     "Company Currencies": "Şirket Para Birimleri",
187
-    "Parent Department": "Ebeveyn Bölümü",
188
-    "Live Rate": "Canlı Oran"
158
+    "Entity": "Varlık",
159
+    "Available": "Mevcut",
160
+    "Live rate": "Canlı Oran",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 149
- 141
resources/data/lang/zh.json View File

1
 {
1
 {
2
     "General": "普通的",
2
     "General": "普通的",
3
-    "slate": "石板",
4
-    "lime": "石灰",
5
-    "Layout": "布局",
6
-    "purple": "紫色",
7
-    "Small": "小",
8
-    "Tax ID": "税号",
9
-    "Corporation": "公司",
10
-    "amber": "琥珀色",
11
-    "yellow": "黄色",
12
-    "Enabled": "已启用",
13
-    "Language": "语言",
14
-    "gray": "灰色",
15
-    "Email": "电子邮件",
16
-    "Full": "已满",
17
-    "Products": "产品",
18
-    "Phone Number": "电话号码",
19
-    "Header": "标题",
20
-    "Discount": "折扣",
21
-    "sky": "天空",
22
-    "Content": "内容",
23
-    "Template": "模板",
24
-    "Other": "其他",
25
-    "Rate": "费率",
3
+    "Bank account": "银行账户",
4
+    "Currency": "货币",
5
+    "Taxes & Discounts": "税收和折扣",
6
+    "Sales tax": "销售税",
7
+    "Purchase tax": "购置税",
8
+    "Sales discount": "销售折扣",
9
+    "Purchase discount": "购买折扣",
10
+    "Appearance": "外观",
11
+    "Default": "默认",
12
+    "Company Profile": "公司简介",
13
+    "Invoice": "发票",
26
     "Localization": "本地化",
14
     "Localization": "本地化",
27
-    "Large": "大号",
28
-    "Items": "物品",
29
-    "Quantity": "数量",
30
-    "Medium": "中等",
31
-    "Screen": "屏幕",
32
-    "Department": "部门",
33
-    "State \/ Province": "州\/省",
15
+    "Discount": "折扣",
16
+    "Tax": "税",
34
     "Accounting": "会计",
17
     "Accounting": "会计",
35
-    "violet": "紫色",
36
-    "Amount": "金额",
37
-    "teal": "蓝绿色",
38
-    "Country": "国家",
39
-    "Total": "总计",
40
-    "Classic": "经典",
41
-    "orange": "橙色",
42
-    "rose": "玫瑰",
43
-    "Extra Large": "超大号",
44
-    "Ascending": "上升",
45
-    "Price": "价格",
46
-    "Modern": "现代",
47
     "Banking": "银行业",
18
     "Banking": "银行业",
19
+    "Account": "账户",
20
+    "Department": "部门",
21
+    "Services": "服务",
22
+    "Connected Accounts": "关联账户",
23
+    "Live Currency": "实时货币",
24
+    "Primary color": "原色",
25
+    "amber": "琥珀色",
26
+    "blue": "蓝色",
27
+    "cyan": "青色",
48
     "emerald": "翡翠",
28
     "emerald": "翡翠",
49
-    "Descending": "降序",
50
-    "Timezone": "时区",
51
-    "Tax": "税",
52
-    "Currency": "货币",
53
-    "Sales Tax": "销售税",
54
-    "Default": "默认",
29
+    "fuchsia": "紫红色",
30
+    "gray": "灰色",
31
+    "green": "绿色",
32
+    "indigo": "靛青",
33
+    "lime": "石灰",
55
     "neutral": "中立",
34
     "neutral": "中立",
35
+    "orange": "橙色",
36
+    "pink": "粉色",
37
+    "purple": "紫色",
56
     "red": "红色",
38
     "red": "红色",
39
+    "rose": "玫瑰",
40
+    "sky": "天空",
41
+    "slate": "石板",
57
     "stone": "石头",
42
     "stone": "石头",
58
-    "Appearance": "外观",
59
-    "cyan": "青色",
60
-    "green": "绿色",
61
-    "Invoice": "发票",
62
-    "Name": "姓名",
63
-    "blue": "蓝色",
43
+    "teal": "蓝绿色",
44
+    "violet": "紫色",
45
+    "yellow": "黄色",
64
     "zinc": "锌",
46
     "zinc": "锌",
65
     "Font": "字体",
47
     "Font": "字体",
66
-    "Account": "账户",
67
-    "pink": "粉色",
68
-    "indigo": "靛青",
69
-    "Services": "服务",
48
+    "Enabled": "已启用",
49
+    "Disabled": "已禁用",
50
+    "Identification": "身份识别",
51
+    "Email": "电子邮件",
52
+    "Phone number": "电话号码",
70
     "Logo": "徽标",
53
     "Logo": "徽标",
71
-    "6X Large": "6X 大号",
72
-    "Unit Name": "单位名称",
73
-    "Hours": "小时",
74
-    "Net 60": "净值 60",
75
-    "Date Format": "日期格式",
76
-    "Sales Discount": "销售折扣",
77
-    "Purchase Discount": "购买折扣",
78
-    "Data Presentation": "数据演示",
79
-    "Payment Terms": "付款条款",
80
-    "Records Per Page": "每页记录数",
81
-    "Subheader": "副标题",
82
-    "Purchase Tax": "购置税",
83
     "Location Details": "位置详情",
54
     "Location Details": "位置详情",
84
-    "Price Name": "价格名称",
85
-    "Bank Account": "银行账户",
86
-    "3X Large": "3X 大号",
87
-    "Modal Width": "模态宽度",
88
-    "Disabled": "已禁用",
89
-    "7X Large": "7X 大号",
55
+    "Country": "国家",
56
+    "State \/ Province": "州\/省",
57
+    "Street Address": "街道地址",
58
+    "City \/ Town": "城市\/城镇",
59
+    "Zip \/ Postal Code": "邮政编码\/邮政编码",
90
     "Legal & Compliance": "法律与合规",
60
     "Legal & Compliance": "法律与合规",
91
-    "Number Digits": "数字数字",
92
-    "Accent Color": "口音颜色",
93
-    "Financial & Fiscal": "金融与财政",
94
-    "Number Next": "下一个数字",
95
-    "Net 30": "Net 30",
96
-    "Time Format": "时间格式",
97
-    "Top Navigation": "热门导航",
61
+    "Entity type": "实体类型",
62
+    "Tax ID": "税号",
63
+    "Sole Proprietorship": "独资经营",
98
     "General Partnership": "普通合伙企业",
64
     "General Partnership": "普通合伙企业",
99
-    "Live Currency": "实时货币",
100
-    "Table Sort Direction": "表格排序方向",
101
-    "4X Large": "4X 大号",
102
-    "Screen Large": "屏幕大",
103
-    "2X Large": "2X 大号",
104
-    "Striped Tables": "条纹桌子",
105
-    "Zip \/ Postal Code": "邮政编码\/邮政编码",
106
-    "Primary Color": "原色",
107
-    "Select Position": "选择位置",
108
-    "Identification": "身份识别",
109
-    "Navigation Layout": "导航布局",
110
-    "Side Navigation": "侧面导航",
111
-    "Due Upon Receipt": "收货时到期",
112
-    "fuchsia": "紫红色",
65
+    "Limited Partnership (LP)": "有限合伙企业 (LP)",
113
     "Limited Liability Partnership (LLP)": "有限责任合伙企业 (LLP)",
66
     "Limited Liability Partnership (LLP)": "有限责任合伙企业 (LLP)",
67
+    "Limited Liability Company (LLC)": "有限责任公司(LLC)",
68
+    "Corporation": "公司",
114
     "Nonprofit": "非营利",
69
     "Nonprofit": "非营利",
115
-    "Entity Type": "实体类型",
116
-    "Before Number": "在数字之前",
117
-    "Number Format": "数字格式",
118
-    "Extra Small": "超小",
70
+    "Number prefix": "数字前缀",
71
+    "Number digits": "数字数字",
72
+    "Number next": "下一个数字",
73
+    "Payment terms": "付款条款",
74
+    "Content": "内容",
75
+    "Header": "标题",
76
+    "Subheader": "副标题",
77
+    "Footer \/ notes": "页脚\/备注",
78
+    "Template": "模板",
79
+    "Show logo": "显示徽标",
80
+    "Accent color": "口音颜色",
81
+    "Item name": "物品名称",
82
+    "Items": "物品",
83
+    "Products": "产品",
84
+    "Other": "其他",
85
+    "Unit name": "单位名称",
86
+    "Quantity": "数量",
87
+    "Hours": "小时",
88
+    "Price name": "价格名称",
89
+    "Price": "价格",
90
+    "Rate": "费率",
91
+    "Amount name": "金额名称",
92
+    "Amount": "金额",
93
+    "Total": "总计",
94
+    "Due Upon Receipt": "收货时到期",
119
     "Net 7": "Net 7",
95
     "Net 7": "Net 7",
120
-    "After Number": "在数字之后",
121
-    "Taxes & Discounts": "税收和折扣",
122
-    "City \/ Town": "城市\/城镇",
123
-    "Limited Liability Company (LLC)": "有限责任公司(LLC)",
124
-    "Week Start": "本周开始",
125
-    "Number Prefix": "数字前缀",
126
-    "Show Logo": "显示徽标",
127
-    "Company Profile": "公司简介",
128
-    "Screen 2X Large": "屏幕 2X 大",
129
-    "Street Address": "街道地址",
130
-    "Footer \/ Notes": "页脚\/备注",
131
-    "Limited Partnership (LP)": "有限合伙企业 (LP)",
132
-    "Sole Proprietorship": "独资经营",
133
-    "5X Large": "5X 大号",
134
-    "Item Name": "物品名称",
135
-    "Date & Time": "日期和时间",
136
-    "Net 15": "Net 15",
137
-    "Amount Name": "金额名称",
138
-    "Percent Position": "百分比位置",
139
     "Net 10": "Net 10",
96
     "Net 10": "Net 10",
140
-    "Connected Accounts": "关联账户",
141
-    "Max Content Width": "最大内容宽度",
142
-    "Screen Extra Large": "屏幕超大",
97
+    "Net 15": "Net 15",
98
+    "Net 30": "Net 30",
99
+    "Net 60": "净值 60",
143
     "Net 90": "净值 90",
100
     "Net 90": "净值 90",
101
+    "Modern": "现代",
102
+    "Classic": "经典",
103
+    "Language": "语言",
104
+    "Timezone": "时区",
105
+    "Date & Time": "日期和时间",
106
+    "Date format": "日期格式",
107
+    "Time format": "时间格式",
108
+    "Week start": "本周开始",
109
+    "Before number": "在数字之前",
110
+    "After number": "在数字之后",
111
+    "Select position": "选择位置",
112
+    "Financial & Fiscal": "金融与财政",
113
+    "Number format": "数字格式",
114
+    "Percent position": "百分比位置",
115
+    "Name": "姓名",
144
     "Code": "代码",
116
     "Code": "代码",
145
     "Symbol": "符号",
117
     "Symbol": "符号",
118
+    "Default :record": "默认 :record",
146
     "Type": "类型",
119
     "Type": "类型",
147
-    "Start Date": "开始日期",
148
-    "Default :Record": "默认 :Record",
149
-    "End Date": "结束日期",
120
+    "Start date": "开始日期",
121
+    "End date": "结束日期",
150
     "Sales": "销售",
122
     "Sales": "销售",
151
-    "Default :Type :Record": "默认 :Type :Record",
123
+    "Default :type :record": "默认 :type :record",
152
     "Purchase": "购买",
124
     "Purchase": "购买",
153
     "Precision": "精度",
125
     "Precision": "精度",
154
-    "Symbol Position": "符号位置",
155
-    "Before Amount": "金额之前",
156
-    "After Amount": "扣除金额后",
126
+    "Symbol position": "符号位置",
127
+    "Before amount": "金额之前",
128
+    "After amount": "扣除金额后",
157
     "Select a symbol position": "选择符号位置",
129
     "Select a symbol position": "选择符号位置",
158
-    "Decimal Separator": "小数分隔符",
130
+    "Decimal separator": "小数分隔符",
131
+    "Thousands separator": "千位分隔符",
159
     "Yes": "是的",
132
     "Yes": "是的",
160
     "No": "没有",
133
     "No": "没有",
161
     "Description": "描述",
134
     "Description": "描述",
167
     "Product": "产品",
140
     "Product": "产品",
168
     "Service": "服务",
141
     "Service": "服务",
169
     "Compound": "化合物",
142
     "Compound": "化合物",
170
-    "Subtype": "子类型",
171
-    "Account Number": "账号",
172
-    "Thousands Separator": "千位分隔符",
143
+    "Current balance": "当前余额",
173
     "Account Information": "账户信息",
144
     "Account Information": "账户信息",
145
+    "Subtype": "子类型",
146
+    "Account number": "账号",
174
     "Investment": "投资",
147
     "Investment": "投资",
175
     "Credit": "信用",
148
     "Credit": "信用",
149
+    "Depository": "存放处",
150
+    "Loan": "贷款",
176
     "Manager": "经理",
151
     "Manager": "经理",
177
     "Children": "孩子们",
152
     "Children": "孩子们",
178
     "All": "全部",
153
     "All": "全部",
179
-    "Available": "可用",
180
     "Main": "主要",
154
     "Main": "主要",
181
-    "Entity": "实体",
182
-    "Loan": "贷款",
183
-    "Depository": "存放处",
184
-    "Parent Department": "家长部",
155
+    "Parent department": "家长部",
185
     "Currency List": "货币清单",
156
     "Currency List": "货币清单",
186
     "Company Currencies": "公司货币",
157
     "Company Currencies": "公司货币",
187
-    "Live Rate": "实时汇率",
188
-    "Current Balance": "当前余额"
158
+    "Entity": "实体",
159
+    "Available": "可用",
160
+    "Live rate": "实时汇率",
161
+    "Edit": "Edit",
162
+    "Notes": "Notes",
163
+    "Terms": "Terms",
164
+    "Ending balance": "Ending balance",
165
+    "Default :type :category": "Default :type :category",
166
+    "Category": "Category",
167
+    "Configuration": "Configuration",
168
+    "Dates": "Dates",
169
+    "Adjustment Details": "Adjustment Details",
170
+    "Adjustments": "Adjustments",
171
+    "Sellable Configuration": "Sellable Configuration",
172
+    "Purchasable Configuration": "Purchasable Configuration",
173
+    "Sale Information": "Sale Information",
174
+    "Purchase Information": "Purchase Information",
175
+    "Billing": "Billing",
176
+    "Shipping": "Shipping",
177
+    "General Information": "General Information",
178
+    "Primary Contact": "Primary Contact",
179
+    "Billing Address": "Billing Address",
180
+    "Shipping Address": "Shipping Address",
181
+    "Secondary Contacts": "Secondary Contacts",
182
+    "Address Information": "Address Information",
183
+    "Invoice Header": "Invoice Header",
184
+    "Invoice Details": "Invoice Details",
185
+    "Footer": "Footer",
186
+    "Invoice Footer": "Invoice Footer",
187
+    "Bill Details": "Bill Details",
188
+    "Create": "Create",
189
+    "Estimate Header": "Estimate Header",
190
+    "Estimate Details": "Estimate Details",
191
+    "Estimate Footer": "Estimate Footer",
192
+    "Scheduling": "Scheduling",
193
+    "Scheduling Form": "Scheduling Form",
194
+    "Approve": "Approve",
195
+    "Frequency": "Frequency",
196
+    "Dates & Time": "Dates & Time"
189
 }
197
 }

+ 1
- 1
resources/views/components/company/reports/layout.blade.php View File

50
 
50
 
51
         .table-class {
51
         .table-class {
52
             border-collapse: collapse;
52
             border-collapse: collapse;
53
-            table-layout: fixed;
53
+            table-layout: auto;
54
             width: 100%;
54
             width: 100%;
55
         }
55
         }
56
 
56
 

+ 23
- 19
resources/views/components/company/reports/report-pdf.blade.php View File

22
         </thead>
22
         </thead>
23
         @foreach($report->getCategories() as $category)
23
         @foreach($report->getCategories() as $category)
24
             <tbody>
24
             <tbody>
25
-            <tr class="category-header-row">
26
-                @foreach($category->header as $index => $header)
27
-                    <td class="{{ $report->getAlignmentClass($index) }}">
28
-                        {{ $header }}
29
-                    </td>
30
-                @endforeach
31
-            </tr>
25
+            @if(! empty($category->header))
26
+                <tr class="category-header-row">
27
+                    @foreach($category->header as $index => $header)
28
+                        <td class="{{ $report->getAlignmentClass($index) }}">
29
+                            {{ $header }}
30
+                        </td>
31
+                    @endforeach
32
+                </tr>
33
+            @endif
32
             @foreach($category->data as $account)
34
             @foreach($category->data as $account)
33
                 <tr>
35
                 <tr>
34
                     @foreach($account as $index => $cell)
36
                     @foreach($account as $index => $cell)
97
                 </tr>
99
                 </tr>
98
             @endforeach
100
             @endforeach
99
 
101
 
100
-            <tr class="category-summary-row">
101
-                @foreach($category->summary as $index => $cell)
102
-                    <td class="{{ $report->getAlignmentClass($index) }}">
103
-                        {{ $cell }}
104
-                    </td>
105
-                @endforeach
106
-            </tr>
107
-
108
-            @unless($loop->last && empty($report->getOverallTotals()))
109
-                <tr class="spacer-row">
110
-                    <td colspan="{{ count($report->getHeaders()) }}"></td>
102
+            @if(! empty($category->summary))
103
+                <tr class="category-summary-row">
104
+                    @foreach($category->summary as $index => $cell)
105
+                        <td class="{{ $report->getAlignmentClass($index) }}">
106
+                            {{ $cell }}
107
+                        </td>
108
+                    @endforeach
111
                 </tr>
109
                 </tr>
112
-            @endunless
110
+
111
+                @unless($loop->last && empty($report->getOverallTotals()))
112
+                    <tr class="spacer-row">
113
+                        <td colspan="{{ count($report->getHeaders()) }}"></td>
114
+                    </tr>
115
+                @endunless
116
+            @endif
113
             </tbody>
117
             </tbody>
114
         @endforeach
118
         @endforeach
115
         <tfoot>
119
         <tfoot>

+ 1
- 1
resources/views/components/company/tables/header.blade.php View File

3
     'alignmentClass',
3
     'alignmentClass',
4
 ])
4
 ])
5
 
5
 
6
-<thead class="divide-y divide-gray-200 dark:divide-white/5">
6
+<thead class="divide-y divide-gray-200 dark:divide-white/5 whitespace-nowrap">
7
 <tr class="bg-gray-50 dark:bg-white/5">
7
 <tr class="bg-gray-50 dark:bg-white/5">
8
     @foreach($headers as $headerIndex => $headerCell)
8
     @foreach($headers as $headerIndex => $headerCell)
9
         <th class="px-3 py-3.5 sm:first-of-type:ps-6 sm:last-of-type:pe-6 {{ $alignmentClass($headerIndex) }}">
9
         <th class="px-3 py-3.5 sm:first-of-type:ps-6 sm:last-of-type:pe-6 {{ $alignmentClass($headerIndex) }}">

+ 19
- 15
resources/views/components/company/tables/reports/detailed-report.blade.php View File

2
     <x-company.tables.header :headers="$report->getHeaders()" :alignment-class="[$report, 'getAlignmentClass']"/>
2
     <x-company.tables.header :headers="$report->getHeaders()" :alignment-class="[$report, 'getAlignmentClass']"/>
3
     @foreach($report->getCategories() as $accountCategory)
3
     @foreach($report->getCategories() as $accountCategory)
4
         <tbody class="divide-y divide-gray-200 whitespace-nowrap dark:divide-white/5">
4
         <tbody class="divide-y divide-gray-200 whitespace-nowrap dark:divide-white/5">
5
-        <x-company.tables.category-header :category-headers="$accountCategory->header"
6
-                                          :alignment-class="[$report, 'getAlignmentClass']"/>
5
+        @if(! empty($accountCategory->header))
6
+            <x-company.tables.category-header :category-headers="$accountCategory->header"
7
+                                              :alignment-class="[$report, 'getAlignmentClass']"/>
8
+        @endif
7
         @foreach($accountCategory->data as $categoryAccount)
9
         @foreach($accountCategory->data as $categoryAccount)
8
             <tr>
10
             <tr>
9
                 @foreach($categoryAccount as $accountIndex => $categoryAccountCell)
11
                 @foreach($categoryAccount as $accountIndex => $categoryAccountCell)
48
                 @endforeach
50
                 @endforeach
49
             </tr>
51
             </tr>
50
         @endforeach
52
         @endforeach
51
-        <tr>
52
-            @foreach($accountCategory->summary as $accountCategorySummaryIndex => $accountCategorySummaryCell)
53
-                <x-company.tables.cell :alignment-class="$report->getAlignmentClass($accountCategorySummaryIndex)"
54
-                                       bold="true">
55
-                    {{ $accountCategorySummaryCell }}
56
-                </x-company.tables.cell>
57
-            @endforeach
58
-        </tr>
59
-        <tr>
60
-            <td colspan="{{ count($report->getHeaders()) }}">
61
-                <div class="min-h-12"></div>
62
-            </td>
63
-        </tr>
53
+        @if(! empty($accountCategory->summary))
54
+            <tr>
55
+                @foreach($accountCategory->summary as $accountCategorySummaryIndex => $accountCategorySummaryCell)
56
+                    <x-company.tables.cell :alignment-class="$report->getAlignmentClass($accountCategorySummaryIndex)"
57
+                                           bold="true">
58
+                        {{ $accountCategorySummaryCell }}
59
+                    </x-company.tables.cell>
60
+                @endforeach
61
+            </tr>
62
+            <tr>
63
+                <td colspan="{{ count($report->getHeaders()) }}">
64
+                    <div class="min-h-12"></div>
65
+                </td>
66
+            </tr>
67
+        @endif
64
         </tbody>
68
         </tbody>
65
     @endforeach
69
     @endforeach
66
     <x-company.tables.footer :totals="$report->getOverallTotals()" :alignment-class="[$report, 'getAlignmentClass']"/>
70
     <x-company.tables.footer :totals="$report->getOverallTotals()" :alignment-class="[$report, 'getAlignmentClass']"/>

+ 3
- 3
resources/views/components/report-entry.blade.php View File

10
         @class([
10
         @class([
11
             'inline-flex rounded-lg p-3 ring-4 ring-white dark:ring-gray-900',
11
             'inline-flex rounded-lg p-3 ring-4 ring-white dark:ring-gray-900',
12
             match ($iconColor) {
12
             match ($iconColor) {
13
-                'gray' => 'fi-color-gray bg-gray-50 text-gray-700 dark:bg-gray-900 dark:text-gray-500',
14
-                default => 'fi-color-custom bg-custom-50 text-custom-700 dark:bg-custom-950 dark:text-custom-500',
13
+                'gray' => 'fi-color-gray bg-gray-50 text-gray-700 dark:bg-gray-950 dark:text-gray-300',
14
+                default => 'fi-color-custom bg-custom-50 text-custom-700 dark:bg-custom-950 dark:text-custom-300',
15
             },
15
             },
16
         ])
16
         ])
17
         @style([
17
         @style([
18
             \Filament\Support\get_color_css_variables(
18
             \Filament\Support\get_color_css_variables(
19
                 $iconColor,
19
                 $iconColor,
20
-                shades: [50, 500, 700, 950],
20
+                shades: [50, 300, 700, 950],
21
             ) => $iconColor !== 'gray',
21
             ) => $iconColor !== 'gray',
22
         ])
22
         ])
23
     >
23
     >

+ 2
- 2
resources/views/livewire/company/service/connected-account/list-institutions.blade.php View File

84
                             />
84
                             />
85
                         </div>
85
                         </div>
86
                         <h4 class="connected-account-empty-state-heading text-base font-semibold leading-6 text-gray-950 dark:text-white">
86
                         <h4 class="connected-account-empty-state-heading text-base font-semibold leading-6 text-gray-950 dark:text-white">
87
-                            {{ __('No Connected Accounts') }}
87
+                            {{ __('No connected accounts') }}
88
                         </h4>
88
                         </h4>
89
                         <p class="connected-account-empty-state-description text-sm text-gray-500 dark:text-gray-400 mt-1">
89
                         <p class="connected-account-empty-state-description text-sm text-gray-500 dark:text-gray-400 mt-1">
90
                             {{ __('Connect your bank account to get started.') }}
90
                             {{ __('Connect your bank account to get started.') }}
94
                                 wire:click="$dispatch('createToken')"
94
                                 wire:click="$dispatch('createToken')"
95
                                 wire:loading.attr="disabled"
95
                                 wire:loading.attr="disabled"
96
                             >
96
                             >
97
-                                {{ __('Connect Account') }}
97
+                                {{ __('Connect account') }}
98
                             </x-filament::button>
98
                             </x-filament::button>
99
                         </div>
99
                         </div>
100
                     </div>
100
                     </div>

+ 6
- 6
tests/Feature/Accounting/TransactionTest.php View File

345
     $newDescription = 'Updated Description';
345
     $newDescription = 'Updated Description';
346
 
346
 
347
     livewire(Transactions::class)
347
     livewire(Transactions::class)
348
-        ->mountTableAction('updateTransaction', $transaction)
348
+        ->mountTableAction('editTransaction', $transaction)
349
         ->assertTableActionDataSet([
349
         ->assertTableActionDataSet([
350
             'type' => $transactionType->value,
350
             'type' => $transactionType->value,
351
             'description' => $transaction->description,
351
             'description' => $transaction->description,
377
         ->create();
377
         ->create();
378
 
378
 
379
     livewire(Transactions::class)
379
     livewire(Transactions::class)
380
-        ->assertTableActionHidden('updateTransfer', $transaction)
381
-        ->assertTableActionHidden('updateJournalTransaction', $transaction);
380
+        ->assertTableActionHidden('editTransfer', $transaction)
381
+        ->assertTableActionHidden('editJournalTransaction', $transaction);
382
 })->with([
382
 })->with([
383
     TransactionType::Deposit,
383
     TransactionType::Deposit,
384
     TransactionType::Withdrawal,
384
     TransactionType::Withdrawal,
394
     $newDescription = 'Updated Transfer Description';
394
     $newDescription = 'Updated Transfer Description';
395
 
395
 
396
     livewire(Transactions::class)
396
     livewire(Transactions::class)
397
-        ->mountTableAction('updateTransfer', $transaction)
397
+        ->mountTableAction('editTransfer', $transaction)
398
         ->assertTableActionDataSet([
398
         ->assertTableActionDataSet([
399
             'type' => TransactionType::Transfer->value,
399
             'type' => TransactionType::Transfer->value,
400
             'description' => $transaction->description,
400
             'description' => $transaction->description,
421
         ->create();
421
         ->create();
422
 
422
 
423
     livewire(Transactions::class)
423
     livewire(Transactions::class)
424
-        ->assertTableActionHidden('updateTransaction', $transaction)
425
-        ->assertTableActionHidden('updateJournalTransaction', $transaction);
424
+        ->assertTableActionHidden('editTransaction', $transaction)
425
+        ->assertTableActionHidden('editJournalTransaction', $transaction);
426
 });
426
 });
427
 
427
 
428
 it('replicates a transaction with correct journal entries', function () {
428
 it('replicates a transaction with correct journal entries', function () {

+ 2
- 1
vite.config.js View File

11
             ],
11
             ],
12
             refresh: [
12
             refresh: [
13
                 ...refreshPaths,
13
                 ...refreshPaths,
14
-                'app/Livewire/**',
15
                 'app/Filament/**',
14
                 'app/Filament/**',
15
+                'app/Livewire/**',
16
+                'app/Providers/Filament/**',
16
             ],
17
             ],
17
         }),
18
         }),
18
     ],
19
     ],

Loading…
Cancel
Save