├── .editorconfig
├── .fossil-settings
├── allow-symlinks
├── ignore-glob
├── manifest
└── pgp-command
├── .travis.yml
├── COPYING
├── README.md
├── SECURITY.md
├── archives
├── 0.7.0_migration.sql
├── 0.7.2_migration.sql
├── 0.8.0_migration.sql
├── 0.8.0_schema.sql
├── 0.8.3_migration.sql
├── 0.8.3_schema.sql
├── 0.8.4_migration.sql
├── 0.9.0_migration.sql
├── 0.9.0_schema.sql
├── 0.9.1_migration.sql
├── 0.9.1_schema.sql
├── 0.9.5_schema.sql
├── 1.0.0_schema.sql
└── plan_comptable.json
├── build
├── debian
│ ├── config.system.php
│ ├── config.user.php
│ ├── makedeb.sh
│ ├── manpage.txt
│ ├── paheko
│ ├── paheko.desktop
│ ├── paheko.menu
│ └── paheko.png
├── kd2fw.version
├── modules.version
├── plugins.version
└── windows
│ ├── Makefile
│ ├── README.md
│ ├── config.local.php
│ ├── launch.bat
│ ├── paheko.ico
│ ├── paheko.nsis
│ └── php.ini
├── doc
├── admin
│ ├── api.md
│ ├── brindille.md
│ ├── brindille_functions.md
│ ├── brindille_modifiers.md
│ ├── brindille_sections.md
│ ├── keyboard.md
│ ├── markdown.md
│ ├── markdown_quickref.md
│ ├── modules.md
│ ├── skriv.md
│ ├── sql.md
│ └── web.md
├── conf
│ └── snuffleupagus_paheko.rules
├── icon.png
├── index.css
├── index.md
├── selfhost2.png
└── skrivml.html
├── src
├── .htaccess.www
├── Makefile
├── VERSION
├── apache-bots.conf
├── apache-htaccess.conf
├── apache-vhost.conf
├── bin
│ └── paheko
├── config.dist.php
├── data
│ └── index.html
├── include
│ ├── data
│ │ ├── 1.1.0_schema.sql
│ │ ├── 1.1.21_migration.sql
│ │ ├── 1.1.25_migration.sql
│ │ ├── 1.1.29_migration.sql
│ │ ├── charts
│ │ │ ├── be_pcmn_2019.csv
│ │ │ ├── ch_asso.csv
│ │ │ ├── fr_cse_2015.csv
│ │ │ ├── fr_pca_1999.csv
│ │ │ ├── fr_pca_2018.csv
│ │ │ ├── fr_pca_2025.csv
│ │ │ ├── fr_pcc_2020.csv
│ │ │ ├── fr_pcg_2014.csv
│ │ │ ├── fr_pcg_2025.csv
│ │ │ └── fr_pcs_2018.csv
│ │ ├── locales
│ │ │ └── fr
│ │ │ │ └── dictionary.txt
│ │ ├── schema.sql
│ │ └── users_fields_presets.ini
│ ├── init.php
│ ├── lib
│ │ ├── Paheko
│ │ │ ├── API.php
│ │ │ ├── API_Credentials.php
│ │ │ ├── Accounting
│ │ │ │ ├── Accounts.php
│ │ │ │ ├── AdvancedSearch.php
│ │ │ │ ├── AssistedReconciliation.php
│ │ │ │ ├── Charts.php
│ │ │ │ ├── Export.php
│ │ │ │ ├── Graph.php
│ │ │ │ ├── Import.php
│ │ │ │ ├── Projects.php
│ │ │ │ ├── Reports.php
│ │ │ │ ├── Transactions.php
│ │ │ │ └── Years.php
│ │ │ ├── AdvancedSearch.php
│ │ │ ├── Backup.php
│ │ │ ├── CLI.php
│ │ │ ├── CSV.php
│ │ │ ├── CSV_Custom.php
│ │ │ ├── Config.php
│ │ │ ├── DB.php
│ │ │ ├── DynamicList.php
│ │ │ ├── Email
│ │ │ │ ├── Emails.php
│ │ │ │ ├── Mailings.php
│ │ │ │ └── Templates.php
│ │ │ ├── Entities
│ │ │ │ ├── API_Credentials.php
│ │ │ │ ├── Accounting
│ │ │ │ │ ├── Account.php
│ │ │ │ │ ├── Chart.php
│ │ │ │ │ ├── Line.php
│ │ │ │ │ ├── Project.php
│ │ │ │ │ ├── Transaction.php
│ │ │ │ │ ├── TransactionLinksTrait.php
│ │ │ │ │ ├── TransactionSubscriptionsTrait.php
│ │ │ │ │ ├── TransactionUsersTrait.php
│ │ │ │ │ └── Year.php
│ │ │ │ ├── Email
│ │ │ │ │ ├── Email.php
│ │ │ │ │ └── Mailing.php
│ │ │ │ ├── Extension.php
│ │ │ │ ├── Files
│ │ │ │ │ ├── File.php
│ │ │ │ │ ├── FilePermissionsTrait.php
│ │ │ │ │ ├── FileSharingTrait.php
│ │ │ │ │ ├── FileThumbnailTrait.php
│ │ │ │ │ ├── FileVersionsTrait.php
│ │ │ │ │ ├── FileWOPITrait.php
│ │ │ │ │ └── Share.php
│ │ │ │ ├── Module.php
│ │ │ │ ├── Plugin.php
│ │ │ │ ├── Search.php
│ │ │ │ ├── Services
│ │ │ │ │ ├── Fee.php
│ │ │ │ │ ├── Reminder.php
│ │ │ │ │ ├── ReminderMessage.php
│ │ │ │ │ ├── Service.php
│ │ │ │ │ └── Service_User.php
│ │ │ │ ├── Signal.php
│ │ │ │ ├── Users
│ │ │ │ │ ├── Category.php
│ │ │ │ │ ├── DynamicField.php
│ │ │ │ │ └── User.php
│ │ │ │ └── Web
│ │ │ │ │ └── Page.php
│ │ │ ├── Entity.php
│ │ │ ├── Extensions.php
│ │ │ ├── Files
│ │ │ │ ├── Conversion.php
│ │ │ │ ├── Files.php
│ │ │ │ ├── Shares.php
│ │ │ │ ├── Storage.php
│ │ │ │ ├── Storage
│ │ │ │ │ ├── FileSystem.php
│ │ │ │ │ ├── SQLite.php
│ │ │ │ │ └── StorageInterface.php
│ │ │ │ ├── Transactions.php
│ │ │ │ ├── Trash.php
│ │ │ │ ├── Users.php
│ │ │ │ └── WebDAV
│ │ │ │ │ ├── NextCloud.php
│ │ │ │ │ ├── Server.php
│ │ │ │ │ ├── Session.php
│ │ │ │ │ ├── Storage.php
│ │ │ │ │ └── WebDAV.php
│ │ │ ├── Form.php
│ │ │ ├── Install.php
│ │ │ ├── Log.php
│ │ │ ├── Plugins.php
│ │ │ ├── Search.php
│ │ │ ├── Services
│ │ │ │ ├── Fees.php
│ │ │ │ ├── Reminders.php
│ │ │ │ ├── Services.php
│ │ │ │ └── Services_User.php
│ │ │ ├── Static_Cache.php
│ │ │ ├── Template.php
│ │ │ ├── Upgrade.php
│ │ │ ├── UserException.php
│ │ │ ├── UserTemplate
│ │ │ │ ├── CommonFunctions.php
│ │ │ │ ├── CommonModifiers.php
│ │ │ │ ├── Functions.php
│ │ │ │ ├── Modifiers.php
│ │ │ │ ├── Modules.php
│ │ │ │ ├── Sections.php
│ │ │ │ └── UserTemplate.php
│ │ │ ├── Users
│ │ │ │ ├── AdvancedSearch.php
│ │ │ │ ├── Categories.php
│ │ │ │ ├── DynamicFields.php
│ │ │ │ ├── Export.php
│ │ │ │ ├── Import.php
│ │ │ │ ├── LocalAddressFinder.php
│ │ │ │ ├── Session.php
│ │ │ │ └── Users.php
│ │ │ ├── Utils.php
│ │ │ └── Web
│ │ │ │ ├── Cache.php
│ │ │ │ ├── Render
│ │ │ │ ├── AbstractRender.php
│ │ │ │ ├── Encrypted.php
│ │ │ │ ├── Extensions.php
│ │ │ │ ├── Markdown.php
│ │ │ │ ├── Render.php
│ │ │ │ └── Skriv.php
│ │ │ │ ├── Router.php
│ │ │ │ ├── Sync.php
│ │ │ │ └── Web.php
│ │ └── dependencies.list
│ ├── migrations
│ │ └── 1.3
│ │ │ ├── 1.3.0_schema.sql
│ │ │ ├── 1.3.10.sql
│ │ │ ├── 1.3.11.php
│ │ │ ├── 1.3.12.sql
│ │ │ ├── 1.3.13.sql
│ │ │ ├── 1.3.14.sql
│ │ │ ├── 1.3.14_recus.sql
│ │ │ ├── 1.3.2.sql
│ │ │ ├── 1.3.3.sql
│ │ │ ├── 1.3.5.sql
│ │ │ ├── 1.3.7.sql
│ │ │ ├── 1.3.8.php
│ │ │ ├── 1.3.8.sql
│ │ │ ├── 1.3.9.php
│ │ │ ├── 1.3.9.sql
│ │ │ └── schema.sql
│ └── test_required.php
├── index.php
├── pubkey.asc
├── pubkey_old.asc
├── pubkey_signed.asc
├── scripts
│ ├── cron.php
│ ├── emails.php
│ ├── handle_bounce.php
│ ├── storage.php
│ └── upgrade.php
├── sous-domaine.html
├── templates
│ ├── _foot.tpl
│ ├── _head.tpl
│ ├── acc
│ │ ├── _table_actions.tpl
│ │ ├── _year_select.tpl
│ │ ├── accounts
│ │ │ ├── _nav.tpl
│ │ │ ├── all.tpl
│ │ │ ├── deposit.tpl
│ │ │ ├── index.tpl
│ │ │ ├── journal.tpl
│ │ │ ├── reconcile.tpl
│ │ │ ├── reconcile_assist.tpl
│ │ │ ├── simple.tpl
│ │ │ └── users.tpl
│ │ ├── charts
│ │ │ ├── _country_input.tpl
│ │ │ ├── _nav.tpl
│ │ │ ├── accounts
│ │ │ │ ├── _account_form.tpl
│ │ │ │ ├── _nav.tpl
│ │ │ │ ├── all.tpl
│ │ │ │ ├── delete.tpl
│ │ │ │ ├── edit.tpl
│ │ │ │ ├── index.tpl
│ │ │ │ ├── new.tpl
│ │ │ │ └── selector.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── edit.tpl
│ │ │ └── index.tpl
│ │ ├── index.tpl
│ │ ├── projects
│ │ │ ├── _list.tpl
│ │ │ ├── _nav.tpl
│ │ │ ├── config.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── edit.tpl
│ │ │ └── index.tpl
│ │ ├── reports
│ │ │ ├── _header.tpl
│ │ │ ├── _journal.tpl
│ │ │ ├── _journal_diff.tpl
│ │ │ ├── _statement.tpl
│ │ │ ├── _statement_table.tpl
│ │ │ ├── balance_sheet.tpl
│ │ │ ├── graphs.tpl
│ │ │ ├── journal.tpl
│ │ │ ├── ledger.tpl
│ │ │ ├── statement.tpl
│ │ │ └── trial_balance.tpl
│ │ ├── search.tpl
│ │ ├── transactions
│ │ │ ├── _form.tpl
│ │ │ ├── _lines_form.tpl
│ │ │ ├── _pending_message.tpl
│ │ │ ├── action_project.tpl
│ │ │ ├── actions_delete.tpl
│ │ │ ├── creator.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── details.tpl
│ │ │ ├── edit.tpl
│ │ │ ├── lock.tpl
│ │ │ ├── new.tpl
│ │ │ ├── pending.tpl
│ │ │ ├── selector.tpl
│ │ │ ├── service_user.tpl
│ │ │ └── user.tpl
│ │ └── years
│ │ │ ├── _provisional_table.tpl
│ │ │ ├── balance.tpl
│ │ │ ├── close.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── download.tpl
│ │ │ ├── edit.tpl
│ │ │ ├── export.tpl
│ │ │ ├── first_setup.tpl
│ │ │ ├── import.tpl
│ │ │ ├── index.tpl
│ │ │ ├── links.tpl
│ │ │ ├── lock.tpl
│ │ │ ├── new.tpl
│ │ │ ├── provisional.tpl
│ │ │ ├── reopen.tpl
│ │ │ ├── select.tpl
│ │ │ ├── split.tpl
│ │ │ └── unlock.tpl
│ ├── common
│ │ ├── _csv_help.tpl
│ │ ├── _csv_match_columns.tpl
│ │ ├── _sql_table.tpl
│ │ ├── delete_form.tpl
│ │ ├── dynamic_list_head.tpl
│ │ ├── files
│ │ │ ├── _context_list.tpl
│ │ │ ├── _file_render_encrypted.tpl
│ │ │ ├── _preview.tpl
│ │ │ ├── _share_nav.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── edit_code.tpl
│ │ │ ├── edit_web.tpl
│ │ │ ├── history.tpl
│ │ │ ├── history_rename.tpl
│ │ │ ├── rename.tpl
│ │ │ ├── share.tpl
│ │ │ ├── shares_list.tpl
│ │ │ └── upload.tpl
│ │ └── search
│ │ │ ├── advanced.tpl
│ │ │ └── saved_searches.tpl
│ ├── config
│ │ ├── _menu.tpl
│ │ ├── advanced
│ │ │ ├── api.tpl
│ │ │ ├── audit.tpl
│ │ │ ├── errors.tpl
│ │ │ ├── index.tpl
│ │ │ ├── reset.tpl
│ │ │ ├── sql.tpl
│ │ │ └── sql_debug.tpl
│ │ ├── backup
│ │ │ ├── _menu.tpl
│ │ │ ├── auto.tpl
│ │ │ ├── documents.tpl
│ │ │ ├── index.tpl
│ │ │ ├── restore.tpl
│ │ │ ├── versions.tpl
│ │ │ └── versions_delete.tpl
│ │ ├── categories
│ │ │ ├── delete.tpl
│ │ │ ├── edit.tpl
│ │ │ └── index.tpl
│ │ ├── custom.tpl
│ │ ├── desktop.tpl
│ │ ├── disk_usage.tpl
│ │ ├── edit_image.tpl
│ │ ├── ext
│ │ │ ├── _details.tpl
│ │ │ ├── _nav.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── details.tpl
│ │ │ ├── diff.tpl
│ │ │ ├── edit.tpl
│ │ │ ├── import.tpl
│ │ │ ├── index.tpl
│ │ │ └── new.tpl
│ │ ├── fields
│ │ │ ├── delete.tpl
│ │ │ ├── edit.tpl
│ │ │ ├── index.tpl
│ │ │ └── new.tpl
│ │ ├── index.tpl
│ │ ├── server
│ │ │ └── index.tpl
│ │ ├── upgrade.tpl
│ │ └── users
│ │ │ ├── field_selector.tpl
│ │ │ └── index.tpl
│ ├── docs
│ │ ├── _nav.tpl
│ │ ├── action_delete.tpl
│ │ ├── action_move_to_transaction.tpl
│ │ ├── action_zip.tpl
│ │ ├── index.tpl
│ │ ├── move.tpl
│ │ ├── new_dir.tpl
│ │ ├── new_doc.tpl
│ │ ├── new_file.tpl
│ │ ├── search.tpl
│ │ ├── shares.tpl
│ │ ├── trash.tpl
│ │ └── trash_delete.tpl
│ ├── emails
│ │ ├── login_changed.tpl
│ │ ├── password_changed.tpl
│ │ ├── password_recovery.tpl
│ │ └── verify_email.tpl
│ ├── error.tpl
│ ├── index.html
│ ├── index.tpl
│ ├── install.tpl
│ ├── legal.tpl
│ ├── login.tpl
│ ├── login_app.tpl
│ ├── login_otp.tpl
│ ├── me
│ │ ├── _nav.tpl
│ │ ├── _security_confirm_password.tpl
│ │ ├── edit.tpl
│ │ ├── export.tpl
│ │ ├── index.tpl
│ │ ├── preferences.tpl
│ │ ├── security.tpl
│ │ ├── security_otp.tpl
│ │ ├── security_otp_recovery.tpl
│ │ ├── security_password.tpl
│ │ ├── security_pgp.tpl
│ │ └── services.tpl
│ ├── open_db.tpl
│ ├── optout.tpl
│ ├── password.tpl
│ ├── password_change.tpl
│ ├── services
│ │ ├── _nav.tpl
│ │ ├── _service_form.tpl
│ │ ├── delete.tpl
│ │ ├── details.tpl
│ │ ├── edit.tpl
│ │ ├── fees
│ │ │ ├── _fee_form.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── details.tpl
│ │ │ ├── edit.tpl
│ │ │ └── index.tpl
│ │ ├── import.tpl
│ │ ├── index.tpl
│ │ ├── reminders
│ │ │ ├── _form.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── details.tpl
│ │ │ ├── edit.tpl
│ │ │ ├── index.tpl
│ │ │ ├── new.tpl
│ │ │ ├── preview.tpl
│ │ │ └── user.tpl
│ │ └── user
│ │ │ ├── _choice_form.tpl
│ │ │ ├── _service_user_form.tpl
│ │ │ ├── add.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── edit.tpl
│ │ │ ├── index.tpl
│ │ │ ├── link.tpl
│ │ │ ├── payment.tpl
│ │ │ └── subscribe.tpl
│ ├── share.tpl
│ ├── share_password.tpl
│ ├── static
│ │ └── upgrade_post.html
│ ├── users
│ │ ├── _details.tpl
│ │ ├── _import_list.tpl
│ │ ├── _list_actions.tpl
│ │ ├── _log_list.tpl
│ │ ├── _nav.tpl
│ │ ├── _nav_user.tpl
│ │ ├── _password_form.tpl
│ │ ├── action.tpl
│ │ ├── delete.tpl
│ │ ├── details.tpl
│ │ ├── edit.tpl
│ │ ├── edit_security.tpl
│ │ ├── import.tpl
│ │ ├── index.tpl
│ │ ├── log.tpl
│ │ ├── mailing
│ │ │ ├── block.tpl
│ │ │ ├── delete.tpl
│ │ │ ├── details.tpl
│ │ │ ├── index.tpl
│ │ │ ├── new.tpl
│ │ │ ├── recipient_data.tpl
│ │ │ ├── recipients.tpl
│ │ │ ├── rejected.tpl
│ │ │ ├── send.tpl
│ │ │ ├── verify.tpl
│ │ │ └── write.tpl
│ │ ├── message.tpl
│ │ ├── new.tpl
│ │ ├── search.tpl
│ │ └── selector.tpl
│ └── web
│ │ ├── _attach.tpl
│ │ ├── _history.tpl
│ │ ├── _list.tpl
│ │ ├── _page.tpl
│ │ ├── _selector.tpl
│ │ ├── all.tpl
│ │ ├── delete.tpl
│ │ ├── edit.tpl
│ │ ├── index.tpl
│ │ ├── new.tpl
│ │ ├── search.tpl
│ │ └── sitemap.tpl
└── www
│ ├── _route.php
│ ├── admin
│ ├── _inc.php
│ ├── _serviceworker.js
│ ├── acc
│ │ ├── _inc.php
│ │ ├── accounts
│ │ │ ├── all.php
│ │ │ ├── deposit.php
│ │ │ ├── index.php
│ │ │ ├── journal.php
│ │ │ ├── reconcile.php
│ │ │ ├── reconcile_assist.php
│ │ │ ├── simple.php
│ │ │ └── users.php
│ │ ├── charts
│ │ │ ├── accounts
│ │ │ │ ├── _inc.php
│ │ │ │ ├── all.php
│ │ │ │ ├── delete.php
│ │ │ │ ├── edit.php
│ │ │ │ ├── index.php
│ │ │ │ ├── new.php
│ │ │ │ └── selector.php
│ │ │ ├── delete.php
│ │ │ ├── edit.php
│ │ │ ├── export.php
│ │ │ └── index.php
│ │ ├── index.php
│ │ ├── projects
│ │ │ ├── config.php
│ │ │ ├── delete.php
│ │ │ ├── edit.php
│ │ │ └── index.php
│ │ ├── reports
│ │ │ ├── _inc.php
│ │ │ ├── balance_sheet.php
│ │ │ ├── graph_pie.php
│ │ │ ├── graph_plot.php
│ │ │ ├── graph_plot_all.php
│ │ │ ├── graphs.php
│ │ │ ├── journal.php
│ │ │ ├── ledger.php
│ │ │ ├── statement.php
│ │ │ └── trial_balance.php
│ │ ├── saved_searches.php
│ │ ├── search.php
│ │ ├── transactions
│ │ │ ├── actions.php
│ │ │ ├── creator.php
│ │ │ ├── delete.php
│ │ │ ├── details.php
│ │ │ ├── edit.php
│ │ │ ├── lock.php
│ │ │ ├── new.php
│ │ │ ├── pending.php
│ │ │ ├── selector.php
│ │ │ ├── service_user.php
│ │ │ └── user.php
│ │ └── years
│ │ │ ├── balance.php
│ │ │ ├── close.php
│ │ │ ├── delete.php
│ │ │ ├── download.php
│ │ │ ├── edit.php
│ │ │ ├── export.php
│ │ │ ├── first_setup.php
│ │ │ ├── import.php
│ │ │ ├── index.php
│ │ │ ├── links.php
│ │ │ ├── lock.php
│ │ │ ├── new.php
│ │ │ ├── provisional.php
│ │ │ ├── reopen.php
│ │ │ ├── select.php
│ │ │ ├── split.php
│ │ │ └── unlock.php
│ ├── common
│ │ ├── autocomplete_address.php
│ │ ├── files
│ │ │ ├── _preview.php
│ │ │ ├── delete.php
│ │ │ ├── edit.php
│ │ │ ├── history.php
│ │ │ ├── preview.php
│ │ │ ├── rename.php
│ │ │ ├── share.php
│ │ │ ├── shares_list.php
│ │ │ └── upload.php
│ │ ├── saved_searches.php
│ │ └── search.php
│ ├── config
│ │ ├── _inc.php
│ │ ├── advanced
│ │ │ ├── api.php
│ │ │ ├── audit.php
│ │ │ ├── errors.php
│ │ │ ├── index.php
│ │ │ ├── reset.php
│ │ │ ├── sql.php
│ │ │ └── sql_debug.php
│ │ ├── backup
│ │ │ ├── auto.php
│ │ │ ├── documents.php
│ │ │ ├── index.php
│ │ │ ├── restore.php
│ │ │ └── versions.php
│ │ ├── categories
│ │ │ ├── delete.php
│ │ │ ├── edit.php
│ │ │ └── index.php
│ │ ├── custom.php
│ │ ├── desktop.php
│ │ ├── disk_usage.php
│ │ ├── donnees
│ │ │ └── import.php
│ │ ├── edit_file.php
│ │ ├── ext
│ │ │ ├── delete.php
│ │ │ ├── details.php
│ │ │ ├── diff.php
│ │ │ ├── edit.php
│ │ │ ├── import.php
│ │ │ ├── index.php
│ │ │ └── new.php
│ │ ├── fields
│ │ │ ├── delete.php
│ │ │ ├── edit.php
│ │ │ ├── index.php
│ │ │ └── new.php
│ │ ├── index.php
│ │ ├── server
│ │ │ └── index.php
│ │ ├── upgrade.php
│ │ └── users
│ │ │ ├── field_selector.php
│ │ │ └── index.php
│ ├── convert.php
│ ├── docs
│ │ ├── _inc.php
│ │ ├── _move.php
│ │ ├── action.php
│ │ ├── index.php
│ │ ├── move.php
│ │ ├── new_dir.php
│ │ ├── new_doc.php
│ │ ├── new_file.php
│ │ ├── search.php
│ │ ├── shares.php
│ │ └── trash.php
│ ├── handle_bounce.php
│ ├── index.php
│ ├── install.php
│ ├── legal.php
│ ├── login.php
│ ├── login_app.php
│ ├── login_otp.php
│ ├── logout.php
│ ├── manifest.php
│ ├── me
│ │ ├── _inc.php
│ │ ├── edit.php
│ │ ├── export.php
│ │ ├── index.php
│ │ ├── preferences.php
│ │ ├── security.php
│ │ ├── security_otp.php
│ │ ├── security_otp_recovery.php
│ │ ├── security_password.php
│ │ ├── security_pgp.php
│ │ └── services.php
│ ├── open_db.php
│ ├── optout.php
│ ├── password.php
│ ├── services
│ │ ├── _inc.php
│ │ ├── delete.php
│ │ ├── details.php
│ │ ├── edit.php
│ │ ├── fees
│ │ │ ├── delete.php
│ │ │ ├── details.php
│ │ │ ├── edit.php
│ │ │ └── index.php
│ │ ├── import.php
│ │ ├── index.php
│ │ ├── reminders
│ │ │ ├── delete.php
│ │ │ ├── details.php
│ │ │ ├── edit.php
│ │ │ ├── index.php
│ │ │ ├── new.php
│ │ │ ├── preview.php
│ │ │ └── user.php
│ │ └── user
│ │ │ ├── _form.php
│ │ │ ├── add.php
│ │ │ ├── delete.php
│ │ │ ├── edit.php
│ │ │ ├── index.php
│ │ │ ├── link.php
│ │ │ ├── payment.php
│ │ │ └── subscribe.php
│ ├── share.php
│ ├── share_legacy.php
│ ├── static
│ │ ├── admin.css
│ │ ├── bg.png
│ │ ├── bg_dev.png
│ │ ├── doc
│ │ │ ├── api.html
│ │ │ ├── brindille.html
│ │ │ ├── brindille_functions.html
│ │ │ ├── brindille_modifiers.html
│ │ │ ├── brindille_sections.html
│ │ │ ├── keyboard.html
│ │ │ ├── markdown.html
│ │ │ ├── markdown_quickref.html
│ │ │ ├── modules.html
│ │ │ ├── shapes.png
│ │ │ ├── skriv.html
│ │ │ ├── sql.html
│ │ │ └── web.html
│ │ ├── favicon.png
│ │ ├── font
│ │ │ ├── config.json
│ │ │ ├── paheko.css
│ │ │ ├── paheko.eot
│ │ │ ├── paheko.svg
│ │ │ ├── paheko.ttf
│ │ │ ├── paheko.woff
│ │ │ └── paheko.woff2
│ │ ├── handheld.css
│ │ ├── icon.png
│ │ ├── pics
│ │ │ ├── img_center.png
│ │ │ ├── img_flow.png
│ │ │ ├── img_left.png
│ │ │ └── img_right.png
│ │ ├── print.css
│ │ ├── scripts
│ │ │ ├── accounting.js
│ │ │ ├── accounting_setup.js
│ │ │ ├── accounts_list.js
│ │ │ ├── advanced_search.js
│ │ │ ├── auto_logout.js
│ │ │ ├── code_editor.css
│ │ │ ├── code_editor.js
│ │ │ ├── color_helper.js
│ │ │ ├── config_fields.js
│ │ │ ├── dragdrop-table.js
│ │ │ ├── erdiagram.js
│ │ │ ├── file_drag.js
│ │ │ ├── global.js
│ │ │ ├── homescreen.js
│ │ │ ├── inputs
│ │ │ │ ├── datalist.js
│ │ │ │ └── file.js
│ │ │ ├── lib
│ │ │ │ ├── code_editor.js
│ │ │ │ ├── datepicker2.min.js
│ │ │ │ ├── gibberish-aes.min.js
│ │ │ │ ├── query_builder.js
│ │ │ │ ├── text_editor.js
│ │ │ │ ├── unzipit.min.js
│ │ │ │ ├── webdav.css
│ │ │ │ ├── webdav.fr.js
│ │ │ │ └── webdav.js
│ │ │ ├── password.js
│ │ │ ├── selector.js
│ │ │ ├── service_form.js
│ │ │ ├── unzip_restore.js
│ │ │ ├── web_editor.css
│ │ │ ├── web_editor.js
│ │ │ ├── web_encryption.js
│ │ │ ├── web_files.js
│ │ │ ├── web_gallery.js
│ │ │ └── zip.js
│ │ └── styles
│ │ │ ├── 00-reset.css
│ │ │ ├── 01-layout.css
│ │ │ ├── 02-common.css
│ │ │ ├── 03-forms.css
│ │ │ ├── 04-dialogs.css
│ │ │ ├── 05-navigation.css
│ │ │ ├── 06-tables-common.css
│ │ │ ├── 07-tables.css
│ │ │ ├── 10-accounting.css
│ │ │ ├── config.css
│ │ │ ├── tables_export.css
│ │ │ └── web.css
│ ├── upgrade.php
│ ├── users
│ │ ├── _inc.php
│ │ ├── action.php
│ │ ├── delete.php
│ │ ├── details.php
│ │ ├── edit.php
│ │ ├── edit_security.php
│ │ ├── import.php
│ │ ├── index.php
│ │ ├── log.php
│ │ ├── mailing
│ │ │ ├── _inc.php
│ │ │ ├── block.php
│ │ │ ├── delete.php
│ │ │ ├── details.php
│ │ │ ├── index.php
│ │ │ ├── new.php
│ │ │ ├── recipient_data.php
│ │ │ ├── recipients.php
│ │ │ ├── rejected.php
│ │ │ ├── send.php
│ │ │ ├── verify.php
│ │ │ └── write.php
│ │ ├── message.php
│ │ ├── new.php
│ │ ├── saved_searches.php
│ │ ├── search.php
│ │ └── selector.php
│ └── web
│ │ ├── _attach.php
│ │ ├── _inc.php
│ │ ├── _selector.php
│ │ ├── all.php
│ │ ├── delete.php
│ │ ├── edit.php
│ │ ├── index.php
│ │ ├── new.php
│ │ ├── search.php
│ │ └── sitemap.php
│ └── index.php
├── tests
├── phpstan.config.php
├── phpstan.neon
├── psalm.xml
├── run.php
├── selenium
│ ├── Makefile
│ └── paheko.side
└── unit_tests
│ ├── 01_basic
│ ├── db.php
│ ├── entity.php
│ ├── paths.php
│ └── version.php
│ ├── 02_accounting
│ ├── charts.php
│ └── money.php
│ └── 03_api
│ ├── _inc.php
│ ├── accounting.php
│ └── user.php
└── tools
├── build_accounting_chart.php
├── build_address_database_fr.php
├── categories_as_projects.sh
├── compare_chart_csv.php
├── config
└── brindille.sublime-syntax
├── doc_md_to_html.php
├── extract-credit-mutuel-csv.php
├── extract-paypal-csv.php
├── factory
├── config.local.php
├── factory_cron.sh
├── factory_cron_emails.sh
└── factory_upgrade.sh
├── fossil_get_branch_hash.php
├── fossil_verify.sh
├── make_installer.php
└── plugin_check_0.8.php
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | end_of_line = lf
5 | insert_final_newline = true
6 | trim_trailing_whitespace = true
7 | charset = utf-8
8 | indent_style = tab
9 | indent_size = tab
10 | tab_width = 4
11 |
--------------------------------------------------------------------------------
/.fossil-settings/allow-symlinks:
--------------------------------------------------------------------------------
1 | on
--------------------------------------------------------------------------------
/.fossil-settings/ignore-glob:
--------------------------------------------------------------------------------
1 | src/data/*
2 | src/*.tar.gz
3 | src/*.asc
4 | src/*.log
5 | src/include/lib/KD2
6 | src/debug_sql.sqlite
7 | src/modules/*
8 | src/config.local.php
9 | build/windows/*.exe
10 | build/windows/php.zip
11 | build/windows/install_dir
12 | build/*.tar.gz*
13 | build/debian/*.deb
14 | src/psalm.phar
--------------------------------------------------------------------------------
/.fossil-settings/manifest:
--------------------------------------------------------------------------------
1 | on
--------------------------------------------------------------------------------
/.fossil-settings/pgp-command:
--------------------------------------------------------------------------------
1 | gpg -u DA0CE7BF68353D06C57041EE262CAB21E6A19229 --clearsign -o
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: php
2 | php:
3 | - '7.2'
4 | - '7.3'
5 | - '7.4'
6 |
7 | install:
8 | - make -C src deps
9 |
10 | script:
11 | - php tests/run.php
12 |
13 | notifications:
14 | irc:
15 | channels:
16 | - "chat.freenode.net#garradin"
17 | template:
18 | - "%{build_number} by %{author} on %{branch}: %{message} "
19 | - "Build details: %{build_url}"
20 | use_notice: false
21 | skip_join: true
--------------------------------------------------------------------------------
/archives/0.7.2_migration.sql:
--------------------------------------------------------------------------------
1 | -- Colonne manquante
2 | ALTER TABLE rappels_envoyes ADD COLUMN id_rappel INTEGER NULL REFERENCES rappels (id);
3 |
4 | -- Un bug a permis d'insérer des comptes avec des lettres minuscules, créant des problèmes
5 | -- corrigeons donc les comptes pour les mettre en majuscules.
6 |
7 | UPDATE compta_comptes SET id = UPPER(id);
8 |
9 | -- Le champ id_auteur était à NOT NULL, il faut corriger ça pour pouvoir avoir un rapprochement anonyme
10 | -- une fois que le membre a été supprimé
11 |
12 | CREATE TABLE compta_rapprochement2
13 | -- Rapprochement entre compta et relevés de comptes
14 | (
15 | id_operation INTEGER NOT NULL PRIMARY KEY REFERENCES compta_journal (id),
16 | date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
17 | id_auteur INTEGER NULL REFERENCES membres (id)
18 | );
19 |
20 | INSERT INTO compta_rapprochement2 SELECT operation, date, auteur FROM compta_rapprochement;
21 |
22 | DROP TABLE compta_rapprochement;
23 |
24 | ALTER TABLE compta_rapprochement2 RENAME TO compta_rapprochement;
--------------------------------------------------------------------------------
/archives/0.8.3_migration.sql:
--------------------------------------------------------------------------------
1 | -- Ajout d'une clause ON DELETE SET NULL sur la table cotisations
2 | ALTER TABLE cotisations_membres RENAME TO cotisations_membres_old;
3 |
4 | -- Création des tables mises à jour (et de leurs index)
5 | .read 0.8.3_schema.sql
6 |
7 | -- Copie des données
8 | INSERT INTO cotisations_membres SELECT * FROM cotisations_membres_old;
9 |
10 | -- Suppression des anciennes tables
11 | DROP TABLE cotisations_membres_old;
12 |
--------------------------------------------------------------------------------
/archives/0.8.4_migration.sql:
--------------------------------------------------------------------------------
1 | -- Mise à jour des URI du wiki pour ne pas inclure les tirets en début et fin de chaîne
2 | -- (problème de concordance entre API PHP et données SQLite)
3 | UPDATE wiki_pages SET uri = trim(uri, '-') WHERE uri != trim(uri, '-');
4 |
--------------------------------------------------------------------------------
/archives/0.9.1_migration.sql:
--------------------------------------------------------------------------------
1 | -- Il manquait une clause ON DELETE SET NULL sur la foreign key
2 | -- de cotisations quand on faisait une mise à jour depuis une
3 | -- ancienne version
4 | ALTER TABLE cotisations RENAME TO cotisations_old;
5 |
6 | .read 0.9.1_schema.sql
7 |
8 | INSERT INTO cotisations SELECT * FROM cotisations_old;
9 |
10 | DROP TABLE cotisations_old;
11 |
12 | -- Changer le compte des reports automatiques
13 | UPDATE compta_journal SET compte_debit = '890' WHERE compte_debit IS NULL;
14 | UPDATE compta_journal SET compte_credit = '890' WHERE compte_credit IS NULL;
15 |
--------------------------------------------------------------------------------
/build/debian/config.system.php:
--------------------------------------------------------------------------------
1 | NUL
18 |
--------------------------------------------------------------------------------
/build/windows/paheko.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paheko/paheko/1ca7d2b8e8f3bbc3b25c262c7a3194e55f8de5e1/build/windows/paheko.ico
--------------------------------------------------------------------------------
/doc/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paheko/paheko/1ca7d2b8e8f3bbc3b25c262c7a3194e55f8de5e1/doc/icon.png
--------------------------------------------------------------------------------
/doc/selfhost2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paheko/paheko/1ca7d2b8e8f3bbc3b25c262c7a3194e55f8de5e1/doc/selfhost2.png
--------------------------------------------------------------------------------
/src/VERSION:
--------------------------------------------------------------------------------
1 | 1.3.15
2 |
--------------------------------------------------------------------------------
/src/apache-htaccess.conf:
--------------------------------------------------------------------------------
1 |
The requested URL was not found on this server.
-------------------------------------------------------------------------------- /src/include/data/1.1.21_migration.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE services_fees ADD COLUMN id_analytical INTEGER NULL REFERENCES acc_accounts (id) ON DELETE SET NULL; 2 | 3 | UPDATE acc_charts SET code = 'PCA_2018' WHERE code = 'PCA2018'; 4 | UPDATE acc_charts SET code = 'PCA_1999' WHERE code = 'PCA1999'; 5 | -------------------------------------------------------------------------------- /src/include/data/1.1.25_migration.sql: -------------------------------------------------------------------------------- 1 | UPDATE plugins_signaux SET signal = 'home.banner' WHERE signal = 'accueil.banniere'; 2 | UPDATE plugins_signaux SET signal = 'reminder.send.after' WHERE signal = 'rappels.auto'; 3 | UPDATE plugins_signaux SET signal = 'email.send.before' WHERE signal = 'email.envoi'; 4 | -------------------------------------------------------------------------------- /src/include/data/1.1.29_migration.sql: -------------------------------------------------------------------------------- 1 | CREATE TEMP TABLE tmp_new_accounts (id_chart, code, label, position); 2 | 3 | -- Add missing accounts 4 | INSERT INTO tmp_new_accounts (code, label, position) VALUES 5 | ('438', 'Organismes sociaux - Charges à payer et produits à recevoir', 2), 6 | ('4382', 'Charges sociales sur congés à payer', 2), 7 | ('4386', 'Autres charges à payer', 2), 8 | ('4387', 'Produits à recevoir', 2); 9 | 10 | UPDATE tmp_new_accounts SET id_chart = (SELECT id FROM acc_charts WHERE code = 'PCA_2018'); 11 | 12 | INSERT OR IGNORE INTO acc_accounts (id_chart, code, label, position, user) SELECT *, 0 FROM tmp_new_accounts WHERE id_chart IS NOT NULL; 13 | 14 | DROP TABLE tmp_new_accounts; 15 | 16 | CREATE TEMP TABLE IF NOT EXISTS su_fix_fee (id); 17 | 18 | INSERT INTO su_fix_fee 19 | SELECT su.id FROM services_users su LEFT JOIN services_fees sf ON sf.id = su.id_fee AND sf.id_service = sf.id_service 20 | WHERE sf.id IS NULL AND su.id_fee IS NOT NULL; 21 | 22 | -- Remove id_fee from subscriptions where it belongs to another service 23 | UPDATE services_users SET id_fee = NULL WHERE id IN (SELECT id FROM su_fix_fee); -------------------------------------------------------------------------------- /src/include/data/schema.sql: -------------------------------------------------------------------------------- 1 | ../migrations/1.3/schema.sql -------------------------------------------------------------------------------- /src/include/lib/Paheko/Web/Render/Encrypted.php: -------------------------------------------------------------------------------- 1 | assign('admin_url', ADMIN_URL); 15 | $tpl->assign(compact('content')); 16 | return $tpl->fetch('common/files/_file_render_encrypted.tpl'); 17 | } 18 | 19 | public function outputHTML(string $content): string 20 | { 21 | return $content; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/include/lib/Paheko/Web/Render/Skriv.php: -------------------------------------------------------------------------------- 1 | resolveAttachment($match[1]); 23 | return $a ? $a->url() : $match[1]; 24 | }, $str); 25 | 26 | if (!isset(self::$skriv)) { 27 | self::$skriv = new SkrivLite; 28 | 29 | self::$skriv->registerExtensions(Extensions::getList()); 30 | } 31 | 32 | Extensions::setRenderer($this); 33 | 34 | $str = CommonModifiers::typo($str); 35 | $str = self::$skriv->render($str); 36 | 37 | return $str; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.10.sql: -------------------------------------------------------------------------------- 1 | UPDATE config_users_fields 2 | SET type = 'textarea', system = system | (0x01 << 6) 3 | WHERE name = 'adresse' AND (system & (0x01 << 5)); -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.11.php: -------------------------------------------------------------------------------- 1 | reload(); 10 | $df->rebuildSearchTable(); 11 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.13.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE searches RENAME COLUMN created TO updated; 2 | ALTER TABLE searches ADD COLUMN description TEXT NULL; 3 | 4 | INSERT INTO config (key, value) VALUES ('analytical_mandatory', 0); 5 | 6 | -- Put 580 account into "internal" 7 | UPDATE acc_accounts SET type = 16 WHERE code = '580'; 8 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.14.sql: -------------------------------------------------------------------------------- 1 | CREATE INDEX IF NOT EXISTS acc_transactions_creator ON acc_transactions (id_creator); 2 | 3 | CREATE TABLE IF NOT EXISTS acc_years_provisional 4 | -- Provisional (prévisionnel) 5 | ( 6 | id_year INTEGER NOT NULL REFERENCES acc_years (id) ON DELETE CASCADE, 7 | id_account INTEGER NOT NULL REFERENCES acc_accounts (id) ON DELETE CASCADE, 8 | amount INTEGER NOT NULL 9 | ); 10 | 11 | CREATE UNIQUE INDEX IF NOT EXISTS acc_years_provisional_id_year ON acc_years_provisional (id_year, id_account); 12 | 13 | UPDATE acc_charts SET label = 'Plan comptable associatif (2018, révision 2024)' WHERE code = 'fr_pca_2018'; 14 | UPDATE acc_charts SET label = 'Plan comptable général, pour entreprises (2014, révision 2024)' WHERE code = 'fr_pcg_2014'; 15 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.14_recus.sql: -------------------------------------------------------------------------------- 1 | -- In previous version of reçus fiscaux, the transaction ID 2 | -- was saved in id_year instead of the real year ID, let's try to fix this 3 | CREATE TEMP TABLE recus_years (id, id_year); 4 | 5 | INSERT INTO recus_years 6 | SELECT r.id, t.id_year 7 | FROM module_data_recus_fiscaux r 8 | LEFT JOIN acc_years y ON y.id = json_extract(r.document, '$.id_year') 9 | LEFT JOIN acc_transactions t ON t.id = json_extract(r.document, '$.id_year') 10 | WHERE 11 | json_extract(r.document, '$.id_year') IS NOT NULL 12 | AND y.id IS NULL; 13 | 14 | UPDATE module_data_recus_fiscaux AS m 15 | SET document = json_patch(document, json_object('id_year', (SELECT id_year FROM recus_years WHERE id = m.id))) 16 | WHERE EXISTS(SELECT id FROM recus_years WHERE id = m.id); 17 | 18 | DROP TABLE recus_years; 19 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.2.sql: -------------------------------------------------------------------------------- 1 | UPDATE config_users_fields SET default_value = 'NOW()' WHERE default_value = '''=NOW''' OR default_value = '=NOW'; 2 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.5.sql: -------------------------------------------------------------------------------- 1 | CREATE VIEW IF NOT EXISTS users_view AS SELECT * FROM users; 2 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.8.php: -------------------------------------------------------------------------------- 1 | rebuildSearchTable(); 16 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.8.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE acc_charts RENAME TO acc_charts_old; 2 | 3 | -- Make country code nullable 4 | CREATE TABLE IF NOT EXISTS acc_charts 5 | -- Accounting charts (plans comptables) 6 | ( 7 | id INTEGER NOT NULL PRIMARY KEY, 8 | country TEXT NULL, 9 | code TEXT NULL, -- the code is NULL if the chart is user-created or imported 10 | label TEXT NOT NULL, 11 | archived INTEGER NOT NULL DEFAULT 0 -- 1 = archived, cannot be changed 12 | ); 13 | 14 | INSERT INTO acc_charts SELECT * FROM acc_charts_old; 15 | DROP TABLE acc_charts_old; 16 | 17 | UPDATE files_search 18 | SET title = (SELECT title FROM web_pages WHERE path = 'web/' || uri) 19 | WHERE EXISTS (SELECT title FROM web_pages WHERE path = 'web/' || uri); 20 | 21 | UPDATE config SET value = NULL WHERE value = '' AND key IN ('color1', 'color2'); 22 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.9.php: -------------------------------------------------------------------------------- 1 | getLocalFile($name)) { 14 | $text = $file->fetch(); 15 | $replaced = preg_replace('/(?setContent($replaced); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/include/migrations/1.3/1.3.9.sql: -------------------------------------------------------------------------------- 1 | CREATE INDEX IF NOT EXISTS plugins_menu ON plugins(menu, enabled); 2 | CREATE INDEX IF NOT EXISTS modules_menu ON modules(menu, enabled); 3 | -------------------------------------------------------------------------------- /src/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |Paheko n'est pas installé sur un sous-domaine dédié.
5 |Ce mode de fonctionnement n'est pas supporté officiellement.
6 | 7 |Le mode conseillé est de positionner un sous-domaine dédié (virtual host ou vhost) sur le répertoire www/
9 |Voir la documentation.
10 | 11 |Voir la documentation dédiée pour configurer Paheko correctement et faire disparaître ce message d'erreur.
-------------------------------------------------------------------------------- /src/templates/_foot.tpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | {if $is_logged} 4 | {* Keep session alive by requesting renewal every before it expires *} 5 | 21 | {/if} 22 | 23 | 26 | 27 | {if $layout === 'public'} 28 | 33 | {/if} 34 | 35 |