├── public ├── favicon.ico ├── robots.txt ├── build │ ├── images │ │ └── logo.png │ └── manifest.json ├── fonts │ └── filament │ │ └── filament │ │ └── inter │ │ ├── inter-greek-wght-normal-AXVTPQD5.woff2 │ │ ├── inter-greek-wght-normal-IRE366VL.woff2 │ │ ├── inter-greek-wght-normal-N43DBLU2.woff2 │ │ ├── inter-latin-wght-normal-NRMW37G5.woff2 │ │ ├── inter-latin-wght-normal-O25CN4JL.woff2 │ │ ├── inter-latin-wght-normal-OPIJAQLS.woff2 │ │ ├── inter-cyrillic-wght-normal-EWLSKVKN.woff2 │ │ ├── inter-cyrillic-wght-normal-JEOLYBOO.woff2 │ │ ├── inter-cyrillic-wght-normal-R5CMSONN.woff2 │ │ ├── inter-greek-ext-wght-normal-7GGTF7EK.woff2 │ │ ├── inter-greek-ext-wght-normal-EOVOK2B5.woff2 │ │ ├── inter-greek-ext-wght-normal-ZEVLMORV.woff2 │ │ ├── inter-latin-ext-wght-normal-5SRY4DMZ.woff2 │ │ ├── inter-latin-ext-wght-normal-GZCIV3NH.woff2 │ │ ├── inter-latin-ext-wght-normal-HA22NDSG.woff2 │ │ ├── inter-vietnamese-wght-normal-CE5GGD3W.woff2 │ │ ├── inter-vietnamese-wght-normal-TWG5UU7E.woff2 │ │ ├── inter-cyrillic-ext-wght-normal-ASVAGXXE.woff2 │ │ ├── inter-cyrillic-ext-wght-normal-IYF56FF6.woff2 │ │ └── inter-cyrillic-ext-wght-normal-XKHXBTUO.woff2 ├── js │ └── filament │ │ ├── forms │ │ └── components │ │ │ ├── textarea.js │ │ │ ├── tags-input.js │ │ │ └── key-value.js │ │ ├── schemas │ │ └── components │ │ │ ├── tabs.js │ │ │ └── actions.js │ │ ├── tables │ │ └── components │ │ │ └── columns │ │ │ ├── checkbox.js │ │ │ ├── toggle.js │ │ │ └── text-input.js │ │ └── actions │ │ └── actions.js └── .htaccess ├── app ├── Models │ ├── Tenant.php │ ├── SiteConfig.php │ ├── domains.php │ ├── Payment.php │ ├── AccountTemplate.php │ ├── ReminderSetting.php │ ├── Company.php │ ├── Vendor.php │ ├── AssetAcquisition.php │ ├── PaymentTerm.php │ ├── SiteSettings.php │ ├── Employee.php │ ├── Activation.php │ ├── BankStatement.php │ ├── Menu.php │ ├── DepreciationCalculation.php │ ├── BankConnection.php │ ├── TeamInvitation.php │ ├── BankFeedTransaction.php │ ├── Currency.php │ ├── Supplier.php │ ├── PurchaseOrderItem.php │ ├── AuditLog.php │ ├── ExchangeRate.php │ ├── Category.php │ └── InventoryTransaction.php ├── Filament │ ├── App │ │ ├── Pages │ │ │ └── .gitignore │ │ ├── Resources │ │ │ ├── .gitignore │ │ │ ├── TaxForms │ │ │ │ └── Pages │ │ │ │ │ ├── CreateTaxForm.php │ │ │ │ │ ├── EditTaxForm.php │ │ │ │ │ └── ListTaxForms.php │ │ │ ├── TaxRates │ │ │ │ └── Pages │ │ │ │ │ ├── CreateTaxRate.php │ │ │ │ │ ├── EditTaxRate.php │ │ │ │ │ └── ListTaxRates.php │ │ │ ├── Assets │ │ │ │ └── Pages │ │ │ │ │ ├── CreateAsset.php │ │ │ │ │ ├── ListAssets.php │ │ │ │ │ ├── EditAsset.php │ │ │ │ │ └── DepreciationSchedulePage.php │ │ │ ├── TimeEntries │ │ │ │ └── Pages │ │ │ │ │ ├── CreateTimeEntry.php │ │ │ │ │ ├── EditTimeEntry.php │ │ │ │ │ └── ListTimeEntries.php │ │ │ ├── Tenants │ │ │ │ └── Pages │ │ │ │ │ ├── CreateTenant.php │ │ │ │ │ ├── EditTenant.php │ │ │ │ │ └── ListTenants.php │ │ │ ├── Accounts │ │ │ │ └── Pages │ │ │ │ │ ├── CreateAccount.php │ │ │ │ │ ├── EditAccount.php │ │ │ │ │ └── ListAccounts.php │ │ │ ├── Companies │ │ │ │ └── Pages │ │ │ │ │ ├── CreateCompany.php │ │ │ │ │ ├── EditCompany.php │ │ │ │ │ └── ListCompanies.php │ │ │ ├── Invoices │ │ │ │ └── Pages │ │ │ │ │ ├── CreateInvoice.php │ │ │ │ │ ├── EditInvoice.php │ │ │ │ │ └── ListInvoices.php │ │ │ ├── Payments │ │ │ │ └── Pages │ │ │ │ │ ├── CreatePayment.php │ │ │ │ │ ├── EditPayment.php │ │ │ │ │ └── ListPayments.php │ │ │ ├── Customers │ │ │ │ └── Pages │ │ │ │ │ ├── CreateCustomer.php │ │ │ │ │ ├── EditCustomer.php │ │ │ │ │ └── ListCustomers.php │ │ │ ├── Categories │ │ │ │ └── Pages │ │ │ │ │ ├── CreateCategory.php │ │ │ │ │ ├── EditCategory.php │ │ │ │ │ └── ListCategories.php │ │ │ ├── Suppliers │ │ │ │ └── Pages │ │ │ │ │ ├── CreateSupplier.php │ │ │ │ │ ├── EditSupplier.php │ │ │ │ │ └── ListSuppliers.php │ │ │ ├── Activations │ │ │ │ └── Pages │ │ │ │ │ ├── CreateActivation.php │ │ │ │ │ ├── EditActivation.php │ │ │ │ │ └── ListActivations.php │ │ │ ├── BankStatements │ │ │ │ └── Pages │ │ │ │ │ ├── CreateBankStatement.php │ │ │ │ │ ├── EditBankStatement.php │ │ │ │ │ └── ListBankStatements.php │ │ │ ├── PurchaseOrders │ │ │ │ └── Pages │ │ │ │ │ ├── CreatePurchaseOrder.php │ │ │ │ │ ├── EditPurchaseOrder.php │ │ │ │ │ └── ListPurchaseOrders.php │ │ │ ├── ChartOfAccounts │ │ │ │ └── Pages │ │ │ │ │ ├── CreateChartOfAccounts.php │ │ │ │ │ ├── EditChartOfAccounts.php │ │ │ │ │ └── ListChartOfAccounts.php │ │ │ ├── PaymentTerms │ │ │ │ └── Pages │ │ │ │ │ ├── CreatePaymentTerm.php │ │ │ │ │ ├── EditPaymentTerm.php │ │ │ │ │ └── ListPaymentTerms.php │ │ │ ├── ReminderSettings │ │ │ │ └── Pages │ │ │ │ │ ├── CreateReminderSetting.php │ │ │ │ │ ├── EditReminderSetting.php │ │ │ │ │ └── ListReminderSettings.php │ │ │ ├── Transactions │ │ │ │ └── Pages │ │ │ │ │ ├── CreateTransaction.php │ │ │ │ │ ├── EditTransaction.php │ │ │ │ │ └── ListTransactions.php │ │ │ ├── GeneralLedgerReports │ │ │ │ └── Pages │ │ │ │ │ ├── EditGeneralLedgerReport.php │ │ │ │ │ ├── ViewGeneralLedgerReport.php │ │ │ │ │ ├── CreateGeneralLedgerReport.php │ │ │ │ │ └── ListGeneralLedgerReports.php │ │ │ └── AssetAcquisitions │ │ │ │ └── Pages │ │ │ │ ├── CreateAssetAcquisition.php │ │ │ │ ├── EditAssetAcquisition.php │ │ │ │ └── ListAssetAcquisitions.php │ │ └── Widgets │ │ │ └── .gitignore │ ├── Resources │ │ ├── Roles │ │ │ └── Pages │ │ │ │ ├── CreateRole.php │ │ │ │ ├── EditRole.php │ │ │ │ └── ListRoles.php │ │ ├── Budgets │ │ │ └── Pages │ │ │ │ ├── CreateBudget.php │ │ │ │ ├── EditBudget.php │ │ │ │ └── ListBudgets.php │ │ ├── Vendors │ │ │ └── Pages │ │ │ │ ├── CreateVendor.php │ │ │ │ ├── EditVendor.php │ │ │ │ └── ListVendors.php │ │ ├── AuditLogs │ │ │ └── Pages │ │ │ │ ├── ViewAuditLog.php │ │ │ │ ├── ListAuditLogs.php │ │ │ │ └── CreateAuditLog.php │ │ ├── Expenses │ │ │ └── Pages │ │ │ │ ├── CreateExpense.php │ │ │ │ ├── EditExpense.php │ │ │ │ └── ListExpenses.php │ │ └── Payrolls │ │ │ └── Pages │ │ │ ├── CreatePayroll.php │ │ │ ├── EditPayroll.php │ │ │ └── ListPayrolls.php │ └── Admin │ │ └── Resources │ │ ├── MenuResource │ │ └── Pages │ │ │ ├── EditMenu.php │ │ │ ├── CreateMenu.php │ │ │ └── ListMenus.php │ │ ├── SiteSettingsResource │ │ └── Pages │ │ │ ├── CreateSiteSettings.php │ │ │ ├── EditSiteSettings.php │ │ │ └── ListSiteSettings.php │ │ └── ModuleResource │ │ └── Pages │ │ └── ListModules.php ├── Traits │ └── IsTenantModel.php ├── Http │ ├── Controllers │ │ ├── Controller.php │ │ └── ForgotPasswordController.php │ ├── Middleware │ │ ├── EncryptCookies.php │ │ ├── VerifyCsrfToken.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── Authenticate.php │ │ ├── ValidateSignature.php │ │ ├── TrustProxies.php │ │ ├── AssignDefaultTeam.php │ │ └── ScreeningDataEncryptor.php │ ├── Livewire │ │ └── CreateTeam.php │ └── Resources │ │ └── TransactionResource.php ├── Actions │ ├── Jetstream │ │ ├── DeleteTeam.php │ │ ├── DeleteUser.php │ │ └── UpdateTeamName.php │ ├── Fortify │ │ └── PasswordValidationRules.php │ └── Socialstream │ │ ├── HandleInvalidState.php │ │ ├── GenerateRedirectForProvider.php │ │ ├── ResolveSocialiteUser.php │ │ └── SetUserPassword.php ├── Listeners │ ├── SwitchTeam.php │ ├── CreatePersonalTeam.php │ └── EmailTracker.php ├── Providers │ ├── BroadcastServiceProvider.php │ ├── AuthServiceProvider.php │ └── AppServiceProvider.php ├── Services │ └── SiteSettingsService.php ├── Settings │ └── GeneralSettings.php ├── Console │ ├── Commands │ │ ├── CalculateLateFees.php │ │ └── ProcessRecurringTransactions.php │ └── Kernel.php └── Exceptions │ └── Handler.php ├── database ├── .gitignore ├── seeders │ ├── PermissionsSeeder.php │ ├── TeamSeeder.php │ ├── DatabaseSeeder.php │ └── UserSeeder.php ├── factories │ ├── MenuFactory.php │ ├── AccountFactory.php │ └── ConnectedAccountFactory.php └── migrations │ ├── 2024_01_20_000001_create_bank_connections_table.php │ ├── 2024_02_13_113146_create_categories_table.php │ ├── 2024_02_20_000000_add_category_support_to_expenses.php │ ├── 2024_02_24_000001_add_reminder_columns_to_invoices.php │ ├── 2024_01_20_000002_create_bank_feed_transactions_table.php │ ├── 0001_01_01_000001_make_password_nullable_on_users_table.php │ ├── 2024_02_24_000000_create_employees_table.php │ ├── 2024_02_22_114005_create_tenants_table.php │ ├── 2020_05_21_100000_create_teams_table.php │ ├── 2024_02_14_000003_create_inventory_cost_layers_table.php │ ├── 2024_02_24_000001_add_credit_fields_to_customers.php │ ├── 2024_01_15_000000_add_supplier_id_to_expenses_table.php │ ├── 2024_01_20_000001_add_forecast_fields_to_budgets_table.php │ ├── 2024_01_20_000000_create_budgets_table.php │ ├── 2024_02_24_000000_create_account_templates_table.php │ ├── 2024_01_07_112857_create_payment_terms_table.php │ ├── 2024_02_23_113224_create_payments_table.php │ ├── 2024_02_24_000000_create_reminder_settings_table.php │ ├── 2020_05_21_200000_create_team_user_table.php │ ├── 2024_07_24_080000_create_menus_table.php │ ├── 2024_01_01_000000_create_expenses_table.php │ ├── 2024_01_01_000002_create_assets_table.php │ ├── 2024_01_20_000000_create_transactions_table.php │ ├── 2024_02_23_112720_create_domains_table.php │ ├── 2024_01_08_113200_create_invoices_table.php │ ├── 2024_02_23_113340_create_asset_acquisitions_table.php │ ├── 2024_02_24_000000_add_late_fee_columns_to_invoices.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ ├── 2024_02_21_create_vendors_table.php │ ├── 2024_01_10_000000_create_audit_logs_table.php │ ├── 2024_01_10_000000_add_approval_fields_to_expenses_table.php │ ├── 2024_02_14_000002_create_depreciation_calculations_table.php │ ├── 2020_05_21_300000_create_team_invitations_table.php │ ├── 2023_05_15_000000_create_site_settings_table.php │ ├── 2024_02_24_000000_create_time_entries_table.php │ ├── 2024_01_03_112935_create_customers_table.php │ ├── 2024_02_14_000001_add_depreciation_fields_to_assets_table.php │ ├── 2024_02_14_000002_create_inventory_transactions_table.php │ ├── 2024_02_20_000000_add_reconciliation_fields_to_transactions.php │ └── 2024_02_23_113200_create_invoices_table.php.disabled ├── .github ├── FUNDING.yml ├── dependabot.yml ├── issue_template.md └── ISSUE_TEMPLATE │ └── sweep-template.yml ├── resources ├── css │ ├── app.css │ └── filament │ │ └── admin │ │ ├── theme.css │ │ └── tailwind.config.js ├── js │ └── app.js ├── views │ ├── filament │ │ ├── widgets │ │ │ ├── report-widget.blade.php │ │ │ ├── daboville-report.blade.php │ │ │ └── descendant-chart.blade.php │ │ ├── pages │ │ │ ├── api-tokens.blade.php │ │ │ ├── create-team.blade.php │ │ │ └── edit-team.blade.php │ │ ├── filament │ │ │ └── pages │ │ │ │ ├── api-tokens.blade.php │ │ │ │ ├── create-team.blade.php │ │ │ │ └── edit-team.blade.php │ │ └── resources │ │ │ └── gedcom-resource │ │ │ └── pages │ │ │ └── gedcom.blade.php │ ├── components │ │ ├── logo.blade.php │ │ ├── checkbox.blade.php │ │ ├── input-error.blade.php │ │ ├── section-border.blade.php │ │ ├── label.blade.php │ │ ├── input.blade.php │ │ ├── dropdown-link.blade.php │ │ ├── authentication-card.blade.php │ │ ├── section-title.blade.php │ │ ├── action-link.blade.php │ │ ├── danger-button.blade.php │ │ ├── secondary-button.blade.php │ │ ├── validation-errors.blade.php │ │ ├── button.blade.php │ │ ├── application-mark.blade.php │ │ ├── action-section.blade.php │ │ ├── socialstream-icons │ │ │ ├── linkedin.blade.php │ │ │ ├── facebook.blade.php │ │ │ ├── gitlab.blade.php │ │ │ ├── twitter.blade.php │ │ │ ├── google.blade.php │ │ │ ├── github.blade.php │ │ │ └── bitbucket.blade.php │ │ ├── action-message.blade.php │ │ ├── authentication-card-logo.blade.php │ │ ├── dialog-modal.blade.php │ │ ├── buttons.blade.php │ │ ├── nav-link.blade.php │ │ ├── why_us_section.blade.php │ │ ├── responsive-nav-link.blade.php │ │ ├── products_section.blade.php │ │ ├── switchable-team.blade.php │ │ └── form-section.blade.php │ ├── api │ │ └── index.blade.php │ ├── teams │ │ ├── create.blade.php │ │ └── show.blade.php │ └── home.blade.php └── images │ └── logo.png ├── storage ├── logs │ └── .gitignore ├── app │ ├── public │ │ └── .gitignore │ └── .gitignore └── framework │ ├── testing │ └── .gitignore │ ├── views │ └── .gitignore │ ├── cache │ ├── data │ │ └── .gitignore │ └── .gitignore │ ├── sessions │ └── .gitignore │ └── .gitignore ├── .docker ├── config │ ├── php.ini │ ├── config │ │ ├── php.ini │ │ └── supervisord.conf │ └── supervisord.conf ├── octane │ ├── php.ini │ ├── opcache.ini │ ├── supervisord.horizon.conf │ ├── .rr.prod.yaml │ ├── RoadRunner │ │ └── .rr.prod.yaml │ └── utilities.sh ├── utilities.sh ├── supervisord.conf ├── supervisord.worker.conf ├── supervisord.horizon.conf ├── php.ini └── supervisord.scheduler.conf ├── postcss.config.cjs ├── tests ├── TestCase.php ├── Unit │ └── ExampleTest.php ├── Feature │ └── ExampleTest.php └── CreatesApplication.php ├── config ├── socialstream.php └── cors.php ├── tailwind.config.js ├── routes ├── socialstream.php ├── web.php ├── channels.php └── console.php ├── .gitignore ├── package.json └── vite.config.js /public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Models/Tenant.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Filament/App/Pages/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/Filament/App/Widgets/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: liberusoftware 2 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- 1 | @import 'tailwindcss'; 2 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import 'preline/dist/preline.js'; -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /resources/views/filament/widgets/report-widget.blade.php: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /.docker/config/php.ini: -------------------------------------------------------------------------------- 1 | [Date] 2 | date.timezone="UTC" 3 | expose_php= Off -------------------------------------------------------------------------------- /.docker/config/config/php.ini: -------------------------------------------------------------------------------- 1 | [Date] 2 | date.timezone="UTC" 3 | expose_php= Off -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('@tailwindcss/postcss'), 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /resources/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/resources/images/logo.png -------------------------------------------------------------------------------- /public/build/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/build/images/logo.png -------------------------------------------------------------------------------- /.docker/octane/php.ini: -------------------------------------------------------------------------------- 1 | [PHP] 2 | post_max_size = 100M 3 | upload_max_filesize = 100M 4 | expose_php = 0 5 | variables_order = "GPCS" 6 | -------------------------------------------------------------------------------- /resources/views/components/logo.blade.php: -------------------------------------------------------------------------------- 1 | {{ config('app.name') }} 2 | -------------------------------------------------------------------------------- /resources/views/components/checkbox.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'rounded border-gray-300 text-indigo-600 shadow-sm focus:ring-indigo-500']) !!}> 2 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /resources/views/components/input-error.blade.php: -------------------------------------------------------------------------------- 1 | @props(['for']) 2 | 3 | @error($for) 4 |

