├── database
├── .gitignore
├── migrations
│ ├── 2024_01_01_000016_create_labels_table.php
│ ├── 2024_01_01_000013_create_boards_table.php
│ ├── 2024_04_11_000001_add_view_type_to_projects_table.php
│ ├── 2024_01_01_000017_create_task_labels_table.php
│ ├── 2024_01_01_000014_create_task_lists_table.php
│ ├── 2025_04_04_203228_add_display_name_to_permissions_table.php
│ ├── 2024_01_01_000007_create_customer_groups_table.php
│ ├── 2024_01_01_000012_create_projects_table.php
│ ├── 0001_01_01_000003_create_settings_table.php
│ ├── 2024_04_03_143009_create_commission_payouts_table.php
│ ├── 2024_01_01_000002_create_categories_table.php
│ ├── 2024_01_01_000009_create_suppliers_table.php
│ ├── 2024_04_03_142517_create_commissions_table.php
│ ├── 0001_01_01_000001_create_cache_table.php
│ ├── 2024_01_01_000009_create_customer_notes_table.php
│ ├── 2024_01_01_000001_create_accounts_table.php
│ ├── 2024_01_01_000015_create_tasks_table.php
│ ├── 2024_01_01_000020_create_savings_plans_table.php
│ ├── 2024_01_01_000021_create_investment_plans_table.php
│ ├── 2024_03_21_000002_create_customer_agreements_table.php
│ ├── 2024_01_01_000019_create_proposal_items_table.php
│ ├── 2024_04_05_create_ai_conversations_table.php
│ ├── 2024_01_01_000023_add_content_to_tasks_table.php
│ ├── 2025_03_29_000001_create_loans_table.php
│ ├── 2024_01_01_000008_create_customers_table.php
│ ├── 2024_01_01_000024_create_debts_table.php
│ ├── 2024_01_01_000018_create_proposal_table.php
│ ├── 2024_03_21_000001_create_customer_credentials_table.php
│ ├── 2024_01_01_000008_create_leads_table.php
│ ├── 0001_01_01_000000_create_users_table.php
│ └── 0001_01_01_000002_create_jobs_table.php
├── factories
│ └── UserFactory.php
└── seeders
│ ├── DatabaseSeeder.php
│ ├── CategorySeeder.php
│ └── AdminUserSeeder.php
├── bootstrap
├── cache
│ └── .gitignore
├── providers.php
└── app.php
├── storage
├── pail
│ └── .gitignore
├── app
│ ├── private
│ │ └── .gitignore
│ ├── public
│ │ └── .gitignore
│ └── .gitignore
└── framework
│ ├── testing
│ └── .gitignore
│ ├── views
│ └── .gitignore
│ ├── cache
│ ├── data
│ │ └── .gitignore
│ └── .gitignore
│ ├── sessions
│ └── .gitignore
│ └── .gitignore
├── public
├── robots.txt
├── favicon.ico
├── index.php
├── js
│ └── filament
│ │ └── forms
│ │ └── components
│ │ ├── textarea.js
│ │ ├── tags-input.js
│ │ └── key-value.js
├── .htaccess
└── build
│ └── manifest.json
├── resources
├── views
│ ├── components
│ │ ├── partials
│ │ │ └── footer.blade.php
│ │ ├── customer-link.blade.php
│ │ ├── category-option.blade.php
│ │ ├── form-elements
│ │ │ ├── link.blade.php
│ │ │ ├── textarea.blade.php
│ │ │ ├── date.blade.php
│ │ │ ├── input.blade.php
│ │ │ ├── select.blade.php
│ │ │ ├── rich-editor.blade.php
│ │ │ └── button.blade.php
│ │ ├── button
│ │ │ ├── icon.blade.php
│ │ │ └── base.blade.php
│ │ ├── table
│ │ │ └── table-layout.blade.php
│ │ ├── input
│ │ │ └── date.blade.php
│ │ ├── card
│ │ │ └── stat-card.blade.php
│ │ └── language-notice.blade.php
│ ├── livewire
│ │ ├── account
│ │ │ ├── transactions-table.blade.php
│ │ │ ├── virtual-pos-manager.blade.php
│ │ │ ├── bank-account-manager.blade.php
│ │ │ ├── crypto-wallet-manager.blade.php
│ │ │ ├── account-history.blade.php
│ │ │ ├── credit-card-transactions.blade.php
│ │ │ └── widgets
│ │ │ │ └── credit-card-stats-widget.blade.php
│ │ ├── loan
│ │ │ └── loan-manager.blade.php
│ │ ├── project
│ │ │ ├── project-manager.blade.php
│ │ │ └── board
│ │ │ │ └── partials
│ │ │ │ ├── edit-list-modal.blade.php
│ │ │ │ └── list-modal.blade.php
│ │ ├── customer
│ │ │ └── customer-manager.blade.php
│ │ ├── supplier
│ │ │ └── supplier-manager.blade.php
│ │ ├── bank-account
│ │ │ └── bank-account-manager.blade.php
│ │ ├── lead
│ │ │ └── lead-manager.blade.php
│ │ ├── planning
│ │ │ ├── investment-planner.blade.php
│ │ │ └── savings-planner.blade.php
│ │ ├── proposal
│ │ │ ├── manager.blade.php
│ │ │ └── form.blade.php
│ │ ├── debt
│ │ │ └── debt-manager.blade.php
│ │ ├── categories
│ │ │ ├── category-manager.blade.php
│ │ │ └── category-form.blade.php
│ │ ├── transaction
│ │ │ ├── recurring-transaction-list-container.blade.php
│ │ │ ├── transaction-form.blade.php
│ │ │ └── widgets
│ │ │ │ └── transaction-stats-widget.blade.php
│ │ ├── customer-group
│ │ │ └── customer-group-manager.blade.php
│ │ ├── role
│ │ │ ├── manager.blade.php
│ │ │ └── role-form.blade.php
│ │ ├── settings
│ │ │ ├── generic-settings-view.blade.php
│ │ │ ├── site.blade.php
│ │ │ ├── payment.blade.php
│ │ │ └── index.blade.php
│ │ ├── credit-card
│ │ │ ├── credit-card-manager.blade.php
│ │ │ ├── credit-card-transactions.blade.php
│ │ │ └── widgets
│ │ │ │ └── credit-card-stats-widget.blade.php
│ │ ├── user
│ │ │ ├── user-manager.blade.php
│ │ │ └── partials
│ │ │ │ └── permissions-button.blade.php
│ │ └── commission
│ │ │ └── widgets
│ │ │ └── commission-stats.blade.php
│ ├── welcome.blade.php
│ └── errors
│ │ └── 403.blade.php
└── lang
│ ├── vendor
│ └── filament-forms
│ │ ├── ja
│ │ └── validation.php
│ │ ├── ko
│ │ └── validation.php
│ │ ├── ar
│ │ └── validation.php
│ │ ├── no
│ │ └── validation.php
│ │ ├── sv
│ │ └── validation.php
│ │ ├── th
│ │ └── validation.php
│ │ ├── az
│ │ └── validation.php
│ │ ├── da
│ │ └── validation.php
│ │ ├── hy
│ │ └── validation.php
│ │ ├── id
│ │ └── validation.php
│ │ ├── ka
│ │ └── validation.php
│ │ ├── hr
│ │ └── validation.php
│ │ ├── sk
│ │ └── validation.php
│ │ ├── tr
│ │ └── validation.php
│ │ ├── vi
│ │ └── validation.php
│ │ ├── cs
│ │ └── validation.php
│ │ ├── de
│ │ └── validation.php
│ │ ├── en
│ │ └── validation.php
│ │ ├── hu
│ │ └── validation.php
│ │ ├── mn
│ │ └── validation.php
│ │ ├── ro
│ │ └── validation.php
│ │ ├── uk
│ │ └── validation.php
│ │ ├── ca
│ │ └── validation.php
│ │ ├── km
│ │ └── validation.php
│ │ ├── ms
│ │ └── validation.php
│ │ ├── ru
│ │ └── validation.php
│ │ ├── uz
│ │ └── validation.php
│ │ ├── es
│ │ └── validation.php
│ │ ├── fi
│ │ └── validation.php
│ │ ├── fr
│ │ └── validation.php
│ │ ├── it
│ │ └── validation.php
│ │ ├── lt
│ │ └── validation.php
│ │ ├── pl
│ │ └── validation.php
│ │ ├── pt_BR
│ │ └── validation.php
│ │ ├── nl
│ │ └── validation.php
│ │ └── pt_PT
│ │ └── validation.php
│ ├── tr
│ ├── general.php
│ ├── pagination.php
│ ├── auth.php
│ ├── passwords.php
│ └── sidebar.php
│ └── en
│ ├── general.php
│ └── sidebar.php
├── .htaccess
├── tests
├── Unit
│ └── ExampleTest.php
├── TestCase.php
├── Feature
│ └── ExampleTest.php
└── Pest.php
├── postcss.config.js
├── app
├── Http
│ └── Controllers
│ │ └── Controller.php
├── Services
│ ├── AI
│ │ ├── Exceptions
│ │ │ └── UnsafeSqlException.php
│ │ └── Contracts
│ │ │ └── AIAssistantInterface.php
│ ├── Transaction
│ │ ├── Contracts
│ │ │ ├── IncomeTransactionServiceInterface.php
│ │ │ ├── ExpenseTransactionServiceInterface.php
│ │ │ ├── TransferTransactionServiceInterface.php
│ │ │ ├── InstallmentTransactionServiceInterface.php
│ │ │ ├── TransactionServiceInterface.php
│ │ │ └── AccountBalanceServiceInterface.php
│ │ └── Implementations
│ │ │ ├── IncomeTransactionService.php
│ │ │ └── ExpenseTransactionService.php
│ ├── Role
│ │ ├── Contracts
│ │ │ └── RoleServiceInterface.php
│ │ └── Implementations
│ │ │ └── RoleService.php
│ ├── Supplier
│ │ ├── Contracts
│ │ │ └── SupplierServiceInterface.php
│ │ └── Implementations
│ │ │ └── SupplierService.php
│ ├── CustomerGroup
│ │ └── Contracts
│ │ │ └── CustomerGroupServiceInterface.php
│ ├── Lead
│ │ └── Contracts
│ │ │ └── LeadServiceInterface.php
│ ├── Payment
│ │ └── Contracts
│ │ │ └── PaymentServiceInterface.php
│ ├── Customer
│ │ └── Contracts
│ │ │ └── CustomerServiceInterface.php
│ ├── Debt
│ │ └── Contracts
│ │ │ └── DebtServiceInterface.php
│ ├── Notification
│ │ └── TelegramNotificationService.php
│ └── Planning
│ │ └── Contracts
│ │ └── PlanningServiceInterface.php
├── Enums
│ ├── TransactionStatusEnum.php
│ ├── TransactionTypeEnum.php
│ ├── CurrencyEnum.php
│ └── PaymentMethodEnum.php
├── Models
│ ├── Note.php
│ ├── Setting.php
│ ├── Label.php
│ ├── TaskLabel.php
│ ├── CommissionPayout.php
│ ├── Category.php
│ ├── Supplier.php
│ ├── AIMessage.php
│ ├── SavingsPlan.php
│ ├── CustomerGroup.php
│ ├── Board.php
│ ├── ProposalItem.php
│ ├── InvestmentPlan.php
│ ├── AIConversation.php
│ ├── Budget.php
│ ├── CustomerNote.php
│ ├── TaskList.php
│ ├── Project.php
│ └── Proposal.php
├── Providers
│ └── OpenAIServiceProvider.php
├── Livewire
│ ├── Dashboard
│ │ ├── UpcomingSubscriptionsWidget.php
│ │ └── Statistics.php
│ └── Auth
│ │ └── Login.php
├── DTOs
│ ├── Project
│ │ ├── BoardData.php
│ │ └── ProjectData.php
│ ├── Role
│ │ └── RoleData.php
│ ├── CustomerGroup
│ │ └── CustomerGroupData.php
│ ├── User
│ │ └── UserLoginData.php
│ └── Customer
│ │ └── NoteData.php
├── Mail
│ └── FinancialNotification.php
└── Console
│ └── Kernel.php
├── routes
└── console.php
├── refresh-demo.sh
├── .editorconfig
├── artisan
├── phpstan.neon
├── vite.config.js
├── pint.json
├── .gitattributes
├── phpcs.xml
├── LICENSE
├── .gitignore
├── phpunit.xml
├── package.json
├── config
├── services.php
└── ai.php
├── tailwind.config.js
└── SECURITY.md
/database/.gitignore:
--------------------------------------------------------------------------------
1 | *.sqlite*
2 |
--------------------------------------------------------------------------------
/bootstrap/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/pail/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | User-agent: *
2 | Disallow:
3 |
--------------------------------------------------------------------------------
/resources/views/components/partials/footer.blade.php:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/storage/app/private/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/app/public/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/testing/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/views/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/cache/data/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/sessions/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !.gitignore
3 |
--------------------------------------------------------------------------------
/storage/framework/cache/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !data/
3 | !.gitignore
4 |
--------------------------------------------------------------------------------
/storage/app/.gitignore:
--------------------------------------------------------------------------------
1 | *
2 | !private/
3 | !public/
4 | !.gitignore
5 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mehmetmasa/finova/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/.htaccess:
--------------------------------------------------------------------------------
1 | RewriteEngine on
2 | RewriteCond %{REQUEST_URI} !^public
3 | RewriteRule ^(.*)$ public/$1 [L]
--------------------------------------------------------------------------------
/resources/views/livewire/account/transactions-table.blade.php:
--------------------------------------------------------------------------------
1 |
2 | {{ $this->table }}
3 |
--------------------------------------------------------------------------------
/tests/Unit/ExampleTest.php:
--------------------------------------------------------------------------------
1 | toBeTrue();
5 | });
6 |
--------------------------------------------------------------------------------
/bootstrap/providers.php:
--------------------------------------------------------------------------------
1 |
2 | Dashboard
3 | Welcome to your dashboard. Customize this page as needed.
4 |
--------------------------------------------------------------------------------
/app/Services/AI/Exceptions/UnsafeSqlException.php:
--------------------------------------------------------------------------------
1 |
4 | {{ $label }}
5 |
--------------------------------------------------------------------------------
/routes/console.php:
--------------------------------------------------------------------------------
1 | comment(Inspiring::quote());
8 | })->purpose('Display an inspiring quote')->hourly();
9 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ja/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => '少なくとも1つ以上:attributeを選択してください',
7 | 'only_one_must_be_selected' => '1つだけ:attributeを選択してください',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ko/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => ':attribute 필드 중 하나 이상을 선택해야 합니다.',
7 | 'only_one_must_be_selected' => ':attribute 필드 중 하나만 선택해야 합니다.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ar/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'يجب تحديد حقل :attribute واحد على الأقل.',
7 | 'only_one_must_be_selected' => 'يجب تحديد حقل :attribute واحد فقط.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/no/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Minst én :attribute felt må være valgt.',
7 | 'only_one_must_be_selected' => 'Bare én :attribute felt må være valgt.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/sv/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Minst ett :attribute fält måste väljas.',
7 | 'only_one_must_be_selected' => 'Endast ett :attribute fält kan väljas.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/th/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'ต้องเลือกอย่างน้อยหนึ่งฟิลด์ :attribute',
7 | 'only_one_must_be_selected' => 'ต้องเลือกฟิลด์ :attribute เดียวเท่านั้น',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/refresh-demo.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Demo data refresh script
4 | echo "Starting demo data refresh process..."
5 |
6 | # Change to project directory if needed
7 | # cd /path/to/your/project
8 |
9 | # Run the artisan command
10 | php artisan demo:refresh
11 |
12 | echo "Demo data refresh completed!"
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/az/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Ən azı bir :attribute sahəsi seçilməlidir.',
7 | 'only_one_must_be_selected' => 'Yalnız bir :attribute sahəsi seçilməlidir',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/da/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Mindst ét :attribute felt skal være valgt.',
7 | 'only_one_must_be_selected' => 'Der må kun vælges ét :attribute felt.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/hy/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Առնվազն մեկ :attribute դաշտ պետք է ընտրվի։',
7 | 'only_one_must_be_selected' => 'Պետք է ընտրվի միայն մեկ :attribute դաշտ։',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/id/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Pilih setidaknya 1 field :attribute.',
7 | 'only_one_must_be_selected' => 'Hanya satu field :attribute yang perlu dipilih.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ka/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'უნდა აირჩეს მინიმუმ ერთი :attribute ველი.',
7 | 'only_one_must_be_selected' => 'უნდა აირჩეს მხოლოდ ერთი :attribute ველი.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/tr/general.php:
--------------------------------------------------------------------------------
1 | 'Kayıt Başarılı',
5 | 'updated' => 'Kayıt Başarılı',
6 | 'deleted' => 'Kayıt Başarılı',
7 | 'languages' => [
8 | 'en' => 'İngilizce',
9 | 'tr' => 'Türkçe',
10 | 'de' => 'Almanca'
11 | ]
12 | ];
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/hr/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Najmanje jedan :attribute mora biti odabran.',
7 | 'only_one_must_be_selected' => 'Samo jedan :attribute može biti odabrab.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/sk/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Musí byť vybrané aspoň jedno pole :attribute.',
7 | 'only_one_must_be_selected' => 'Musí byť vybrané iba jedno pole :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/tr/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'En az 1 adet :attribute alanı seçmelisiniz.',
7 | 'only_one_must_be_selected' => 'Sadece 1 adet :attribute alanı seçilmelidir.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/vi/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Ít nhất một trường :attribute phải được chọn.',
7 | 'only_one_must_be_selected' => 'Chỉ có một trường :attribute được chọn.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/cs/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Musí být vybráno alespoň jedno pole :attribute.',
7 | 'only_one_must_be_selected' => 'Musí být vybráno pouze jedno pole :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/de/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Wenigstens muss das :attribute ausgewählt sein.',
7 | 'only_one_must_be_selected' => 'Nur das :attribute Feld darf ausgewählt sein.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/en/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'At least one :attribute field must be selected.',
7 | 'only_one_must_be_selected' => 'Only one :attribute field must be selected.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/hu/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Legalább egy :attribute mezőt ki kell választani.',
7 | 'only_one_must_be_selected' => 'Csak egy :attribute mezőt választhatsz ki.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/mn/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => ':attribute багадаа нэгийг сонгосон байх ёстой.',
7 | 'only_one_must_be_selected' => ':attribute зөвхөн нэгийг сонгосон байх ёстой.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ro/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Trebuie selectat cel puțin un element :attribute.',
7 | 'only_one_must_be_selected' => 'Trebuie selectat doar un element :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/uk/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => ' Має бути вибрано хоча б одне поле :attribute.',
7 | 'only_one_must_be_selected' => 'Має бути вибрано тільки одне поле :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/views/components/category-option.blade.php:
--------------------------------------------------------------------------------
1 | @props(['name', 'icon', 'color'])
2 |
3 |
4 |
5 |
6 |
{{ $name }}
7 |
--------------------------------------------------------------------------------
/resources/views/livewire/loan/loan-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ca/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'S\'ha de seleccionar almenys un camp :attribute.',
7 | 'only_one_must_be_selected' => 'S\'ha de seleccionar només un camp :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/km/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'យ៉ាងហោចណាស់មួយ :attribute ត្រូវតែត្រូវបានជ្រើសរើស។',
7 | 'only_one_must_be_selected' => 'តែមួយគត់ :attribute ត្រូវតែត្រូវបានជ្រើសរើស។',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ms/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Sekurang-kurangnya satu medan :attribute mesti dipilih.',
7 | 'only_one_must_be_selected' => 'Hanya satu medan :attribute mesti dipilih.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/ru/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => ' Должно быть выбрано хотя бы одно поле :attribute.',
7 | 'only_one_must_be_selected' => 'Должно быть выбрано только одно поле :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/uz/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Kamida bitta :attribute maydoni tanlanishi kerak.',
7 | 'only_one_must_be_selected' => 'Faqat bitta :attribute maydonini tanlash kerak.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/views/livewire/project/project-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/es/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Se debe seleccionar al menos un campo :attribute.',
7 | 'only_one_must_be_selected' => 'Se debe seleccionar solamente un campo :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/fi/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Vähintään yksi :attribute kenttä tulee olla valittuna.',
7 | 'only_one_must_be_selected' => 'Vain yksi :attribute kenttä tulee olla valittuna.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/fr/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Au moins un champ :attribute doit être sélectionné.',
7 | 'only_one_must_be_selected' => 'Seulement un champ :attribute doit être sélectionné.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/it/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'È necessario selezionare almeno un campo :attribute.',
7 | 'only_one_must_be_selected' => 'È necessario selezionare un solo campo :attribute.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/lt/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Bent vienas :attribute laukas turi būti pasirinktas.',
7 | 'only_one_must_be_selected' => 'Tik vienas :attribute laukas gali būti pasirinktas.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/pl/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Przynajmniej jedno pole :attribute musi być zaznaczone.',
7 | 'only_one_must_be_selected' => 'Tylko jedno pole :attribute musi być zaznaczone.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/pt_BR/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Pelo menos um campo :attribute deve ser selecionado.',
7 | 'only_one_must_be_selected' => 'Apenas um campo :attribute deve ser selecionado.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/nl/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Minstens één :attribute veld moet worden geselecteerd.',
7 | 'only_one_must_be_selected' => 'Slechts één :attribute veld mag worden geselecteerd.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/lang/vendor/filament-forms/pt_PT/validation.php:
--------------------------------------------------------------------------------
1 | [
6 | 'must_be_selected' => 'Deve ser seleccionado, no mínimo, um campo :attribute.',
7 | 'only_one_must_be_selected' => 'Apenas um campo :attribute deve ser seleccionado.',
8 | ],
9 |
10 | ];
11 |
--------------------------------------------------------------------------------
/resources/views/livewire/account/virtual-pos-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/customer/customer-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/supplier/supplier-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/bank-account/bank-account-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/account/bank-account-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/lead/lead-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/planning/investment-planner.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/planning/savings-planner.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/proposal/manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/account/crypto-wallet-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | end_of_line = lf
6 | indent_size = 4
7 | indent_style = space
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
14 | [*.{yml,yaml}]
15 | indent_size = 2
16 |
17 | [docker-compose.yml]
18 | indent_size = 4
19 |
--------------------------------------------------------------------------------
/resources/lang/en/general.php:
--------------------------------------------------------------------------------
1 | 'Record created successfully',
5 | 'updated' => 'Record updated successfully',
6 | 'deleted' => 'Record deleted successfully',
7 | 'languages' => [
8 | 'en' => 'English',
9 | 'tr' => 'Turkish',
10 | 'de' => 'German'
11 | ],
12 | ];
13 |
--------------------------------------------------------------------------------
/resources/views/livewire/account/account-history.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/debt/debt-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 |
9 | {{ $this->table }}
10 |
--------------------------------------------------------------------------------
/resources/views/livewire/categories/category-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/tests/TestCase.php:
--------------------------------------------------------------------------------
1 | withoutVite();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/resources/views/livewire/transaction/recurring-transaction-list-container.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
10 |
--------------------------------------------------------------------------------
/tests/Feature/ExampleTest.php:
--------------------------------------------------------------------------------
1 | get(route('home'))->assertSuccessful();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/resources/views/livewire/customer-group/customer-group-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 | {{ $this->table }}
9 |
--------------------------------------------------------------------------------
/resources/views/livewire/role/manager.blade.php:
--------------------------------------------------------------------------------
1 |
9 | {{ $this->table }}
10 |
--------------------------------------------------------------------------------
/resources/views/livewire/settings/generic-settings-view.blade.php:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/artisan:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | handleCommand(new ArgvInput);
14 |
15 | exit($status);
16 |
--------------------------------------------------------------------------------
/resources/views/livewire/credit-card/credit-card-manager.blade.php:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 | {{ $this->table }}
11 |
--------------------------------------------------------------------------------
/resources/views/livewire/user/user-manager.blade.php:
--------------------------------------------------------------------------------
1 |
9 | {{ $this->table }}
10 |
--------------------------------------------------------------------------------
/resources/views/components/form-elements/link.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'href',
3 | 'label',
4 | 'attributes' => []
5 | ])
6 |
7 | merge([
9 | 'class' => 'text-gray-900 hover:text-primary-600 transition-colors duration-200'
10 | ]) }}
11 | @if(isset($attributes['wire:navigate']))
12 | wire:navigate
13 | @endif
14 | >
15 | {{ $label }}
16 |
--------------------------------------------------------------------------------
/resources/views/components/button/icon.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'icon' => null,
3 | ])
4 |
5 |
--------------------------------------------------------------------------------
/resources/views/livewire/user/partials/permissions-button.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
9 |
--------------------------------------------------------------------------------
/resources/views/components/table/table-layout.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'pageTitle' => '',
3 | 'breadcrumbs' => [],
4 | 'backRoute' => null,
5 | 'backLabel' => null,
6 | ])
7 |
8 |
9 |
15 |
16 |
17 | {{ $slot }}
18 |
--------------------------------------------------------------------------------
/resources/views/components/form-elements/textarea.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'label' => null,
3 | ])
4 |
5 |
6 | @if($label)
7 |
10 | @endif
11 |
12 |
15 |
--------------------------------------------------------------------------------
/resources/views/components/input/date.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'label' => null,
3 | ])
4 |
5 |
6 | @if($label)
7 |
10 | @endif
11 |
12 | merge(['class' => 'block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm']) }}
15 | />
16 |
--------------------------------------------------------------------------------
/resources/views/components/form-elements/date.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'label' => null,
3 | ])
4 |
5 |
6 | @if($label)
7 |
10 | @endif
11 |
12 | merge(['class' => 'block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm']) }}
15 | />
16 |
--------------------------------------------------------------------------------
/resources/views/livewire/settings/site.blade.php:
--------------------------------------------------------------------------------
1 |
13 | {{ $this->form }}
14 |
--------------------------------------------------------------------------------
/resources/views/livewire/settings/payment.blade.php:
--------------------------------------------------------------------------------
1 |
13 | {{ $this->form }}
14 |
--------------------------------------------------------------------------------
/resources/views/livewire/credit-card/credit-card-transactions.blade.php:
--------------------------------------------------------------------------------
1 |
9 |
10 | {{ $this->table }}
11 |
12 |
13 |
--------------------------------------------------------------------------------
/resources/views/components/form-elements/input.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'label' => null,
3 | 'type' => 'text',
4 | ])
5 |
6 |
7 | @if($label)
8 |
11 | @endif
12 |
13 | merge(['class' => 'block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 sm:text-sm']) }}
16 | />
17 |
--------------------------------------------------------------------------------
/app/Enums/TransactionStatusEnum.php:
--------------------------------------------------------------------------------
1 | handleRequest(Request::capture());
18 |
--------------------------------------------------------------------------------
/app/Models/Note.php:
--------------------------------------------------------------------------------
1 | name : 'Yeni Rol Oluştur'"
4 | :breadcrumbs="[
5 | ['label' => 'Dashboard', 'url' => route('admin.dashboard'), 'wire' => true],
6 | ['label' => 'Roller', 'url' => route('admin.roles.index'), 'wire' => true],
7 | ['label' => $isEdit ? 'Düzenle' : 'Oluştur']
8 | ]"
9 | backRoute="{{ route('admin.roles.index') }}"
10 | backLabel="Rollere Dön"
11 | >
12 | {{ $this->form }}
13 |
--------------------------------------------------------------------------------
/resources/views/livewire/account/credit-card-transactions.blade.php:
--------------------------------------------------------------------------------
1 |
10 |
11 | {{ $this->table }}
12 |
13 |
--------------------------------------------------------------------------------
/resources/views/livewire/categories/category-form.blade.php:
--------------------------------------------------------------------------------
1 |
12 | {{ $this->form }}
13 |
--------------------------------------------------------------------------------
/phpstan.neon:
--------------------------------------------------------------------------------
1 | parameters:
2 | level: 8
3 | paths:
4 | - app
5 | - config
6 | - database
7 | - routes
8 | - tests
9 | excludePaths:
10 | - vendor/*
11 | - storage/*
12 | - bootstrap/cache/*
13 | checkMissingIterableValueType: false
14 | checkGenericClassInNonGenericObjectType: false
15 | ignoreErrors:
16 | - '#Property [a-zA-Z0-9\\_]+::\$[a-zA-Z0-9\\_]+ is never written, only read#'
17 | - '#Access to an undefined property [a-zA-Z0-9\\_]+::\$[a-zA-Z0-9\\_]+#'
18 | - '#Call to an undefined method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
--------------------------------------------------------------------------------
/resources/views/livewire/proposal/form.blade.php:
--------------------------------------------------------------------------------
1 |
13 | {{ $this->form }}
14 |
15 |
16 |
--------------------------------------------------------------------------------
/resources/lang/tr/pagination.php:
--------------------------------------------------------------------------------
1 | '« Önceki',
17 | 'next' => 'Sonraki »',
18 |
19 | ];
20 |
--------------------------------------------------------------------------------
/resources/views/components/form-elements/select.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'label' => null,
3 | 'options' => [],
4 | ])
5 |
6 |
7 | @if($label)
8 |
11 | @endif
12 |
13 |
20 |
--------------------------------------------------------------------------------
/public/js/filament/forms/components/textarea.js:
--------------------------------------------------------------------------------
1 | function r({initialHeight:t,shouldAutosize:i,state:s}){return{state:s,wrapperEl:null,init:function(){this.wrapperEl=this.$el.parentNode,this.setInitialHeight(),i?this.$watch("state",()=>{this.resize()}):this.setUpResizeObserver()},setInitialHeight:function(){this.$el.scrollHeight<=0||(this.wrapperEl.style.height=t+"rem")},resize:function(){if(this.setInitialHeight(),this.$el.scrollHeight<=0)return;let e=this.$el.scrollHeight+"px";this.wrapperEl.style.height!==e&&(this.wrapperEl.style.height=e)},setUpResizeObserver:function(){new ResizeObserver(()=>{this.wrapperEl.style.height=this.$el.style.height}).observe(this.$el)}}}export{r as default};
2 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000016_create_labels_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->string('name');
13 | $table->string('color', 7)->default('#000000');
14 | $table->timestamps();
15 | });
16 | }
17 |
18 | public function down(): void
19 | {
20 | Schema::dropIfExists('labels');
21 | }
22 | };
23 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000013_create_boards_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('project_id')->constrained()->cascadeOnDelete();
13 | $table->string('name');
14 | $table->timestamps();
15 | });
16 | }
17 |
18 | public function down(): void
19 | {
20 | Schema::dropIfExists('boards');
21 | }
22 | };
23 |
--------------------------------------------------------------------------------
/database/migrations/2024_04_11_000001_add_view_type_to_projects_table.php:
--------------------------------------------------------------------------------
1 | enum('view_type', ['list', 'kanban'])->default('list')->after('status');
12 | });
13 | }
14 |
15 | public function down(): void
16 | {
17 | Schema::table('projects', function (Blueprint $table) {
18 | $table->dropColumn('view_type');
19 | });
20 | }
21 | };
--------------------------------------------------------------------------------
/public/.htaccess:
--------------------------------------------------------------------------------
1 |
2 |
3 | Options -MultiViews -Indexes
4 |
5 |
6 | RewriteEngine On
7 |
8 | # Handle Authorization Header
9 | RewriteCond %{HTTP:Authorization} .
10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
11 |
12 | # Redirect Trailing Slashes If Not A Folder...
13 | RewriteCond %{REQUEST_FILENAME} !-d
14 | RewriteCond %{REQUEST_URI} (.+)/$
15 | RewriteRule ^ %1 [L,R=301]
16 |
17 | # Send Requests To Front Controller...
18 | RewriteCond %{REQUEST_FILENAME} !-d
19 | RewriteCond %{REQUEST_FILENAME} !-f
20 | RewriteRule ^ index.php [L]
21 |
22 |
--------------------------------------------------------------------------------
/resources/views/livewire/transaction/transaction-form.blade.php:
--------------------------------------------------------------------------------
1 |
14 | {{ $this->form }}
15 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000017_create_task_labels_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('task_id')->constrained()->cascadeOnDelete();
13 | $table->foreignId('label_id')->constrained()->cascadeOnDelete();
14 | });
15 | }
16 |
17 | public function down(): void
18 | {
19 | Schema::dropIfExists('task_labels');
20 | }
21 | };
22 |
--------------------------------------------------------------------------------
/resources/views/components/form-elements/rich-editor.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'label' => null,
3 | ])
4 |
5 |
6 | @if($label)
7 |
10 | @endif
11 |
12 |
13 |
16 |
17 |
18 |
19 | En fazla 2000 karakter
20 |
21 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import laravel, { refreshPaths } from 'laravel-vite-plugin'
3 |
4 | export default defineConfig({
5 | plugins: [
6 | laravel({
7 | input: [
8 | 'resources/css/app.css',
9 | 'resources/js/app.js',
10 | 'resources/js/kanban.js'
11 | ],
12 | refresh: [
13 | ...refreshPaths,
14 | 'app/Filament/**',
15 | 'app/Forms/Components/**',
16 | 'app/Livewire/**',
17 | 'app/Infolists/Components/**',
18 | 'app/Providers/Filament/**',
19 | 'app/Tables/Columns/**',
20 | ],
21 | }),
22 | ],
23 | })
24 |
--------------------------------------------------------------------------------
/resources/lang/tr/auth.php:
--------------------------------------------------------------------------------
1 | 'Bu bilgilerle eşleşen bir kayıt bulunamadı.',
17 | 'password' => 'Girilen parola yanlış.',
18 | 'throttle' => 'Çok fazla giriş denemesi. :seconds saniye sonra tekrar deneyin.',
19 |
20 | ];
21 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000014_create_task_lists_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('board_id')->constrained()->cascadeOnDelete();
13 | $table->string('name');
14 | $table->unsignedInteger('order')->default(0);
15 | $table->timestamps();
16 | });
17 | }
18 |
19 | public function down(): void
20 | {
21 | Schema::dropIfExists('task_lists');
22 | }
23 | };
24 |
--------------------------------------------------------------------------------
/resources/views/components/card/stat-card.blade.php:
--------------------------------------------------------------------------------
1 | @props(['label', 'value', 'color'])
2 |
3 |
11 |
12 |
13 | {{ $label }}
14 |
15 |
16 | {{ $value }}
17 |
18 |
19 |
--------------------------------------------------------------------------------
/app/Services/Transaction/Contracts/IncomeTransactionServiceInterface.php:
--------------------------------------------------------------------------------
1 | 'button',
3 | 'color' => 'primary',
4 | ])
5 |
6 |
--------------------------------------------------------------------------------
/database/migrations/2025_04_04_203228_add_display_name_to_permissions_table.php:
--------------------------------------------------------------------------------
1 | string('display_name')->nullable()->after('guard_name');
16 | });
17 | }
18 |
19 | /**
20 | * Reverse the migrations.
21 | */
22 | public function down(): void
23 | {
24 | Schema::table('permissions', function (Blueprint $table) {
25 | $table->dropColumn('display_name');
26 | });
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000007_create_customer_groups_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->string('name');
14 | $table->text('description')->nullable();
15 | $table->boolean('status')->default(true);
16 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
17 | $table->timestamps();
18 | });
19 | }
20 |
21 | public function down(): void
22 | {
23 | Schema::dropIfExists('customer_groups');
24 | }
25 | };
--------------------------------------------------------------------------------
/resources/views/components/button/base.blade.php:
--------------------------------------------------------------------------------
1 | @props([
2 | 'type' => 'button',
3 | 'color' => 'primary',
4 | ])
5 |
6 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto eol=lf
2 |
3 | *.blade.php diff=html
4 | *.css diff=css
5 | *.html diff=html
6 | *.md diff=markdown
7 | *.php diff=php
8 |
9 | /.github export-ignore
10 | CHANGELOG.md export-ignore
11 | .styleci.yml export-ignore
12 | CLAUDE.md export-ignore
13 |
14 | # IDE and Editor files
15 | .idea/ export-ignore
16 | .vscode/ export-ignore
17 | *.sublime-project export-ignore
18 | *.sublime-workspace export-ignore
19 | *.code-workspace export-ignore
20 | .cursorrules export-ignore
21 |
22 | # OS generated files
23 | .DS_Store export-ignore
24 | .DS_Store?
25 | ._*
26 | .Spotlight-V100
27 | .Trashes
28 | ehthumbs.db
29 | Thumbs.db
30 |
31 | # Temporary files
32 | *.log export-ignore
33 | *.tmp export-ignore
34 | *.temp export-ignore
35 | *.swp export-ignore
36 | *~ export-ignore
37 |
38 | # Documentation
39 | /docs/ export-ignore
40 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000012_create_projects_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->string('name');
13 | $table->text('description')->nullable();
14 | $table->enum('status', ['active', 'completed'])->default('active');
15 | $table->foreignId('created_by')->constrained('users')->cascadeOnDelete();
16 | $table->timestamps();
17 | });
18 | }
19 |
20 | public function down(): void
21 | {
22 | Schema::dropIfExists('projects');
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/resources/lang/tr/passwords.php:
--------------------------------------------------------------------------------
1 | 'Parolanız sıfırlandı.',
17 | 'sent' => 'Parola sıfırlama e-postası gönderildi.',
18 | 'throttled' => 'Tekrar denemeden önce lütfen bekleyin.',
19 | 'token' => 'Parola sıfırlama kodu geçersiz.',
20 | 'user' => "Bu e-posta adresi ile kayıtlı kullanıcı bulunamadı.",
21 |
22 | ];
23 |
--------------------------------------------------------------------------------
/app/Models/Setting.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | protected $fillable = [
25 | 'group',
26 | 'key',
27 | 'value',
28 | 'type',
29 | ];
30 |
31 | /**
32 | * Attribute casts
33 | *
34 | * @var array
35 | */
36 | protected $casts = [
37 | 'value' => 'array',
38 | ];
39 | }
--------------------------------------------------------------------------------
/app/Services/Transaction/Contracts/InstallmentTransactionServiceInterface.php:
--------------------------------------------------------------------------------
1 | e!==t)},reorderTags:function(t){let e=this.state.splice(t.oldIndex,1)[0];this.state.splice(t.newIndex,0,e),this.state=[...this.state]},input:{"x-on:blur":"createTag()","x-model":"newTag","x-on:keydown"(t){["Enter",...n].includes(t.key)&&(t.preventDefault(),t.stopPropagation(),this.createTag())},"x-on:paste"(){this.$nextTick(()=>{if(n.length===0){this.createTag();return}let t=n.map(e=>e.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&")).join("|");this.newTag.split(new RegExp(t,"g")).forEach(e=>{this.newTag=e,this.createTag()})})}}}}export{i as default};
2 |
--------------------------------------------------------------------------------
/database/migrations/0001_01_01_000003_create_settings_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->string('group');
14 | $table->string('key');
15 | $table->json('value')->nullable();
16 | $table->enum('type', ['text', 'textarea', 'image', 'boolean', 'json', 'integer', 'float'])->default('text');
17 | $table->timestamps();
18 | $table->unique(['group', 'key']);
19 | });
20 | }
21 |
22 | public function down(): void
23 | {
24 | Schema::dropIfExists('settings');
25 | }
26 | };
--------------------------------------------------------------------------------
/bootstrap/app.php:
--------------------------------------------------------------------------------
1 | withRouting(
9 | web: __DIR__.'/../routes/web.php',
10 | commands: __DIR__.'/../routes/console.php',
11 | health: '/up',
12 | )
13 | ->withMiddleware(function (Middleware $middleware) {
14 | $middleware->alias([
15 | 'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
16 | 'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
17 | 'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
18 | ]);
19 | })
20 | ->withExceptions(function (Exceptions $exceptions) {
21 | //
22 | })->create();
23 |
--------------------------------------------------------------------------------
/app/Providers/OpenAIServiceProvider.php:
--------------------------------------------------------------------------------
1 | app->singleton(OpenAI\Client::class, function () {
27 | return OpenAI::client(config('ai.openai.api_key'));
28 | });
29 |
30 | $this->app->bind(AIAssistantInterface::class, OpenAIAssistant::class);
31 | }
32 | }
--------------------------------------------------------------------------------
/database/migrations/2024_04_03_143009_create_commission_payouts_table.php:
--------------------------------------------------------------------------------
1 | id();
16 | $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
17 | $table->decimal('amount', 15, 2);
18 | $table->date('payment_date');
19 | $table->timestamps();
20 | });
21 | }
22 |
23 | /**
24 | * Reverse the migrations.
25 | */
26 | public function down(): void
27 | {
28 | Schema::dropIfExists('commission_payouts');
29 | }
30 | };
--------------------------------------------------------------------------------
/resources/views/livewire/project/board/partials/edit-list-modal.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 | Liste Düzenle
4 |
5 |
6 |
25 |
--------------------------------------------------------------------------------
/phpcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | PSR-12 Laravel Standards
4 |
5 | app
6 | config
7 | database
8 | routes
9 | tests
10 |
11 | */vendor/*
12 | */storage/*
13 | */bootstrap/cache/*
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | */tests/*
29 |
30 |
--------------------------------------------------------------------------------
/app/Models/Label.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | protected $fillable = [
25 | 'name',
26 | 'color',
27 | ];
28 |
29 | /**
30 | * Tasks that the label is assigned to.
31 | *
32 | * @return BelongsToMany
33 | */
34 | public function tasks(): BelongsToMany
35 | {
36 | return $this->belongsToMany(Task::class, 'task_labels');
37 | }
38 | }
--------------------------------------------------------------------------------
/resources/views/livewire/project/board/partials/list-modal.blade.php:
--------------------------------------------------------------------------------
1 |
5 |
6 | Liste Oluştur
7 |
8 |
9 |
28 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000002_create_categories_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
13 | $table->enum('type', ['income', 'expense', 'transfer']);
14 | $table->string('name');
15 | $table->string('color', 10)->nullable();
16 | $table->boolean('status')->default(true);
17 | $table->timestamps();
18 | });
19 | }
20 |
21 | public function down(): void
22 | {
23 | Schema::disableForeignKeyConstraints();
24 | Schema::dropIfExists('categories');
25 | Schema::enableForeignKeyConstraints();
26 | }
27 | };
28 |
--------------------------------------------------------------------------------
/app/Models/TaskLabel.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | protected $fillable = [
24 | 'task_id',
25 | 'label_id',
26 | ];
27 |
28 | /**
29 | * Related task
30 | *
31 | * @return BelongsTo
32 | */
33 | public function task()
34 | {
35 | return $this->belongsTo(Task::class);
36 | }
37 |
38 | /**
39 | * Related label
40 | *
41 | * @return BelongsTo
42 | */
43 | public function label()
44 | {
45 | return $this->belongsTo(Label::class);
46 | }
47 | }
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000009_create_suppliers_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->string('name');
14 | $table->string('contact_name')->nullable();
15 | $table->string('phone')->nullable();
16 | $table->string('email')->nullable()->unique();
17 | $table->text('address')->nullable();
18 | $table->text('notes')->nullable();
19 | $table->boolean('status')->default(true);
20 | $table->timestamps();
21 | $table->softDeletes();
22 | });
23 | }
24 |
25 | public function down(): void
26 | {
27 | Schema::dropIfExists('suppliers');
28 | }
29 | };
--------------------------------------------------------------------------------
/database/migrations/2024_04_03_142517_create_commissions_table.php:
--------------------------------------------------------------------------------
1 | id();
16 | $table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
17 | $table->foreignId('transaction_id')->constrained('transactions')->cascadeOnDelete();
18 | $table->decimal('commission_rate', 5, 2);
19 | $table->decimal('commission_amount', 15, 2);
20 | $table->timestamps();
21 | });
22 | }
23 |
24 | /**
25 | * Reverse the migrations.
26 | */
27 | public function down(): void
28 | {
29 | Schema::dropIfExists('commissions');
30 | }
31 | };
--------------------------------------------------------------------------------
/public/js/filament/forms/components/key-value.js:
--------------------------------------------------------------------------------
1 | function r({state:o}){return{state:o,rows:[],shouldUpdateRows:!0,init:function(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(t,e)=>{let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(t)===0&&s(e)===0||this.updateRows()})},addRow:function(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow:function(t){this.rows.splice(t,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows:function(t){let e=Alpine.raw(this.rows);this.rows=[];let s=e.splice(t.oldIndex,1)[0];e.splice(t.newIndex,0,s),this.$nextTick(()=>{this.rows=e,this.updateState()})},updateRows:function(){if(!this.shouldUpdateRows){this.shouldUpdateRows=!0;return}let t=[];for(let[e,s]of Object.entries(this.state??{}))t.push({key:e,value:s});this.rows=t},updateState:function(){let t={};this.rows.forEach(e=>{e.key===""||e.key===null||(t[e.key]=e.value)}),this.shouldUpdateRows=!1,this.state=t}}}export{r as default};
2 |
--------------------------------------------------------------------------------
/app/Models/CommissionPayout.php:
--------------------------------------------------------------------------------
1 |
17 | */
18 | protected $fillable = [
19 | 'user_id',
20 | 'amount',
21 | 'payment_date',
22 | 'period_start',
23 | 'period_end',
24 | 'notes'
25 | ];
26 |
27 | protected $casts = [
28 | 'amount' => 'decimal:2',
29 | 'payment_date' => 'date',
30 | 'period_start' => 'date',
31 | 'period_end' => 'date'
32 | ];
33 |
34 | /**
35 | * The user who received the commission payout.
36 | *
37 | * @return BelongsTo
38 | */
39 | public function user(): BelongsTo
40 | {
41 | return $this->belongsTo(User::class);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/database/migrations/0001_01_01_000001_create_cache_table.php:
--------------------------------------------------------------------------------
1 | string('key')->primary();
16 | $table->mediumText('value');
17 | $table->integer('expiration');
18 | });
19 |
20 | Schema::create('cache_locks', function (Blueprint $table) {
21 | $table->string('key')->primary();
22 | $table->string('owner');
23 | $table->integer('expiration');
24 | });
25 | }
26 |
27 | /**
28 | * Reverse the migrations.
29 | */
30 | public function down(): void
31 | {
32 | Schema::dropIfExists('cache');
33 | Schema::dropIfExists('cache_locks');
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/app/Livewire/Dashboard/UpcomingSubscriptionsWidget.php:
--------------------------------------------------------------------------------
1 | where('next_payment_date', '<=', now()->addDays(30))
26 | ->orderBy('next_payment_date')
27 | ->take(5)
28 | ->get();
29 |
30 | return view('livewire.dashboard.upcoming-subscriptions-widget', [
31 | 'subscriptions' => $upcomingSubscriptions
32 | ]);
33 | }
34 | }
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000009_create_customer_notes_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->foreignId('customer_id')->constrained()->cascadeOnDelete();
14 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
15 | $table->foreignId('assigned_user_id')->nullable()->constrained('users')->nullOnDelete();
16 | $table->text('content');
17 | $table->enum('type', ['note', 'call', 'meeting', 'email', 'other'])->default('note');
18 | $table->timestamp('activity_date')->nullable();
19 | $table->timestamps();
20 | });
21 | }
22 |
23 | public function down(): void
24 | {
25 | Schema::dropIfExists('customer_notes');
26 | }
27 | };
--------------------------------------------------------------------------------
/app/Services/Role/Contracts/RoleServiceInterface.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
14 | $table->string('name');
15 | $table->enum('type', ['bank_account', 'credit_card', 'crypto_wallet', 'virtual_pos', 'cash', 'debt']);
16 | $table->string('currency', 10);
17 | $table->decimal('balance', 15, 5)->default(0);
18 | $table->json('details')->nullable();
19 | $table->boolean('status')->default(true);
20 | $table->timestamps();
21 | $table->softDeletes();
22 | });
23 | }
24 |
25 | public function down(): void
26 | {
27 | Schema::dropIfExists('accounts');
28 | }
29 | };
--------------------------------------------------------------------------------
/app/Models/Category.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | protected $fillable = [
25 | 'user_id',
26 | 'type',
27 | 'name',
28 | 'color',
29 | 'status',
30 | ];
31 |
32 | /**
33 | * Attribute casts
34 | *
35 | * @var array
36 | */
37 | protected $casts = [
38 | 'status' => 'boolean',
39 | ];
40 |
41 | /**
42 | * The user who owns the category.
43 | *
44 | * @return BelongsTo
45 | */
46 | public function user()
47 | {
48 | return $this->belongsTo(User::class);
49 | }
50 | }
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000015_create_tasks_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('task_list_id')->constrained()->cascadeOnDelete();
13 | $table->string('title');
14 | $table->unsignedInteger('order')->default(0);
15 | $table->text('description')->nullable();
16 | $table->enum('priority', ['low', 'medium', 'high'])->default('medium');
17 | $table->date('due_date')->nullable();
18 | $table->foreignId('assigned_to')->nullable()->constrained('users')->nullOnDelete();
19 | $table->boolean('completed')->default(false);
20 | $table->timestamps();
21 | });
22 | }
23 |
24 | public function down(): void
25 | {
26 | Schema::dropIfExists('tasks');
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000020_create_savings_plans_table.php:
--------------------------------------------------------------------------------
1 | id();
16 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
17 | $table->string('goal_name');
18 | $table->decimal('target_amount', 12, 2);
19 | $table->decimal('saved_amount', 12, 2)->default(0);
20 | $table->date('target_date')->nullable();
21 | $table->enum('status', ['active', 'completed', 'cancelled'])->default('active');
22 | $table->timestamps();
23 | });
24 | }
25 |
26 | /**
27 | * Reverse the migrations.
28 | */
29 | public function down(): void
30 | {
31 | Schema::dropIfExists('savings_plans');
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000021_create_investment_plans_table.php:
--------------------------------------------------------------------------------
1 | id();
16 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
17 | $table->string('investment_name');
18 | $table->decimal('invested_amount', 12, 2);
19 | $table->decimal('current_value', 12, 2)->default(0);
20 | $table->enum('investment_type', ['stocks', 'real_estate', 'crypto', 'other'])->default('other');
21 | $table->date('investment_date');
22 | $table->timestamps();
23 | });
24 | }
25 |
26 | /**
27 | * Reverse the migrations.
28 | */
29 | public function down(): void
30 | {
31 | Schema::dropIfExists('investment_plans');
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Mikpa Yazılım
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/database/migrations/2024_03_21_000002_create_customer_agreements_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
14 | $table->foreignId('customer_id')->constrained()->cascadeOnDelete();
15 | $table->string('name');
16 | $table->text('description')->nullable();
17 | $table->decimal('amount', 15, 5);
18 | $table->date('start_date');
19 | $table->date('next_payment_date');
20 | $table->enum('status', ['active', 'completed', 'cancelled'])->default('active');
21 | $table->timestamps();
22 | $table->softDeletes();
23 | });
24 | }
25 |
26 | public function down(): void
27 | {
28 | Schema::dropIfExists('customer_agreements');
29 | }
30 | };
--------------------------------------------------------------------------------
/app/Services/Supplier/Contracts/SupplierServiceInterface.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('proposal_id')->constrained()->cascadeOnDelete();
13 | $table->string('name');
14 | $table->text('description')->nullable();
15 | $table->decimal('price', 12, 2);
16 | $table->integer('quantity')->default(1);
17 | $table->string('unit')->default('adet');
18 | $table->decimal('discount', 12, 2)->default(0);
19 | $table->decimal('tax_rate', 5, 2)->default(20); // %20 VAT
20 | $table->boolean('tax_included')->default(false);
21 | $table->decimal('total', 12, 2)->default(0);
22 | $table->timestamps();
23 | });
24 | }
25 |
26 | public function down(): void
27 | {
28 | Schema::dropIfExists('proposal_items');
29 | }
30 | };
31 |
--------------------------------------------------------------------------------
/app/DTOs/Project/BoardData.php:
--------------------------------------------------------------------------------
1 | $this->name,
47 | 'project_id' => $this->project_id,
48 | ];
49 | }
50 | }
--------------------------------------------------------------------------------
/database/factories/UserFactory.php:
--------------------------------------------------------------------------------
1 |
11 | */
12 | class UserFactory extends Factory
13 | {
14 | /**
15 | * The current password being used by the factory.
16 | */
17 | protected static ?string $password;
18 |
19 | /**
20 | * Define the model's default state.
21 | *
22 | * @return array
23 | */
24 | public function definition(): array
25 | {
26 | return [
27 | 'name' => fake()->name(),
28 | 'email' => fake()->unique()->safeEmail(),
29 | 'password' => static::$password ??= Hash::make('admin123'),
30 | 'remember_token' => Str::random(10),
31 | ];
32 | }
33 |
34 | /**
35 | * Indicate that the model's email address should be unverified.
36 | */
37 | public function unverified(): static
38 | {
39 | return $this->state(fn (array $attributes) => [
40 | 'email_verified_at' => null,
41 | ]);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /vendor/
2 | node_modules/
3 | npm-debug.log
4 | yarn-error.log
5 |
6 | # Laravel 4 specific
7 | bootstrap/compiled.php
8 | app/storage/
9 |
10 | # Laravel & Lumen specific
11 | public/storage
12 | public/hot
13 |
14 | # Laravel 5 & Lumen specific with changed public path
15 | public_html/storage
16 | public_html/hot
17 |
18 | storage/*.key
19 | .env
20 | Homestead.yaml
21 | Homestead.json
22 | /.vagrant
23 | .phpunit.result.cache
24 |
25 | # IDE and Editor files
26 | .idea/
27 | .vscode/
28 | *.sublime-project
29 | *.sublime-workspace
30 | *.code-workspace
31 | .cursorrules
32 |
33 | # OS generated files
34 | .DS_Store
35 | .DS_Store?
36 | ._*
37 | .Spotlight-V100
38 | .Trashes
39 | ehthumbs.db
40 | Thumbs.db
41 |
42 | # Temporary files
43 | *.log
44 | *.tmp
45 | *.temp
46 | *.swp
47 | *~
48 |
49 | # New additions
50 | .env.backup
51 | docker-compose.override.yml
52 | /.fleet
53 | /.cursor
54 |
55 | # Added by Claude Task Master
56 | # Logs
57 | logs
58 | npm-debug.log*
59 | yarn-debug.log*
60 | yarn-error.log*
61 | dev-debug.log
62 | # Dependency directories
63 | # Environment variables
64 | # Editor directories and files
65 | .idea
66 | .vscode
67 | *.suo
68 | *.ntvs*
69 | *.njsproj
70 | *.sln
71 | *.sw?
72 | # OS specific
73 | #docs
74 | docs/
--------------------------------------------------------------------------------
/app/Enums/TransactionTypeEnum.php:
--------------------------------------------------------------------------------
1 | 'Gelir',
37 | self::EXPENSE => 'Gider',
38 | self::TRANSFER => 'Transfer',
39 | self::INSTALLMENT => 'Taksitli Ödeme',
40 | self::SUBSCRIPTION => 'Abonelik',
41 | self::LOAN_PAYMENT => 'Kredi Ödemesi',
42 | };
43 | }
44 | }
--------------------------------------------------------------------------------
/database/migrations/2024_04_05_create_ai_conversations_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
14 | $table->string('title')->nullable();
15 | $table->boolean('is_active')->default(true);
16 | $table->timestamps();
17 | });
18 |
19 | Schema::create('ai_messages', function (Blueprint $table) {
20 | $table->id();
21 | $table->foreignId('conversation_id')->constrained('ai_conversations')->cascadeOnDelete();
22 | $table->enum('role', ['user', 'assistant']);
23 | $table->text('content');
24 | $table->json('metadata')->nullable();
25 | $table->timestamps();
26 | });
27 | }
28 |
29 | public function down(): void
30 | {
31 | Schema::dropIfExists('ai_messages');
32 | Schema::dropIfExists('ai_conversations');
33 | }
34 | };
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000023_add_content_to_tasks_table.php:
--------------------------------------------------------------------------------
1 | json('content')->nullable(); // TipTap JSON content
13 | $table->json('checklist')->nullable(); // Checklist items
14 |
15 | // If assigned_to column already exists, add it
16 | if (!Schema::hasColumn('tasks', 'assigned_to')) {
17 | $table->foreignId('assigned_to')->nullable()->constrained('users')->nullOnDelete();
18 | }
19 | });
20 | }
21 |
22 | public function down(): void
23 | {
24 | Schema::table('tasks', function (Blueprint $table) {
25 | $table->dropColumn(['content', 'checklist']);
26 |
27 | if (Schema::hasColumn('tasks', 'assigned_to')) {
28 | $table->dropForeign(['assigned_to']);
29 | $table->dropColumn('assigned_to');
30 | }
31 | });
32 | }
33 | };
--------------------------------------------------------------------------------
/app/DTOs/Role/RoleData.php:
--------------------------------------------------------------------------------
1 | $this->name,
48 | 'permissions' => $this->permissions,
49 | ];
50 | }
51 | }
--------------------------------------------------------------------------------
/app/Mail/FinancialNotification.php:
--------------------------------------------------------------------------------
1 |
48 | */
49 | public function attachments(): array
50 | {
51 | return [];
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/database/seeders/DatabaseSeeder.php:
--------------------------------------------------------------------------------
1 | create([
13 | 'name' => 'Admin User',
14 | 'email' => 'admin@admin.com',
15 | 'phone' => '+905555555555',
16 | 'password' => 'admin123',
17 | 'has_commission' => false,
18 | 'commission_rate' => 0,
19 | 'status' => true,
20 | 'remember_token' => Str::random(10),
21 | ]);
22 |
23 | User::factory()->create([
24 | 'name' => 'Test User',
25 | 'email' => 'test@test.com',
26 | 'phone' => '+905555555554',
27 | 'password' => 'testtest',
28 | 'has_commission' => true,
29 | 'commission_rate' => 15,
30 | 'status' => true,
31 | 'remember_token' => Str::random(10),
32 | ]);
33 |
34 | $this->call([
35 | PermissionSeeder::class,
36 | AdminUserSeeder::class,
37 | SettingSeeder::class,
38 | //DemoDataSeeder::class,
39 | ]);
40 | }
41 | }
--------------------------------------------------------------------------------
/app/Models/Supplier.php:
--------------------------------------------------------------------------------
1 |
25 | */
26 | protected $fillable = [
27 | 'name',
28 | 'contact_name',
29 | 'phone',
30 | 'email',
31 | 'address',
32 | 'notes',
33 | 'status',
34 | ];
35 |
36 | /**
37 | * Attribute casts
38 | *
39 | * @var array
40 | */
41 | protected $casts = [
42 | 'status' => 'boolean',
43 | ];
44 |
45 | /**
46 | * Debts related to the supplier.
47 | *
48 | * @return HasMany
49 | */
50 | public function debts(): HasMany
51 | {
52 | return $this->hasMany(Debt::class, 'supplier_id');
53 | }
54 | }
--------------------------------------------------------------------------------
/app/Models/AIMessage.php:
--------------------------------------------------------------------------------
1 |
30 | */
31 | protected $fillable = [
32 | 'conversation_id',
33 | 'role',
34 | 'content',
35 | 'metadata',
36 | ];
37 |
38 | /**
39 | * Attribute casts
40 | *
41 | * @var array
42 | */
43 | protected $casts = [
44 | 'metadata' => 'array',
45 | ];
46 |
47 | /**
48 | * The conversation the message belongs to.
49 | *
50 | * @return BelongsTo
51 | */
52 | public function conversation(): BelongsTo
53 | {
54 | return $this->belongsTo(AIConversation::class);
55 | }
56 | }
--------------------------------------------------------------------------------
/phpunit.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 | tests/Unit
10 |
11 |
12 | tests/Feature
13 |
14 |
15 |
16 |
17 | app
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/database/migrations/2025_03_29_000001_create_loans_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
14 | $table->string('bank_name');
15 | $table->string('loan_type');
16 | $table->decimal('amount', 15, 5);
17 | $table->decimal('monthly_payment', 15, 5);
18 | $table->integer('installments');
19 | $table->integer('remaining_installments');
20 | $table->date('start_date');
21 | $table->date('next_payment_date');
22 | $table->date('due_date')->nullable();
23 | $table->decimal('remaining_amount', 15, 5)->default(0);
24 | $table->string('status')->default('pending');
25 | $table->text('notes')->nullable();
26 | $table->timestamps();
27 | $table->softDeletes();
28 | });
29 | }
30 |
31 | public function down(): void
32 | {
33 | Schema::dropIfExists('loans');
34 | }
35 | };
36 |
--------------------------------------------------------------------------------
/app/Models/SavingsPlan.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | protected $fillable = [
25 | 'user_id',
26 | 'goal_name',
27 | 'target_amount',
28 | 'saved_amount',
29 | 'target_date',
30 | 'status',
31 | ];
32 |
33 | /**
34 | * Attribute casts
35 | *
36 | * @var array
37 | */
38 | protected $casts = [
39 | 'target_date' => 'date',
40 | 'target_amount' => 'decimal:2',
41 | 'saved_amount' => 'decimal:2',
42 | 'status' => 'boolean',
43 | ];
44 |
45 | /**
46 | * The user who owns the savings plan.
47 | *
48 | * @return BelongsTo
49 | */
50 | public function user(): BelongsTo
51 | {
52 | return $this->belongsTo(User::class);
53 | }
54 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "type": "module",
4 | "scripts": {
5 | "build": "vite build",
6 | "dev": "vite",
7 | "list": "node scripts/dev.js list",
8 | "generate": "node scripts/dev.js generate",
9 | "parse-prd": "node scripts/dev.js parse-prd"
10 | },
11 | "devDependencies": {
12 | "@tailwindcss/forms": "^0.5",
13 | "@tailwindcss/typography": "^0.5",
14 | "autoprefixer": "^10.4.21",
15 | "concurrently": "^9.2.1",
16 | "flowbite": "^2.5.2",
17 | "laravel-vite-plugin": "^1.0",
18 | "postcss": "^8.5.1",
19 | "postcss-nesting": "^13.0.2",
20 | "sass": "^1.93",
21 | "sass-loader": "^16.0",
22 | "tailwindcss": "^3.4.17",
23 | "vite": "^6.0.0"
24 | },
25 | "dependencies": {
26 | "@anthropic-ai/sdk": "^0.39.0",
27 | "@tiptap/core": "^3.6.5",
28 | "@tiptap/extension-task-item": "^3.6.5",
29 | "@tiptap/extension-task-list": "^3.6.5",
30 | "@tiptap/pm": "^3.6.5",
31 | "@tiptap/starter-kit": "^3.6.5",
32 | "boxen": "^7.1.1",
33 | "chalk": "^5.3.0",
34 | "chart.js": "^4.5.0",
35 | "cli-table3": "^0.6.3",
36 | "commander": "^14.0.1",
37 | "dotenv": "^17.2.3",
38 | "figlet": "^1.9.3",
39 | "gradient-string": "^3.0.0",
40 | "openai": "^6.2.0",
41 | "ora": "^9.0.0",
42 | "sortablejs": "^1.15.6"
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/app/Enums/CurrencyEnum.php:
--------------------------------------------------------------------------------
1 | 'rgb(230, 25, 75)', // Red
31 | self::USD => 'rgb(60, 180, 75)', // Green
32 | self::EUR => 'rgb(0, 130, 200)', // Blue
33 | self::GBP => 'rgb(245, 130, 48)', // Orange
34 | };
35 | }
36 |
37 | /**
38 | * Returns the symbol for the currency
39 | *
40 | * @return string Currency symbol
41 | */
42 | public function symbol(): string
43 | {
44 | return match($this) {
45 | self::TRY => '₺',
46 | self::USD => '$',
47 | self::EUR => '€',
48 | self::GBP => '£',
49 | };
50 | }
51 | }
--------------------------------------------------------------------------------
/app/Services/CustomerGroup/Contracts/CustomerGroupServiceInterface.php:
--------------------------------------------------------------------------------
1 |
24 | */
25 | protected $fillable = [
26 | 'name',
27 | 'description',
28 | 'status',
29 | 'user_id',
30 | ];
31 |
32 | /**
33 | * Attribute casts
34 | *
35 | * @var array
36 | */
37 | protected $casts = [
38 | 'status' => 'boolean',
39 | ];
40 |
41 | /**
42 | * Customers belonging to the group.
43 | *
44 | * @return HasMany
45 | */
46 | public function customers()
47 | {
48 | return $this->hasMany(Customer::class);
49 | }
50 |
51 | /**
52 | * The user who owns the group.
53 | *
54 | * @return BelongsTo
55 | */
56 | public function user()
57 | {
58 | return $this->belongsTo(User::class);
59 | }
60 | }
--------------------------------------------------------------------------------
/app/Models/Board.php:
--------------------------------------------------------------------------------
1 |
24 | */
25 | protected $fillable = [
26 | 'project_id',
27 | 'name',
28 | ];
29 |
30 | /**
31 | * Attribute casts
32 | *
33 | * @var array
34 | */
35 | protected $casts = [
36 | 'project_id' => 'integer',
37 | ];
38 |
39 | /**
40 | * The project that the board belongs to.
41 | *
42 | * @return BelongsTo
43 | */
44 | public function project(): BelongsTo
45 | {
46 | return $this->belongsTo(Project::class);
47 | }
48 |
49 | /**
50 | * Task lists belonging to the board.
51 | *
52 | * @return HasMany
53 | */
54 | public function taskLists(): HasMany
55 | {
56 | return $this->hasMany(TaskList::class)->orderBy('order');
57 | }
58 | }
--------------------------------------------------------------------------------
/resources/views/errors/403.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Erişim Engellendi
7 | @vite(['resources/css/app.css'])
8 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | 403
20 |
21 |
22 | Erişim Engellendi
23 |
24 |
25 |
26 | Bu sayfayı görüntüleme yetkiniz bulunmamaktadır.
27 |
28 |
Anasayfaya Dön
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/resources/views/livewire/settings/index.blade.php:
--------------------------------------------------------------------------------
1 |
9 |
10 | {{-- Tab Headers --}}
11 |
12 |
21 |
22 |
23 | {{-- Tab Content --}}
24 |
25 | {{-- Load the appropriate Livewire component based on the active tab --}}
26 | @livewire($this->getActiveComponent(), key($activeTab))
27 |
28 |
29 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000008_create_customers_table.php:
--------------------------------------------------------------------------------
1 | id();
13 | $table->string('name');
14 | $table->enum('type', ['individual', 'corporate'])->default('corporate');
15 | $table->string('tax_number')->nullable();
16 | $table->string('tax_office')->nullable();
17 | $table->string('email')->nullable();
18 | $table->string('phone')->nullable();
19 | $table->text('address')->nullable();
20 | $table->string('city')->nullable();
21 | $table->string('district')->nullable();
22 | $table->text('description')->nullable();
23 | $table->boolean('status')->default(true);
24 | $table->foreignId('customer_group_id')->nullable()->constrained('customer_groups')->nullOnDelete();
25 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
26 | $table->timestamps();
27 | $table->softDeletes();
28 | });
29 | }
30 |
31 | public function down(): void
32 | {
33 | Schema::dropIfExists('customers');
34 | }
35 | };
--------------------------------------------------------------------------------
/app/Models/ProposalItem.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | protected $fillable = [
24 | 'proposal_id',
25 | 'name',
26 | 'description',
27 | 'price',
28 | 'quantity',
29 | 'unit',
30 | 'discount',
31 | 'tax_rate',
32 | 'tax_included',
33 | 'total',
34 | ];
35 |
36 | /**
37 | * Attribute casts
38 | *
39 | * @var array
40 | */
41 | protected $casts = [
42 | 'price' => 'float',
43 | 'quantity' => 'integer',
44 | 'discount' => 'float',
45 | 'tax_rate' => 'float',
46 | 'tax_included' => 'boolean',
47 | 'total' => 'float',
48 | ];
49 |
50 | /**
51 | * The proposal the item belongs to.
52 | *
53 | * @return BelongsTo
54 | */
55 | public function proposal(): BelongsTo
56 | {
57 | return $this->belongsTo(Proposal::class);
58 | }
59 | }
--------------------------------------------------------------------------------
/app/Models/InvestmentPlan.php:
--------------------------------------------------------------------------------
1 |
26 | */
27 | protected $fillable = [
28 | 'user_id',
29 | 'investment_name',
30 | 'invested_amount',
31 | 'current_value',
32 | 'investment_type',
33 | 'investment_date',
34 | ];
35 |
36 | /**
37 | * Attribute casts
38 | *
39 | * @var array
40 | */
41 | protected $casts = [
42 | 'invested_amount' => 'decimal:2',
43 | 'current_value' => 'decimal:2',
44 | 'investment_date' => 'date',
45 | ];
46 |
47 | /**
48 | * The user who owns the investment plan.
49 | *
50 | * @return BelongsTo
51 | */
52 | public function user(): BelongsTo
53 | {
54 | return $this->belongsTo(User::class);
55 | }
56 | }
--------------------------------------------------------------------------------
/app/Livewire/Dashboard/Statistics.php:
--------------------------------------------------------------------------------
1 | '$refresh'];
21 |
22 | /** @var StatisticsServiceInterface Statistics service */
23 | private StatisticsServiceInterface $statisticsService;
24 |
25 | /**
26 | * When the component is booted, the statistics service is injected
27 | *
28 | * @param StatisticsServiceInterface $statisticsService Statistics service
29 | * @return void
30 | */
31 | public function boot(StatisticsServiceInterface $statisticsService): void
32 | {
33 | $this->statisticsService = $statisticsService;
34 | }
35 |
36 | /**
37 | * Renders the component view
38 | *
39 | * @return \Illuminate\Contracts\View\View
40 | */
41 | public function render(): View
42 | {
43 | $statistics = $this->statisticsService->getDashboardStatistics();
44 | return view('livewire.dashboard.statistics', [
45 | 'statistics' => $statistics
46 | ]);
47 | }
48 | }
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000024_create_debts_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
13 | $table->foreignId('customer_id')->nullable()->constrained()->nullOnDelete();
14 | $table->foreignId('supplier_id')->nullable()->constrained()->nullOnDelete();
15 | $table->enum('type', ['loan_payment', 'debt_payment']);
16 | $table->decimal('amount', 15, 5);
17 | $table->string('currency', 10)->default('TRY');
18 | $table->decimal('buy_price', 15, 2)->nullable(); // Buy price
19 | $table->decimal('sell_price', 15, 2)->nullable(); // Sell price
20 | $table->decimal('profit_loss', 15, 2)->nullable(); // Profit/Loss
21 | $table->text('description')->nullable();
22 | $table->date('date');
23 | $table->date('due_date')->nullable();
24 | $table->string('status')->default('pending');
25 | $table->timestamps();
26 | $table->softDeletes();
27 | });
28 | }
29 |
30 | public function down(): void
31 | {
32 | Schema::dropIfExists('debts');
33 | }
34 | };
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000018_create_proposal_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->foreignId('customer_id')->constrained()->cascadeOnDelete();
13 | $table->string('number')->unique(); // Example: PRO-2024001
14 | $table->string('title');
15 | $table->text('content')->nullable();
16 | $table->date('valid_until');
17 | $table->enum('status', ['draft', 'sent', 'accepted', 'declined', 'expired'])->default('draft');
18 | $table->text('payment_terms')->nullable();
19 | $table->text('notes')->nullable();
20 | $table->decimal('subtotal', 12, 2)->default(0);
21 | $table->decimal('tax_total', 12, 2)->default(0);
22 | $table->decimal('discount_total', 12, 2)->default(0);
23 | $table->decimal('total', 12, 2)->default(0);
24 | $table->string('currency', 3)->default('TRY');
25 | $table->foreignId('created_by')->constrained('users')->cascadeOnDelete();
26 | $table->timestamps();
27 | });
28 | }
29 |
30 | public function down(): void
31 | {
32 | Schema::dropIfExists('proposals');
33 | }
34 | };
35 |
--------------------------------------------------------------------------------
/database/migrations/2024_03_21_000001_create_customer_credentials_table.php:
--------------------------------------------------------------------------------
1 | id();
30 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
31 | $table->foreignId('customer_id')->constrained()->cascadeOnDelete();
32 | $table->string('name');
33 | $table->text('value');
34 | $table->boolean('status')->default(true);
35 | $table->timestamps();
36 | $table->softDeletes();
37 | });
38 | }
39 |
40 | /**
41 | * Deletes the table
42 | *
43 | * @return void
44 | */
45 | public function down(): void
46 | {
47 | Schema::dropIfExists('customer_credentials');
48 | }
49 | };
--------------------------------------------------------------------------------
/app/Services/Lead/Contracts/LeadServiceInterface.php:
--------------------------------------------------------------------------------
1 | toArray(),
39 | 'type' => 'income',
40 | ]);
41 |
42 | $this->balanceService->updateForIncome($transaction);
43 | return $transaction;
44 | });
45 | }
46 | }
--------------------------------------------------------------------------------
/app/Models/AIConversation.php:
--------------------------------------------------------------------------------
1 |
31 | */
32 | protected $fillable = [
33 | 'user_id',
34 | 'title',
35 | 'is_active',
36 | ];
37 |
38 | /**
39 | * Attribute casts
40 | *
41 | * @var array
42 | */
43 | protected $casts = [
44 | 'is_active' => 'boolean',
45 | ];
46 |
47 | /**
48 | * The user who owns the conversation.
49 | *
50 | * @return BelongsTo
51 | */
52 | public function user(): BelongsTo
53 | {
54 | return $this->belongsTo(User::class);
55 | }
56 |
57 | /**
58 | * The messages in the conversation.
59 | *
60 | * @return HasMany
61 | */
62 | public function messages(): HasMany
63 | {
64 | return $this->hasMany(AIMessage::class, 'conversation_id');
65 | }
66 | }
--------------------------------------------------------------------------------
/config/services.php:
--------------------------------------------------------------------------------
1 | [
18 | 'token' => env('POSTMARK_TOKEN'),
19 | ],
20 |
21 | 'ses' => [
22 | 'key' => env('AWS_ACCESS_KEY_ID'),
23 | 'secret' => env('AWS_SECRET_ACCESS_KEY'),
24 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
25 | ],
26 |
27 | 'resend' => [
28 | 'key' => env('RESEND_KEY'),
29 | ],
30 |
31 | 'slack' => [
32 | 'notifications' => [
33 | 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
34 | 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
35 | ],
36 | ],
37 |
38 | 'tcmb' => [
39 | 'api_key' => env('TCMB_API_KEY'),
40 | 'api_url' => 'https://evds2.tcmb.gov.tr/service/evds/series',
41 | ],
42 |
43 | 'openai' => [
44 | 'api_key' => env('OPENAI_API_KEY'),
45 | ],
46 |
47 | 'telegram' => [
48 | 'bot_token' => env('TELEGRAM_BOT_TOKEN'),
49 | 'default_chat_id' => env('TELEGRAM_DEFAULT_CHAT_ID'),
50 | ],
51 |
52 | ];
53 |
--------------------------------------------------------------------------------
/config/ai.php:
--------------------------------------------------------------------------------
1 | env('AI_SERVICE', 'gemini'), // gemini or openai service
5 |
6 | 'openai' => [
7 | 'model' => env('OPENAI_MODEL', 'gpt-4o-mini-2024-07-18'), // default economic model
8 | 'max_tokens' => (int) env('OPENAI_MAX_TOKENS', 1000),
9 | 'temperature' => (float) env('OPENAI_TEMPERATURE', 0.7),
10 | 'api_key' => env('OPENAI_API_KEY'),
11 | 'organization' => env('OPENAI_ORGANIZATION'),
12 | ],
13 |
14 | 'gemini' => [
15 | 'model' => env('GEMINI_MODEL', 'gemini-2.5-pro-exp-03-25'),
16 | 'api_key' => env('GEMINI_API_KEY'),
17 | 'max_tokens' => (int) env('GEMINI_MAX_TOKENS', 1000),
18 | 'temperature' => (float) env('GEMINI_TEMPERATURE', 0.7),
19 | ],
20 |
21 | // Common system prompt - will be used for both services
22 | 'system_prompt' => "Sen bir finansal asistansın. Kullanıcıların gelir ve gider verilerini analiz ederek sorularını yanıtlarsın.
23 | Önemli kurallar:
24 | 1. Sadece soru sahibinin verilerine erişebilirsin, diğer kullanıcıların verilerini göremezsin.
25 | 2. Transfer işlemleri hesaplamalara dahil edilmez, sadece gerçek gelir ve giderler üzerinden analiz yaparsın.
26 | 3. Tüm para birimlerini Türk Lirası (TL) olarak, binlik ayracı için nokta (.) ve ondalık ayracı için virgül (,) kullanarak formatla.
27 | 4. Kullanıcı başka kullanıcıların verilerini sorduğunda nazikçe 'Üzgünüm, gizlilik politikamız gereği diğer kullanıcıların verilerine erişemiyorum.' şeklinde yanıt ver.
28 | 5. Yanıtlarında her zaman net, anlaşılır ve profesyonel bir dil kullan.",
29 | ];
--------------------------------------------------------------------------------
/resources/views/livewire/transaction/widgets/transaction-stats-widget.blade.php:
--------------------------------------------------------------------------------
1 |
2 | @foreach($this->getStats() as $stat)
3 |
4 | {{-- Top --}}
5 |
6 |
7 |
12 |
13 |
14 |
15 |
16 | {{ $stat['label'] }}
17 |
18 |
19 | {{ $stat['value'] }}
20 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 | @endforeach
33 |
--------------------------------------------------------------------------------
/app/Services/Transaction/Implementations/ExpenseTransactionService.php:
--------------------------------------------------------------------------------
1 | toArray(),
40 | 'type' => 'expense',
41 | ]);
42 |
43 | $this->balanceService->updateForExpense($transaction);
44 | return $transaction;
45 | });
46 | }
47 | }
--------------------------------------------------------------------------------
/app/Services/Transaction/Contracts/TransactionServiceInterface.php:
--------------------------------------------------------------------------------
1 | $this->name,
53 | 'description' => $this->description,
54 | 'status' => $this->status,
55 | 'created_by' => $this->created_by,
56 | ];
57 | }
58 | }
--------------------------------------------------------------------------------
/app/DTOs/CustomerGroup/CustomerGroupData.php:
--------------------------------------------------------------------------------
1 | $this->name,
53 | 'description' => $this->description,
54 | 'status' => $this->status,
55 | 'user_id' => $this->user_id,
56 | ];
57 | }
58 | }
--------------------------------------------------------------------------------
/app/Models/Budget.php:
--------------------------------------------------------------------------------
1 |
24 | */
25 | protected $fillable = [
26 | 'user_id',
27 | 'category_id',
28 | 'name',
29 | 'description',
30 | 'amount',
31 | 'start_date',
32 | 'end_date',
33 | 'period',
34 | 'status'
35 | ];
36 |
37 | /**
38 | * Attribute casts
39 | *
40 | * @var array
41 | */
42 | protected $casts = [
43 | 'start_date' => 'date',
44 | 'end_date' => 'date',
45 | 'amount' => 'decimal:2',
46 | 'status' => 'boolean'
47 | ];
48 |
49 | /**
50 | * The user who owns the budget.
51 | *
52 | * @return BelongsTo
53 | */
54 | public function user(): BelongsTo
55 | {
56 | return $this->belongsTo(User::class);
57 | }
58 |
59 | /**
60 | * The category the budget belongs to.
61 | *
62 | * @return BelongsTo
63 | */
64 | public function category(): BelongsTo
65 | {
66 | return $this->belongsTo(Category::class);
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/app/Services/Payment/Contracts/PaymentServiceInterface.php:
--------------------------------------------------------------------------------
1 | string, 'requires_sql' => bool, 'explanation' => string]
26 | */
27 | public function generateSqlQuery($user, string $message, array $databaseSchema): array;
28 |
29 | /**
30 | * Create a response using SQL results.
31 | *
32 | * @param mixed $user The user object.
33 | * @param string $message The user's message.
34 | * @param string $sqlQuery The executed SQL query.
35 | * @param array $sqlResults The SQL results.
36 | * @param string $conversationId The conversation ID.
37 | * @return string
38 | */
39 | public function queryWithSqlResults($user, string $message, string $sqlQuery, array $sqlResults, string $conversationId = null): string;
40 | }
--------------------------------------------------------------------------------
/app/Services/Customer/Contracts/CustomerServiceInterface.php:
--------------------------------------------------------------------------------
1 | 'Nakit',
33 | self::BANK => 'Banka Hesabı',
34 | self::CREDIT_CARD => 'Kredi Kartı',
35 | self::CRYPTO => 'Kripto Cüzdan',
36 | self::VIRTUAL_POS => 'Sanal POS',
37 | };
38 | }
39 |
40 | /**
41 | * Returns all payment methods with their labels as an array
42 | *
43 | * @return array Payment methods and labels
44 | */
45 | public static function toArray(): array
46 | {
47 | return [
48 | self::CASH->value => self::CASH->label(),
49 | self::BANK->value => self::BANK->label(),
50 | self::CREDIT_CARD->value => self::CREDIT_CARD->label(),
51 | self::CRYPTO->value => self::CRYPTO->label(),
52 | self::VIRTUAL_POS->value => self::VIRTUAL_POS->label(),
53 | ];
54 | }
55 | }
--------------------------------------------------------------------------------
/app/Models/CustomerNote.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | protected $fillable = [
25 | 'customer_id',
26 | 'user_id',
27 | 'assigned_user_id',
28 | 'content',
29 | 'type',
30 | 'activity_date',
31 | ];
32 |
33 | /**
34 | * Attribute casts
35 | *
36 | * @var array
37 | */
38 | protected $casts = [
39 | 'activity_date' => 'datetime',
40 | ];
41 |
42 | /**
43 | * The customer the note belongs to.
44 | *
45 | * @return BelongsTo
46 | */
47 | public function customer(): BelongsTo
48 | {
49 | return $this->belongsTo(Customer::class);
50 | }
51 |
52 | /**
53 | * The user who created the note.
54 | *
55 | * @return BelongsTo
56 | */
57 | public function user(): BelongsTo
58 | {
59 | return $this->belongsTo(User::class);
60 | }
61 |
62 | /**
63 | * The user assigned to the note.
64 | *
65 | * @return BelongsTo
66 | */
67 | public function assignedUser(): BelongsTo
68 | {
69 | return $this->belongsTo(User::class, 'assigned_user_id');
70 | }
71 | }
--------------------------------------------------------------------------------
/app/Models/TaskList.php:
--------------------------------------------------------------------------------
1 |
26 | */
27 | protected $fillable = [
28 | 'board_id',
29 | 'name',
30 | 'order',
31 | ];
32 |
33 | /**
34 | * Attribute casts
35 | *
36 | * @var array
37 | */
38 | protected $casts = [
39 | 'order' => 'integer',
40 | ];
41 |
42 | /**
43 | * Sorting configuration
44 | *
45 | * @var array
46 | */
47 | public $sortable = [
48 | 'order_column_name' => 'order',
49 | 'sort_when_creating' => true,
50 | ];
51 |
52 | /**
53 | * The board that the list belongs to.
54 | *
55 | * @return BelongsTo
56 | */
57 | public function board(): BelongsTo
58 | {
59 | return $this->belongsTo(Board::class);
60 | }
61 |
62 | /**
63 | * Tasks belonging to the list.
64 | *
65 | * @return HasMany
66 | */
67 | public function tasks(): HasMany
68 | {
69 | return $this->hasMany(Task::class)->orderBy('order');
70 | }
71 | }
--------------------------------------------------------------------------------
/app/DTOs/User/UserLoginData.php:
--------------------------------------------------------------------------------
1 | $this->email,
50 | 'password' => $this->password,
51 | 'remember_me' => $this->remember_me,
52 | ];
53 | }
54 |
55 | /**
56 | * Return the data for the user's login credentials
57 | *
58 | * @return array
59 | */
60 | public function credentials(): array
61 | {
62 | return [
63 | 'email' => $this->email,
64 | 'password' => $this->password,
65 | ];
66 | }
67 | }
--------------------------------------------------------------------------------
/tests/Pest.php:
--------------------------------------------------------------------------------
1 | extend(Tests\TestCase::class)
15 | // ->use(Illuminate\Foundation\Testing\RefreshDatabase::class)
16 | ->in('Feature');
17 |
18 | /*
19 | |--------------------------------------------------------------------------
20 | | Expectations
21 | |--------------------------------------------------------------------------
22 | |
23 | | When you're writing tests, you often need to check that values meet certain conditions. The
24 | | "expect()" function gives you access to a set of "expectations" methods that you can use
25 | | to assert different things. Of course, you may extend the Expectation API at any time.
26 | |
27 | */
28 |
29 | expect()->extend('toBeOne', function () {
30 | return $this->toBe(1);
31 | });
32 |
33 | /*
34 | |--------------------------------------------------------------------------
35 | | Functions
36 | |--------------------------------------------------------------------------
37 | |
38 | | While Pest is very powerful out-of-the-box, you may have some testing code specific to your
39 | | project that you don't want to repeat in every file. Here you can also expose helpers as
40 | | global functions to help you to reduce the number of lines of code in your test files.
41 | |
42 | */
43 |
44 | function something()
45 | {
46 | // ..
47 | }
48 |
--------------------------------------------------------------------------------
/database/migrations/2024_01_01_000008_create_leads_table.php:
--------------------------------------------------------------------------------
1 | id();
12 | $table->string('name');
13 | $table->enum('type', ['individual', 'corporate'])->default('corporate');
14 | $table->string('email')->nullable();
15 | $table->string('phone')->nullable();
16 | $table->text('address')->nullable();
17 | $table->string('city')->nullable();
18 | $table->string('district')->nullable();
19 | $table->enum('source', ['website', 'referral', 'social_media', 'other'])->default('other');
20 | $table->enum('status', ['new', 'contacted', 'proposal_sent', 'negotiating', 'converted', 'lost'])->default('new');
21 | $table->timestamp('last_contact_date')->nullable();
22 | $table->timestamp('next_contact_date')->nullable();
23 | $table->text('notes')->nullable();
24 | $table->foreignId('assigned_to')->nullable()->constrained('users')->nullOnDelete();
25 | $table->timestamp('converted_at')->nullable();
26 | $table->foreignId('converted_to_customer_id')->nullable()->constrained('customers')->nullOnDelete();
27 | $table->string('conversion_reason')->nullable();
28 | $table->foreignId('user_id')->constrained()->cascadeOnDelete();
29 | $table->timestamps();
30 | });
31 | }
32 |
33 | public function down(): void
34 | {
35 | Schema::dropIfExists('leads');
36 | }
37 | };
38 |
--------------------------------------------------------------------------------
/resources/views/components/language-notice.blade.php:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | @if($defaultLocale === $locale)
5 |
6 |
7 |
8 | @else
9 |
10 |
11 |
12 | @endif
13 |
14 |
15 |
16 |
17 | @if($defaultLocale === $locale)
18 | Managing Default Language Content
19 | @else
20 | Managing Translation Content
21 | @endif
22 |
23 |
24 | You are currently {{ isset($isEdit) && $isEdit ? 'editing' : 'adding' }} content in
25 |
26 | {{ strtoupper($locale) }}
27 |
28 |
29 |
30 |
31 |
32 | @if($defaultLocale === $locale)
33 |
34 | This is your default language. Content in this language will be used as fallback when translations are not available.
35 |
36 | @endif
37 |
--------------------------------------------------------------------------------
/resources/views/livewire/credit-card/widgets/credit-card-stats-widget.blade.php:
--------------------------------------------------------------------------------
1 |
2 | @foreach($this->getStats() as $stat)
3 |
4 |
5 |
6 |
13 |
14 |
15 |
16 |
17 | {{ $stat['label'] }}
18 |
19 |
20 | {{ $stat['value'] }}
21 |
22 |
23 |
24 |
25 |
26 |
33 |
34 |
35 | @endforeach
36 |
--------------------------------------------------------------------------------
/resources/views/livewire/commission/widgets/commission-stats.blade.php:
--------------------------------------------------------------------------------
1 |
2 | @foreach($this->getStats() as $stat)
3 |
4 |
5 |
6 |
13 |
14 |
15 |
16 |
17 | {{ $stat['label'] }}
18 |
19 |
20 | {{ $stat['value'] }}
21 |
22 |
23 |
24 |
25 |
26 |
33 |
34 |
35 | @endforeach
36 |
--------------------------------------------------------------------------------
/app/Models/Project.php:
--------------------------------------------------------------------------------
1 |
25 | */
26 | protected $fillable = [
27 | 'name',
28 | 'description',
29 | 'status',
30 | 'created_by',
31 | 'view_type',
32 | ];
33 |
34 | /**
35 | * Methods to run when the model is booted.
36 | *
37 | * @return void
38 | */
39 | protected static function booted()
40 | {
41 | static::created(function ($project) {
42 | $project->board()->create(['name' => 'Main Board']);
43 | });
44 | }
45 |
46 | /**
47 | * The user who created the project.
48 | *
49 | * @return BelongsTo
50 | */
51 | public function creator(): BelongsTo
52 | {
53 | return $this->belongsTo(User::class, 'created_by');
54 | }
55 |
56 | /**
57 | * Boards belonging to the project.
58 | *
59 | * @return HasMany
60 | */
61 | public function boards(): HasMany
62 | {
63 | return $this->hasMany(Board::class);
64 | }
65 |
66 | /**
67 | * The project's main board.
68 | *
69 | * @return HasOne
70 | */
71 | public function board(): HasOne
72 | {
73 | return $this->hasOne(Board::class);
74 | }
75 | }
--------------------------------------------------------------------------------
/resources/lang/tr/sidebar.php:
--------------------------------------------------------------------------------
1 | 'Dashboard',
5 | 'financial_transactions' => [
6 | 'title' => 'Finansal İşlemler',
7 | 'all' => 'Gelir & Gider',
8 | 'debts' => 'Borç & Alacak',
9 | 'loans' => 'Krediler'
10 | ],
11 | 'accounts' => [
12 | 'title' => 'Hesaplar',
13 | 'bank' => 'Banka Hesapları',
14 | 'credit_cards' => 'Kredi Kartları',
15 | 'crypto' => 'Kripto Cüzdanları',
16 | 'virtual_pos' => 'Sanal POS'
17 | ],
18 | 'customer_management' => [
19 | 'title' => 'Müşteriler',
20 | 'list' => 'Müşteri Listesi',
21 | 'potential' => 'Potansiyel Müşteriler',
22 | 'groups' => 'Müşteri Grupları'
23 | ],
24 | 'project_management' => [
25 | 'title' => 'Projeler',
26 | 'all' => 'Tüm Projeler',
27 | 'active' => 'Aktif Projeler',
28 | 'completed' => 'Tamamlanan Projeler',
29 | 'boards' => 'Proje Panoları'
30 | ],
31 | 'analysis_tracking' => [
32 | 'title' => 'Analiz & Takip',
33 | 'cash_flow' => 'Nakit Akışı',
34 | 'profit_loss' => 'Kar/Zarar',
35 | 'expense_category' => 'Gider Kategorileri',
36 | 'income_source' => 'Gelir Kaynakları',
37 | 'budget_performance' => 'Bütçe Performansı',
38 | 'customer_profitability' => 'Müşteri Karlılığı',
39 | 'project_profitability' => 'Proje Karlılığı',
40 | 'category' => 'Kategori Analizi'
41 | ],
42 | 'system_settings' => [
43 | 'title' => 'Sistem Ayarları',
44 | 'general' => 'Genel Ayarlar',
45 | 'site' => 'Site Ayarları',
46 | 'payment' => 'Ödeme Ayarları',
47 | 'smtp' => 'SMTP Ayarları',
48 | 'notification' => 'Bildirim Ayarları',
49 | 'roles' => 'Rol & İzinler',
50 | 'users' => 'Kullanıcılar'
51 | ]
52 | ];
53 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | import preset from './vendor/filament/support/tailwind.config.preset'
2 | const colors = require('tailwindcss/colors')
3 |
4 | /** @type {import('tailwindcss').Config} */
5 | module.exports = {
6 | presets: [preset],
7 | content: [
8 | './app/Filament/**/*.php',
9 | './resources/views/**/*.blade.php',
10 | './vendor/filament/**/*.blade.php',
11 | './resources/**/*.js',
12 | './resources/**/*.vue',
13 | ],
14 | theme: {
15 | extend: {
16 | colors: {
17 | primary: {
18 | '50': '#ebf5ff',
19 | '100': '#e1effe',
20 | '200': '#c3ddfd',
21 | '300': '#a4cafe',
22 | '400': '#76a9fa',
23 | '500': '#3f83f8',
24 | '600': '#1c64f2',
25 | '700': '#1a56db',
26 | '800': '#1e429f',
27 | '900': '#233876',
28 | },
29 | secondary: {
30 | '50': '#f9fafb',
31 | '100': '#f4f5f7',
32 | '200': '#e5e7eb',
33 | '300': '#d2d6dc',
34 | '400': '#9fa6b2',
35 | '500': '#6b7280',
36 | '600': '#4b5563',
37 | '700': '#374151',
38 | '800': '#252f3f',
39 | '900': '#161e2e',
40 | },
41 | },
42 | filament: {
43 | toggle: {
44 | width: '2.5rem',
45 | height: '1.25rem',
46 | dotSize: '0.875rem',
47 | },
48 | },
49 | },
50 | },
51 | plugins: [
52 | require('flowbite/plugin'),
53 | require('@tailwindcss/forms'),
54 | ],
55 | }
56 |
--------------------------------------------------------------------------------
/app/Console/Kernel.php:
--------------------------------------------------------------------------------
1 | command('inspire')->hourly();
18 |
19 | // Every 30 minutes update the demo data
20 | if (config('app.app_demo_mode')) {
21 | $schedule->command('demo:refresh')
22 | ->everyThirtyMinutes()
23 | ->withoutOverlapping()
24 | ->runInBackground();
25 | }
26 |
27 | $schedule->call(function () {
28 | Debt::where('due_date', '<', now()->startOfDay())
29 | ->where('status', 'pending')
30 | ->each(function (Debt $debt) {
31 | $debt->update(['status' => 'overdue']);
32 | });
33 | })->daily();
34 |
35 | // Send Telegram notifications for upcoming payments
36 | $schedule->command('notifications:upcoming-payments')
37 | ->dailyAt('08:00')
38 | ->when(function () {
39 | $enabled = \App\Models\Setting::where('group', 'telegram')
40 | ->where('key', 'telegram_enabled')
41 | ->first();
42 | return $enabled && filter_var($enabled->value, FILTER_VALIDATE_BOOLEAN);
43 | });
44 | }
45 |
46 | /**
47 | * Register the commands for the application.
48 | */
49 | protected function commands(): void
50 | {
51 | $this->load(__DIR__.'/Commands');
52 |
53 | require base_path('routes/console.php');
54 | }
55 | }
--------------------------------------------------------------------------------
/resources/lang/en/sidebar.php:
--------------------------------------------------------------------------------
1 | 'Dashboard',
5 | 'financial_transactions' => [
6 | 'title' => 'Financial Transactions',
7 | 'all' => 'Income & Expense',
8 | 'debts' => 'Debts & Receivables',
9 | 'loans' => 'Loans'
10 | ],
11 | 'accounts' => [
12 | 'title' => 'Accounts',
13 | 'bank' => 'Bank Accounts',
14 | 'credit_cards' => 'Credit Cards',
15 | 'crypto' => 'Crypto Wallets',
16 | 'virtual_pos' => 'Virtual POS'
17 | ],
18 | 'customer_management' => [
19 | 'title' => 'Customers',
20 | 'list' => 'Customer List',
21 | 'potential' => 'Potential Customers',
22 | 'groups' => 'Customer Groups'
23 | ],
24 | 'project_management' => [
25 | 'title' => 'Projects',
26 | 'all' => 'All Projects',
27 | 'active' => 'Active Projects',
28 | 'completed' => 'Completed Projects',
29 | 'boards' => 'Project Boards'
30 | ],
31 | 'analysis_tracking' => [
32 | 'title' => 'Analysis & Tracking',
33 | 'cash_flow' => 'Cash Flow',
34 | 'profit_loss' => 'Profit/Loss',
35 | 'expense_category' => 'Expense Categories',
36 | 'income_source' => 'Income Sources',
37 | 'budget_performance' => 'Budget Performance',
38 | 'customer_profitability' => 'Customer Profitability',
39 | 'project_profitability' => 'Project Profitability',
40 | 'category' => 'Category Analysis'
41 | ],
42 | 'system_settings' => [
43 | 'title' => 'System Settings',
44 | 'general' => 'General Settings',
45 | 'site' => 'Site Settings',
46 | 'payment' => 'Payment Settings',
47 | 'smtp' => 'SMTP Settings',
48 | 'notification' => 'Notification Settings',
49 | 'roles' => 'Roles & Permissions',
50 | 'users' => 'Users'
51 | ]
52 | ];
53 |
54 |
--------------------------------------------------------------------------------
/database/migrations/0001_01_01_000000_create_users_table.php:
--------------------------------------------------------------------------------
1 | id();
16 | $table->string('name');
17 | $table->string('email')->unique();
18 | $table->string('phone')->nullable();
19 | $table->string('password');
20 | $table->boolean('status')->default(true);
21 | $table->boolean('has_commission')->default(false);
22 | $table->decimal('commission_rate', 5, 2)->default(0);
23 | $table->rememberToken();
24 | $table->timestamps();
25 | $table->softDeletes();
26 | });
27 |
28 | Schema::create('password_reset_tokens', function (Blueprint $table) {
29 | $table->string('email')->primary();
30 | $table->string('token');
31 | $table->timestamp('created_at')->nullable();
32 | });
33 |
34 | Schema::create('sessions', function (Blueprint $table) {
35 | $table->string('id')->primary();
36 | $table->foreignId('user_id')->nullable()->index();
37 | $table->string('ip_address', 45)->nullable();
38 | $table->text('user_agent')->nullable();
39 | $table->longText('payload');
40 | $table->integer('last_activity')->index();
41 | });
42 | }
43 |
44 | /**
45 | * Reverse the migrations.
46 | */
47 | public function down(): void
48 | {
49 | Schema::dropIfExists('users');
50 | Schema::dropIfExists('password_reset_tokens');
51 | Schema::dropIfExists('sessions');
52 | }
53 | };
54 |
--------------------------------------------------------------------------------
/resources/views/livewire/account/widgets/credit-card-stats-widget.blade.php:
--------------------------------------------------------------------------------
1 |
2 | @foreach($this->getStats() as $stat)
3 |
4 |
5 |
6 |
14 |
15 |
16 |
17 |
18 | {{ $stat['label'] }}
19 |
20 |
21 | {{ $stat['value'] }}
22 |
23 |
24 |
25 |
26 |
27 |
35 |
36 |
37 | @endforeach
38 |
--------------------------------------------------------------------------------
/app/Livewire/Auth/Login.php:
--------------------------------------------------------------------------------
1 | 'required|email',
20 | 'password' => 'required|min:8',
21 | ];
22 |
23 | protected $messages = [
24 | 'email.required' => 'Email alanı zorunludur.',
25 | 'email.email' => 'Geçerli bir email adresi giriniz.',
26 | 'password.required' => 'Şifre alanı zorunludur.',
27 | 'password.min' => 'Şifre en az 8 karakter olmalıdır.',
28 | ];
29 |
30 | public function mount(): void
31 | {
32 | if (Auth::check()) {
33 | $this->redirect(route('admin.dashboard'));
34 | }
35 | }
36 |
37 | public function submit()
38 | {
39 | $credentials = $this->validate();
40 |
41 | if (Auth::attempt($credentials)) {
42 | session()->regenerate();
43 |
44 | $this->dispatch('loginSuccess');
45 |
46 | Notification::make()
47 | ->title(__('Giriş Başarılı'))
48 | ->success()
49 | ->send();
50 |
51 | return redirect()->intended(route('admin.dashboard'));
52 | }
53 |
54 | Notification::make()
55 | ->title(__('Giriş Başarısız'))
56 | ->danger()
57 | ->send();
58 |
59 | $this->resetPasswordField();
60 | }
61 |
62 | public function resetPasswordField(): void
63 | {
64 | $this->password = '';
65 | }
66 |
67 | public function render(): View
68 | {
69 | return view('livewire.auth.login');
70 | }
71 | }
--------------------------------------------------------------------------------
/app/Services/Supplier/Implementations/SupplierService.php:
--------------------------------------------------------------------------------
1 | toArray());
31 | });
32 | }
33 |
34 | /**
35 | * Update an existing supplier.
36 | *
37 | * @param Supplier $supplier Supplier to update
38 | * @param SupplierData $data Data to update
39 | * @return Supplier Updated supplier
40 | */
41 | public function update(Supplier $supplier, SupplierData $data): Supplier
42 | {
43 | return DB::transaction(function () use ($supplier, $data) {
44 | $supplier->update($data->toArray());
45 | return $supplier->fresh();
46 | });
47 | }
48 |
49 | /**
50 | * Delete a supplier.
51 | *
52 | * @param Supplier $supplier Supplier to delete
53 | */
54 | public function delete(Supplier $supplier): void
55 | {
56 | DB::transaction(function () use ($supplier) {
57 | $supplier->delete();
58 | });
59 | Notification::make()
60 | ->title('Tedarikçi silindi')
61 | ->success()
62 | ->send();
63 | }
64 | }
--------------------------------------------------------------------------------
/database/seeders/CategorySeeder.php:
--------------------------------------------------------------------------------
1 | 'Maaş', 'color' => '#22c55e'],
18 | ['name' => 'Freelance', 'color' => '#3b82f6'],
19 | ['name' => 'Yatırım Gelirleri', 'color' => '#f59e0b'],
20 | ['name' => 'Kira Geliri', 'color' => '#8b5cf6'],
21 | ['name' => 'Diğer Gelirler', 'color' => '#64748b'],
22 | ];
23 |
24 | foreach ($incomeCategories as $category) {
25 | Category::create([
26 | 'user_id' => $user->id,
27 | 'type' => 'income',
28 | 'name' => $category['name'],
29 | 'color' => $category['color'],
30 | 'status' => true,
31 | ]);
32 | }
33 |
34 | // Expense Categories
35 | $expenseCategories = [
36 | ['name' => 'Kira', 'color' => '#ef4444'],
37 | ['name' => 'Market', 'color' => '#f97316'],
38 | ['name' => 'Faturalar', 'color' => '#06b6d4'],
39 | ['name' => 'Ulaşım', 'color' => '#6366f1'],
40 | ['name' => 'Sağlık', 'color' => '#ec4899'],
41 | ['name' => 'Eğitim', 'color' => '#14b8a6'],
42 | ['name' => 'Eğlence', 'color' => '#f43f5e'],
43 | ['name' => 'Diğer Giderler', 'color' => '#64748b'],
44 | ];
45 |
46 | foreach ($expenseCategories as $category) {
47 | Category::create([
48 | 'user_id' => $user->id,
49 | 'type' => 'expense',
50 | 'name' => $category['name'],
51 | 'color' => $category['color'],
52 | 'status' => true,
53 | ]);
54 | }
55 | }
56 | }
--------------------------------------------------------------------------------
/app/Services/Role/Implementations/RoleService.php:
--------------------------------------------------------------------------------
1 | $data->name]);
31 | $role->syncPermissions($data->permissions ?? []);
32 | return $role;
33 | });
34 | }
35 |
36 | /**
37 | * Update an existing role.
38 | *
39 | * @param Role $role Role to update
40 | * @param RoleData $data New role data
41 | * @return Role Updated role
42 | */
43 | public function update(Role $role, RoleData $data): Role
44 | {
45 | return DB::transaction(function () use ($role, $data) {
46 | $role->update(['name' => $data->name]);
47 | $role->syncPermissions($data->permissions ?? []);
48 | return $role->fresh();
49 | });
50 | }
51 |
52 | /**
53 | * Delete a role.
54 | *
55 | * @param Role $role Role to delete
56 | */
57 | public function delete(Role $role): void
58 | {
59 | DB::transaction(function () use ($role) {
60 | $role->delete();
61 | });
62 | Notification::make()
63 | ->title('Rol silindi')
64 | ->success()
65 | ->send();
66 | }
67 | }
--------------------------------------------------------------------------------
/app/Services/Transaction/Contracts/AccountBalanceServiceInterface.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | protected $fillable = [
25 | 'customer_id',
26 | 'number',
27 | 'title',
28 | 'content',
29 | 'valid_until',
30 | 'status',
31 | 'payment_terms',
32 | 'notes',
33 | 'subtotal',
34 | 'tax_total',
35 | 'discount_total',
36 | 'total',
37 | 'currency',
38 | 'created_by',
39 | ];
40 |
41 | /**
42 | * Attribute casts
43 | *
44 | * @var array
45 | */
46 | protected $casts = [
47 | 'valid_until' => 'date',
48 | 'subtotal' => 'float',
49 | 'tax_total' => 'float',
50 | 'discount_total' => 'float',
51 | 'total' => 'float',
52 | ];
53 |
54 | /**
55 | * The customer that the proposal belongs to
56 | *
57 | * @return BelongsTo
58 | */
59 | public function customer(): BelongsTo
60 | {
61 | return $this->belongsTo(Customer::class);
62 | }
63 |
64 | /**
65 | * The user who created the proposal
66 | *
67 | * @return BelongsTo
68 | */
69 | public function creator(): BelongsTo
70 | {
71 | return $this->belongsTo(User::class, 'created_by');
72 | }
73 |
74 | /**
75 | * Proposal items belonging to the proposal
76 | *
77 | * @return HasMany
78 | */
79 | public function items(): HasMany
80 | {
81 | return $this->hasMany(ProposalItem::class);
82 | }
83 | }
--------------------------------------------------------------------------------
/app/Services/Debt/Contracts/DebtServiceInterface.php:
--------------------------------------------------------------------------------
1 | truncate();
19 | DB::table('model_has_roles')->truncate();
20 | DB::table('model_has_permissions')->truncate();
21 | DB::table('roles')->truncate();
22 | Schema::enableForeignKeyConstraints();
23 |
24 | // Create Super Admin role
25 | $superAdminRole = Role::create([
26 | 'name' => 'admin',
27 | 'guard_name' => 'web'
28 | ]);
29 | $superAdminRole->syncPermissions(Permission::all());
30 |
31 | // Create Employee role
32 | $employeeRole = Role::create([
33 | 'name' => 'employee',
34 | 'guard_name' => 'web'
35 | ]);
36 | $employeeRole->syncPermissions([
37 | 'customers.view',
38 | 'customers.create',
39 | 'customers.edit',
40 | 'customers.detail',
41 | 'leads.view',
42 | 'leads.create',
43 | 'leads.edit',
44 | 'leads.convert_customer',
45 | 'projects.view',
46 | 'projects.create',
47 | 'projects.edit',
48 | 'projects.details',
49 | ]);
50 |
51 | // Assign Super Admin role to Admin user
52 | $admin = User::where('email', 'admin@admin.com')->first();
53 | $employee = User::where('email', 'test@test.com')->first();
54 | if ($admin) {
55 | $admin->assignRole($superAdminRole);
56 | }
57 | if ($employee) {
58 | $employee->assignRole($employeeRole);
59 | }
60 | }
61 | }
--------------------------------------------------------------------------------
/database/migrations/0001_01_01_000002_create_jobs_table.php:
--------------------------------------------------------------------------------
1 | id();
16 | $table->string('queue')->index();
17 | $table->longText('payload');
18 | $table->unsignedTinyInteger('attempts');
19 | $table->unsignedInteger('reserved_at')->nullable();
20 | $table->unsignedInteger('available_at');
21 | $table->unsignedInteger('created_at');
22 | });
23 |
24 | Schema::create('job_batches', function (Blueprint $table) {
25 | $table->string('id')->primary();
26 | $table->string('name');
27 | $table->integer('total_jobs');
28 | $table->integer('pending_jobs');
29 | $table->integer('failed_jobs');
30 | $table->longText('failed_job_ids');
31 | $table->mediumText('options')->nullable();
32 | $table->integer('cancelled_at')->nullable();
33 | $table->integer('created_at');
34 | $table->integer('finished_at')->nullable();
35 | });
36 |
37 | Schema::create('failed_jobs', function (Blueprint $table) {
38 | $table->id();
39 | $table->string('uuid')->unique();
40 | $table->text('connection');
41 | $table->text('queue');
42 | $table->longText('payload');
43 | $table->longText('exception');
44 | $table->timestamp('failed_at')->useCurrent();
45 | });
46 | }
47 |
48 | /**
49 | * Reverse the migrations.
50 | */
51 | public function down(): void
52 | {
53 | Schema::dropIfExists('jobs');
54 | Schema::dropIfExists('job_batches');
55 | Schema::dropIfExists('failed_jobs');
56 | }
57 | };
58 |
--------------------------------------------------------------------------------
/app/Services/Notification/TelegramNotificationService.php:
--------------------------------------------------------------------------------
1 | where('key', 'telegram_enabled')
26 | ->first();
27 |
28 | if (!$enabled || !filter_var($enabled->value, FILTER_VALIDATE_BOOLEAN)) {
29 | return false;
30 | }
31 |
32 | // Get token and chat ID
33 | $token = Setting::where('group', 'telegram')
34 | ->where('key', 'telegram_bot_token')
35 | ->first();
36 |
37 | $chatId = Setting::where('group', 'telegram')
38 | ->where('key', 'telegram_chat_id')
39 | ->first();
40 |
41 | if (!$token || !$token->value || !$chatId || !$chatId->value) {
42 | return false;
43 | }
44 |
45 | // Telegram API instance
46 | if (!$this->telegram) {
47 | $this->telegram = new Api($token->value);
48 | }
49 |
50 | // Send message
51 | $this->telegram->sendMessage([
52 | 'chat_id' => $chatId->value,
53 | 'text' => $message,
54 | 'parse_mode' => 'HTML',
55 | ]);
56 |
57 | return true;
58 | } catch (TelegramSDKException $e) {
59 | Log::error('Telegram hatası: ' . $e->getMessage());
60 | return false;
61 | }
62 | }
63 | }
--------------------------------------------------------------------------------
/app/Services/Planning/Contracts/PlanningServiceInterface.php:
--------------------------------------------------------------------------------
1 | $this->customer_id,
59 | 'type' => $this->type,
60 | 'content' => $this->content,
61 | 'activity_date' => $this->activity_date,
62 | 'user_id' => $this->user_id,
63 | 'assigned_user_id' => $this->assigned_user_id,
64 | ];
65 | }
66 | }
--------------------------------------------------------------------------------