merge(['class' => 'text-sm text-red-600']) }}>{{ $message }}

5 | @enderror 6 | -------------------------------------------------------------------------------- /resources/views/components/section-border.blade.php: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /resources/views/components/label.blade.php: -------------------------------------------------------------------------------- 1 | @props(['value']) 2 | 3 | 6 | -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-greek-wght-normal-AXVTPQD5.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-greek-wght-normal-IRE366VL.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-greek-wght-normal-N43DBLU2.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-latin-wght-normal-NRMW37G5.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-latin-wght-normal-O25CN4JL.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-latin-wght-normal-OPIJAQLS.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-EWLSKVKN.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-JEOLYBOO.woff2 -------------------------------------------------------------------------------- /public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberu-accounting/accounting-laravel/HEAD/public/fonts/filament/filament/inter/inter-cyrillic-wght-normal-R5CMSONN.woff2 -------------------------------------------------------------------------------- /app/Models/SiteConfig.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | @livewire(\Laravel\Jetstream\Http\Livewire\ApiTokenManager::class) 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | @livewire(\Laravel\Jetstream\Http\Livewire\ApiTokenManager::class) 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/Models/domains.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | @livewire(\Laravel\Jetstream\Http\Livewire\CreateTeamForm::class) 4 |
5 | 6 | 7 | -------------------------------------------------------------------------------- /resources/views/components/input.blade.php: -------------------------------------------------------------------------------- 1 | @props(['disabled' => false]) 2 | 3 | merge(['class' => 'border-gray-300 focus:border-indigo-500 text-gray-700 focus:ring-indigo-500 rounded-md shadow-sm']) !!}> 4 | -------------------------------------------------------------------------------- /resources/views/filament/filament/pages/create-team.blade.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | @livewire(\Laravel\Jetstream\Http\Livewire\CreateTeamForm::class) 4 |
5 | 6 |
7 | -------------------------------------------------------------------------------- /resources/views/components/dropdown-link.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 transition duration-150 ease-in-out']) }}>{{ $slot }} 2 | -------------------------------------------------------------------------------- /.docker/utilities.sh: -------------------------------------------------------------------------------- 1 | tinker() { 2 | if [ -z "$1" ]; then 3 | php artisan tinker 4 | else 5 | php artisan tinker --execute="\"dd($1);\"" 6 | fi 7 | } 8 | 9 | # Commonly used aliases 10 | alias ..="cd .." 11 | alias ...="cd ../.." 12 | alias art="php artisan" 13 | -------------------------------------------------------------------------------- /resources/views/filament/resources/gedcom-resource/pages/gedcom.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{-- 3 | 4 | 5 | --}} 6 | 7 | -------------------------------------------------------------------------------- /app/Traits/IsTenantModel.php: -------------------------------------------------------------------------------- 1 | belongsTo(Team::class); 14 | } 15 | } -------------------------------------------------------------------------------- /config/socialstream.php: -------------------------------------------------------------------------------- 1 | ['web'], 7 | 'prompt' => 'Or Login Via', 8 | 'providers' => [ 9 | // Providers::github(), 10 | ], 11 | 'component' => 'socialstream::components.socialstream', 12 | ]; 13 | -------------------------------------------------------------------------------- /app/Filament/Resources/Roles/Pages/CreateRole.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/Filament/Admin/Resources/MenuResource/Pages/EditMenu.php: -------------------------------------------------------------------------------- 1 | 2 |
3 | {{ $logo }} 4 |
5 | 6 |
7 | {{ $slot }} 8 |
9 | 10 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/TaxForms/Pages/CreateTaxForm.php: -------------------------------------------------------------------------------- 1 | purge(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/TimeEntries/Pages/CreateTimeEntry.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/PaymentTerms/Pages/CreatePaymentTerm.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | {{ __('API Tokens') }} 5 |

6 |
7 | 8 |
9 |
10 | @livewire('api.api-token-manager') 11 |
12 |
13 | 14 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Models/Payment.php: -------------------------------------------------------------------------------- 1 | 2 |
3 |

{{ $title }}

4 | 5 |

6 | {{ $description }} 7 |

8 |
9 | 10 |
11 | {{ $aside ?? '' }} 12 |
13 | 14 | -------------------------------------------------------------------------------- /resources/views/teams/create.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | {{ __('Create Team') }} 5 |

6 |
7 | 8 |
9 |
10 | @livewire('teams.create-team-form') 11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /resources/views/components/action-link.blade.php: -------------------------------------------------------------------------------- 1 | merge(['class' => 'inline-flex items-center px-4 py-2 bg-white border border-gray-800 rounded-md font-semibold text-xs text-gray-800 uppercase tracking-widest hover:bg-gray-200 hover:border-gray-600 active:border-gray-900 focus:outline-none focus:border-gray-900 focus:shadow-outline-gray disabled:opacity-25 transition ease-in-out duration-150'])}}> 2 | {{ $slot }} 3 | 4 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/GeneralLedgerReports/Pages/EditGeneralLedgerReport.php: -------------------------------------------------------------------------------- 1 | merge(['type' => 'button', 'class' => 'inline-flex items-center justify-center px-4 py-2 bg-red-600 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-red-500 active:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 transition ease-in-out duration-150']) }}> 2 | {{ $slot }} 3 | 4 | -------------------------------------------------------------------------------- /resources/views/components/secondary-button.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/GeneralLedgerReports/Pages/CreateGeneralLedgerReport.php: -------------------------------------------------------------------------------- 1 | any()) 2 |
3 |
{{ __('Whoops! Something went wrong.') }}
4 | 5 | 10 |
11 | @endif 12 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/AssetAcquisitions/Pages/CreateAssetAcquisition.php: -------------------------------------------------------------------------------- 1 | merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-gray-700 focus:bg-gray-700 active:bg-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 disabled:opacity-50 transition ease-in-out duration-150']) }}> 2 | {{ $slot }} 3 | 4 | -------------------------------------------------------------------------------- /.docker/supervisord.worker.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | user=%(ENV_USER)s 4 | logfile=/var/log/supervisor/supervisord.log 5 | pidfile=/var/run/supervisord.pid 6 | 7 | [program:worker] 8 | process_name=%(program_name)s_%(process_num)02d 9 | command=%(ENV_WORKER_COMMAND)s 10 | user=%(ENV_USER)s 11 | autostart=true 12 | autorestart=true 13 | stdout_logfile=/dev/stdout 14 | stdout_logfile_maxbytes=0 15 | stderr_logfile=/dev/stderr 16 | stderr_logfile_maxbytes=0 17 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 16 | 17 | $response->assertStatus(200); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Models/AccountTemplate.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 'array' 22 | ]; 23 | } -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /routes/socialstream.php: -------------------------------------------------------------------------------- 1 | config('socialstream.middleware', ['web'])], function () { 7 | Route::get('/oauth/{provider}', [OAuthController::class, 'redirect'])->name('oauth.redirect'); 8 | Route::match(['get', 'post'], '/oauth/{provider}/callback', [OAuthController::class, 'callback'])->name('oauth.callback'); 9 | }); 10 | -------------------------------------------------------------------------------- /app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | 3 | 4 | 5 | 6 | node_modules/ 7 | npm-debug.log 8 | yarn-error.log 9 | 10 | # Laravel 4 specific 11 | bootstrap/compiled.php 12 | app/storage/ 13 | 14 | # Laravel 5 & Lumen specific 15 | public/storage 16 | public/hot 17 | 18 | # Laravel 5 & Lumen specific with changed public path 19 | public_html/storage 20 | public_html/hot 21 | 22 | storage/*.key 23 | .env 24 | Homestead.yaml 25 | Homestead.json 26 | /.vagrant 27 | .phpunit.result.cache 28 | rr 29 | .rr.yaml 30 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'current_password', 16 | 'password', 17 | 'password_confirmation', 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 18 | 19 | return $app; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.docker/octane/supervisord.horizon.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | user=root 4 | logfile=/var/log/supervisor/supervisord.log 5 | pidfile=/var/run/supervisord.pid 6 | 7 | [program:horizon] 8 | process_name=%(program_name)s_%(process_num)02d 9 | command=php /var/www/html/artisan horizon 10 | user=octane 11 | autostart=true 12 | autorestart=true 13 | stdout_logfile=/dev/stdout 14 | stdout_logfile_maxbytes=0 15 | stderr_logfile=/dev/stderr 16 | stderr_logfile_maxbytes=0 17 | stopwaitsecs=3600 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts(): array 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.docker/supervisord.horizon.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | user=%(ENV_USER)s 4 | logfile=/var/log/supervisor/supervisord.log 5 | pidfile=/var/run/supervisord.pid 6 | 7 | [program:horizon] 8 | process_name=%(program_name)s_%(process_num)02d 9 | command=php %(ENV_ROOT)s/artisan horizon 10 | user=%(ENV_USER)s 11 | autostart=true 12 | autorestart=true 13 | stdout_logfile=/dev/stdout 14 | stdout_logfile_maxbytes=0 15 | stderr_logfile=/dev/stderr 16 | stderr_logfile_maxbytes=0 17 | stopwaitsecs=3600 18 | -------------------------------------------------------------------------------- /resources/views/components/action-section.blade.php: -------------------------------------------------------------------------------- 1 |
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> 2 | 3 | {{ $title }} 4 | {{ $description }} 5 | 6 | 7 |
8 |
9 | {{ $content }} 10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson() ? null : route('login'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /database/factories/MenuFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->word, 16 | 'url' => $this->faker->url, 17 | 'order' => $this->faker->numberBetween(1, 10), 18 | ]; 19 | } 20 | } -------------------------------------------------------------------------------- /app/Models/ReminderSetting.php: -------------------------------------------------------------------------------- 1 | 'boolean', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /resources/views/filament/pages/edit-team.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @livewire(Laravel\Jetstream\Http\Livewire\UpdateTeamNameForm::class, compact('team')) 3 | 4 | @livewire(Laravel\Jetstream\Http\Livewire\TeamMemberManager::class, compact('team')) 5 | 6 | @if (Gate::check('delete', $team) && ! $team->personal_team) 7 | 8 | 9 | @livewire(Laravel\Jetstream\Http\Livewire\DeleteTeamForm::class, compact('team')) 10 | @endif 11 | 12 | -------------------------------------------------------------------------------- /resources/views/components/socialstream-icons/linkedin.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/views/components/action-message.blade.php: -------------------------------------------------------------------------------- 1 | @props(['on']) 2 | 3 |
merge(['class' => 'text-sm text-gray-600']) }}> 9 | {{ $slot->isEmpty() ? 'Saved.' : $slot }} 10 |
11 | -------------------------------------------------------------------------------- /resources/views/components/authentication-card-logo.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /resources/views/filament/filament/pages/edit-team.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @livewire(Laravel\Jetstream\Http\Livewire\UpdateTeamNameForm::class, compact('team')) 3 | 4 | @livewire(Laravel\Jetstream\Http\Livewire\TeamMemberManager::class, compact('team')) 5 | 6 | @if (Gate::check('delete', $team) && ! $team->personal_team) 7 | 8 | 9 | @livewire(Laravel\Jetstream\Http\Livewire\DeleteTeamForm::class, compact('team')) 10 | @endif 11 | 12 | -------------------------------------------------------------------------------- /.docker/octane/.rr.prod.yaml: -------------------------------------------------------------------------------- 1 | version: '2.7' 2 | rpc: 3 | listen: 'tcp://127.0.0.1:6001' 4 | http: 5 | middleware: [ "static", "gzip", "headers" ] 6 | max_request_size: 20 7 | static: 8 | dir: "public" 9 | forbid: [ ".php", ".htaccess" ] 10 | uploads: 11 | forbid: [".php", ".exe", ".bat", ".sh"] 12 | pool: 13 | allocate_timeout: 10s 14 | destroy_timeout: 10s 15 | supervisor: 16 | max_worker_memory: 128 17 | exec_ttl: 60s 18 | logs: 19 | mode: production 20 | level: debug 21 | encoding: json 22 | -------------------------------------------------------------------------------- /database/seeders/TeamSeeder.php: -------------------------------------------------------------------------------- 1 | 'default', 18 | 'personal_team' => false, 19 | 'user_id' => 1, 20 | ]); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "composer" 4 | # Files stored in repository root 5 | directory: "/" 6 | schedule: 7 | interval: "daily" 8 | - package-ecosystem: "npm" 9 | # Files stored in repository root 10 | directory: "/" 11 | schedule: 12 | interval: "daily" 13 | - package-ecosystem: "github-actions" 14 | # Workflow files stored in the 15 | # default location of `.github/workflows` 16 | directory: "/" 17 | schedule: 18 | interval: "daily" 19 | -------------------------------------------------------------------------------- /app/Actions/Fortify/PasswordValidationRules.php: -------------------------------------------------------------------------------- 1 | |string> 14 | */ 15 | protected function passwordRules(): array 16 | { 17 | return ['required', 'string', Password::default(), 'confirmed']; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Filament/Resources/Roles/Pages/EditRole.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class AccountFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/DeleteUser.php: -------------------------------------------------------------------------------- 1 | deleteProfilePhoto(); 18 | $user->tokens->each->delete(); 19 | $user->connectedAccounts->each->delete(); 20 | $user->delete(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Actions/Socialstream/HandleInvalidState.php: -------------------------------------------------------------------------------- 1 | hasMany(Invoice::class); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/views/components/dialog-modal.blade.php: -------------------------------------------------------------------------------- 1 | @props(['id' => null, 'maxWidth' => null]) 2 | 3 | 4 |
5 |
6 | {{ $title }} 7 |
8 | 9 |
10 | {{ $content }} 11 |
12 |
13 | 14 |
15 | {{ $footer }} 16 |
17 |
18 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/Assets/Pages/EditAsset.php: -------------------------------------------------------------------------------- 1 | belongsTo(Asset::class, 'asset_id'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/Customers/Pages/EditCustomer.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 'fbclid', 16 | // 'utm_campaign', 17 | // 'utm_content', 18 | // 'utm_medium', 19 | // 'utm_source', 20 | // 'utm_term', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /app/Listeners/CreatePersonalTeam.php: -------------------------------------------------------------------------------- 1 | teamManagementService = $teamManagementService; 15 | } 16 | 17 | public function handle(Registered $event): void 18 | { 19 | $this->teamManagementService->assignUserToDefaultTeam($event->user); 20 | } 21 | } -------------------------------------------------------------------------------- /.docker/config/config/supervisord.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | logfile=/dev/null 4 | logfile_maxbytes=0 5 | pidfile=/run/supervisord.pid 6 | 7 | [program:php-fpm] 8 | command=php-fpm83 -F 9 | stdout_logfile=/dev/stdout 10 | stdout_logfile_maxbytes=0 11 | stderr_logfile=/dev/stderr 12 | stderr_logfile_maxbytes=0 13 | autorestart=false 14 | startretries=0 15 | 16 | [program:nginx] 17 | command=nginx -g 'daemon off;' 18 | stdout_logfile=/dev/stdout 19 | stdout_logfile_maxbytes=0 20 | stderr_logfile=/dev/stderr 21 | stderr_logfile_maxbytes=0 22 | autorestart=false 23 | startretries=0 24 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/Categories/Pages/EditCategory.php: -------------------------------------------------------------------------------- 1 | redirect(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/PaymentTerms/Pages/EditPaymentTerm.php: -------------------------------------------------------------------------------- 1 | hasMany(Supplier::class, 'payment_term_id'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/PaymentTerms/Pages/ListPaymentTerms.php: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | @endforeach 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /.docker/supervisord.scheduler.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | user=%(ENV_USER)s 4 | logfile=/var/log/supervisor/supervisord.log 5 | pidfile=/var/run/supervisord.pid 6 | 7 | [program:scheduler] 8 | process_name=%(program_name)s_%(process_num)02d 9 | command=supercronic -overlapping /etc/supercronic/laravel 10 | user=%(ENV_USER)s 11 | autostart=%(ENV_WITH_SCHEDULER)s 12 | autorestart=true 13 | stdout_logfile=/dev/stdout 14 | stdout_logfile_maxbytes=0 15 | stderr_logfile=/dev/stderr 16 | stderr_logfile_maxbytes=0 17 | 18 | [program:clear-scheduler-cache] 19 | process_name=%(program_name)s_%(process_num)02d 20 | command=php %(ENV_ROOT)s/artisan schedule:clear-cache 21 | user=%(ENV_USER)s 22 | autostart=%(ENV_WITH_SCHEDULER)s 23 | autorestart=false 24 | stdout_logfile=/dev/stdout 25 | stdout_logfile_maxbytes=0 26 | stderr_logfile=/dev/stderr 27 | stderr_logfile_maxbytes=0 -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | app->singleton(ModuleManager::class, function ($app) { 18 | return new ModuleManager(); 19 | }); 20 | 21 | // Register the module service provider 22 | $this->app->register(ModuleServiceProvider::class); 23 | } 24 | 25 | /** 26 | * Bootstrap any application services. 27 | */ 28 | public function boot(): void 29 | { 30 | // 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2024_01_20_000000_create_budgets_table.php: -------------------------------------------------------------------------------- 1 | id(); 13 | $table->foreignId('account_id')->constrained()->onDelete('cascade'); 14 | $table->date('start_date'); 15 | $table->date('end_date'); 16 | $table->decimal('planned_amount', 15, 2); 17 | $table->string('description')->nullable(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | public function down(): void 23 | { 24 | Schema::dropIfExists('budgets'); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /database/migrations/2024_02_24_000000_create_account_templates_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | id(); 18 | $table->string('name'); 19 | $table->string('industry_type'); 20 | $table->json('structure'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('account_templates'); 31 | } 32 | }; -------------------------------------------------------------------------------- /public/js/filament/tables/components/columns/checkbox.js: -------------------------------------------------------------------------------- 1 | function o({name:i,recordKey:s,state:a}){return{error:void 0,isLoading:!1,state:a,init(){Livewire.hook("commit",({component:e,commit:r,succeed:n,fail:h,respond:u})=>{n(({snapshot:f,effect:d})=>{this.$nextTick(()=>{if(this.isLoading||e.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let t=this.getServerState();t===void 0||Alpine.raw(this.state)===t||(this.state=t)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||Alpine.raw(this.state)===e)return;this.isLoading=!0;let r=await this.$wire.updateTableColumnState(i,s,this.state);this.error=r?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.state?"1":"0"),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[1,"1"].includes(this.$refs.serverState.value)}}}export{o as default}; 2 | -------------------------------------------------------------------------------- /public/js/filament/tables/components/columns/toggle.js: -------------------------------------------------------------------------------- 1 | function o({name:i,recordKey:s,state:a}){return{error:void 0,isLoading:!1,state:a,init(){Livewire.hook("commit",({component:e,commit:r,succeed:n,fail:h,respond:u})=>{n(({snapshot:f,effect:d})=>{this.$nextTick(()=>{if(this.isLoading||e.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let t=this.getServerState();t===void 0||Alpine.raw(this.state)===t||(this.state=t)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||Alpine.raw(this.state)===e)return;this.isLoading=!0;let r=await this.$wire.updateTableColumnState(i,s,this.state);this.error=r?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.state?"1":"0"),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[1,"1"].includes(this.$refs.serverState.value)}}}export{o as default}; 2 | -------------------------------------------------------------------------------- /database/migrations/2024_01_07_112857_create_payment_terms_table.php: -------------------------------------------------------------------------------- 1 | unsignedBigInteger('payment_term_id', true); 16 | $table->string('payment_term_name'); 17 | $table->string('payment_term_description'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('payment_terms'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_02_23_113224_create_payments_table.php: -------------------------------------------------------------------------------- 1 | integer('payment_id', true); 16 | $table->integer('invoice_id'); 17 | $table->decimal('payment_amount', 10, 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('payments'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_02_24_000000_create_reminder_settings_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | id(); 15 | $table->integer('days_before_reminder')->default(3); 16 | $table->integer('reminder_frequency_days')->default(7); 17 | $table->integer('max_reminders')->default(3); 18 | $table->boolean('is_active')->default(true); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | public function down(): void 24 | { 25 | Schema::dropIfExists('reminder_settings'); 26 | } 27 | }; -------------------------------------------------------------------------------- /app/Models/Category.php: -------------------------------------------------------------------------------- 1 | belongsToMany(Account::class); 22 | } 23 | 24 | public function transactions() 25 | { 26 | return $this->belongsToMany(Transaction::class); 27 | } 28 | 29 | public function parent() 30 | { 31 | return $this->belongsTo(Category::class, 'parent_id'); 32 | } 33 | 34 | public function children() 35 | { 36 | return $this->hasMany(Category::class, 'parent_id'); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /public/js/filament/schemas/components/actions.js: -------------------------------------------------------------------------------- 1 | var i=()=>({isSticky:!1,width:0,resizeObserver:null,boundUpdateWidth:null,init(){let e=this.$el.parentElement;e&&(this.updateWidth(),this.resizeObserver=new ResizeObserver(()=>this.updateWidth()),this.resizeObserver.observe(e),this.boundUpdateWidth=this.updateWidth.bind(this),window.addEventListener("resize",this.boundUpdateWidth))},enableSticky(){this.isSticky=this.$el.getBoundingClientRect().top>0},disableSticky(){this.isSticky=!1},updateWidth(){let e=this.$el.parentElement;if(!e)return;let t=getComputedStyle(this.$root.querySelector(".fi-ac"));this.width=e.offsetWidth+parseInt(t.marginInlineStart,10)*-1+parseInt(t.marginInlineEnd,10)*-1},destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.boundUpdateWidth&&(window.removeEventListener("resize",this.boundUpdateWidth),this.boundUpdateWidth=null)}});export{i as default}; 2 | -------------------------------------------------------------------------------- /resources/views/components/socialstream-icons/github.blade.php: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /app/Actions/Jetstream/UpdateTeamName.php: -------------------------------------------------------------------------------- 1 | $input 17 | */ 18 | public function update(User $user, Team $team, array $input): void 19 | { 20 | Gate::forUser($user)->authorize('update', $team); 21 | 22 | Validator::make($input, [ 23 | 'name' => ['required', 'string', 'max:255'], 24 | ])->validateWithBag('updateTeamName'); 25 | 26 | $team->forceFill([ 27 | 'name' => $input['name'], 28 | ])->save(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/migrations/2020_05_21_200000_create_team_user_table.php: -------------------------------------------------------------------------------- 1 | id(); 15 | $table->foreignId('team_id'); 16 | $table->foreignId('user_id'); 17 | $table->string('role')->nullable(); 18 | $table->timestamps(); 19 | 20 | $table->unique(['team_id', 'user_id']); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('team_user'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_080000_create_menus_table.php: -------------------------------------------------------------------------------- 1 | id(); 13 | $table->string('name'); 14 | $table->string('url'); 15 | $table->unsignedBigInteger('parent_id')->nullable(); 16 | $table->integer('order')->default(0); 17 | $table->timestamps(); 18 | $table->softDeletes(); 19 | 20 | $table->foreign('parent_id')->references('id')->on('menus')->onDelete('cascade'); 21 | }); 22 | } 23 | 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('menus'); 27 | } 28 | }; -------------------------------------------------------------------------------- /app/Listeners/EmailTracker.php: -------------------------------------------------------------------------------- 1 | message; 14 | $campaignId = $message->getHeaders()->get('X-Campaign-ID'); 15 | $leadId = $message->getHeaders()->get('X-Lead-ID'); 16 | 17 | if ($campaignId && $leadId) { 18 | $campaign = EmailCampaign::find($campaignId); 19 | $lead = Lead::find($leadId); 20 | 21 | if ($campaign && $lead) { 22 | // Record that the email was sent 23 | $campaign->emailStats()->create([ 24 | 'lead_id' => $lead->id, 25 | 'sent_at' => now(), 26 | ]); 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /app/Models/InventoryTransaction.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 'integer', 27 | 'unit_price' => 'decimal:2' 28 | ]; 29 | 30 | public function inventoryItem() 31 | { 32 | return $this->belongsTo(InventoryItem::class); 33 | } 34 | 35 | public function transaction() 36 | { 37 | return $this->belongsTo(Transaction::class); 38 | } 39 | } -------------------------------------------------------------------------------- /resources/views/components/socialstream-icons/bitbucket.blade.php: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /app/Filament/Admin/Resources/ModuleResource/Pages/ListModules.php: -------------------------------------------------------------------------------- 1 | label('Refresh Modules') 19 | ->icon('heroicon-o-arrow-path') 20 | ->action(function () { 21 | // Clear module cache and reload 22 | cache()->forget('app.modules'); 23 | $this->redirect(request()->header('Referer')); 24 | }), 25 | ]; 26 | } 27 | } -------------------------------------------------------------------------------- /database/migrations/2024_01_01_000000_create_expenses_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->foreignId('user_id')->constrained()->onDelete('cascade'); 17 | $table->string('description')->nullable(); 18 | $table->decimal('amount', 12, 2); 19 | $table->date('date'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('expenses'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_01_01_000002_create_assets_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->foreignId('user_id')->constrained()->onDelete('cascade'); 17 | $table->string('name'); 18 | $table->decimal('value', 12, 2); 19 | $table->date('acquired_at')->nullable(); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('assets'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/migrations/2024_01_20_000000_create_transactions_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->foreignId('user_id')->constrained()->onDelete('cascade'); 17 | $table->string('type'); 18 | $table->decimal('amount', 12, 2); 19 | $table->date('date'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('transactions'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/migrations/2024_02_23_112720_create_domains_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 16 | $table->string('domain', 191)->unique(); 17 | $table->string('tenant_id'); 18 | 19 | $table->timestamps(); 20 | $table->foreign('tenant_id')->references('id')->on('tenants')->onUpdate('cascade')->onDelete('cascade'); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('domains'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_01_08_113200_create_invoices_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->timestamp('invoice_date'); 17 | $table->decimal('total_amount', 10, 2); 18 | $table->string('payment_status'); 19 | $table->timestamps(); 20 | 21 | $table->foreignId('customer_id')->constrained()->onDelete('cascade'); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('invoices'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_02_23_113340_create_asset_acquisitions_table.php: -------------------------------------------------------------------------------- 1 | integer('asset_acquisition_id', true); 16 | $table->date('acquisition_date'); 17 | $table->decimal('acquisition_price', 10, 2); 18 | $table->timestamps(); 19 | $table->foreignId('asset_id')->constrained()->onDelete('cascade'); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('asset_acquisitions'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_02_24_000000_add_late_fee_columns_to_invoices.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | decimal('late_fee_percentage', 5, 2)->default(0); 15 | $table->integer('grace_period_days')->default(0); 16 | $table->decimal('late_fee_amount', 10, 2)->default(0); 17 | $table->date('due_date')->nullable(); 18 | }); 19 | } 20 | 21 | public function down(): void 22 | { 23 | Schema::table('invoices', function (Blueprint $table) { 24 | $table->dropColumn(['late_fee_percentage', 'grace_period_days', 'late_fee_amount', 'due_date']); 25 | }); 26 | } 27 | }; -------------------------------------------------------------------------------- /app/Http/Middleware/AssignDefaultTeam.php: -------------------------------------------------------------------------------- 1 | check()) { 15 | $user = auth()->user(); 16 | $defaultTeam = $user->currentTeam ?? $user->ownedTeams()->first(); 17 | if (!$defaultTeam) { 18 | $defaultTeam = $user->ownedTeams()->create([ 19 | 'name' => $user->name . "'s Team", 20 | 'personal_team' => true, 21 | ]); 22 | $user->current_team_id = $defaultTeam->id; 23 | $user->save(); 24 | } 25 | Filament::setTenant($defaultTeam); 26 | } 27 | return $next($request); 28 | } 29 | } -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('uuid')->unique(); 17 | $table->text('connection'); 18 | $table->text('queue'); 19 | $table->longText('payload'); 20 | $table->longText('exception'); 21 | $table->timestamp('failed_at')->useCurrent(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('failed_jobs'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /app/Http/Controllers/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | validate(['email' => 'required|email']); 20 | 21 | $status = Password::broker('admins')->sendResetLink( 22 | $request->only('email') 23 | ); 24 | 25 | return $status === Password::RESET_LINK_SENT 26 | ? back()->with(['status' => __($status)]) 27 | : back()->withErrors(['email' => __($status)]); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /database/migrations/2024_02_21_create_vendors_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | id(); 15 | $table->string('name'); 16 | $table->string('email')->nullable(); 17 | $table->string('phone')->nullable(); 18 | $table->text('address')->nullable(); 19 | $table->string('tax_id')->nullable(); 20 | $table->integer('payment_terms')->default(30); 21 | $table->enum('status', ['active', 'inactive'])->default('active'); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | public function down() 27 | { 28 | Schema::dropIfExists('vendors'); 29 | } 30 | }; -------------------------------------------------------------------------------- /database/migrations/2024_01_10_000000_create_audit_logs_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | id(); 15 | $table->morphs('auditable'); 16 | $table->foreignId('user_id')->nullable()->constrained(); 17 | $table->string('event'); 18 | $table->json('old_values')->nullable(); 19 | $table->json('new_values')->nullable(); 20 | $table->string('ip_address')->nullable(); 21 | $table->string('user_agent')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | public function down() 27 | { 28 | Schema::dropIfExists('audit_logs'); 29 | } 30 | }; -------------------------------------------------------------------------------- /database/migrations/2024_01_10_000000_add_approval_fields_to_expenses_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | enum('approval_status', ['pending', 'approved', 'rejected'])->default('pending'); 15 | $table->text('rejection_reason')->nullable(); 16 | $table->foreignId('approved_by')->nullable()->constrained('users'); 17 | $table->timestamp('approved_at')->nullable(); 18 | }); 19 | } 20 | 21 | public function down() 22 | { 23 | Schema::table('expenses', function (Blueprint $table) { 24 | $table->dropColumn(['approval_status', 'rejection_reason', 'approved_by', 'approved_at']); 25 | }); 26 | } 27 | }; -------------------------------------------------------------------------------- /app/Http/Middleware/ScreeningDataEncryptor.php: -------------------------------------------------------------------------------- 1 | getContent()) { 15 | $content = json_decode($response->getContent(), true); 16 | 17 | $fieldsToEncrypt = [ 18 | 'background_check_status', 19 | 'credit_report_status', 20 | 'rental_history_status' 21 | ]; 22 | 23 | foreach ($fieldsToEncrypt as $field) { 24 | if (isset($content[$field])) { 25 | $content[$field] = Crypt::encryptString($content[$field]); 26 | } 27 | } 28 | 29 | $response->setContent(json_encode($content)); 30 | } 31 | 32 | return $response; 33 | } 34 | } -------------------------------------------------------------------------------- /database/migrations/2024_02_14_000002_create_depreciation_calculations_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | id(); 15 | $table->foreignId('asset_id')->constrained('assets', 'id'); 16 | $table->integer('year'); 17 | $table->decimal('depreciation_amount', 15, 2); 18 | $table->decimal('accumulated_depreciation', 15, 2); 19 | $table->decimal('book_value', 15, 2); 20 | $table->date('calculation_date'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | public function down() 26 | { 27 | Schema::dropIfExists('depreciation_calculations'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | ['api/*', 'sanctum/csrf-cookie'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => ['*'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => [], 29 | 30 | 'max_age' => 0, 31 | 32 | 'supports_credentials' => false, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import laravel, { refreshPaths } from 'laravel-vite-plugin' 3 | import { viteStaticCopy } from "vite-plugin-static-copy"; 4 | 5 | export default defineConfig({ 6 | plugins: [ 7 | laravel({ 8 | input: ['resources/css/app.css', 'resources/js/app.js', 9 | 'resources/css/filament/admin/theme.css'], 10 | refresh: [ 11 | ...refreshPaths, 12 | 'app/Filament/**', 13 | 'app/Forms/Components/**', 14 | 'app/Livewire/**', 15 | 'app/Infolists/Components/**', 16 | 'app/Providers/Filament/**', 17 | 'app/Tables/Columns/**', 18 | ], 19 | }), 20 | viteStaticCopy({ 21 | targets: [ 22 | { 23 | src: "resources/images/*", 24 | dest: "images", 25 | }, 26 | ], 27 | }), 28 | ], 29 | }) 30 | -------------------------------------------------------------------------------- /database/migrations/2020_05_21_300000_create_team_invitations_table.php: -------------------------------------------------------------------------------- 1 | id(); 15 | $table->foreignId('team_id')->constrained()->cascadeOnDelete(); 16 | $table->string('email'); 17 | $table->string('role')->nullable(); 18 | $table->string('token', 64)->unique(); 19 | $table->timestamps(); 20 | 21 | $table->unique(['team_id', 'email']); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('team_invitations'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/seeders/UserSeeder.php: -------------------------------------------------------------------------------- 1 | 'Admin User', 20 | 'email' => 'admin@example.com', 21 | 'password' => Hash::make('password'), 22 | 'email_verified_at' => now(), 23 | ]); 24 | $adminUser->assignRole('admin'); 25 | 26 | // $this->createTeamForUser($adminUser); 27 | } 28 | 29 | private function createTeamForUser($user) 30 | { 31 | $team = Team::first(); 32 | $team->users()->attach($user); 33 | $user->current_team_id = 1; 34 | $user->save(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/js/filament/forms/components/key-value.js: -------------------------------------------------------------------------------- 1 | function h({state:r}){return{state:r,rows:[],init(){this.updateRows(),this.rows.length<=0?this.rows.push({key:"",value:""}):this.updateState(),this.$watch("state",(e,t)=>{let s=i=>i===null?0:Array.isArray(i)?i.length:typeof i!="object"?0:Object.keys(i).length;s(e)===0&&s(t)===0||this.updateRows()})},addRow(){this.rows.push({key:"",value:""}),this.updateState()},deleteRow(e){this.rows.splice(e,1),this.rows.length<=0&&this.addRow(),this.updateState()},reorderRows(e){let t=Alpine.raw(this.rows);this.rows=[];let s=t.splice(e.oldIndex,1)[0];t.splice(e.newIndex,0,s),this.$nextTick(()=>{this.rows=t,this.updateState()})},updateRows(){let t=Alpine.raw(this.state).map(({key:s,value:i})=>({key:s,value:i}));this.rows.forEach(s=>{(s.key===""||s.key===null)&&t.push({key:"",value:s.value})}),this.rows=t},updateState(){let e=[];this.rows.forEach(t=>{t.key===""||t.key===null||e.push({key:t.key,value:t.value})}),JSON.stringify(this.state)!==JSON.stringify(e)&&(this.state=e)}}}export{h as default}; 2 | -------------------------------------------------------------------------------- /app/Filament/App/Resources/Assets/Pages/DepreciationSchedulePage.php: -------------------------------------------------------------------------------- 1 | record = $record; 22 | } 23 | 24 | protected function getHeaderActions(): array 25 | { 26 | return [ 27 | Action::make('back') 28 | ->url(fn () => AssetResource::getUrl()) 29 | ->label('Back to Assets') 30 | ->icon('heroicon-o-arrow-left'), 31 | ]; 32 | } 33 | } -------------------------------------------------------------------------------- /database/migrations/2023_05_15_000000_create_site_settings_table.php: -------------------------------------------------------------------------------- 1 | id(); 17 | $table->string('name')->nullable(); 18 | $table->string('group')->nullable(); 19 | $table->string('payload')->nullable(); 20 | $table->integer('locked')->nullable(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('settings'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /resources/views/components/switchable-team.blade.php: -------------------------------------------------------------------------------- 1 | @props(['team', 'component' => 'dropdown-link']) 2 | 3 |
4 | @method('PUT') 5 | @csrf 6 | 7 | 8 | 9 | 10 | 11 |
12 | @if (Auth::user()->isCurrentTeam($team)) 13 | 14 | 15 | 16 | @endif 17 | 18 |
{{ $team->name }}
19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /public/js/filament/actions/actions.js: -------------------------------------------------------------------------------- 1 | (()=>{var n=({livewireId:e})=>({actionNestingIndex:null,init(){window.addEventListener("sync-action-modals",t=>{t.detail.id===e&&this.syncActionModals(t.detail.newActionNestingIndex)})},syncActionModals(t){if(this.actionNestingIndex===t){this.actionNestingIndex!==null&&this.$nextTick(()=>this.openModal());return}if(this.actionNestingIndex!==null&&this.closeModal(),this.actionNestingIndex=t,this.actionNestingIndex!==null){if(!this.$el.querySelector(`#${this.generateModalId(t)}`)){this.$nextTick(()=>this.openModal());return}this.openModal()}},generateModalId(t){return`fi-${e}-action-`+t},openModal(){let t=this.generateModalId(this.actionNestingIndex);document.dispatchEvent(new CustomEvent("open-modal",{bubbles:!0,composed:!0,detail:{id:t}}))},closeModal(){let t=this.generateModalId(this.actionNestingIndex);document.dispatchEvent(new CustomEvent("close-modal-quietly",{bubbles:!0,composed:!0,detail:{id:t}}))}});document.addEventListener("alpine:init",()=>{window.Alpine.data("filamentActionModals",n)});})(); 2 | -------------------------------------------------------------------------------- /public/js/filament/tables/components/columns/text-input.js: -------------------------------------------------------------------------------- 1 | function o({name:i,recordKey:s,state:a}){return{error:void 0,isLoading:!1,state:a,init(){Livewire.hook("commit",({component:e,commit:r,succeed:n,fail:d,respond:u})=>{n(({snapshot:f,effect:h})=>{this.$nextTick(()=>{if(this.isLoading||e.id!==this.$root.closest("[wire\\:id]")?.attributes["wire:id"].value)return;let t=this.getServerState();t===void 0||this.getNormalizedState()===t||(this.state=t)})})}),this.$watch("state",async()=>{let e=this.getServerState();if(e===void 0||this.getNormalizedState()===e)return;this.isLoading=!0;let r=await this.$wire.updateTableColumnState(i,s,this.state);this.error=r?.error??void 0,!this.error&&this.$refs.serverState&&(this.$refs.serverState.value=this.getNormalizedState()),this.isLoading=!1})},getServerState(){if(this.$refs.serverState)return[null,void 0].includes(this.$refs.serverState.value)?"":this.$refs.serverState.value.replaceAll('\\"','"')},getNormalizedState(){let e=Alpine.raw(this.state);return[null,void 0].includes(e)?"":e}}}export{o as default}; 2 | -------------------------------------------------------------------------------- /resources/views/components/form-section.blade.php: -------------------------------------------------------------------------------- 1 | @props(['submit']) 2 | 3 |
merge(['class' => 'md:grid md:grid-cols-3 md:gap-6']) }}> 4 | 5 | {{ $title }} 6 | {{ $description }} 7 | 8 | 9 |
10 |
11 |
12 |
13 | {{ $form }} 14 |
15 |
16 | 17 | @if (isset($actions)) 18 |
19 | {{ $actions }} 20 |
21 | @endif 22 |
23 |
24 |
25 | -------------------------------------------------------------------------------- /database/migrations/2024_02_24_000000_create_time_entries_table.php: -------------------------------------------------------------------------------- 1 | id(); 13 | 14 | $table->dateTime('start_time'); 15 | $table->dateTime('end_time'); 16 | $table->text('description'); 17 | $table->decimal('hourly_rate', 10, 2); 18 | $table->decimal('total_amount', 10, 2); 19 | 20 | $table->foreignId('customer_id')->constrained()->onDelete('cascade'); 21 | $table->foreignId('invoice_id')->constrained()->onDelete('cascade'); 22 | 23 | $table->timestamps(); 24 | 25 | }); 26 | } 27 | 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('time_entries'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_01_03_112935_create_customers_table.php: -------------------------------------------------------------------------------- 1 | id(); 17 | $table->string('customer_name'); 18 | $table->string('customer_last_name'); 19 | $table->string('customer_address'); 20 | $table->string('customer_email')->unique(); 21 | $table->string('customer_phone')->unique(); 22 | $table->string('customer_city'); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | */ 30 | public function down(): void 31 | { 32 | Schema::dropIfExists('customers'); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/2024_02_14_000001_add_depreciation_fields_to_assets_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | string('depreciation_method')->default('straight_line'); 15 | $table->decimal('salvage_value', 15, 2)->default(0); 16 | $table->date('acquisition_date')->nullable(); 17 | $table->boolean('is_active')->default(true); 18 | }); 19 | } 20 | 21 | public function down() 22 | { 23 | Schema::table('assets', function (Blueprint $table) { 24 | $table->dropColumn([ 25 | 'depreciation_method', 26 | 'salvage_value', 27 | 'acquisition_date', 28 | 'is_active' 29 | ]); 30 | }); 31 | } 32 | }; -------------------------------------------------------------------------------- /database/migrations/2024_02_14_000002_create_inventory_transactions_table.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | id('inventory_transaction_id'); 15 | $table->foreignId('inventory_item_id')->constrained('inventory_items'); 16 | $table->foreignId('transaction_id')->constrained('transactions'); 17 | $table->integer('quantity'); 18 | $table->decimal('unit_price', 15, 2); 19 | $table->enum('transaction_type', ['purchase', 'sale', 'adjustment']); 20 | $table->text('notes')->nullable(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | public function down() 26 | { 27 | Schema::dropIfExists('inventory_transactions'); 28 | } 29 | }; -------------------------------------------------------------------------------- /database/migrations/2024_02_20_000000_add_reconciliation_fields_to_transactions.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | boolean('reconciled')->default(false); 15 | $table->text('discrepancy_notes')->nullable(); 16 | $table->timestamp('reconciled_at')->nullable(); 17 | $table->foreignId('reconciled_by_user_id')->nullable()->constrained('users')->nullOnDelete(); 18 | }); 19 | } 20 | 21 | public function down() 22 | { 23 | Schema::table('transactions', function (Blueprint $table) { 24 | $table->dropForeign(['reconciled_by_user_id']); 25 | $table->dropColumn(['reconciled', 'discrepancy_notes', 'reconciled_at', 'reconciled_by_user_id']); 26 | }); 27 | } 28 | }; -------------------------------------------------------------------------------- /database/migrations/2024_02_23_113200_create_invoices_table.php.disabled: -------------------------------------------------------------------------------- 1 | integer('invoice_id', true); 16 | $table->integer('customer_id'); 17 | $table->timestamp('invoice_date'); 18 | $table->decimal('total_amount', 10, 2); 19 | $table->string('payment_status'); 20 | $table->timestamps(); 21 | 22 | $table->foreign('customer_id')->references('customer_id')->on('customers')->onDelete('cascade'); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('invoices'); 32 | } 33 | }; 34 | --------------------------------------------------------------------------------