From f5f3c4d623d668e183b828e9df955107f1ded75e Mon Sep 17 00:00:00 2001 From: Velz2020 Date: Fri, 1 Oct 2021 23:34:16 +0530 Subject: [PATCH] LIVE SERVER CODE MOVED --- .../no_image.jpg => application/.DS_Store | Bin 7888 -> 6148 bytes application/language/english/ip_lang.php | 96 +- application/logs/.gitignore | 3 - application/logs/index.html | 10 - application/modules/.DS_Store | Bin 0 -> 6148 bytes .../modules/clients/controllers/Clients.php | 2 + .../modules/clients/models/Mdl_clients.php | 1 + .../clients/views/partial_client_table.php | 11 +- .../models/Mdl_invoice_custom.php | 31 +- .../dashboard/controllers/Dashboard.php | 32 +- application/modules/dashboard/views/index.php | 375 +- .../modules/invoices/controllers/Ajax.php | 661 +- .../modules/invoices/controllers/Invoices.php | 373 +- .../invoices/models/Mdl_invoice_tax_rates.php | 21 + .../modules/invoices/models/Mdl_invoices.php | 85 +- .../invoices/models/Mdl_item_amounts.php | 19 +- .../modules/invoices/models/Mdl_items.php | 267 +- .../modules/invoices/models/Mdl_reports.php | 1488 + application/modules/invoices/models/view.php | 787 + .../invoices/views/partial_item_table.php | 1200 +- application/modules/invoices/views/view.php | 796 +- .../modules/invoices/views/view_asn.php | 600 + .../modules/invoices_1/controllers/Ajax.php | 913 + .../modules/invoices_1/controllers/Cron.php | 125 + .../invoices_1/controllers/Invoices.php | 480 + .../invoices_1/controllers/Recurring.php | 60 + .../invoices_1/models/Mdl_invoice_amounts.php | 407 + .../invoices_1/models/Mdl_invoice_sumex.php | 83 + .../models/Mdl_invoice_tax_rates.php | 96 + .../invoices_1/models/Mdl_invoices.php | 973 + .../models/Mdl_invoices_recurring.php | 135 + .../invoices_1/models/Mdl_item_amounts.php | 83 + .../modules/invoices_1/models/Mdl_items.php | 501 + .../modules/invoices_1/models/Mdl_reports.php | 1488 + .../invoices_1/models/Mdl_templates.php | 70 + .../modules/invoices_1/models/view.php | 787 + .../modules/invoices_1/views/archive.php | 24 + .../modules/invoices_1/views/index.php | 93 + .../modules/invoices_1/views/index_client.php | 38 + .../invoices_1/views/index_recurring.php | 89 + .../views/modal_add_invoice_tax.php | 66 + .../invoices_1/views/modal_change_client.php | 65 + .../invoices_1/views/modal_copy_invoice.php | 129 + .../invoices_1/views/modal_create_credit.php | 110 + .../invoices_1/views/modal_create_invoice.php | 120 + .../views/modal_create_recurring.php | 109 + .../invoices_1/views/modal_delete_invoice.php | 36 + .../views/partial_invoice_archive.php | 31 + .../views/partial_invoice_table.php | 136 + .../invoices_1/views/partial_item_table.php | 868 + application/modules/invoices_1/views/view.php | 1008 + .../modules/invoices_1/views/view_sumex.php | 752 + .../modules/layout/views/includes/navbar.php | 53 +- .../modules/layout/views/includes/sidebar.php | 21 +- .../modules/payments/controllers/Payments.php | 529 +- .../modules/payments/models/Mdl_payments.php | 298 +- .../modules/payments/views/editform.php | 273 + application/modules/payments/views/form.php | 840 +- .../payments/views/partial_payment_table.php | 40 +- .../modules/payments/views/paymentslip.php | 249 + .../modules/products/models/Mdl_products.php | 29 +- application/modules/products/views/form.php | 88 + .../modules/quotes/controllers/Ajax.php | 161 +- .../modules/quotes/controllers/Quotes.php | 56 +- .../quotes/models/Mdl_quote_item_amounts.php | 15 +- .../modules/quotes/models/Mdl_quote_items.php | 45 +- .../modules/quotes/models/Mdl_quotes.php | 116 +- .../modules/quotes/views/invoice_details.php | 121 + .../quotes/views/modal_create_quote.php | 2 +- .../quotes/views/partial_item_table.php | 817 +- .../quotes/views/partial_quote_table.php | 49 + .../modules/quotes/views/partialitemq.php | 803 + .../modules/quotes/views/quotes_to_polist.php | 59 + application/modules/quotes/views/view.php | 110 +- application/modules/reports/.DS_Store | Bin 0 -> 6148 bytes .../modules/reports/controllers/Reports.php | 554 +- .../modules/reports/models/Mdl_reports.php | 940 +- application/modules/reports/views/Reports.php | 545 + .../modules/reports/views/all_invoice.php | 364 + .../reports/views/consolidate_sales.php | 726 + .../reports/views/cumulative_report.php | 300 + .../reports/views/cumulative_report_day.php | 197 + .../reports/views/cumulative_report_month.php | 200 + .../reports/views/cumulative_report_year.php | 237 + .../modules/reports/views/customer_wise.php | 338 + .../modules/reports/views/deliver_perform.php | 324 + .../modules/reports/views/gstin_wise.php | 411 + application/modules/reports/views/hsn_san.php | 338 + .../modules/reports/views/hsn_wise.php | 364 + .../reports/views/invoice_aging_index.php | 167 +- .../modules/reports/views/month_wise.php | 154 + .../reports/views/payment_history_index.php | 91 +- application/modules/reports/views/sales.php | 488 + .../reports/views/sales_by_client_index.php | 329 +- .../reports/views/sales_by_year_index.php | 194 +- .../modules/reports/views/year_wise.php | 221 + .../modules/reports/views/year_wise_total.php | 152 + .../modules/sessions/models/Mdl_sessions.php | 28 +- application/modules/tax_rates/views/index.php | 2 +- .../modules/upload/controllers/Upload.php | 2 +- .../upload/views/dropzone-invoice-html.php | 12 +- .../upload/views/dropzone-quote-html.php | 24 +- application/views/.DS_Store | Bin 0 -> 6148 bytes application/views/invoice_templates/.DS_Store | Bin 0 -> 6148 bytes application/views/invoice_templates/pdf.zip | Bin 0 -> 893824 bytes application/views/reports/invoice_aging.php | 114 +- application/views/reports/sales_by_client.php | 93 +- application/views/reports/sales_by_year.php | 185 +- application/views/reports/year_wise_pdf.php | 76 + assets/core/img/favicon.png | Bin 4125 -> 1150 bytes assets/core/img/favicon_old.png | Bin 0 -> 1408 bytes index.php | 5 +- php_errorlog | 43 +- uploads/.gitignore | 6 - uploads/archive/.gitignore | 2 - uploads/customer_files/.gitignore | 3 - uploads/customer_files/.htaccess | 2 - uploads/import/.gitignore | 2 - uploads/temp/.gitignore | 4 - uploads/temp/.htaccess | 4 - uploads/temp/mpdf/.gitignore | 2 - vendor_old/autoload.php | 7 - .../codeigniter/framework/system/.htaccess | 6 - .../framework/system/core/Benchmark.php | 133 - .../framework/system/core/CodeIgniter.php | 559 - .../framework/system/core/Common.php | 849 - .../framework/system/core/Config.php | 379 - .../framework/system/core/Controller.php | 96 - .../framework/system/core/Exceptions.php | 274 - .../framework/system/core/Hooks.php | 266 - .../framework/system/core/Input.php | 895 - .../framework/system/core/Lang.php | 203 - .../framework/system/core/Loader.php | 1411 - .../codeigniter/framework/system/core/Log.php | 296 - .../framework/system/core/Model.php | 80 - .../framework/system/core/Output.php | 849 - .../framework/system/core/Router.php | 515 - .../framework/system/core/Security.php | 1080 - .../codeigniter/framework/system/core/URI.php | 643 - .../framework/system/core/Utf8.php | 164 - .../framework/system/core/compat/hash.php | 254 - .../framework/system/core/compat/index.html | 11 - .../framework/system/core/compat/mbstring.php | 149 - .../framework/system/core/compat/password.php | 251 - .../framework/system/core/compat/standard.php | 182 - .../framework/system/core/index.html | 11 - .../framework/system/database/DB.php | 218 - .../framework/system/database/DB_cache.php | 221 - .../framework/system/database/DB_driver.php | 1986 -- .../framework/system/database/DB_forge.php | 1032 - .../system/database/DB_query_builder.php | 2805 -- .../framework/system/database/DB_result.php | 666 - .../framework/system/database/DB_utility.php | 424 - .../database/drivers/cubrid/cubrid_driver.php | 405 - .../database/drivers/cubrid/cubrid_forge.php | 230 - .../database/drivers/cubrid/cubrid_result.php | 177 - .../drivers/cubrid/cubrid_utility.php | 79 - .../system/database/drivers/cubrid/index.html | 11 - .../database/drivers/ibase/ibase_driver.php | 413 - .../database/drivers/ibase/ibase_forge.php | 251 - .../database/drivers/ibase/ibase_result.php | 161 - .../database/drivers/ibase/ibase_utility.php | 69 - .../system/database/drivers/ibase/index.html | 11 - .../system/database/drivers/index.html | 11 - .../system/database/drivers/mssql/index.html | 11 - .../database/drivers/mssql/mssql_driver.php | 518 - .../database/drivers/mssql/mssql_forge.php | 151 - .../database/drivers/mssql/mssql_result.php | 198 - .../database/drivers/mssql/mssql_utility.php | 77 - .../system/database/drivers/mysql/index.html | 11 - .../database/drivers/mysql/mysql_driver.php | 494 - .../database/drivers/mysql/mysql_forge.php | 243 - .../database/drivers/mysql/mysql_result.php | 199 - .../database/drivers/mysql/mysql_utility.php | 211 - .../system/database/drivers/mysqli/index.html | 11 - .../database/drivers/mysqli/mysqli_driver.php | 544 - .../database/drivers/mysqli/mysqli_forge.php | 244 - .../database/drivers/mysqli/mysqli_result.php | 186 - .../drivers/mysqli/mysqli_utility.php | 213 - .../system/database/drivers/oci8/index.html | 11 - .../database/drivers/oci8/oci8_driver.php | 688 - .../database/drivers/oci8/oci8_forge.php | 187 - .../database/drivers/oci8/oci8_result.php | 229 - .../database/drivers/oci8/oci8_utility.php | 68 - .../system/database/drivers/odbc/index.html | 11 - .../database/drivers/odbc/odbc_driver.php | 425 - .../database/drivers/odbc/odbc_forge.php | 86 - .../database/drivers/odbc/odbc_result.php | 268 - .../database/drivers/odbc/odbc_utility.php | 63 - .../system/database/drivers/pdo/index.html | 11 - .../database/drivers/pdo/pdo_driver.php | 329 - .../system/database/drivers/pdo/pdo_forge.php | 65 - .../database/drivers/pdo/pdo_result.php | 198 - .../database/drivers/pdo/pdo_utility.php | 63 - .../drivers/pdo/subdrivers/index.html | 11 - .../drivers/pdo/subdrivers/pdo_4d_driver.php | 200 - .../drivers/pdo/subdrivers/pdo_4d_forge.php | 217 - .../pdo/subdrivers/pdo_cubrid_driver.php | 209 - .../pdo/subdrivers/pdo_cubrid_forge.php | 230 - .../pdo/subdrivers/pdo_dblib_driver.php | 337 - .../pdo/subdrivers/pdo_dblib_forge.php | 149 - .../pdo/subdrivers/pdo_firebird_driver.php | 279 - .../pdo/subdrivers/pdo_firebird_forge.php | 237 - .../drivers/pdo/subdrivers/pdo_ibm_driver.php | 244 - .../drivers/pdo/subdrivers/pdo_ibm_forge.php | 154 - .../pdo/subdrivers/pdo_informix_driver.php | 309 - .../pdo/subdrivers/pdo_informix_forge.php | 163 - .../pdo/subdrivers/pdo_mysql_driver.php | 374 - .../pdo/subdrivers/pdo_mysql_forge.php | 256 - .../drivers/pdo/subdrivers/pdo_oci_driver.php | 326 - .../drivers/pdo/subdrivers/pdo_oci_forge.php | 176 - .../pdo/subdrivers/pdo_odbc_driver.php | 229 - .../drivers/pdo/subdrivers/pdo_odbc_forge.php | 70 - .../pdo/subdrivers/pdo_pgsql_driver.php | 384 - .../pdo/subdrivers/pdo_pgsql_forge.php | 210 - .../pdo/subdrivers/pdo_sqlite_driver.php | 219 - .../pdo/subdrivers/pdo_sqlite_forge.php | 238 - .../pdo/subdrivers/pdo_sqlsrv_driver.php | 369 - .../pdo/subdrivers/pdo_sqlsrv_forge.php | 149 - .../database/drivers/postgre/index.html | 11 - .../drivers/postgre/postgre_driver.php | 620 - .../drivers/postgre/postgre_forge.php | 205 - .../drivers/postgre/postgre_result.php | 182 - .../drivers/postgre/postgre_utility.php | 78 - .../system/database/drivers/sqlite/index.html | 11 - .../database/drivers/sqlite/sqlite_driver.php | 330 - .../database/drivers/sqlite/sqlite_forge.php | 205 - .../database/drivers/sqlite/sqlite_result.php | 164 - .../drivers/sqlite/sqlite_utility.php | 61 - .../database/drivers/sqlite3/index.html | 11 - .../drivers/sqlite3/sqlite3_driver.php | 350 - .../drivers/sqlite3/sqlite3_forge.php | 225 - .../drivers/sqlite3/sqlite3_result.php | 194 - .../drivers/sqlite3/sqlite3_utility.php | 61 - .../system/database/drivers/sqlsrv/index.html | 11 - .../database/drivers/sqlsrv/sqlsrv_driver.php | 543 - .../database/drivers/sqlsrv/sqlsrv_forge.php | 149 - .../database/drivers/sqlsrv/sqlsrv_result.php | 193 - .../drivers/sqlsrv/sqlsrv_utility.php | 77 - .../framework/system/database/index.html | 11 - .../framework/system/fonts/index.html | 11 - .../framework/system/fonts/texb.ttf | Bin 143830 -> 0 bytes .../framework/system/helpers/array_helper.php | 115 - .../system/helpers/captcha_helper.php | 341 - .../system/helpers/cookie_helper.php | 113 - .../framework/system/helpers/date_helper.php | 742 - .../system/helpers/directory_helper.php | 101 - .../system/helpers/download_helper.php | 158 - .../framework/system/helpers/email_helper.php | 84 - .../framework/system/helpers/file_helper.php | 453 - .../framework/system/helpers/form_helper.php | 1061 - .../framework/system/helpers/html_helper.php | 410 - .../framework/system/helpers/index.html | 11 - .../system/helpers/inflector_helper.php | 275 - .../system/helpers/language_helper.php | 75 - .../system/helpers/number_helper.php | 94 - .../framework/system/helpers/path_helper.php | 82 - .../system/helpers/security_helper.php | 137 - .../system/helpers/smiley_helper.php | 255 - .../system/helpers/string_helper.php | 304 - .../framework/system/helpers/text_helper.php | 567 - .../system/helpers/typography_helper.php | 104 - .../framework/system/helpers/url_helper.php | 569 - .../framework/system/helpers/xml_helper.php | 90 - .../codeigniter/framework/system/index.html | 11 - .../system/language/english/calendar_lang.php | 84 - .../system/language/english/date_lang.php | 94 - .../system/language/english/db_lang.php | 63 - .../system/language/english/email_lang.php | 58 - .../language/english/form_validation_lang.php | 68 - .../system/language/english/ftp_lang.php | 51 - .../system/language/english/imglib_lang.php | 57 - .../system/language/english/index.html | 11 - .../language/english/migration_lang.php | 47 - .../system/language/english/number_lang.php | 44 - .../language/english/pagination_lang.php | 43 - .../system/language/english/profiler_lang.php | 60 - .../language/english/unit_test_lang.php | 58 - .../system/language/english/upload_lang.php | 55 - .../framework/system/language/index.html | 11 - .../system/libraries/Cache/Cache.php | 255 - .../libraries/Cache/drivers/Cache_apc.php | 221 - .../libraries/Cache/drivers/Cache_dummy.php | 172 - .../libraries/Cache/drivers/Cache_file.php | 286 - .../Cache/drivers/Cache_memcached.php | 303 - .../libraries/Cache/drivers/Cache_redis.php | 328 - .../Cache/drivers/Cache_wincache.php | 217 - .../system/libraries/Cache/drivers/index.html | 11 - .../system/libraries/Cache/index.html | 11 - .../framework/system/libraries/Calendar.php | 546 - .../framework/system/libraries/Cart.php | 567 - .../framework/system/libraries/Driver.php | 342 - .../framework/system/libraries/Email.php | 2474 -- .../framework/system/libraries/Encrypt.php | 521 - .../framework/system/libraries/Encryption.php | 943 - .../system/libraries/Form_validation.php | 1584 - .../framework/system/libraries/Ftp.php | 667 - .../framework/system/libraries/Image_lib.php | 1839 - .../framework/system/libraries/Javascript.php | 856 - .../system/libraries/Javascript/Jquery.php | 1076 - .../system/libraries/Javascript/index.html | 11 - .../framework/system/libraries/Migration.php | 477 - .../framework/system/libraries/Pagination.php | 701 - .../framework/system/libraries/Parser.php | 248 - .../framework/system/libraries/Profiler.php | 562 - .../system/libraries/Session/Session.php | 985 - .../Session/SessionHandlerInterface.php | 59 - .../libraries/Session/Session_driver.php | 191 - .../drivers/Session_database_driver.php | 420 - .../Session/drivers/Session_files_driver.php | 406 - .../drivers/Session_memcached_driver.php | 375 - .../Session/drivers/Session_redis_driver.php | 395 - .../libraries/Session/drivers/index.html | 11 - .../system/libraries/Session/index.html | 11 - .../framework/system/libraries/Table.php | 538 - .../framework/system/libraries/Trackback.php | 556 - .../framework/system/libraries/Typography.php | 424 - .../framework/system/libraries/Unit_test.php | 406 - .../framework/system/libraries/Upload.php | 1328 - .../framework/system/libraries/User_agent.php | 681 - .../framework/system/libraries/Xmlrpc.php | 1920 - .../framework/system/libraries/Xmlrpcs.php | 625 - .../framework/system/libraries/Zip.php | 532 - .../framework/system/libraries/index.html | 11 - vendor_old/composer/ClassLoader.php | 445 - vendor_old/composer/LICENSE | 21 - vendor_old/composer/autoload_classmap.php | 30 - vendor_old/composer/autoload_files.php | 15 - vendor_old/composer/autoload_namespaces.php | 12 - vendor_old/composer/autoload_psr4.php | 42 - vendor_old/composer/autoload_real.php | 70 - vendor_old/composer/autoload_static.php | 259 - vendor_old/composer/installed.json | 2643 -- vendor_old/guzzle/guzzle/.gitignore | 27 - vendor_old/guzzle/guzzle/.travis.yml | 17 - vendor_old/guzzle/guzzle/CHANGELOG.md | 751 - vendor_old/guzzle/guzzle/LICENSE | 19 - vendor_old/guzzle/guzzle/README.md | 57 - vendor_old/guzzle/guzzle/UPGRADING.md | 537 - vendor_old/guzzle/guzzle/build.xml | 45 - vendor_old/guzzle/guzzle/composer.json | 82 - vendor_old/guzzle/guzzle/docs/Makefile | 153 - .../docs/_downloads/guzzle-schema-1.0.json | 176 - .../guzzle/docs/_static/guzzle-icon.png | Bin 803 -> 0 bytes .../guzzle/guzzle/docs/_static/homepage.css | 122 - .../guzzle/guzzle/docs/_static/logo.png | Bin 247678 -> 0 bytes .../guzzle/guzzle/docs/_static/prettify.css | 41 - .../guzzle/guzzle/docs/_static/prettify.js | 28 - .../guzzle/guzzle/docs/_templates/index.html | 106 - .../guzzle/docs/_templates/leftbar.html | 0 .../guzzle/docs/_templates/nav_links.html | 5 - .../guzzle/guzzle/docs/batching/batching.rst | 183 - vendor_old/guzzle/guzzle/docs/conf.py | 94 - vendor_old/guzzle/guzzle/docs/docs.rst | 73 - .../guzzle/docs/getting-started/faq.rst | 29 - .../docs/getting-started/installation.rst | 154 - .../guzzle/docs/getting-started/overview.rst | 85 - .../guzzle/guzzle/docs/http-client/client.rst | 569 - .../guzzle/docs/http-client/entity-bodies.rst | 151 - .../docs/http-client/http-redirects.rst | 99 - .../guzzle/docs/http-client/request.rst | 667 - .../guzzle/docs/http-client/response.rst | 141 - .../guzzle/docs/http-client/uri-templates.rst | 52 - vendor_old/guzzle/guzzle/docs/index.rst | 5 - .../docs/iterators/guzzle-iterators.rst | 97 - .../docs/iterators/resource-iterators.rst | 149 - .../guzzle/docs/plugins/async-plugin.rst | 18 - .../guzzle/docs/plugins/backoff-plugin.rst | 22 - .../guzzle/docs/plugins/cache-plugin.rst | 169 - .../guzzle/docs/plugins/cookie-plugin.rst | 33 - .../guzzle/docs/plugins/creating-plugins.rst | 93 - .../guzzle/docs/plugins/curl-auth-plugin.rst | 32 - .../guzzle/docs/plugins/history-plugin.rst | 24 - .../guzzle/guzzle/docs/plugins/log-plugin.rst | 69 - .../docs/plugins/md5-validator-plugin.rst | 29 - .../guzzle/docs/plugins/mock-plugin.rst | 27 - .../guzzle/docs/plugins/oauth-plugin.rst | 30 - .../guzzle/docs/plugins/plugins-list.rst.inc | 9 - .../guzzle/docs/plugins/plugins-overview.rst | 59 - .../guzzle/guzzle/docs/requirements.txt | 2 - .../guzzle/docs/testing/unit-testing.rst | 201 - .../guzzle-service-descriptions.rst | 619 - .../using-the-service-builder.rst | 316 - .../webservice-client/webservice-client.rst | 659 - vendor_old/guzzle/guzzle/phar-stub.php | 16 - .../guzzle/guzzle/phing/build.properties.dist | 16 - .../guzzle/phing/imports/dependencies.xml | 33 - .../guzzle/guzzle/phing/imports/deploy.xml | 142 - .../guzzle/phing/tasks/ComposerLintTask.php | 152 - .../phing/tasks/GuzzlePearPharPackageTask.php | 338 - .../guzzle/phing/tasks/GuzzleSubSplitTask.php | 385 - vendor_old/guzzle/guzzle/phpunit.xml.dist | 48 - .../Guzzle/Batch/AbstractBatchDecorator.php | 66 - .../guzzle/guzzle/src/Guzzle/Batch/Batch.php | 92 - .../guzzle/src/Guzzle/Batch/BatchBuilder.php | 199 - .../src/Guzzle/Batch/BatchClosureDivisor.php | 39 - .../src/Guzzle/Batch/BatchClosureTransfer.php | 40 - .../src/Guzzle/Batch/BatchCommandTransfer.php | 75 - .../Guzzle/Batch/BatchDivisorInterface.php | 18 - .../src/Guzzle/Batch/BatchInterface.php | 32 - .../src/Guzzle/Batch/BatchRequestTransfer.php | 65 - .../src/Guzzle/Batch/BatchSizeDivisor.php | 47 - .../Guzzle/Batch/BatchTransferInterface.php | 16 - .../Exception/BatchTransferException.php | 90 - .../Guzzle/Batch/ExceptionBufferingBatch.php | 50 - .../guzzle/src/Guzzle/Batch/FlushingBatch.php | 60 - .../guzzle/src/Guzzle/Batch/HistoryBatch.php | 39 - .../src/Guzzle/Batch/NotifyingBatch.php | 38 - .../guzzle/src/Guzzle/Batch/composer.json | 31 - .../src/Guzzle/Cache/AbstractCacheAdapter.php | 21 - .../src/Guzzle/Cache/CacheAdapterFactory.php | 117 - .../Guzzle/Cache/CacheAdapterInterface.php | 55 - .../src/Guzzle/Cache/ClosureCacheAdapter.php | 57 - .../src/Guzzle/Cache/DoctrineCacheAdapter.php | 41 - .../src/Guzzle/Cache/NullCacheAdapter.php | 31 - .../src/Guzzle/Cache/Zf1CacheAdapter.php | 44 - .../src/Guzzle/Cache/Zf2CacheAdapter.php | 41 - .../guzzle/src/Guzzle/Cache/composer.json | 27 - .../Guzzle/Common/AbstractHasDispatcher.php | 49 - .../guzzle/src/Guzzle/Common/Collection.php | 403 - .../guzzle/guzzle/src/Guzzle/Common/Event.php | 52 - .../Exception/BadMethodCallException.php | 5 - .../Common/Exception/ExceptionCollection.php | 108 - .../Common/Exception/GuzzleException.php | 8 - .../Exception/InvalidArgumentException.php | 5 - .../Common/Exception/RuntimeException.php | 5 - .../Exception/UnexpectedValueException.php | 5 - .../src/Guzzle/Common/FromConfigInterface.php | 18 - .../Guzzle/Common/HasDispatcherInterface.php | 54 - .../src/Guzzle/Common/ToArrayInterface.php | 16 - .../guzzle/src/Guzzle/Common/Version.php | 29 - .../guzzle/src/Guzzle/Common/composer.json | 20 - .../Http/AbstractEntityBodyDecorator.php | 221 - .../src/Guzzle/Http/CachingEntityBody.php | 229 - .../guzzle/guzzle/src/Guzzle/Http/Client.php | 524 - .../src/Guzzle/Http/ClientInterface.php | 223 - .../src/Guzzle/Http/Curl/CurlHandle.php | 464 - .../guzzle/src/Guzzle/Http/Curl/CurlMulti.php | 423 - .../Guzzle/Http/Curl/CurlMultiInterface.php | 58 - .../src/Guzzle/Http/Curl/CurlMultiProxy.php | 150 - .../src/Guzzle/Http/Curl/CurlVersion.php | 66 - .../src/Guzzle/Http/Curl/RequestMediator.php | 147 - .../guzzle/src/Guzzle/Http/EntityBody.php | 201 - .../src/Guzzle/Http/EntityBodyInterface.php | 73 - .../Http/Exception/BadResponseException.php | 69 - .../ClientErrorResponseException.php | 8 - .../CouldNotRewindStreamException.php | 7 - .../Guzzle/Http/Exception/CurlException.php | 101 - .../Guzzle/Http/Exception/HttpException.php | 10 - .../Http/Exception/MultiTransferException.php | 145 - .../Http/Exception/RequestException.php | 39 - .../ServerErrorResponseException.php | 8 - .../Exception/TooManyRedirectsException.php | 5 - .../src/Guzzle/Http/IoEmittingEntityBody.php | 83 - .../Guzzle/Http/Message/AbstractMessage.php | 220 - .../Http/Message/EntityEnclosingRequest.php | 247 - .../EntityEnclosingRequestInterface.php | 137 - .../guzzle/src/Guzzle/Http/Message/Header.php | 182 - .../Http/Message/Header/CacheControl.php | 121 - .../Http/Message/Header/HeaderCollection.php | 108 - .../Http/Message/Header/HeaderFactory.php | 26 - .../Message/Header/HeaderFactoryInterface.php | 19 - .../Http/Message/Header/HeaderInterface.php | 83 - .../src/Guzzle/Http/Message/Header/Link.php | 93 - .../Guzzle/Http/Message/MessageInterface.php | 102 - .../src/Guzzle/Http/Message/PostFile.php | 124 - .../Guzzle/Http/Message/PostFileInterface.php | 83 - .../src/Guzzle/Http/Message/Request.php | 638 - .../Guzzle/Http/Message/RequestFactory.php | 359 - .../Http/Message/RequestFactoryInterface.php | 105 - .../Guzzle/Http/Message/RequestInterface.php | 318 - .../src/Guzzle/Http/Message/Response.php | 968 - .../guzzle/src/Guzzle/Http/Mimetypes.php | 962 - .../Http/QueryAggregator/CommaAggregator.php | 20 - .../QueryAggregator/DuplicateAggregator.php | 22 - .../Http/QueryAggregator/PhpAggregator.php | 27 - .../QueryAggregatorInterface.php | 22 - .../guzzle/src/Guzzle/Http/QueryString.php | 297 - .../src/Guzzle/Http/ReadLimitEntityBody.php | 122 - .../guzzle/src/Guzzle/Http/RedirectPlugin.php | 250 - .../src/Guzzle/Http/Resources/cacert.pem | 3870 -- .../guzzle/src/Guzzle/Http/StaticClient.php | 157 - .../guzzle/guzzle/src/Guzzle/Http/Url.php | 554 - .../guzzle/src/Guzzle/Http/composer.json | 32 - .../src/Guzzle/Inflection/Inflector.php | 38 - .../Guzzle/Inflection/InflectorInterface.php | 27 - .../Guzzle/Inflection/MemoizingInflector.php | 70 - .../Inflection/PreComputedInflector.php | 59 - .../src/Guzzle/Inflection/composer.json | 26 - .../src/Guzzle/Iterator/AppendIterator.php | 19 - .../src/Guzzle/Iterator/ChunkedIterator.php | 56 - .../src/Guzzle/Iterator/FilterIterator.php | 36 - .../src/Guzzle/Iterator/MapIterator.php | 34 - .../Guzzle/Iterator/MethodProxyIterator.php | 27 - .../guzzle/src/Guzzle/Iterator/README.md | 25 - .../guzzle/src/Guzzle/Iterator/composer.json | 27 - .../src/Guzzle/Log/AbstractLogAdapter.php | 16 - .../guzzle/src/Guzzle/Log/ArrayLogAdapter.php | 34 - .../src/Guzzle/Log/ClosureLogAdapter.php | 23 - .../src/Guzzle/Log/LogAdapterInterface.php | 18 - .../src/Guzzle/Log/MessageFormatter.php | 179 - .../src/Guzzle/Log/MonologLogAdapter.php | 34 - .../guzzle/src/Guzzle/Log/PsrLogAdapter.php | 36 - .../guzzle/src/Guzzle/Log/Zf1LogAdapter.php | 24 - .../guzzle/src/Guzzle/Log/Zf2LogAdapter.php | 21 - .../guzzle/src/Guzzle/Log/composer.json | 29 - .../src/Guzzle/Parser/Cookie/CookieParser.php | 131 - .../Parser/Cookie/CookieParserInterface.php | 33 - .../Parser/Message/AbstractMessageParser.php | 58 - .../Guzzle/Parser/Message/MessageParser.php | 110 - .../Parser/Message/MessageParserInterface.php | 27 - .../Parser/Message/PeclHttpMessageParser.php | 48 - .../src/Guzzle/Parser/ParserRegistry.php | 75 - .../Parser/UriTemplate/PeclUriTemplate.php | 26 - .../Guzzle/Parser/UriTemplate/UriTemplate.php | 254 - .../UriTemplate/UriTemplateInterface.php | 21 - .../src/Guzzle/Parser/Url/UrlParser.php | 48 - .../Guzzle/Parser/Url/UrlParserInterface.php | 19 - .../guzzle/src/Guzzle/Parser/composer.json | 19 - .../src/Guzzle/Plugin/Async/AsyncPlugin.php | 84 - .../src/Guzzle/Plugin/Async/composer.json | 27 - .../Backoff/AbstractBackoffStrategy.php | 91 - .../AbstractErrorCodeBackoffStrategy.php | 40 - .../Guzzle/Plugin/Backoff/BackoffLogger.php | 76 - .../Guzzle/Plugin/Backoff/BackoffPlugin.php | 126 - .../Backoff/BackoffStrategyInterface.php | 30 - .../Backoff/CallbackBackoffStrategy.php | 47 - .../Backoff/ConstantBackoffStrategy.php | 34 - .../Plugin/Backoff/CurlBackoffStrategy.php | 28 - .../Backoff/ExponentialBackoffStrategy.php | 25 - .../Plugin/Backoff/HttpBackoffStrategy.php | 30 - .../Plugin/Backoff/LinearBackoffStrategy.php | 36 - .../Backoff/ReasonPhraseBackoffStrategy.php | 25 - .../Backoff/TruncatedBackoffStrategy.php | 36 - .../src/Guzzle/Plugin/Backoff/composer.json | 28 - .../Cache/CacheKeyProviderInterface.php | 11 - .../src/Guzzle/Plugin/Cache/CachePlugin.php | 353 - .../Plugin/Cache/CacheStorageInterface.php | 43 - .../Plugin/Cache/CallbackCanCacheStrategy.php | 53 - .../Cache/CanCacheStrategyInterface.php | 30 - .../Plugin/Cache/DefaultCacheKeyProvider.php | 46 - .../Plugin/Cache/DefaultCacheStorage.php | 266 - .../Plugin/Cache/DefaultCanCacheStrategy.php | 32 - .../Plugin/Cache/DefaultRevalidation.php | 174 - .../Guzzle/Plugin/Cache/DenyRevalidation.php | 19 - .../Plugin/Cache/RevalidationInterface.php | 32 - .../Guzzle/Plugin/Cache/SkipRevalidation.php | 19 - .../src/Guzzle/Plugin/Cache/composer.json | 28 - .../src/Guzzle/Plugin/Cookie/Cookie.php | 538 - .../Cookie/CookieJar/ArrayCookieJar.php | 237 - .../Cookie/CookieJar/CookieJarInterface.php | 85 - .../Plugin/Cookie/CookieJar/FileCookieJar.php | 65 - .../src/Guzzle/Plugin/Cookie/CookiePlugin.php | 70 - .../Exception/InvalidCookieException.php | 7 - .../src/Guzzle/Plugin/Cookie/composer.json | 27 - .../Guzzle/Plugin/CurlAuth/CurlAuthPlugin.php | 46 - .../src/Guzzle/Plugin/CurlAuth/composer.json | 27 - .../ErrorResponseExceptionInterface.php | 22 - .../ErrorResponse/ErrorResponsePlugin.php | 72 - .../Exception/ErrorResponseException.php | 7 - .../Guzzle/Plugin/ErrorResponse/composer.json | 27 - .../Guzzle/Plugin/History/HistoryPlugin.php | 163 - .../src/Guzzle/Plugin/History/composer.json | 27 - .../src/Guzzle/Plugin/Log/LogPlugin.php | 161 - .../src/Guzzle/Plugin/Log/composer.json | 28 - .../Plugin/Md5/CommandContentMd5Plugin.php | 57 - .../Guzzle/Plugin/Md5/Md5ValidatorPlugin.php | 88 - .../src/Guzzle/Plugin/Md5/composer.json | 27 - .../src/Guzzle/Plugin/Mock/MockPlugin.php | 245 - .../src/Guzzle/Plugin/Mock/composer.json | 27 - .../src/Guzzle/Plugin/Oauth/OauthPlugin.php | 306 - .../src/Guzzle/Plugin/Oauth/composer.json | 27 - .../guzzle/src/Guzzle/Plugin/composer.json | 44 - .../Guzzle/Service/AbstractConfigLoader.php | 177 - .../Guzzle/Service/Builder/ServiceBuilder.php | 189 - .../Builder/ServiceBuilderInterface.php | 40 - .../Service/Builder/ServiceBuilderLoader.php | 89 - .../Guzzle/Service/CachingConfigLoader.php | 46 - .../guzzle/src/Guzzle/Service/Client.php | 297 - .../src/Guzzle/Service/ClientInterface.php | 68 - .../Service/Command/AbstractCommand.php | 390 - .../Guzzle/Service/Command/ClosureCommand.php | 41 - .../Service/Command/CommandInterface.php | 128 - .../Command/CreateResponseClassEvent.php | 32 - .../Command/DefaultRequestSerializer.php | 169 - .../Service/Command/DefaultResponseParser.php | 55 - .../Service/Command/Factory/AliasFactory.php | 39 - .../Command/Factory/CompositeFactory.php | 154 - .../Command/Factory/ConcreteClassFactory.php | 47 - .../Command/Factory/FactoryInterface.php | 21 - .../Service/Command/Factory/MapFactory.php | 27 - .../Factory/ServiceDescriptionFactory.php | 71 - .../Request/AbstractRequestVisitor.php | 69 - .../LocationVisitor/Request/BodyVisitor.php | 58 - .../LocationVisitor/Request/HeaderVisitor.php | 44 - .../LocationVisitor/Request/JsonVisitor.php | 63 - .../Request/PostFieldVisitor.php | 18 - .../Request/PostFileVisitor.php | 24 - .../LocationVisitor/Request/QueryVisitor.php | 18 - .../Request/RequestVisitorInterface.php | 31 - .../Request/ResponseBodyVisitor.php | 18 - .../LocationVisitor/Request/XmlVisitor.php | 252 - .../Response/AbstractResponseVisitor.php | 26 - .../LocationVisitor/Response/BodyVisitor.php | 23 - .../Response/HeaderVisitor.php | 50 - .../LocationVisitor/Response/JsonVisitor.php | 93 - .../Response/ReasonPhraseVisitor.php | 23 - .../Response/ResponseVisitorInterface.php | 46 - .../Response/StatusCodeVisitor.php | 23 - .../LocationVisitor/Response/XmlVisitor.php | 151 - .../LocationVisitor/VisitorFlyweight.php | 138 - .../Service/Command/OperationCommand.php | 89 - .../Command/OperationResponseParser.php | 195 - .../Command/RequestSerializerInterface.php | 21 - .../Command/ResponseClassInterface.php | 18 - .../Command/ResponseParserInterface.php | 18 - .../Guzzle/Service/ConfigLoaderInterface.php | 22 - .../Guzzle/Service/Description/Operation.php | 547 - .../Description/OperationInterface.php | 159 - .../Guzzle/Service/Description/Parameter.php | 925 - .../Service/Description/SchemaFormatter.php | 156 - .../Service/Description/SchemaValidator.php | 291 - .../Description/ServiceDescription.php | 271 - .../ServiceDescriptionInterface.php | 106 - .../Description/ServiceDescriptionLoader.php | 64 - .../Description/ValidatorInterface.php | 28 - .../Service/Exception/CommandException.php | 7 - .../Exception/CommandTransferException.php | 119 - .../Exception/DescriptionBuilderException.php | 7 - .../InconsistentClientTransferException.php | 38 - .../Exception/ResponseClassException.php | 9 - .../Exception/ServiceBuilderException.php | 7 - .../Exception/ServiceNotFoundException.php | 5 - .../Service/Exception/ValidationException.php | 30 - .../AbstractResourceIteratorFactory.php | 37 - .../CompositeResourceIteratorFactory.php | 67 - .../Resource/MapResourceIteratorFactory.php | 34 - .../src/Guzzle/Service/Resource/Model.php | 64 - .../Service/Resource/ResourceIterator.php | 254 - .../Resource/ResourceIteratorApplyBatched.php | 111 - .../Resource/ResourceIteratorClassFactory.php | 60 - .../ResourceIteratorFactoryInterface.php | 30 - .../Resource/ResourceIteratorInterface.php | 61 - .../guzzle/src/Guzzle/Service/composer.json | 29 - .../Guzzle/Stream/PhpStreamRequestFactory.php | 284 - .../guzzle/src/Guzzle/Stream/Stream.php | 289 - .../src/Guzzle/Stream/StreamInterface.php | 218 - .../Stream/StreamRequestFactoryInterface.php | 24 - .../guzzle/src/Guzzle/Stream/composer.json | 30 - .../Batch/AbstractBatchDecoratorTest.php | 33 - .../Guzzle/Tests/Batch/BatchBuilderTest.php | 86 - .../Tests/Batch/BatchClosureDivisorTest.php | 36 - .../Tests/Batch/BatchClosureTransferTest.php | 52 - .../Tests/Batch/BatchCommandTransferTest.php | 83 - .../Tests/Batch/BatchRequestTransferTest.php | 80 - .../Tests/Batch/BatchSizeDivisorTest.php | 24 - .../tests/Guzzle/Tests/Batch/BatchTest.php | 91 - .../Batch/ExceptionBufferingBatchTest.php | 45 - .../Guzzle/Tests/Batch/FlushingBatchTest.php | 40 - .../Guzzle/Tests/Batch/HistoryBatchTest.php | 26 - .../Guzzle/Tests/Batch/NotifyingBatchTest.php | 45 - .../Tests/Cache/CacheAdapterFactoryTest.php | 64 - .../Guzzle/Tests/Cache/CacheAdapterTest.php | 68 - .../Tests/Cache/ClosureCacheAdapterTest.php | 94 - .../Tests/Cache/NullCacheAdapterTest.php | 20 - .../Tests/Cache/Zf2CacheAdapterTest.php | 58 - .../Common/AbstractHasDispatcherTest.php | 63 - .../Guzzle/Tests/Common/CollectionTest.php | 529 - .../tests/Guzzle/Tests/Common/EventTest.php | 62 - .../Exception/BatchTransferExceptionTest.php | 21 - .../Exception/ExceptionCollectionTest.php | 66 - .../tests/Guzzle/Tests/Common/VersionTest.php | 27 - .../tests/Guzzle/Tests/GuzzleTestCase.php | 235 - .../Http/AbstractEntityBodyDecoratorTest.php | 34 - .../Tests/Http/CachingEntityBodyTest.php | 249 - .../tests/Guzzle/Tests/Http/ClientTest.php | 601 - .../Guzzle/Tests/Http/Curl/CurlHandleTest.php | 947 - .../Tests/Http/Curl/CurlMultiProxyTest.php | 110 - .../Guzzle/Tests/Http/Curl/CurlMultiTest.php | 455 - .../Tests/Http/Curl/CurlVersionTest.php | 39 - .../Tests/Http/Curl/RequestMediatorTest.php | 67 - .../Guzzle/Tests/Http/EntityBodyTest.php | 182 - .../Http/Exception/CurlExceptionTest.php | 27 - .../Tests/Http/Exception/ExceptionTest.php | 66 - .../Exception/MultiTransferExceptionTest.php | 51 - .../Tests/Http/IoEmittingEntityBodyTest.php | 47 - .../Http/Message/AbstractMessageTest.php | 136 - .../Message/EntityEnclosingRequestTest.php | 434 - .../Http/Message/Header/HeaderFactoryTest.php | 29 - .../Tests/Http/Message/Header/LinkTest.php | 63 - .../Tests/Http/Message/HeaderComparison.php | 135 - .../Http/Message/HeaderComparisonTest.php | 115 - .../Guzzle/Tests/Http/Message/HeaderTest.php | 162 - .../Tests/Http/Message/PostFileTest.php | 88 - .../Tests/Http/Message/RequestFactoryTest.php | 616 - .../Guzzle/Tests/Http/Message/RequestTest.php | 639 - .../Tests/Http/Message/ResponseTest.php | 677 - .../tests/Guzzle/Tests/Http/MimetypesTest.php | 31 - .../QueryAggregator/CommaAggregatorTest.php | 30 - .../DuplicateAggregatorTest.php | 30 - .../QueryAggregator/PhpAggregatorTest.php | 32 - .../Guzzle/Tests/Http/QueryStringTest.php | 233 - .../Tests/Http/ReadLimitEntityBodyTest.php | 81 - .../Guzzle/Tests/Http/RedirectPluginTest.php | 277 - .../guzzle/tests/Guzzle/Tests/Http/Server.php | 191 - .../Guzzle/Tests/Http/StaticClientTest.php | 67 - .../tests/Guzzle/Tests/Http/UrlTest.php | 303 - .../guzzle/tests/Guzzle/Tests/Http/server.js | 146 - .../Guzzle/Tests/Inflection/InflectorTest.php | 37 - .../Inflection/MemoizingInflectorTest.php | 46 - .../Inflection/PreComputedInflectorTest.php | 45 - .../Tests/Iterator/AppendIteratorTest.php | 29 - .../Tests/Iterator/ChunkedIteratorTest.php | 52 - .../Tests/Iterator/FilterIteratorTest.php | 28 - .../Guzzle/Tests/Iterator/MapIteratorTest.php | 28 - .../Iterator/MethodProxyIteratorTest.php | 28 - .../Guzzle/Tests/Log/ArrayLogAdapterTest.php | 23 - .../Tests/Log/ClosureLogAdapterTest.php | 30 - .../Guzzle/Tests/Log/MessageFormatterTest.php | 143 - .../Guzzle/Tests/Log/PsrLogAdapterTest.php | 25 - .../Guzzle/Tests/Log/Zf2LogAdapterTest.php | 51 - .../Guzzle/Tests/Mock/CustomResponseModel.php | 21 - .../Guzzle/Tests/Mock/ErrorResponseMock.php | 25 - .../tests/Guzzle/Tests/Mock/ExceptionMock.php | 11 - .../tests/Guzzle/Tests/Mock/MockMulti.php | 11 - .../tests/Guzzle/Tests/Mock/MockObserver.php | 65 - .../tests/Guzzle/Tests/Mock/MockSubject.php | 7 - .../Parser/Cookie/CookieParserProvider.php | 381 - .../Tests/Parser/Cookie/CookieParserTest.php | 22 - .../Parser/Message/MessageParserProvider.php | 225 - .../Parser/Message/MessageParserTest.php | 58 - .../Message/PeclHttpMessageParserTest.php | 36 - .../Tests/Parser/ParserRegistryTest.php | 33 - .../UriTemplate/AbstractUriTemplateTest.php | 113 - .../UriTemplate/PeclUriTemplateTest.php | 27 - .../Parser/UriTemplate/UriTemplateTest.php | 106 - .../Tests/Plugin/Async/AsyncPluginTest.php | 93 - .../Backoff/AbstractBackoffStrategyTest.php | 86 - .../Plugin/Backoff/BackoffLoggerTest.php | 110 - .../Plugin/Backoff/BackoffPluginTest.php | 297 - .../Backoff/CallbackBackoffStrategyTest.php | 31 - .../Backoff/ConstantBackoffStrategyTest.php | 20 - .../Backoff/CurlBackoffStrategyTest.php | 36 - .../ExponentialBackoffStrategyTest.php | 23 - .../Backoff/HttpBackoffStrategyTest.php | 47 - .../Backoff/LinearBackoffStrategyTest.php | 21 - .../ReasonPhraseBackoffStrategyTest.php | 32 - .../Backoff/TruncatedBackoffStrategyTest.php | 30 - .../Tests/Plugin/Cache/CachePluginTest.php | 441 - .../Cache/CallbackCanCacheStrategyTest.php | 72 - .../Plugin/Cache/DefaultCacheStorageTest.php | 193 - .../Cache/DefaultCanCacheStrategyTest.php | 40 - .../Plugin/Cache/DefaultRevalidationTest.php | 248 - .../Plugin/Cache/DenyRevalidationTest.php | 19 - .../Plugin/Cache/SkipRevalidationTest.php | 19 - .../Cookie/CookieJar/ArrayCookieJarTest.php | 385 - .../Cookie/CookieJar/FileCookieJarTest.php | 63 - .../Tests/Plugin/Cookie/CookiePluginTest.php | 134 - .../Guzzle/Tests/Plugin/Cookie/CookieTest.php | 223 - .../Plugin/CurlAuth/CurlAuthPluginTest.php | 39 - .../ErrorResponse/ErrorResponsePluginTest.php | 137 - .../Plugin/History/HistoryPluginTest.php | 140 - .../Guzzle/Tests/Plugin/Log/LogPluginTest.php | 95 - .../Md5/CommandContentMd5PluginTest.php | 97 - .../Plugin/Md5/Md5ValidatorPluginTest.php | 120 - .../Tests/Plugin/Mock/MockPluginTest.php | 199 - .../Tests/Plugin/Oauth/OauthPluginTest.php | 345 - .../Service/AbstractConfigLoaderTest.php | 149 - .../Builder/ServiceBuilderLoaderTest.php | 177 - .../Service/Builder/ServiceBuilderTest.php | 317 - .../Tests/Service/CachingConfigLoaderTest.php | 43 - .../tests/Guzzle/Tests/Service/ClientTest.php | 320 - .../Service/Command/AbstractCommandTest.php | 16 - .../Service/Command/ClosureCommandTest.php | 54 - .../Tests/Service/Command/CommandTest.php | 445 - .../Command/DefaultRequestSerializerTest.php | 122 - .../Command/DefaultResponseParserTest.php | 59 - .../Command/Factory/AliasFactoryTest.php | 76 - .../Command/Factory/CompositeFactoryTest.php | 124 - .../Factory/ConcreteClassFactoryTest.php | 49 - .../Command/Factory/MapFactoryTest.php | 37 - .../Factory/ServiceDescriptionFactoryTest.php | 68 - .../Request/AbstractVisitorTestCase.php | 110 - .../Request/BodyVisitorTest.php | 63 - .../Request/HeaderVisitorTest.php | 48 - .../Request/JsonVisitorTest.php | 60 - .../Request/PostFieldVisitorTest.php | 33 - .../Request/PostFileVisitorTest.php | 54 - .../Request/QueryVisitorTest.php | 48 - .../Request/ResponseBodyVisitorTest.php | 20 - .../Request/XmlVisitorTest.php | 558 - .../Response/AbstractResponseVisitorTest.php | 29 - .../Response/BodyVisitorTest.php | 21 - .../Response/HeaderVisitorTest.php | 98 - .../Response/JsonVisitorTest.php | 157 - .../Response/ReasonPhraseVisitorTest.php | 21 - .../Response/StatusCodeVisitorTest.php | 21 - .../Response/XmlVisitorTest.php | 431 - .../LocationVisitor/VisitorFlyweightTest.php | 53 - .../Service/Command/OperationCommandTest.php | 102 - .../Command/OperationResponseParserTest.php | 335 - .../Service/Description/OperationTest.php | 308 - .../Service/Description/ParameterTest.php | 411 - .../Description/SchemaFormatterTest.php | 61 - .../Description/SchemaValidatorTest.php | 326 - .../ServiceDescriptionLoaderTest.php | 177 - .../Description/ServiceDescriptionTest.php | 240 - .../CommandTransferExceptionTest.php | 66 - ...nconsistentClientTransferExceptionTest.php | 15 - .../Exception/ValidationExceptionTest.php | 17 - .../Service/Mock/Command/IterableCommand.php | 31 - .../Service/Mock/Command/MockCommand.php | 32 - .../Service/Mock/Command/OtherCommand.php | 30 - .../Tests/Service/Mock/Command/Sub/Sub.php | 7 - .../Guzzle/Tests/Service/Mock/MockClient.php | 36 - .../Mock/Model/MockCommandIterator.php | 42 - .../CompositeResourceIteratorFactoryTest.php | 37 - .../MapResourceIteratorFactoryTest.php | 40 - .../Tests/Service/Resource/ModelTest.php | 65 - .../ResourceIteratorClassFactoryTest.php | 41 - .../Service/Resource/ResourceIteratorTest.php | 184 - .../Stream/PhpStreamRequestFactoryTest.php | 172 - .../tests/Guzzle/Tests/Stream/StreamTest.php | 189 - .../tests/Guzzle/Tests/TestData/FileBody.txt | 0 .../Tests/TestData/description/bar.json | 3 - .../Tests/TestData/description/baz.json | 3 - .../Tests/TestData/description/foo.json | 8 - .../Tests/TestData/description/recursive.json | 3 - .../tests/Guzzle/Tests/TestData/mock_response | 3 - .../Guzzle/Tests/TestData/services/json1.json | 18 - .../Guzzle/Tests/TestData/services/json2.json | 11 - .../Tests/TestData/services/services.json | 71 - .../Guzzle/Tests/TestData/test_service.json | 40 - .../Guzzle/Tests/TestData/test_service2.json | 7 - .../Guzzle/Tests/TestData/test_service_3.json | 40 - vendor_old/guzzle/guzzle/tests/bootstrap.php | 10 - .../ircmaxell/password-compat/LICENSE.md | 7 - .../ircmaxell/password-compat/composer.json | 20 - .../password-compat/lib/password.php | 314 - .../password-compat/version-test.php | 6 - vendor_old/mpdf/mpdf/.gitattributes | 20 - vendor_old/mpdf/mpdf/.github/CONTRIBUTING.md | 29 - .../mpdf/mpdf/.github/ISSUE_TEMPLATE.md | 17 - vendor_old/mpdf/mpdf/.gitignore | 2 - vendor_old/mpdf/mpdf/.travis.yml | 41 - vendor_old/mpdf/mpdf/CHANGELOG.md | 639 - vendor_old/mpdf/mpdf/CREDITS.txt | 91 - vendor_old/mpdf/mpdf/LICENSE.txt | 340 - vendor_old/mpdf/mpdf/README.md | 93 - vendor_old/mpdf/mpdf/composer.json | 70 - vendor_old/mpdf/mpdf/data/CJKdata.php | 99 - .../collations/Afrikaans_South_Africa.php | 104 - .../mpdf/data/collations/Albanian_Albania.php | 110 - .../mpdf/data/collations/Alsatian_France.php | 104 - .../mpdf/data/collations/Arabic_Algeria.php | 67 - .../mpdf/data/collations/Arabic_Bahrain.php | 67 - .../mpdf/data/collations/Arabic_Egypt.php | 67 - .../mpdf/mpdf/data/collations/Arabic_Iraq.php | 67 - .../mpdf/data/collations/Arabic_Jordan.php | 67 - .../mpdf/data/collations/Arabic_Kuwait.php | 67 - .../mpdf/data/collations/Arabic_Lebanon.php | 67 - .../mpdf/data/collations/Arabic_Libya.php | 67 - .../mpdf/data/collations/Arabic_Morocco.php | 67 - .../mpdf/mpdf/data/collations/Arabic_Oman.php | 67 - .../data/collations/Arabic_Pseudo_RTL.php | 67 - .../mpdf/data/collations/Arabic_Qatar.php | 67 - .../data/collations/Arabic_Saudi_Arabia.php | 67 - .../mpdf/data/collations/Arabic_Syria.php | 67 - .../mpdf/data/collations/Arabic_Tunisia.php | 67 - .../mpdf/data/collations/Arabic_Yemen.php | 67 - .../Azeri_(Cyrillic)_Azerbaijan.php | 79 - .../collations/Azeri_(Latin)_Azerbaijan.php | 97 - .../mpdf/data/collations/Bashkir_Russia.php | 79 - .../mpdf/data/collations/Basque_Spain.php | 104 - .../data/collations/Belarusian_Belarus.php | 79 - ...nian_(Cyrillic)_Bosnia_and_Herzegovina.php | 79 - ...Bosnian_(Latin)_Bosnia_and_Herzegovina.php | 106 - .../mpdf/data/collations/Breton_France.php | 104 - .../data/collations/Bulgarian_Bulgaria.php | 79 - .../mpdf/data/collations/Catalan_Spain.php | 104 - .../mpdf/data/collations/Corsican_France.php | 104 - ...roatian_(Latin)_Bosnia_and_Herzegovina.php | 106 - .../mpdf/data/collations/Croatian_Croatia.php | 106 - .../data/collations/Czech_Czech_Republic.php | 107 - .../mpdf/data/collations/Danish_Denmark.php | 101 - .../mpdf/data/collations/Dari_Afghanistan.php | 64 - .../mpdf/data/collations/Dutch_Belgium.php | 104 - .../data/collations/Dutch_Netherlands.php | 104 - .../data/collations/English_Australia.php | 104 - .../mpdf/data/collations/English_Belize.php | 104 - .../mpdf/data/collations/English_Canada.php | 104 - .../data/collations/English_Caribbean.php | 104 - .../mpdf/data/collations/English_India.php | 104 - .../mpdf/data/collations/English_Ireland.php | 104 - .../mpdf/data/collations/English_Jamaica.php | 104 - .../mpdf/data/collations/English_Malaysia.php | 104 - .../data/collations/English_New_Zealand.php | 104 - .../English_Republic_of_the_Philippines.php | 104 - .../data/collations/English_Singapore.php | 104 - .../data/collations/English_South_Africa.php | 104 - .../English_Trinidad_and_Tobago.php | 104 - .../collations/English_United_Kingdom.php | 103 - .../data/collations/English_United_States.php | 103 - .../mpdf/data/collations/English_Zimbabwe.php | 104 - .../mpdf/data/collations/Estonian_Estonia.php | 93 - .../data/collations/Faroese_Faroe_Islands.php | 104 - .../data/collations/Filipino_Philippines.php | 104 - .../mpdf/data/collations/Finnish_Finland.php | 102 - .../mpdf/data/collations/French_Belgium.php | 104 - .../mpdf/data/collations/French_Canada.php | 104 - .../mpdf/data/collations/French_France.php | 104 - .../data/collations/French_Luxembourg.php | 104 - .../French_Principality_of_Monaco.php | 104 - .../data/collations/French_Switzerland.php | 104 - .../data/collations/Frisian_Netherlands.php | 104 - .../mpdf/data/collations/Galician_Spain.php | 104 - .../mpdf/data/collations/German_Austria.php | 104 - .../mpdf/data/collations/German_Germany.php | 104 - .../data/collations/German_Liechtenstein.php | 104 - .../data/collations/German_Luxembourg.php | 104 - .../data/collations/German_Switzerland.php | 104 - .../mpdf/data/collations/Greek_Greece.php | 74 - .../data/collations/Greenlandic_Greenland.php | 101 - .../data/collations/Hausa_(Latin)_Nigeria.php | 104 - .../mpdf/data/collations/Hebrew_Israel.php | 59 - .../data/collations/Hungarian_Hungary.php | 70 - .../data/collations/Icelandic_Iceland.php | 94 - .../mpdf/data/collations/Igbo_Nigeria.php | 104 - .../data/collations/Indonesian_Indonesia.php | 104 - .../collations/Inuktitut_(Latin)_Canada.php | 104 - .../Invariant_Language_Invariant_Country.php | 104 - .../mpdf/data/collations/Irish_Ireland.php | 104 - .../mpdf/data/collations/Italian_Italy.php | 104 - .../data/collations/Italian_Switzerland.php | 104 - .../data/collations/Kinyarwanda_Rwanda.php | 104 - .../mpdf/data/collations/Kiswahili_Kenya.php | 104 - .../data/collations/Kyrgyz_Kyrgyzstan.php | 79 - .../mpdf/data/collations/Latvian_Latvia.php | 87 - .../data/collations/Lithuanian_Lithuania.php | 91 - .../data/collations/Lower_Sorbian_Germany.php | 104 - .../collations/Luxembourgish_Luxembourg.php | 104 - .../Macedonian_(FYROM)_Macedonia_(FYROM).php | 78 - .../collations/Malay_Brunei_Darussalam.php | 104 - .../mpdf/data/collations/Malay_Malaysia.php | 104 - .../mpdf/data/collations/Mapudungun_Chile.php | 102 - .../mpdf/data/collations/Mohawk_Canada.php | 104 - .../Mongolian_(Cyrillic)_Mongolia.php | 79 - .../collations/Norwegian_(Nynorsk)_Norway.php | 101 - .../mpdf/data/collations/Occitan_France.php | 104 - .../mpdf/data/collations/Persian_Iran.php | 65 - .../mpdf/data/collations/Polish_Poland.php | 102 - .../data/collations/Portuguese_Brazil.php | 104 - .../data/collations/Portuguese_Portugal.php | 104 - .../mpdf/data/collations/Quechua_Bolivia.php | 104 - .../mpdf/data/collations/Quechua_Ecuador.php | 104 - .../mpdf/data/collations/Quechua_Peru.php | 104 - .../mpdf/data/collations/Romanian_Romania.php | 107 - .../data/collations/Romansh_Switzerland.php | 86 - .../mpdf/data/collations/Russian_Russia.php | 79 - .../data/collations/Sami_(Inari)_Finland.php | 94 - .../data/collations/Sami_(Lule)_Norway.php | 94 - .../data/collations/Sami_(Lule)_Sweden.php | 94 - .../collations/Sami_(Northern)_Finland.php | 94 - .../collations/Sami_(Northern)_Norway.php | 94 - .../collations/Sami_(Northern)_Sweden.php | 94 - .../data/collations/Sami_(Skolt)_Finland.php | 94 - .../collations/Sami_(Southern)_Norway.php | 94 - .../collations/Sami_(Southern)_Sweden.php | 94 - ...bian_(Cyrillic)_Bosnia_and_Herzegovina.php | 79 - .../collations/Serbian_(Cyrillic)_Serbia.php | 79 - ...Serbian_(Latin)_Bosnia_and_Herzegovina.php | 106 - .../collations/Serbian_(Latin)_Serbia.php | 106 - .../Sesotho_sa_Leboa_South_Africa.php | 104 - .../data/collations/Setswana_South_Africa.php | 104 - .../mpdf/data/collations/Slovak_Slovakia.php | 105 - .../data/collations/Slovenian_Slovenia.php | 104 - .../data/collations/Spanish_Argentina.php | 103 - .../mpdf/data/collations/Spanish_Bolivia.php | 103 - .../mpdf/data/collations/Spanish_Chile.php | 103 - .../mpdf/data/collations/Spanish_Colombia.php | 103 - .../data/collations/Spanish_Costa_Rica.php | 103 - .../collations/Spanish_Dominican_Republic.php | 103 - .../mpdf/data/collations/Spanish_Ecuador.php | 103 - .../data/collations/Spanish_El_Salvador.php | 103 - .../data/collations/Spanish_Guatemala.php | 103 - .../mpdf/data/collations/Spanish_Honduras.php | 103 - .../mpdf/data/collations/Spanish_Mexico.php | 103 - .../data/collations/Spanish_Nicaragua.php | 103 - .../mpdf/data/collations/Spanish_Panama.php | 103 - .../mpdf/data/collations/Spanish_Paraguay.php | 103 - .../mpdf/data/collations/Spanish_Peru.php | 103 - .../data/collations/Spanish_Puerto_Rico.php | 103 - .../mpdf/data/collations/Spanish_Spain.php | 103 - .../data/collations/Spanish_United_States.php | 104 - .../mpdf/data/collations/Spanish_Uruguay.php | 103 - .../data/collations/Spanish_Venezuela.php | 103 - .../mpdf/data/collations/Swedish_Finland.php | 102 - .../mpdf/data/collations/Swedish_Sweden.php | 102 - .../Tajik_(Cyrillic)_Tajikistan.php | 79 - .../collations/Tamazight_(Latin)_Algeria.php | 104 - .../mpdf/data/collations/Tatar_Russia.php | 79 - .../mpdf/data/collations/Turkish_Turkey.php | 97 - .../data/collations/Turkmen_Turkmenistan.php | 104 - .../data/collations/Ukrainian_Ukraine.php | 78 - .../data/collations/Upper_Sorbian_Germany.php | 102 - .../Urdu_Islamic_Republic_of_Pakistan.php | 66 - .../Uzbek_(Cyrillic)_Uzbekistan.php | 79 - .../collations/Uzbek_(Latin)_Uzbekistan.php | 102 - .../data/collations/Vietnamese_Vietnam.php | 90 - .../data/collations/Welsh_United_Kingdom.php | 104 - .../mpdf/data/collations/Wolof_Senegal.php | 104 - .../mpdf/data/collations/Yakut_Russia.php | 78 - .../mpdf/data/collations/Yoruba_Nigeria.php | 104 - .../data/collations/isiXhosa_South_Africa.php | 104 - .../data/collations/isiZulu_South_Africa.php | 104 - vendor_old/mpdf/mpdf/data/font/ccourier.php | 9 - vendor_old/mpdf/mpdf/data/font/ccourierb.php | 9 - vendor_old/mpdf/mpdf/data/font/ccourierbi.php | 9 - vendor_old/mpdf/mpdf/data/font/ccourieri.php | 9 - vendor_old/mpdf/mpdf/data/font/chelvetica.php | 21 - .../mpdf/mpdf/data/font/chelveticab.php | 21 - .../mpdf/mpdf/data/font/chelveticabi.php | 21 - .../mpdf/mpdf/data/font/chelveticai.php | 21 - vendor_old/mpdf/mpdf/data/font/csymbol.php | 20 - vendor_old/mpdf/mpdf/data/font/ctimes.php | 21 - vendor_old/mpdf/mpdf/data/font/ctimesb.php | 21 - vendor_old/mpdf/mpdf/data/font/ctimesbi.php | 21 - vendor_old/mpdf/mpdf/data/font/ctimesi.php | 21 - .../mpdf/mpdf/data/font/czapfdingbats.php | 20 - .../data/iccprofiles/sRGB_IEC61966-2-1.icc | Bin 3052 -> 0 bytes vendor_old/mpdf/mpdf/data/lang2fonts.css | 394 - vendor_old/mpdf/mpdf/data/linebrdictK.dat | Bin 1053144 -> 0 bytes vendor_old/mpdf/mpdf/data/linebrdictL.dat | Bin 126932 -> 0 bytes vendor_old/mpdf/mpdf/data/linebrdictT.dat | Bin 301751 -> 0 bytes vendor_old/mpdf/mpdf/data/mpdf.css | 94 - vendor_old/mpdf/mpdf/data/out.php | 68 - vendor_old/mpdf/mpdf/data/patterns/NOTES.txt | 5 - vendor_old/mpdf/mpdf/data/patterns/de.php | 8 - .../mpdf/mpdf/data/patterns/dictionary.txt | 1 - vendor_old/mpdf/mpdf/data/patterns/en.php | 8 - vendor_old/mpdf/mpdf/data/patterns/es.php | 10 - vendor_old/mpdf/mpdf/data/patterns/fi.php | 8 - vendor_old/mpdf/mpdf/data/patterns/fr.php | 11 - vendor_old/mpdf/mpdf/data/patterns/it.php | 10 - vendor_old/mpdf/mpdf/data/patterns/nl.php | 10 - vendor_old/mpdf/mpdf/data/patterns/pl.php | 8 - vendor_old/mpdf/mpdf/data/patterns/ru.php | 11 - vendor_old/mpdf/mpdf/data/patterns/sv.php | 11 - vendor_old/mpdf/mpdf/data/subs_core.php | 452 - vendor_old/mpdf/mpdf/data/subs_win-1252.php | 306 - vendor_old/mpdf/mpdf/data/upperCase.php | 3 - vendor_old/mpdf/mpdf/phpunit.xml | 18 - vendor_old/mpdf/mpdf/ruleset.xml | 22 - vendor_old/mpdf/mpdf/src/Barcode.php | 2142 -- vendor_old/mpdf/mpdf/src/Cache.php | 82 - .../mpdf/mpdf/src/Color/ColorConvertor.php | 469 - .../mpdf/mpdf/src/Color/NamedColors.php | 158 - .../mpdf/mpdf/src/Config/ConfigVariables.php | 482 - .../mpdf/mpdf/src/Config/FontVariables.php | 332 - .../mpdf/mpdf/src/Conversion/DecToAlpha.php | 44 - .../mpdf/mpdf/src/Conversion/DecToCjk.php | 19 - .../mpdf/mpdf/src/Conversion/DecToHebrew.php | 67 - .../mpdf/mpdf/src/Conversion/DecToOther.php | 89 - .../mpdf/mpdf/src/Conversion/DecToRoman.php | 131 - vendor_old/mpdf/mpdf/src/Css/Border.php | 13 - vendor_old/mpdf/mpdf/src/Css/DefaultCss.php | 217 - vendor_old/mpdf/mpdf/src/Css/TextVars.php | 25 - vendor_old/mpdf/mpdf/src/CssManager.php | 2061 -- vendor_old/mpdf/mpdf/src/DirectWrite.php | 499 - vendor_old/mpdf/mpdf/src/Fonts/FontCache.php | 48 - .../mpdf/mpdf/src/Fonts/FontFileFinder.php | 30 - .../mpdf/mpdf/src/Fonts/GlyphOperator.php | 17 - .../mpdf/mpdf/src/Fonts/MetricsGenerator.php | 182 - vendor_old/mpdf/mpdf/src/Form.php | 1776 - vendor_old/mpdf/mpdf/src/Gif/ColorTable.php | 82 - vendor_old/mpdf/mpdf/src/Gif/FileHeader.php | 94 - vendor_old/mpdf/mpdf/src/Gif/Gif.php | 70 - vendor_old/mpdf/mpdf/src/Gif/Image.php | 187 - vendor_old/mpdf/mpdf/src/Gif/ImageHeader.php | 87 - vendor_old/mpdf/mpdf/src/Gif/Lzw.php | 219 - vendor_old/mpdf/mpdf/src/Gradient.php | 984 - vendor_old/mpdf/mpdf/src/Hyphenator.php | 203 - vendor_old/mpdf/mpdf/src/Image/Bmp.php | 277 - .../mpdf/mpdf/src/Image/ImageProcessor.php | 1294 - .../mpdf/mpdf/src/Image/ImageTypeGuesser.php | 27 - vendor_old/mpdf/mpdf/src/Image/Svg.php | 3906 --- vendor_old/mpdf/mpdf/src/Image/Wmf.php | 290 - vendor_old/mpdf/mpdf/src/LangToFont.php | 580 - vendor_old/mpdf/mpdf/src/Log/Context.php | 13 - vendor_old/mpdf/mpdf/src/Meter.php | 287 - vendor_old/mpdf/mpdf/src/Mpdf.php | 29185 ---------------- vendor_old/mpdf/mpdf/src/MpdfException.php | 8 - .../mpdf/mpdf/src/MpdfImageException.php | 8 - vendor_old/mpdf/mpdf/src/Otl.php | 6187 ---- vendor_old/mpdf/mpdf/src/OtlDump.php | 4347 --- .../mpdf/mpdf/src/Output/Destination.php | 15 - vendor_old/mpdf/mpdf/src/PageFormat.php | 83 - vendor_old/mpdf/mpdf/src/Pdf/Protection.php | 360 - .../src/Pdf/Protection/UniqidGenerator.php | 32 - vendor_old/mpdf/mpdf/src/QrCode/QrCode.php | 637 - vendor_old/mpdf/mpdf/src/ScriptToLang.php | 126 - vendor_old/mpdf/mpdf/src/Shaper/Indic.php | 1947 -- vendor_old/mpdf/mpdf/src/Shaper/Myanmar.php | 543 - vendor_old/mpdf/mpdf/src/Shaper/Sea.php | 397 - vendor_old/mpdf/mpdf/src/SizeConvertor.php | 139 - vendor_old/mpdf/mpdf/src/TTFontFile.php | 5025 --- .../mpdf/mpdf/src/TTFontFileAnalysis.php | 454 - vendor_old/mpdf/mpdf/src/TableOfContents.php | 856 - vendor_old/mpdf/mpdf/src/Tag.php | 6868 ---- vendor_old/mpdf/mpdf/src/Ucdn.php | 2924 -- vendor_old/mpdf/mpdf/src/functions.php | 226 - .../mpdf/mpdf/tests/Mpdf/AddFontTest.php | 34 - .../mpdf/tests/Mpdf/ColorConvertorTest.php | 50 - vendor_old/mpdf/mpdf/tests/Mpdf/FpdiTest.php | 528 - .../mpdf/mpdf/tests/Mpdf/HyphenatorTest.php | 59 - vendor_old/mpdf/mpdf/tests/Mpdf/MpdfTest.php | 108 - .../Pdf/Protection/UniqidGeneratorTest.php | 17 - .../mpdf/tests/Mpdf/Pdf/ProtectionTest.php | 83 - .../mpdf/tests/Mpdf/SizeConvertorTest.php | 118 - .../mpdf/mpdf/tests/Mpdf/WriteHtmlTest.php | 74 - vendor_old/mpdf/mpdf/tests/bootstrap.php | 20 - .../mpdf/tests/data/pdfs/2-Page-PDF_1_4.pdf | Bin 22894 -> 0 bytes vendor_old/mpdf/mpdf/tests/data/xml/test.xml | 4 - vendor_old/mpdf/mpdf/tests/mPDFTest.php | 71 - vendor_old/mpdf/mpdf/tmp/.gitignore | 4 - vendor_old/mpdf/mpdf/tmp/ttfontdata/.gitkeep | 0 .../mpdf/mpdf/ttfonts/DejaVuSans-Bold.ttf | Bin 693876 -> 0 bytes .../mpdf/ttfonts/DejaVuSans-BoldOblique.ttf | Bin 632168 -> 0 bytes .../mpdf/mpdf/ttfonts/DejaVuSans-Oblique.ttf | Bin 632416 -> 0 bytes vendor_old/mpdf/mpdf/ttfonts/DejaVuSans.ttf | Bin 741536 -> 0 bytes .../mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf | Bin 676456 -> 0 bytes .../DejaVuSansCondensed-BoldOblique.ttf | Bin 621680 -> 0 bytes .../ttfonts/DejaVuSansCondensed-Oblique.ttf | Bin 609268 -> 0 bytes .../mpdf/mpdf/ttfonts/DejaVuSansCondensed.ttf | Bin 690388 -> 0 bytes .../mpdf/mpdf/ttfonts/DejaVuSansMono-Bold.ttf | Bin 318392 -> 0 bytes .../ttfonts/DejaVuSansMono-BoldOblique.ttf | Bin 239876 -> 0 bytes .../mpdf/ttfonts/DejaVuSansMono-Oblique.ttf | Bin 245948 -> 0 bytes .../mpdf/mpdf/ttfonts/DejaVuSansMono.ttf | Bin 335068 -> 0 bytes .../mpdf/mpdf/ttfonts/DejaVuSerif-Bold.ttf | Bin 345364 -> 0 bytes .../mpdf/ttfonts/DejaVuSerif-BoldItalic.ttf | Bin 336884 -> 0 bytes .../mpdf/mpdf/ttfonts/DejaVuSerif-Italic.ttf | Bin 343388 -> 0 bytes vendor_old/mpdf/mpdf/ttfonts/DejaVuSerif.ttf | Bin 367260 -> 0 bytes .../ttfonts/DejaVuSerifCondensed-Bold.ttf | Bin 320720 -> 0 bytes .../DejaVuSerifCondensed-BoldItalic.ttf | Bin 335940 -> 0 bytes .../ttfonts/DejaVuSerifCondensed-Italic.ttf | Bin 342736 -> 0 bytes .../mpdf/ttfonts/DejaVuSerifCondensed.ttf | Bin 334040 -> 0 bytes vendor_old/mpdf/mpdf/ttfonts/DejaVuinfo.txt | 99 - .../mpdf/mpdf/utils/data/UnicodeData.txt | 21488 ------------ .../mpdf/mpdf/utils/data/UnicodeRanges.php | 216 - .../mpdf/mpdf/utils/font_collections.php | 66 - vendor_old/mpdf/mpdf/utils/font_coverage.php | 244 - vendor_old/mpdf/mpdf/utils/font_dump.php | 242 - vendor_old/mpdf/mpdf/utils/font_dump_otl.php | 202 - vendor_old/mpdf/mpdf/utils/font_names.php | 240 - vendor_old/mpdf/mpdf/utils/image_details.php | 665 - vendor_old/omnipay/2checkout/.gitignore | 4 - vendor_old/omnipay/2checkout/.travis.yml | 13 - vendor_old/omnipay/2checkout/CONTRIBUTING.md | 10 - vendor_old/omnipay/2checkout/LICENSE | 20 - vendor_old/omnipay/2checkout/README.md | 50 - vendor_old/omnipay/2checkout/composer.json | 41 - vendor_old/omnipay/2checkout/phpunit.xml.dist | 25 - vendor_old/omnipay/2checkout/src/Gateway.php | 59 - .../src/Message/CompletePurchaseRequest.php | 33 - .../src/Message/CompletePurchaseResponse.php | 21 - .../2checkout/src/Message/PurchaseRequest.php | 69 - .../src/Message/PurchaseResponse.php | 39 - .../omnipay/2checkout/tests/GatewayTest.php | 64 - .../Message/CompletePurchaseResponseTest.php | 18 - .../tests/Message/PurchaseRequestTest.php | 27 - .../tests/Message/PurchaseResponseTest.php | 21 - vendor_old/omnipay/authorizenet/.gitignore | 5 - vendor_old/omnipay/authorizenet/.travis.yml | 18 - .../omnipay/authorizenet/CONTRIBUTING.md | 10 - vendor_old/omnipay/authorizenet/LICENSE | 20 - vendor_old/omnipay/authorizenet/README.md | 90 - vendor_old/omnipay/authorizenet/composer.json | 41 - .../omnipay/authorizenet/phpunit.xml.dist | 25 - .../omnipay/authorizenet/src/AIMGateway.php | 144 - .../omnipay/authorizenet/src/CIMGateway.php | 83 - .../omnipay/authorizenet/src/DPMGateway.php | 46 - .../src/Message/AIMAbstractRequest.php | 323 - .../src/Message/AIMAuthorizeRequest.php | 54 - .../src/Message/AIMCaptureRequest.php | 23 - .../src/Message/AIMPurchaseRequest.php | 11 - .../src/Message/AIMRefundRequest.php | 68 - .../authorizenet/src/Message/AIMResponse.php | 180 - .../src/Message/AIMVoidRequest.php | 22 - .../src/Message/CIMAbstractRequest.php | 111 - .../src/Message/CIMAbstractResponse.php | 206 - .../src/Message/CIMAuthorizeRequest.php | 48 - .../src/Message/CIMCaptureRequest.php | 7 - .../src/Message/CIMCreateCardRequest.php | 298 - .../src/Message/CIMCreateCardResponse.php | 27 - .../CIMCreatePaymentProfileRequest.php | 50 - .../CIMCreatePaymentProfileResponse.php | 27 - .../CIMDeletePaymentProfileRequest.php | 31 - .../CIMDeletePaymentProfileResponse.php | 11 - .../Message/CIMGetPaymentProfileRequest.php | 32 - .../Message/CIMGetPaymentProfileResponse.php | 19 - .../src/Message/CIMGetProfileRequest.php | 31 - .../src/Message/CIMGetProfileResponse.php | 47 - .../src/Message/CIMPurchaseRequest.php | 11 - .../src/Message/CIMRefundRequest.php | 11 - .../authorizenet/src/Message/CIMResponse.php | 10 - .../CIMUpdatePaymentProfileRequest.php | 51 - .../CIMUpdatePaymentProfileResponse.php | 16 - .../src/Message/CIMVoidRequest.php | 10 - .../src/Message/DPMAuthorizeRequest.php | 61 - .../src/Message/DPMCompleteRequest.php | 16 - .../src/Message/DPMCompleteResponse.php | 10 - .../src/Message/DPMPurchaseRequest.php | 11 - .../authorizenet/src/Message/DPMResponse.php | 158 - .../src/Message/SIMAbstractRequest.php | 176 - .../src/Message/SIMAuthorizeRequest.php | 92 - .../src/Message/SIMAuthorizeResponse.php | 47 - .../src/Message/SIMCaptureRequest.php | 22 - .../Message/SIMCompleteAuthorizeRequest.php | 83 - .../Message/SIMCompleteAuthorizeResponse.php | 118 - .../src/Message/SIMPurchaseRequest.php | 11 - .../src/Message/SIMVoidRequest.php | 21 - .../authorizenet/src/Model/CardReference.php | 78 - .../src/Model/TransactionReference.php | 122 - .../omnipay/authorizenet/src/SIMGateway.php | 95 - .../tests/AIMGatewayIntegrationTest.php | 96 - .../authorizenet/tests/AIMGatewayTest.php | 186 - .../tests/CIMGatewayIntegrationTest.php | 213 - .../authorizenet/tests/CIMGatewayTest.php | 238 - .../authorizenet/tests/DPMGatewayTest.php | 130 - .../tests/Message/AIMAbstractRequestTest.php | 37 - .../tests/Message/AIMAuthorizeRequestTest.php | 89 - .../tests/Message/AIMPurchaseRequestTest.php | 37 - .../tests/Message/AIMRefundRequestTest.php | 82 - .../tests/Message/AIMResponseTest.php | 160 - .../tests/Message/CIMAuthorizeRequestTest.php | 36 - .../tests/Message/CIMCaptureRequestTest.php | 30 - .../Message/CIMCreateCardRequestTest.php | 62 - .../Message/CIMCreateCardResponseTest.php | 46 - .../CIMCreatePaymentProfileRequestTest.php | 34 - .../CIMCreatePaymentProfileResponseTest.php | 43 - .../CIMGetPaymentProfileRequestTest.php | 29 - .../CIMGetPaymentProfileResponseTest.php | 26 - .../Message/CIMGetProfileRequestTest.php | 27 - .../Message/CIMGetProfileResponseTest.php | 26 - .../tests/Message/CIMPurchaseRequestTest.php | 33 - .../tests/Message/CIMRefundRequestTest.php | 32 - .../CIMUpdatePaymentProfileRequestTest.php | 35 - .../CIMUpdatePaymentProfileResponseTest.php | 34 - .../tests/Message/DPMAuthorizeRequestTest.php | 85 - .../tests/Message/DPMCompleteRequestTest.php | 100 - .../tests/Message/DPMCompleteResponseTest.php | 26 - .../tests/Message/DPMPurchaseRequestTest.php | 88 - .../tests/Message/SIMAuthorizeRequestTest.php | 87 - .../SIMCompleteAuthorizeRequestTest.php | 66 - .../SIMCompleteAuthorizeResponseTest.php | 26 - .../tests/Mock/AIMAuthorizeFailure.txt | 13 - .../tests/Mock/AIMAuthorizeInvalid.txt | 13 - .../Mock/AIMAuthorizeInvalidOTSToken.txt | 13 - .../tests/Mock/AIMAuthorizeSuccess.txt | 13 - .../tests/Mock/AIMCaptureFailure.txt | 13 - .../tests/Mock/AIMCaptureSuccess.txt | 13 - .../tests/Mock/AIMPurchaseFailure.txt | 13 - .../tests/Mock/AIMPurchaseSuccess.txt | 13 - .../tests/Mock/AIMRefundFailure.txt | 13 - .../tests/Mock/AIMRefundSuccess.txt | 13 - .../tests/Mock/AIMVoidFailure.txt | 13 - .../tests/Mock/AIMVoidSuccess.txt | 13 - .../tests/Mock/CIMCreateCardFailure.txt | 14 - .../CIMCreateCardFailureWithDuplicate.txt | 14 - .../tests/Mock/CIMCreateCardSuccess.txt | 14 - .../Mock/CIMCreatePaymentProfileFailure.txt | 14 - ...tePaymentProfileFailureMaxProfileLimit.txt | 14 - .../Mock/CIMCreatePaymentProfileSuccess.txt | 14 - .../Mock/CIMGetPaymentProfileSuccess.txt | 14 - .../tests/Mock/CIMGetProfileSuccess.txt | 14 - .../Mock/CIMUpdatePaymentProfileSuccess.txt | 14 - .../tests/Mock/DPMAuthorizeFailure.txt | 10 - .../tests/Mock/DPMAuthorizeSuccess.txt | 10 - .../tests/Model/CardReferenceTest.php | 29 - .../tests/Model/TransactionReferenceTest.php | 31 - .../authorizenet/tests/SIMGatewayTest.php | 102 - vendor_old/omnipay/buckaroo/.gitignore | 4 - vendor_old/omnipay/buckaroo/.travis.yml | 14 - vendor_old/omnipay/buckaroo/CONTRIBUTING.md | 10 - vendor_old/omnipay/buckaroo/LICENSE | 20 - vendor_old/omnipay/buckaroo/README.md | 53 - vendor_old/omnipay/buckaroo/composer.json | 39 - vendor_old/omnipay/buckaroo/phpunit.xml.dist | 25 - .../omnipay/buckaroo/src/BuckarooGateway.php | 55 - .../buckaroo/src/CreditCardGateway.php | 31 - .../omnipay/buckaroo/src/IdealGateway.php | 19 - .../buckaroo/src/Message/AbstractRequest.php | 133 - .../src/Message/CompletePurchaseRequest.php | 32 - .../src/Message/CompletePurchaseResponse.php | 47 - .../src/Message/CreditCardPurchaseRequest.php | 24 - .../src/Message/IdealPurchaseRequest.php | 21 - .../src/Message/PayPalPurchaseRequest.php | 17 - .../buckaroo/src/Message/PurchaseRequest.php | 22 - .../buckaroo/src/Message/PurchaseResponse.php | 37 - .../SepaDirectDebitPurchaseRequest.php | 17 - .../omnipay/buckaroo/src/PayPalGateway.php | 19 - .../buckaroo/src/SepaDirectDebitGateway.php | 19 - .../buckaroo/tests/BuckarooGatewayTest.php | 28 - .../buckaroo/tests/CreditCardGatewayTest.php | 30 - .../buckaroo/tests/IdealGatewayTest.php | 49 - .../tests/Message/AbstractRequestTest.php | 100 - .../Message/CompletePurchaseRequestTest.php | 88 - .../Message/CompletePurchaseResponseTest.php | 36 - .../Message/CreditCardPurchaseRequestTest.php | 73 - .../Message/IdealPurchaseRequestTest.php | 28 - .../Message/PayPalPurchaseRequestTest.php | 28 - .../tests/Message/PurchaseRequestTest.php | 57 - .../SepaDirectDebitPurchaseRequestTest.php | 28 - .../buckaroo/tests/PayPalGatewayTest.php | 23 - .../tests/SepaDirectDebitGatewayTest.php | 26 - vendor_old/omnipay/cardsave/.gitignore | 4 - vendor_old/omnipay/cardsave/.travis.yml | 17 - vendor_old/omnipay/cardsave/CONTRIBUTING.md | 10 - vendor_old/omnipay/cardsave/LICENSE | 20 - vendor_old/omnipay/cardsave/README.md | 50 - vendor_old/omnipay/cardsave/composer.json | 40 - vendor_old/omnipay/cardsave/phpunit.xml.dist | 25 - vendor_old/omnipay/cardsave/src/Gateway.php | 68 - .../src/Message/CompletePurchaseRequest.php | 30 - .../cardsave/src/Message/PurchaseRequest.php | 102 - .../src/Message/ReferencedPurchaseRequest.php | 11 - .../cardsave/src/Message/RefundRequest.php | 38 - .../omnipay/cardsave/src/Message/Response.php | 78 - .../omnipay/cardsave/tests/GatewayTest.php | 53 - .../Message/ReferencedPurchaseRequestTest.php | 37 - .../tests/Message/RefundRequestTest.php | 37 - .../cardsave/tests/Message/ResponseTest.php | 60 - .../cardsave/tests/Mock/PurchaseFailure.txt | 10 - .../Mock/PurchaseFailureWithoutStatusCode.txt | 10 - .../cardsave/tests/Mock/PurchaseRedirect.txt | 10 - .../cardsave/tests/Mock/PurchaseSuccess.txt | 10 - vendor_old/omnipay/coinbase/.gitignore | 4 - vendor_old/omnipay/coinbase/.travis.yml | 13 - vendor_old/omnipay/coinbase/CONTRIBUTING.md | 10 - vendor_old/omnipay/coinbase/LICENSE | 20 - vendor_old/omnipay/coinbase/README.md | 50 - vendor_old/omnipay/coinbase/composer.json | 39 - vendor_old/omnipay/coinbase/phpunit.xml.dist | 25 - vendor_old/omnipay/coinbase/src/Gateway.php | 84 - .../coinbase/src/Message/AbstractRequest.php | 80 - .../src/Message/CompletePurchaseRequest.php | 33 - .../src/Message/FetchTransactionRequest.php | 25 - .../coinbase/src/Message/PurchaseRequest.php | 35 - .../coinbase/src/Message/PurchaseResponse.php | 47 - .../omnipay/coinbase/src/Message/Response.php | 35 - .../omnipay/coinbase/tests/GatewayTest.php | 39 - .../tests/Message/AbstractRequestTest.php | 35 - .../Message/CompletePurchaseRequestTest.php | 85 - .../Message/FetchTransactionRequestTest.php | 54 - .../tests/Message/PurchaseRequestTest.php | 96 - .../tests/Message/PurchaseResponseTest.php | 45 - .../coinbase/tests/Message/ResponseTest.php | 40 - .../tests/Mock/FetchTransactionFailure.txt | 23 - .../tests/Mock/FetchTransactionSuccess.txt | 23 - .../coinbase/tests/Mock/PurchaseFailure.txt | 23 - .../coinbase/tests/Mock/PurchaseSuccess.txt | 23 - .../tests/Mock/PurchaseUnauthorized.txt | 22 - vendor_old/omnipay/common/.gitignore | 7 - vendor_old/omnipay/common/.travis.yml | 21 - vendor_old/omnipay/common/CONTRIBUTING.md | 10 - vendor_old/omnipay/common/LICENSE | 20 - vendor_old/omnipay/common/README.md | 23 - vendor_old/omnipay/common/composer.json | 96 - vendor_old/omnipay/common/makedoc.sh | 23 - vendor_old/omnipay/common/phpunit.xml.dist | 25 - .../src/Omnipay/Common/AbstractGateway.php | 301 - .../common/src/Omnipay/Common/CreditCard.php | 1407 - .../common/src/Omnipay/Common/Currency.php | 135 - .../Exception/BadMethodCallException.php | 10 - .../Exception/InvalidCreditCardException.php | 12 - .../Exception/InvalidRequestException.php | 12 - .../Exception/InvalidResponseException.php | 16 - .../Common/Exception/OmnipayException.php | 10 - .../Common/Exception/RuntimeException.php | 10 - .../src/Omnipay/Common/GatewayFactory.php | 122 - .../src/Omnipay/Common/GatewayInterface.php | 55 - .../common/src/Omnipay/Common/Helper.php | 118 - .../common/src/Omnipay/Common/Issuer.php | 86 - .../common/src/Omnipay/Common/Item.php | 128 - .../common/src/Omnipay/Common/ItemBag.php | 100 - .../src/Omnipay/Common/ItemInterface.php | 35 - .../Common/Message/AbstractRequest.php | 623 - .../Common/Message/AbstractResponse.php | 168 - .../Message/FetchIssuersResponseInterface.php | 31 - .../FetchPaymentMethodsResponseInterface.php | 31 - .../Common/Message/MessageInterface.php | 23 - .../Message/RedirectResponseInterface.php | 39 - .../Common/Message/RequestInterface.php | 51 - .../Common/Message/ResponseInterface.php | 66 - .../src/Omnipay/Common/PaymentMethod.php | 66 - .../omnipay/common/src/Omnipay/Omnipay.php | 105 - .../Omnipay/Common/AbstractGatewayTest.php | 175 - .../tests/Omnipay/Common/CreditCardTest.php | 601 - .../tests/Omnipay/Common/CurrencyTest.php | 42 - .../Exception/BadMethodCallExceptionTest.php | 14 - .../InvalidCreditCardExceptionTest.php | 14 - .../Exception/InvalidRequestExceptionTest.php | 14 - .../InvalidResponseExceptionTest.php | 20 - .../Common/Exception/RuntimeExceptionTest.php | 14 - .../Omnipay/Common/GatewayFactoryTest.php | 95 - .../tests/Omnipay/Common/HelperTest.php | 137 - .../tests/Omnipay/Common/IssuerTest.php | 26 - .../tests/Omnipay/Common/ItemBagTest.php | 75 - .../common/tests/Omnipay/Common/ItemTest.php | 55 - .../Common/Message/AbstractRequestTest.php | 345 - .../Common/Message/AbstractResponseTest.php | 111 - .../Omnipay/Common/PaymentMethodTest.php | 16 - .../common/tests/Omnipay/OmnipayTest.php | 42 - vendor_old/omnipay/common/tests/bootstrap.php | 10 - vendor_old/omnipay/dummy/.gitignore | 10 - vendor_old/omnipay/dummy/.travis.yml | 13 - vendor_old/omnipay/dummy/CONTRIBUTING.md | 10 - vendor_old/omnipay/dummy/LICENSE | 20 - vendor_old/omnipay/dummy/README.md | 55 - vendor_old/omnipay/dummy/composer.json | 39 - vendor_old/omnipay/dummy/makedoc.sh | 157 - vendor_old/omnipay/dummy/phpunit.xml.dist | 25 - vendor_old/omnipay/dummy/runtests.sh | 25 - vendor_old/omnipay/dummy/src/Gateway.php | 89 - .../dummy/src/Message/AuthorizeRequest.php | 66 - .../omnipay/dummy/src/Message/Response.php | 30 - .../omnipay/dummy/tests/GatewayTest.php | 72 - .../tests/Message/AuthorizeRequestTest.php | 23 - .../dummy/tests/Message/ResponseTest.php | 34 - vendor_old/omnipay/eway/.gitignore | 10 - vendor_old/omnipay/eway/.travis.yml | 13 - vendor_old/omnipay/eway/CONTRIBUTING.md | 10 - vendor_old/omnipay/eway/LICENSE | 20 - vendor_old/omnipay/eway/README.md | 65 - vendor_old/omnipay/eway/composer.json | 39 - vendor_old/omnipay/eway/makedoc.sh | 146 - vendor_old/omnipay/eway/phpunit.xml.dist | 25 - vendor_old/omnipay/eway/runtests.sh | 25 - vendor_old/omnipay/eway/src/DirectGateway.php | 67 - .../eway/src/Message/AbstractRequest.php | 153 - .../eway/src/Message/AbstractResponse.php | 235 - .../src/Message/DirectAbstractRequest.php | 71 - .../src/Message/DirectAuthorizeRequest.php | 53 - .../eway/src/Message/DirectCaptureRequest.php | 38 - .../src/Message/DirectPurchaseRequest.php | 53 - .../eway/src/Message/DirectRefundRequest.php | 53 - .../eway/src/Message/DirectResponse.php | 37 - .../eway/src/Message/DirectVoidRequest.php | 35 - .../eway/src/Message/RapidCaptureRequest.php | 68 - .../Message/RapidCompletePurchaseRequest.php | 24 - .../Message/RapidDirectAbstractRequest.php | 106 - .../Message/RapidDirectAuthorizeRequest.php | 92 - .../Message/RapidDirectCreateCardRequest.php | 76 - .../Message/RapidDirectPurchaseRequest.php | 103 - .../Message/RapidDirectUpdateCardRequest.php | 83 - .../eway/src/Message/RapidPurchaseRequest.php | 53 - .../eway/src/Message/RapidResponse.php | 55 - .../Message/RapidSharedPurchaseRequest.php | 143 - .../eway/src/Message/RapidSharedResponse.php | 48 - .../eway/src/Message/RefundRequest.php | 70 - .../eway/src/Message/RefundResponse.php | 12 - .../omnipay/eway/src/RapidDirectGateway.php | 220 - vendor_old/omnipay/eway/src/RapidGateway.php | 79 - .../omnipay/eway/src/RapidSharedGateway.php | 76 - .../omnipay/eway/tests/DirectGatewayTest.php | 204 - .../tests/Message/AbstractRequestTest.php | 71 - .../tests/Message/AbstractResponseTest.php | 42 - .../tests/Message/RapidCaptureRequestTest.php | 64 - .../RapidCompletePurchaseRequestTest.php | 55 - .../RapidDirectAuthorizeRequestTest.php | 107 - .../RapidDirectCreateCardRequestTest.php | 94 - .../RapidDirectPurchaseRequestTest.php | 216 - .../RapidDirectUpdateCardRequestTest.php | 84 - .../Message/RapidPurchaseRequestTest.php | 130 - .../eway/tests/Message/RapidResponseTest.php | 24 - .../RapidSharedPurchaseRequestTest.php | 181 - .../eway/tests/Message/RefundRequestTest.php | 118 - .../tests/Mock/DirectAuthorizeFailure.txt | 11 - .../tests/Mock/DirectAuthorizeSuccess.txt | 11 - .../eway/tests/Mock/DirectCaptureFailure.txt | 11 - .../eway/tests/Mock/DirectCaptureSuccess.txt | 11 - .../eway/tests/Mock/DirectPurchaseFailure.txt | 11 - .../eway/tests/Mock/DirectPurchaseSuccess.txt | 11 - .../eway/tests/Mock/DirectRefundFailure.txt | 11 - .../eway/tests/Mock/DirectRefundSuccess.txt | 11 - .../eway/tests/Mock/DirectVoidFailure.txt | 11 - .../eway/tests/Mock/DirectVoidSuccess.txt | 11 - .../tests/Mock/RapidCaptureRequestFailure.txt | 16 - .../tests/Mock/RapidCaptureRequestSuccess.txt | 16 - .../RapidCompletePurchaseRequestFailure.txt | 16 - .../RapidCompletePurchaseRequestSuccess.txt | 16 - .../RapidDirectAuthoriseRequestFailure.txt | 17 - .../RapidDirectAuthoriseRequestSuccess.txt | 17 - .../RapidDirectCreateCardRequestFailure.txt | 17 - .../RapidDirectCreateCardRequestSuccess.txt | 17 - .../RapidDirectPurchaseRequestFailure.txt | 17 - .../RapidDirectPurchaseRequestSuccess.txt | 17 - .../RapidDirectUpdateCardRequestFailure.txt | 17 - .../RapidDirectUpdateCardRequestSuccess.txt | 17 - .../Mock/RapidPurchaseRequestFailure.txt | 17 - .../Mock/RapidPurchaseRequestSuccess.txt | 16 - .../tests/Mock/RapidRefundRequestFailure.txt | 16 - .../tests/Mock/RapidRefundRequestSuccess.txt | 16 - .../RapidSharedPurchaseRequestFailure.txt | 17 - .../RapidSharedPurchaseRequestSuccess.txt | 16 - .../eway/tests/RapidDirectGatewayTest.php | 47 - .../omnipay/eway/tests/RapidGatewayTest.php | 31 - .../eway/tests/RapidSharedGatewayTest.php | 31 - vendor_old/omnipay/firstdata/.gitignore | 10 - vendor_old/omnipay/firstdata/.travis.yml | 13 - vendor_old/omnipay/firstdata/CONTRIBUTING.md | 10 - vendor_old/omnipay/firstdata/LICENSE | 20 - vendor_old/omnipay/firstdata/README.md | 116 - vendor_old/omnipay/firstdata/composer.json | 40 - vendor_old/omnipay/firstdata/phpunit.xml.dist | 25 - vendor_old/omnipay/firstdata/runtests.sh | 34 - .../omnipay/firstdata/src/ConnectGateway.php | 175 - .../omnipay/firstdata/src/GlobalGateway.php | 15 - .../src/Message/CompletePurchaseRequest.php | 55 - .../src/Message/CompletePurchaseResponse.php | 34 - .../src/Message/PayeezyAbstractRequest.php | 232 - .../src/Message/PayeezyAuthorizeRequest.php | 14 - .../src/Message/PayeezyCaptureRequest.php | 14 - .../src/Message/PayeezyPurchaseRequest.php | 85 - .../src/Message/PayeezyRefundRequest.php | 29 - .../firstdata/src/Message/PayeezyResponse.php | 139 - .../src/Message/PayeezyVoidRequest.php | 14 - .../firstdata/src/Message/PurchaseRequest.php | 181 - .../src/Message/PurchaseResponse.php | 42 - .../src/Message/WebserviceAbstractRequest.php | 392 - .../Message/WebserviceAuthorizeRequest.php | 65 - .../src/Message/WebserviceCaptureRequest.php | 78 - .../src/Message/WebservicePurchaseRequest.php | 155 - .../src/Message/WebserviceRefundRequest.php | 92 - .../src/Message/WebserviceResponse.php | 66 - .../src/Message/WebserviceVoidRequest.php | 87 - .../omnipay/firstdata/src/PayeezyGateway.php | 218 - .../firstdata/src/WebserviceGateway.php | 413 - .../omnipay/firstdata/tests/GatewayTest.php | 179 - .../Message/CompletePurchaseResponseTest.php | 48 - .../Message/PayeezyAuthorizeRequestTest.php | 26 - .../Message/PayeezyPurchaseRequestTest.php | 44 - .../Message/PayeezyPurchaseResponseTest.php | 59 - .../Message/PayeezyRefundRequestTest.php | 24 - .../tests/Message/PurchaseResponseTest.php | 22 - .../Message/WebserviceCaptureRequestTest.php | 22 - .../Message/WebservicePurchaseRequestTest.php | 40 - .../Message/WebserviceRefundRequestTest.php | 25 - .../Message/WebserviceVoidRequestTest.php | 23 - .../firstdata/tests/Mock/PurchaseSuccess.txt | 5 - .../firstdata/tests/Mock/RefundError.txt | 5 - .../firstdata/tests/Mock/RefundSuccess.txt | 5 - .../tests/Mock/WebservicePurchaseSuccess.txt | 1 - .../firstdata/tests/PayeezyGatewayTest.php | 61 - .../firstdata/tests/WebserviceGatewayTest.php | 65 - vendor_old/omnipay/gocardless/.gitignore | 4 - vendor_old/omnipay/gocardless/.travis.yml | 13 - vendor_old/omnipay/gocardless/CONTRIBUTING.md | 10 - vendor_old/omnipay/gocardless/LICENSE | 20 - vendor_old/omnipay/gocardless/README.md | 50 - vendor_old/omnipay/gocardless/composer.json | 40 - .../omnipay/gocardless/phpunit.xml.dist | 25 - vendor_old/omnipay/gocardless/src/Gateway.php | 129 - .../src/Message/AbstractRequest.php | 161 - .../src/Message/AuthorizeRequest.php | 90 - .../src/Message/AuthorizeResponse.php | 37 - .../gocardless/src/Message/CaptureRequest.php | 51 - .../src/Message/CaptureResponse.php | 24 - .../src/Message/CompleteAuthorizeRequest.php | 55 - .../src/Message/CompleteAuthorizeResponse.php | 35 - .../src/Message/CompletePurchaseRequest.php | 57 - .../src/Message/CompletePurchaseResponse.php | 37 - .../src/Message/PurchaseRequest.php | 47 - .../src/Message/PurchaseResponse.php | 38 - .../omnipay/gocardless/tests/GatewayTest.php | 168 - .../Message/CompletePurchaseResponseTest.php | 28 - .../tests/Mock/CapturePaymentFailure.txt | 3 - .../tests/Mock/CapturePaymentSuccess.txt | 3 - .../tests/Mock/CompletePurchaseFailure.txt | 3 - .../tests/Mock/CompletePurchaseSuccess.txt | 3 - vendor_old/omnipay/manual/.gitignore | 10 - vendor_old/omnipay/manual/.travis.yml | 13 - vendor_old/omnipay/manual/CONTRIBUTING.md | 10 - vendor_old/omnipay/manual/LICENSE | 20 - vendor_old/omnipay/manual/README.md | 50 - vendor_old/omnipay/manual/composer.json | 39 - vendor_old/omnipay/manual/makedoc.sh | 146 - vendor_old/omnipay/manual/phpunit.xml.dist | 25 - vendor_old/omnipay/manual/runtests.sh | 25 - vendor_old/omnipay/manual/src/Gateway.php | 105 - .../omnipay/manual/src/Message/Request.php | 26 - .../omnipay/manual/src/Message/Response.php | 19 - .../omnipay/manual/tests/GatewayTest.php | 96 - vendor_old/omnipay/migs/.gitignore | 4 - vendor_old/omnipay/migs/.travis.yml | 13 - vendor_old/omnipay/migs/CONTRIBUTING.md | 10 - vendor_old/omnipay/migs/LICENSE | 20 - vendor_old/omnipay/migs/README.md | 51 - vendor_old/omnipay/migs/composer.json | 40 - vendor_old/omnipay/migs/phpunit.xml.dist | 25 - .../migs/src/Message/AbstractRequest.php | 83 - .../omnipay/migs/src/Message/Response.php | 36 - .../ThreePartyCompletePurchaseRequest.php | 33 - .../src/Message/ThreePartyPurchaseRequest.php | 38 - .../Message/ThreePartyPurchaseResponse.php | 46 - .../src/Message/ThreePartyRefundRequest.php | 35 - .../src/Message/TwoPartyPurchaseRequest.php | 38 - .../omnipay/migs/src/ThreePartyGateway.php | 31 - .../omnipay/migs/src/TwoPartyGateway.php | 62 - .../ThreePartyCompletePurchaseRequestTest.php | 51 - .../Message/ThreePartyPurchaseRequestTest.php | 60 - .../ThreePartyPurchaseResponseTest.php | 25 - .../Message/ThreePartyRefundRequestTest.php | 0 .../Message/TwoPartyPurchaseRequestTest.php | 64 - .../Message/TwoPartyPurchaseResponseTest.php | 34 - .../tests/Mock/TwoPartyPurchaseFailure.txt | 11 - .../tests/Mock/TwoPartyPurchaseSuccess.txt | 11 - .../migs/tests/ThreePartyGatewayTest.php | 49 - .../migs/tests/TwoPartyGatewayTest.php | 53 - vendor_old/omnipay/mollie/.gitignore | 4 - vendor_old/omnipay/mollie/.travis.yml | 13 - vendor_old/omnipay/mollie/CONTRIBUTING.md | 10 - vendor_old/omnipay/mollie/LICENSE | 20 - vendor_old/omnipay/mollie/README.md | 50 - vendor_old/omnipay/mollie/composer.json | 39 - vendor_old/omnipay/mollie/phpunit.xml.dist | 25 - vendor_old/omnipay/mollie/src/Gateway.php | 129 - .../mollie/src/Message/AbstractRequest.php | 55 - .../mollie/src/Message/AbstractResponse.php | 18 - .../src/Message/CompletePurchaseRequest.php | 38 - .../src/Message/CompletePurchaseResponse.php | 14 - .../src/Message/CreateCustomerRequest.php | 113 - .../src/Message/CreateCustomerResponse.php | 16 - .../src/Message/FetchCustomerRequest.php | 57 - .../src/Message/FetchCustomerResponse.php | 16 - .../src/Message/FetchIssuersRequest.php | 26 - .../src/Message/FetchIssuersResponse.php | 26 - .../Message/FetchPaymentMethodsRequest.php | 26 - .../Message/FetchPaymentMethodsResponse.php | 26 - .../src/Message/FetchTransactionRequest.php | 28 - .../src/Message/FetchTransactionResponse.php | 150 - .../mollie/src/Message/PurchaseRequest.php | 54 - .../mollie/src/Message/PurchaseResponse.php | 17 - .../mollie/src/Message/RefundRequest.php | 29 - .../mollie/src/Message/RefundResponse.php | 18 - .../src/Message/UpdateCustomerRequest.php | 133 - .../src/Message/UpdateCustomerResponse.php | 16 - .../omnipay/mollie/tests/GatewayTest.php | 135 - .../Message/CompletePurchaseRequestTest.php | 84 - .../Message/CreateCustomerRequestTest.php | 73 - .../Message/FetchCustomerRequestTest.php | 56 - .../tests/Message/FetchIssuersRequestTest.php | 55 - .../FetchPaymentMethodsRequestTest.php | 59 - .../Message/FetchTransactionRequestTest.php | 75 - .../tests/Message/PurchaseRequestTest.php | 159 - .../tests/Message/RefundRequestTest.php | 67 - .../Message/UpdateCustomerRequestTest.php | 80 - .../tests/Mock/CompletePurchaseExpired.txt | 28 - .../tests/Mock/CompletePurchaseFailure.txt | 19 - .../tests/Mock/CompletePurchaseSuccess.txt | 31 - .../tests/Mock/CreateCustomerFailure.txt | 22 - .../tests/Mock/CreateCustomerSuccess.txt | 24 - .../tests/Mock/FetchCustomerFailure.txt | 19 - .../tests/Mock/FetchCustomerSuccess.txt | 24 - .../mollie/tests/Mock/FetchIssuersFailure.txt | 22 - .../mollie/tests/Mock/FetchIssuersSuccess.txt | 25 - .../tests/Mock/FetchPaymentMethodsFailure.txt | 21 - .../tests/Mock/FetchPaymentMethodsSuccess.txt | 67 - .../tests/Mock/FetchTransactionExpired.txt | 28 - .../tests/Mock/FetchTransactionFailure.txt | 18 - .../tests/Mock/FetchTransactionSuccess.txt | 31 - .../mollie/tests/Mock/PurchaseFailure.txt | 19 - .../tests/Mock/PurchaseIssuerFailure.txt | 19 - .../mollie/tests/Mock/PurchaseSuccess.txt | 28 - .../tests/Mock/PurchaseSystemFailure.txt | 18 - .../mollie/tests/Mock/RefundSuccess.txt | 43 - .../tests/Mock/UpdateCustomerFailure.txt | 22 - .../tests/Mock/UpdateCustomerSuccess.txt | 24 - vendor_old/omnipay/multisafepay/.gitignore | 4 - vendor_old/omnipay/multisafepay/.travis.yml | 17 - .../omnipay/multisafepay/CONTRIBUTING.md | 10 - vendor_old/omnipay/multisafepay/LICENSE | 20 - vendor_old/omnipay/multisafepay/README.md | 51 - vendor_old/omnipay/multisafepay/composer.json | 40 - .../omnipay/multisafepay/phpunit.xml.dist | 25 - .../omnipay/multisafepay/src/Gateway.php | 19 - .../src/Message/AbstractRequest.php | 133 - .../src/Message/AbstractResponse.php | 41 - .../src/Message/CompletePurchaseRequest.php | 57 - .../src/Message/CompletePurchaseResponse.php | 106 - .../src/Message/FetchIssuersRequest.php | 52 - .../src/Message/FetchIssuersResponse.php | 39 - .../Message/FetchPaymentMethodsRequest.php | 75 - .../Message/FetchPaymentMethodsResponse.php | 39 - .../src/Message/PurchaseRequest.php | 290 - .../src/Message/PurchaseResponse.php | 81 - .../src/Message/RestAbstractRequest.php | 179 - .../src/Message/RestAbstractResponse.php | 79 - .../Message/RestCompletePurchaseRequest.php | 58 - .../Message/RestCompletePurchaseResponse.php | 30 - .../src/Message/RestFetchIssuersRequest.php | 66 - .../src/Message/RestFetchIssuersResponse.php | 48 - .../RestFetchPaymentMethodsRequest.php | 84 - .../RestFetchPaymentMethodsResponse.php | 52 - .../Message/RestFetchTransactionRequest.php | 65 - .../Message/RestFetchTransactionResponse.php | 103 - .../src/Message/RestPurchaseRequest.php | 543 - .../src/Message/RestPurchaseResponse.php | 141 - .../src/Message/RestRefundRequest.php | 81 - .../src/Message/RestRefundResponse.php | 38 - .../omnipay/multisafepay/src/RestGateway.php | 258 - .../omnipay/multisafepay/src/XmlGateway.php | 178 - .../Message/RestFetchIssuersRequestTest.php | 57 - .../RestFetchPaymentMethodsRequestTest.php | 42 - .../tests/Message/RestPurchaseRequestTest.php | 91 - .../tests/Message/XmlAbstractRequestTest.php | 37 - .../XmlCompletePurchaseRequestTest.php | 110 - .../Message/XmlFetchIssuersRequestTest.php | 104 - .../XmlFetchPaymentMethodsRequestTest.php | 103 - .../tests/Message/XmlPurchaseRequestTest.php | 293 - .../tests/Mock/RestFetchIssuersFailure.txt | 8 - .../tests/Mock/RestFetchIssuersSuccess.txt | 8 - .../Mock/RestFetchPaymentMethodsSuccess.txt | 8 - .../tests/Mock/RestInvalidApiKeyFailure.txt | 8 - .../tests/Mock/RestPurchaseInvalidAmount.txt | 8 - .../tests/Mock/RestPurchaseSuccess.txt | 8 - .../tests/Mock/XmlCompletePurchaseFailure.txt | 8 - .../tests/Mock/XmlCompletePurchaseSuccess.txt | 8 - .../tests/Mock/XmlFetchIssuersFailure.txt | 10 - .../tests/Mock/XmlFetchIssuersSuccess.txt | 10 - .../Mock/XmlFetchPaymentMethodsFailure.txt | 10 - .../Mock/XmlFetchPaymentMethodsSuccess.txt | 10 - .../tests/Mock/XmlPurchaseFailure.txt | 8 - .../tests/Mock/XmlPurchaseSuccess.txt | 8 - .../multisafepay/tests/RestGatewayTest.php | 59 - .../multisafepay/tests/XmlGatewayTest.php | 154 - vendor_old/omnipay/netaxept/.gitignore | 4 - vendor_old/omnipay/netaxept/.travis.yml | 13 - vendor_old/omnipay/netaxept/CONTRIBUTING.md | 10 - vendor_old/omnipay/netaxept/LICENSE | 20 - vendor_old/omnipay/netaxept/README.md | 50 - vendor_old/omnipay/netaxept/composer.json | 39 - vendor_old/omnipay/netaxept/phpunit.xml.dist | 25 - vendor_old/omnipay/netaxept/src/Gateway.php | 74 - .../netaxept/src/Message/AnnulRequest.php | 38 - .../netaxept/src/Message/CaptureRequest.php | 37 - .../src/Message/CompletePurchaseRequest.php | 39 - .../netaxept/src/Message/CreditRequest.php | 38 - .../netaxept/src/Message/ErrorResponse.php | 26 - .../netaxept/src/Message/PurchaseRequest.php | 75 - .../omnipay/netaxept/src/Message/Response.php | 58 - .../omnipay/netaxept/tests/GatewayTest.php | 179 - .../tests/Message/AnnulRequestTest.php | 49 - .../tests/Message/CaptureRequestTest.php | 49 - .../Message/CompletePurchaseRequestTest.php | 46 - .../tests/Message/CreditRequestTest.php | 49 - .../tests/Message/PurchaseRequestTest.php | 66 - .../netaxept/tests/Message/ResponseTest.php | 120 - .../netaxept/tests/Mock/AnnulFailure.txt | 15 - .../netaxept/tests/Mock/AnnulSuccess.txt | 21 - .../netaxept/tests/Mock/CaptureFailure.txt | 15 - .../netaxept/tests/Mock/CaptureSuccess.txt | 21 - .../tests/Mock/CompletePurchaseFailure.txt | 15 - .../tests/Mock/CompletePurchaseSuccess.txt | 19 - .../netaxept/tests/Mock/CreditFailure.txt | 15 - .../netaxept/tests/Mock/CreditSuccess.txt | 21 - .../netaxept/tests/Mock/PurchaseFailure.txt | 15 - .../netaxept/tests/Mock/PurchaseSuccess.txt | 13 - vendor_old/omnipay/netbanx/.gitignore | 5 - vendor_old/omnipay/netbanx/.travis.yml | 13 - vendor_old/omnipay/netbanx/CONTRIBUTING.md | 10 - vendor_old/omnipay/netbanx/LICENSE | 20 - vendor_old/omnipay/netbanx/README.md | 50 - vendor_old/omnipay/netbanx/composer.json | 39 - vendor_old/omnipay/netbanx/phpunit.xml.dist | 25 - vendor_old/omnipay/netbanx/src/Gateway.php | 160 - .../omnipay/netbanx/src/HostedGateway.php | 128 - .../netbanx/src/Message/AbstractRequest.php | 189 - .../netbanx/src/Message/AuthorizeRequest.php | 144 - .../netbanx/src/Message/CaptureRequest.php | 59 - .../src/Message/HostedAbstractRequest.php | 103 - .../src/Message/HostedAbstractResponse.php | 73 - .../src/Message/HostedAuthorizeRequest.php | 19 - .../src/Message/HostedCaptureRequest.php | 39 - .../src/Message/HostedCaptureResponse.php | 47 - .../HostedCompleteAuthorizeRequest.php | 7 - .../Message/HostedCompletePurchaseRequest.php | 41 - .../src/Message/HostedPurchaseRequest.php | 120 - .../src/Message/HostedPurchaseResponse.php | 50 - .../src/Message/HostedRefundRequest.php | 42 - .../src/Message/HostedRefundResponse.php | 43 - .../netbanx/src/Message/PurchaseRequest.php | 28 - .../omnipay/netbanx/src/Message/Response.php | 75 - .../netbanx/src/Message/VoidRequest.php | 60 - .../omnipay/netbanx/tests/GatewayTest.php | 335 - .../netbanx/tests/HostedGatewayTest.php | 202 - .../netbanx/tests/Mock/AuthorizeFailure.txt | 32 - .../netbanx/tests/Mock/AuthorizeSuccess.txt | 32 - .../netbanx/tests/Mock/CaptureFailure.txt | 31 - .../netbanx/tests/Mock/CaptureSuccess.txt | 30 - .../omnipay/netbanx/tests/Mock/CreateCard.txt | 32 - .../Mock/HostedCompleteAuthorizeSuccess.txt | 116 - .../Mock/HostedCompletePurchaseSuccess.txt | 112 - .../tests/Mock/HostedPurchaseFailure.txt | 12 - .../tests/Mock/HostedPurchaseSuccess.txt | 33 - .../netbanx/tests/Mock/PurchaseFailure.txt | 31 - .../netbanx/tests/Mock/PurchaseSuccess.txt | 32 - .../tests/Mock/StoredDataAuthorizeFailure.txt | 38 - .../tests/Mock/StoredDataAuthorizeSuccess.txt | 32 - .../tests/Mock/StoredDataPurchaseFailure.txt | 31 - .../tests/Mock/StoredDataPurchaseSuccess.txt | 32 - .../netbanx/tests/Mock/VoidFailure.txt | 31 - .../netbanx/tests/Mock/VoidSuccess.txt | 30 - .../omnipay/netbanx/tests/bootstrap.php | 7 - vendor_old/omnipay/payfast/.gitignore | 4 - vendor_old/omnipay/payfast/.travis.yml | 13 - vendor_old/omnipay/payfast/CONTRIBUTING.md | 10 - vendor_old/omnipay/payfast/LICENSE | 20 - vendor_old/omnipay/payfast/README.md | 50 - vendor_old/omnipay/payfast/composer.json | 39 - vendor_old/omnipay/payfast/phpunit.xml.dist | 25 - vendor_old/omnipay/payfast/src/Gateway.php | 70 - .../Message/CompletePurchaseItnResponse.php | 39 - .../Message/CompletePurchasePdtResponse.php | 39 - .../src/Message/CompletePurchaseRequest.php | 55 - .../payfast/src/Message/PurchaseRequest.php | 96 - .../payfast/src/Message/PurchaseResponse.php | 46 - .../omnipay/payfast/tests/GatewayTest.php | 31 - .../Message/CompletePurchaseRequestTest.php | 86 - .../tests/Message/PurchaseRequestTest.php | 49 - .../tests/Message/PurchaseResponseTest.php | 24 - .../tests/Mock/CompletePurchaseItnFailure.txt | 13 - .../tests/Mock/CompletePurchaseItnSuccess.txt | 12 - .../tests/Mock/CompletePurchasePdtFailure.txt | 12 - .../tests/Mock/CompletePurchasePdtSuccess.txt | 34 - vendor_old/omnipay/payflow/.gitignore | 10 - vendor_old/omnipay/payflow/.travis.yml | 13 - vendor_old/omnipay/payflow/CONTRIBUTING.md | 10 - vendor_old/omnipay/payflow/LICENSE | 20 - vendor_old/omnipay/payflow/README.md | 50 - vendor_old/omnipay/payflow/composer.json | 39 - vendor_old/omnipay/payflow/makedoc.sh | 157 - vendor_old/omnipay/payflow/phpunit.xml.dist | 25 - vendor_old/omnipay/payflow/runtests.sh | 25 - .../payflow/src/Message/AuthorizeRequest.php | 291 - .../payflow/src/Message/CaptureRequest.php | 75 - .../payflow/src/Message/CreateCardRequest.php | 72 - .../src/Message/FetchTransactionRequest.php | 74 - .../payflow/src/Message/InquiryRequest.php | 24 - .../payflow/src/Message/PurchaseRequest.php | 52 - .../payflow/src/Message/RefundRequest.php | 64 - .../omnipay/payflow/src/Message/Response.php | 64 - .../payflow/src/Message/VoidRequest.php | 77 - vendor_old/omnipay/payflow/src/ProGateway.php | 302 - .../tests/Message/AuthorizeRequestTest.php | 66 - .../payflow/tests/Message/ResponseTest.php | 68 - .../payflow/tests/Mock/PurchaseFailure.txt | 8 - .../payflow/tests/Mock/PurchaseSuccess.txt | 8 - .../omnipay/payflow/tests/ProGatewayTest.php | 112 - vendor_old/omnipay/paymentexpress/.gitignore | 4 - vendor_old/omnipay/paymentexpress/.travis.yml | 17 - .../omnipay/paymentexpress/CONTRIBUTING.md | 10 - vendor_old/omnipay/paymentexpress/LICENSE | 20 - vendor_old/omnipay/paymentexpress/README.md | 51 - .../omnipay/paymentexpress/composer.json | 45 - .../omnipay/paymentexpress/phpunit.xml.dist | 25 - .../src/Message/PxPayAuthorizeRequest.php | 233 - .../src/Message/PxPayAuthorizeResponse.php | 51 - .../Message/PxPayCompleteAuthorizeRequest.php | 33 - .../src/Message/PxPayCreateCardRequest.php | 34 - .../src/Message/PxPayPurchaseRequest.php | 11 - .../src/Message/PxPostAuthorizeRequest.php | 176 - .../src/Message/PxPostCaptureRequest.php | 22 - .../src/Message/PxPostCreateCardRequest.php | 25 - .../src/Message/PxPostPurchaseRequest.php | 11 - .../src/Message/PxPostRefundRequest.php | 11 - .../paymentexpress/src/Message/Response.php | 46 - .../paymentexpress/src/PxPayGateway.php | 108 - .../paymentexpress/src/PxPostGateway.php | 74 - .../Message/PxPayAuthorizeResponseTest.php | 32 - .../Message/PxPayCreateCardRequestTest.php | 35 - .../tests/Message/ResponseTest.php | 80 - .../Mock/PxPayCompleteCreateCardFailure.txt | 9 - .../Mock/PxPayCompleteCreateCardSuccess.txt | 9 - .../Mock/PxPayCompletePurchaseFailure.txt | 9 - .../Mock/PxPayCompletePurchaseSuccess.txt | 9 - .../tests/Mock/PxPayCreateCardFailure.txt | 9 - .../tests/Mock/PxPayCreateCardSuccess.txt | 9 - .../tests/Mock/PxPayPurchaseFailure.txt | 9 - .../tests/Mock/PxPayPurchaseSuccess.txt | 9 - .../tests/Mock/PxPostCreateCardFailure.txt | 9 - .../tests/Mock/PxPostCreateCardSuccess.txt | 9 - .../tests/Mock/PxPostPurchaseFailure.txt | 9 - .../tests/Mock/PxPostPurchaseSuccess.txt | 3 - .../paymentexpress/tests/PxPayGatewayTest.php | 253 - .../tests/PxPostGatewayTest.php | 146 - vendor_old/omnipay/paypal/.gitignore | 11 - vendor_old/omnipay/paypal/.travis.yml | 33 - vendor_old/omnipay/paypal/CONTRIBUTING.md | 10 - vendor_old/omnipay/paypal/LICENSE | 20 - vendor_old/omnipay/paypal/README.md | 60 - vendor_old/omnipay/paypal/composer.json | 41 - vendor_old/omnipay/paypal/makedoc.sh | 146 - vendor_old/omnipay/paypal/phpunit.xml.dist | 25 - .../omnipay/paypal/src/ExpressGateway.php | 168 - .../paypal/src/ExpressInContextGateway.php | 24 - .../paypal/src/Message/AbstractRequest.php | 353 - .../src/Message/AbstractRestRequest.php | 205 - .../paypal/src/Message/CaptureRequest.php | 23 - .../src/Message/ExpressAuthorizeRequest.php | 164 - .../src/Message/ExpressAuthorizeResponse.php | 58 - .../ExpressCompleteAuthorizeRequest.php | 47 - .../Message/ExpressCompleteOrderRequest.php | 17 - .../ExpressCompletePurchaseRequest.php | 22 - .../ExpressCompletePurchaseResponse.php | 44 - .../Message/ExpressFetchCheckoutRequest.php | 26 - .../ExpressInContextAuthorizeRequest.php | 14 - .../ExpressInContextAuthorizeResponse.php | 20 - .../Message/ExpressInContextOrderRequest.php | 17 - .../src/Message/ExpressOrderRequest.php | 17 - .../ExpressTransactionSearchRequest.php | 371 - .../ExpressTransactionSearchResponse.php | 34 - .../paypal/src/Message/ExpressVoidRequest.php | 18 - .../src/Message/FetchTransactionRequest.php | 20 - .../src/Message/ProAuthorizeRequest.php | 43 - .../paypal/src/Message/ProPurchaseRequest.php | 17 - .../paypal/src/Message/RefundRequest.php | 26 - .../omnipay/paypal/src/Message/Response.php | 46 - .../src/Message/RestAuthorizeRequest.php | 365 - .../src/Message/RestAuthorizeResponse.php | 100 - .../Message/RestCancelSubscriptionRequest.php | 93 - .../paypal/src/Message/RestCaptureRequest.php | 59 - .../Message/RestCompletePurchaseRequest.php | 71 - .../RestCompleteSubscriptionRequest.php | 120 - .../src/Message/RestCreateCardRequest.php | 110 - .../src/Message/RestCreatePlanRequest.php | 323 - .../Message/RestCreateSubscriptionRequest.php | 457 - .../src/Message/RestDeleteCardRequest.php | 62 - .../src/Message/RestFetchPurchaseRequest.php | 55 - .../Message/RestFetchTransactionRequest.php | 56 - .../src/Message/RestListPurchaseRequest.php | 282 - .../src/Message/RestPurchaseRequest.php | 232 - .../RestReactivateSubscriptionRequest.php | 93 - .../src/Message/RestRefundCaptureRequest.php | 36 - .../paypal/src/Message/RestRefundRequest.php | 73 - .../paypal/src/Message/RestResponse.php | 72 - .../Message/RestSearchTransactionRequest.php | 198 - .../RestSuspendSubscriptionRequest.php | 93 - .../paypal/src/Message/RestTokenRequest.php | 56 - .../src/Message/RestUpdatePlanRequest.php | 127 - .../paypal/src/Message/RestVoidRequest.php | 28 - vendor_old/omnipay/paypal/src/PayPalItem.php | 32 - .../omnipay/paypal/src/PayPalItemBag.php | 33 - vendor_old/omnipay/paypal/src/ProGateway.php | 81 - vendor_old/omnipay/paypal/src/RestGateway.php | 702 - .../InstantUpdateApi/ShippingOption.php | 72 - .../paypal/tests/ExpressGatewayTest.php | 218 - .../tests/ExpressInContextGatewayTest.php | 78 - .../tests/Message/CaptureRequestTest.php | 48 - .../Message/ExpressAuthorizeRequestTest.php | 375 - .../Message/ExpressAuthorizeResponseTest.php | 45 - .../ExpressCompleteAuthorizeRequestTest.php | 96 - .../ExpressCompletePurchaseRequestTest.php | 96 - .../ExpressFetchCheckoutRequestTest.php | 72 - .../ExpressInContextAuthorizeRequestTest.php | 374 - .../ExpressInContextAuthorizeResponseTest.php | 45 - .../ExpressTransactionSearchRequestTest.php | 96 - .../ExpressTransactionSearchResponseTest.php | 44 - .../tests/Message/ExpressVoidRequestTest.php | 34 - .../Message/FetchTransactionRequestTest.php | 43 - .../tests/Message/ProAuthorizeRequestTest.php | 67 - .../tests/Message/ProPurchaseRequestTest.php | 67 - .../tests/Message/RefundRequestTest.php | 63 - .../paypal/tests/Message/ResponseTest.php | 37 - .../Message/RestAuthorizeRequestTest.php | 129 - .../Message/RestAuthorizeResponseTest.php | 24 - .../RestCancelSubscriptionRequestTest.php | 30 - .../RestCompletePurchaseRequestTest.php | 37 - .../RestCompleteSubscriptionRequestTest.php | 29 - .../Message/RestCreateCardRequestTest.php | 47 - .../Message/RestCreatePlanRequestTest.php | 49 - .../RestCreateSubscriptionRequestTest.php | 38 - .../Message/RestDeleteCardRequestTest.php | 35 - .../Message/RestFetchPurchaseRequestTest.php | 24 - .../RestFetchTransactionRequestTest.php | 31 - .../tests/Message/RestPurchaseRequestTest.php | 76 - .../RestReactivateSubscriptionRequestTest.php | 30 - .../paypal/tests/Message/RestResponseTest.php | 77 - .../RestSearchTransactionRequestTest.php | 37 - .../RestSuspendSubscriptionRequestTest.php | 30 - .../Message/RestUpdatePlanRequestTest.php | 31 - .../Mock/ExpressCompletePurchaseFailure.txt | 8 - ...ExpressCompletePurchaseFailureRedirect.txt | 8 - .../Mock/ExpressCompletePurchaseSuccess.txt | 8 - .../Mock/ExpressFetchCheckoutFailure.txt | 7 - .../Mock/ExpressFetchCheckoutSuccess.txt | 7 - .../paypal/tests/Mock/ExpressOrderFailure.txt | 8 - .../paypal/tests/Mock/ExpressOrderSuccess.txt | 8 - .../tests/Mock/ExpressPurchaseFailure.txt | 8 - .../tests/Mock/ExpressPurchaseSuccess.txt | 8 - .../Mock/ExpressTransactionSearchResponse.txt | 10 - .../paypal/tests/Mock/ExpressVoidFailure.txt | 8 - .../paypal/tests/Mock/ExpressVoidSuccess.txt | 8 - .../paypal/tests/Mock/ProPurchaseFailure.txt | 8 - .../paypal/tests/Mock/ProPurchaseSuccess.txt | 8 - .../tests/Mock/RestAuthorizationSuccess.txt | 12 - .../paypal/tests/Mock/RestCaptureSuccess.txt | 12 - .../Mock/RestCompletePurchaseFailure.txt | 12 - .../Mock/RestCompletePurchaseSuccess.txt | 11 - .../tests/Mock/RestCreateCardSuccess.txt | 12 - .../Mock/RestExecuteSubscriptionSuccess.txt | 20 - .../tests/Mock/RestFetchPurchaseSuccess.txt | 53 - .../Mock/RestGenericSubscriptionSuccess.txt | 7 - .../paypal/tests/Mock/RestPurchaseFailure.txt | 14 - .../paypal/tests/Mock/RestPurchaseSuccess.txt | 12 - .../Mock/RestPurchaseWithoutCardSuccess.txt | 11 - .../paypal/tests/Mock/RestRefundSuccess.txt | 12 - .../paypal/tests/Mock/RestTokenFailure.txt | 11 - .../paypal/tests/Mock/RestTokenSuccess.txt | 11 - .../omnipay/paypal/tests/ProGatewayTest.php | 58 - .../omnipay/paypal/tests/RestGatewayTest.php | 282 - vendor_old/omnipay/pin/.gitignore | 10 - vendor_old/omnipay/pin/.travis.yml | 13 - vendor_old/omnipay/pin/CONTRIBUTING.md | 10 - vendor_old/omnipay/pin/LICENSE | 20 - vendor_old/omnipay/pin/README.md | 54 - vendor_old/omnipay/pin/composer.json | 39 - vendor_old/omnipay/pin/makedoc.sh | 146 - vendor_old/omnipay/pin/phpunit.xml.dist | 25 - vendor_old/omnipay/pin/runtests.sh | 25 - vendor_old/omnipay/pin/src/Gateway.php | 215 - .../pin/src/Message/AbstractRequest.php | 142 - .../pin/src/Message/AuthorizeRequest.php | 114 - .../pin/src/Message/CaptureRequest.php | 34 - .../pin/src/Message/CaptureResponse.php | 31 - .../pin/src/Message/CreateCardRequest.php | 100 - .../pin/src/Message/CreateCustomerRequest.php | 105 - .../pin/src/Message/PurchaseRequest.php | 196 - .../omnipay/pin/src/Message/RefundRequest.php | 55 - .../omnipay/pin/src/Message/Response.php | 96 - vendor_old/omnipay/pin/tests/GatewayTest.php | 142 - .../pin/tests/Message/CaptureRequestTest.php | 39 - .../pin/tests/Message/CaptureResponseTest.php | 30 - .../tests/Message/CreateCardRequestTest.php | 50 - .../Message/CreateCustomerRequestTest.php | 59 - .../pin/tests/Message/PurchaseRequestTest.php | 70 - .../pin/tests/Message/RefundRequestTest.php | 37 - .../pin/tests/Message/ResponseTest.php | 74 - .../omnipay/pin/tests/Mock/CaptureFailure.txt | 18 - .../omnipay/pin/tests/Mock/CaptureSuccess.txt | 18 - .../omnipay/pin/tests/Mock/CardFailure.txt | 18 - .../omnipay/pin/tests/Mock/CardSuccess.txt | 18 - .../pin/tests/Mock/CustomerFailure.txt | 17 - .../pin/tests/Mock/CustomerSuccess.txt | 18 - .../pin/tests/Mock/PurchaseFailure.txt | 17 - .../pin/tests/Mock/PurchaseSuccess.txt | 18 - .../omnipay/pin/tests/Mock/RefundFailure.txt | 17 - .../omnipay/pin/tests/Mock/RefundSuccess.txt | 18 - vendor_old/omnipay/sagepay/.gitignore | 4 - vendor_old/omnipay/sagepay/.travis.yml | 13 - vendor_old/omnipay/sagepay/CONTRIBUTING.md | 10 - vendor_old/omnipay/sagepay/LICENSE | 20 - vendor_old/omnipay/sagepay/README.md | 209 - vendor_old/omnipay/sagepay/composer.json | 41 - vendor_old/omnipay/sagepay/phpunit.xml.dist | 25 - .../omnipay/sagepay/src/DirectGateway.php | 202 - .../sagepay/src/Message/AbstractRequest.php | 370 - .../src/Message/DirectAuthorizeRequest.php | 160 - .../DirectCompleteAuthorizeRequest.php | 30 - .../src/Message/DirectPurchaseRequest.php | 11 - .../Message/DirectRepeatPaymentRequest.php | 14 - .../DirectTokenRegistrationRequest.php | 47 - .../omnipay/sagepay/src/Message/Response.php | 120 - .../src/Message/ServerAuthorizeRequest.php | 45 - .../src/Message/ServerAuthorizeResponse.php | 35 - .../ServerCompleteAuthorizeRequest.php | 80 - .../ServerCompleteAuthorizeResponse.php | 119 - .../src/Message/ServerNotifyRequest.php | 356 - .../src/Message/ServerNotifyResponse.php | 167 - .../src/Message/ServerPurchaseRequest.php | 11 - ...ServerTokenRegistrationCompleteRequest.php | 53 - ...erverTokenRegistrationCompleteResponse.php | 15 - .../ServerTokenRegistrationRequest.php | 33 - .../ServerTokenRegistrationResponse.php | 32 - .../src/Message/SharedAbortRequest.php | 11 - .../src/Message/SharedCaptureRequest.php | 29 - .../src/Message/SharedRefundRequest.php | 35 - .../Message/SharedRepeatAuthorizeRequest.php | 170 - .../Message/SharedRepeatPurchaseRequest.php | 13 - .../src/Message/SharedTokenRemovalRequest.php | 26 - .../sagepay/src/Message/SharedVoidRequest.php | 27 - .../omnipay/sagepay/src/ServerGateway.php | 95 - .../sagepay/tests/DirectGatewayTest.php | 278 - .../Message/DirectAuthorizeRequestTest.php | 356 - .../DirectRepeatPaymentRequestTest.php | 44 - .../tests/Message/DirectTokenRequestTest.php | 66 - .../sagepay/tests/Message/ResponseTest.php | 83 - .../Message/ServerAuthorizeRequestTest.php | 36 - .../Message/ServerAuthorizeResponseTest.php | 56 - .../ServerCompleteAuthorizeResponseTest.php | 92 - .../Message/ServerNotifyResponseTest.php | 105 - ...erTokenRegistrationCompleteRequestTest.php | 79 - ...rTokenRegistrationCompleteResponseTest.php | 79 - .../ServerTokenRegistrationRequestTest.php | 41 - .../ServerTokenRegistrationResponseTest.php | 38 - .../tests/Message/SharedAbortRequestTest.php | 41 - .../tests/Message/SharedRefundRequestTest.php | 41 - .../SharedRepeatAuthorizeRequestTest.php | 44 - .../SharedRepeatPurchaseRequestTest.php | 44 - .../Message/SharedTokenRemovalRequestTest.php | 33 - .../tests/Message/SharedVoidRequestTest.php | 41 - .../tests/Mock/DirectPurchase3dSecure.txt | 16 - .../tests/Mock/DirectPurchaseFailure.txt | 13 - .../tests/Mock/DirectPurchaseSuccess.txt | 20 - .../tests/Mock/DirectPurchaseWithToken.txt | 21 - .../tests/Mock/ServerPurchaseFailure.txt | 11 - .../tests/Mock/ServerPurchaseSuccess.txt | 16 - .../tests/Mock/ServerPurchaseWithToken.txt | 17 - .../Mock/ServerTokenRegistrationFailure.txt | 11 - .../Mock/ServerTokenRegistrationSuccess.txt | 16 - .../sagepay/tests/Mock/SharedAbortFailure.txt | 13 - .../sagepay/tests/Mock/SharedAbortSuccess.txt | 13 - .../tests/Mock/SharedCaptureFailure.txt | 13 - .../tests/Mock/SharedCaptureSuccess.txt | 13 - .../tests/Mock/SharedRefundFailure.txt | 14 - .../tests/Mock/SharedRefundSuccess.txt | 16 - .../tests/Mock/SharedRepeatAuthorize.txt | 22 - .../Mock/SharedRepeatAuthorizeFailure.txt | 22 - .../sagepay/tests/Mock/SharedVoidFailure.txt | 13 - .../sagepay/tests/Mock/SharedVoidSuccess.txt | 13 - .../sagepay/tests/ServerGatewayTest.php | 340 - vendor_old/omnipay/securepay/.gitignore | 4 - vendor_old/omnipay/securepay/.travis.yml | 13 - vendor_old/omnipay/securepay/CONTRIBUTING.md | 10 - vendor_old/omnipay/securepay/LICENSE | 20 - vendor_old/omnipay/securepay/README.md | 50 - vendor_old/omnipay/securepay/composer.json | 39 - vendor_old/omnipay/securepay/phpunit.xml.dist | 25 - .../securepay/src/DirectPostGateway.php | 69 - .../securepay/src/Message/AbstractRequest.php | 37 - .../src/Message/DirectPostAbstractRequest.php | 12 - .../Message/DirectPostAuthorizeRequest.php | 68 - .../Message/DirectPostAuthorizeResponse.php | 47 - .../DirectPostCompletePurchaseRequest.php | 44 - .../DirectPostCompletePurchaseResponse.php | 37 - .../src/Message/DirectPostPurchaseRequest.php | 11 - .../src/Message/SecureXMLAbstractRequest.php | 139 - .../src/Message/SecureXMLAuthorizeRequest.php | 22 - .../src/Message/SecureXMLCaptureRequest.php | 45 - .../src/Message/SecureXMLEchoTestRequest.php | 21 - .../src/Message/SecureXMLPurchaseRequest.php | 17 - .../src/Message/SecureXMLRefundRequest.php | 25 - .../src/Message/SecureXMLResponse.php | 85 - .../securepay/src/SecureXMLGateway.php | 110 - .../securepay/tests/DirectPostGatewayTest.php | 48 - .../DirectPostAuthorizeRequestTest.php | 56 - .../DirectPostCompletePurchaseRequestTest.php | 96 - .../Message/DirectPostPurchaseRequestTest.php | 56 - .../Message/SecureXMLAuthorizeRequestTest.php | 111 - .../Message/SecureXMLEchoTestRequestTest.php | 34 - .../Message/SecureXMLPurchaseRequestTest.php | 72 - .../Mock/SecureXMLAuthorizeRequestFailure.txt | 11 - ...thorizeRequestInsufficientFundsFailure.txt | 11 - ...AuthorizeRequestInvalidMerchantFailure.txt | 8 - ...thorizeRequestInvalidMerchantIDFailure.txt | 8 - .../Mock/SecureXMLAuthorizeRequestSuccess.txt | 11 - .../Mock/SecureXMLEchoTestRequestSuccess.txt | 22 - ...urchaseRequestInsufficientFundsFailure.txt | 11 - .../SecureXMLPurchaseRequestSendFailure.txt | 11 - .../SecureXMLPurchaseRequestSendSuccess.txt | 11 - .../securepay/tests/SecureXMLGatewayTest.php | 41 - vendor_old/omnipay/stripe/.gitignore | 8 - vendor_old/omnipay/stripe/.travis.yml | 12 - vendor_old/omnipay/stripe/CONTRIBUTING.md | 10 - vendor_old/omnipay/stripe/LICENSE | 20 - vendor_old/omnipay/stripe/README.md | 94 - vendor_old/omnipay/stripe/composer.json | 39 - vendor_old/omnipay/stripe/makedoc.sh | 146 - vendor_old/omnipay/stripe/phpunit.xml.dist | 25 - vendor_old/omnipay/stripe/runtests.sh | 25 - vendor_old/omnipay/stripe/src/Gateway.php | 642 - .../stripe/src/Message/AbstractRequest.php | 218 - .../stripe/src/Message/AuthorizeRequest.php | 223 - .../src/Message/CancelSubscriptionRequest.php | 87 - .../stripe/src/Message/CaptureRequest.php | 48 - .../stripe/src/Message/CreateCardRequest.php | 114 - .../src/Message/CreateCustomerRequest.php | 150 - .../src/Message/CreateInvoiceItemRequest.php | 203 - .../stripe/src/Message/CreatePlanRequest.php | 210 - .../src/Message/CreateSubscriptionRequest.php | 75 - .../stripe/src/Message/DeleteCardRequest.php | 59 - .../src/Message/DeleteCustomerRequest.php | 34 - .../src/Message/DeleteInvoiceItemRequest.php | 52 - .../stripe/src/Message/DeletePlanRequest.php | 51 - .../FetchBalanceTransactionRequest.php | 68 - .../stripe/src/Message/FetchChargeRequest.php | 52 - .../src/Message/FetchCustomerRequest.php | 31 - .../stripe/src/Message/FetchEventRequest.php | 52 - .../src/Message/FetchInvoiceItemRequest.php | 52 - .../src/Message/FetchInvoiceLinesRequest.php | 52 - .../src/Message/FetchInvoiceRequest.php | 52 - .../stripe/src/Message/FetchPlanRequest.php | 52 - .../src/Message/FetchSubscriptionRequest.php | 53 - .../stripe/src/Message/FetchTokenRequest.php | 45 - .../src/Message/FetchTransactionRequest.php | 48 - .../src/Message/ListInvoicesRequest.php | 32 - .../stripe/src/Message/ListPlansRequest.php | 34 - .../stripe/src/Message/PurchaseRequest.php | 76 - .../stripe/src/Message/RefundRequest.php | 99 - .../omnipay/stripe/src/Message/Response.php | 337 - .../stripe/src/Message/UpdateCardRequest.php | 91 - .../src/Message/UpdateCustomerRequest.php | 87 - .../src/Message/UpdateSubscriptionRequest.php | 72 - .../stripe/src/Message/VoidRequest.php | 50 - .../omnipay/stripe/tests/GatewayTest.php | 256 - .../tests/Message/AbstractRequestTest.php | 59 - .../tests/Message/AuthorizeRequestTest.php | 128 - .../Message/CancelSubscriptionRequestTest.php | 48 - .../tests/Message/CaptureRequestTest.php | 54 - .../tests/Message/CreateCardRequestTest.php | 101 - .../Message/CreateCustomerRequestTest.php | 85 - .../Message/CreateInvoiceItemRequestTest.php | 46 - .../tests/Message/CreatePlanRequestTest.php | 50 - .../Message/CreateSubscriptionRequestTest.php | 43 - .../tests/Message/DeleteCardRequestTest.php | 48 - .../Message/DeleteCustomerRequestTest.php | 43 - .../Message/DeleteInvoiceItemRequestTest.php | 41 - .../tests/Message/DeletePlanRequestTest.php | 41 - .../Message/FetchBalanceTransactionTest.php | 43 - .../tests/Message/FetchChargeRequestTest.php | 43 - .../Message/FetchCustomerRequestTest.php | 46 - .../tests/Message/FetchEventRequestTest.php | 41 - .../Message/FetchInvoiceItemsRequestTest.php | 41 - .../Message/FetchInvoiceLinesRequestTest.php | 39 - .../tests/Message/FetchInvoiceRequestTest.php | 41 - .../tests/Message/FetchPlanRequestTest.php | 42 - .../Message/FetchSubscriptionRequestTest.php | 44 - .../tests/Message/FetchTokenRequestTest.php | 48 - .../tests/Message/FetchTransactionTest.php | 43 - .../tests/Message/ListInvoicesRequestTest.php | 40 - .../stripe/tests/Message/ListPlansTest.php | 41 - .../tests/Message/PurchaseRequestTest.php | 62 - .../tests/Message/RefundRequestTest.php | 56 - .../stripe/tests/Message/ResponseTest.php | 216 - .../tests/Message/UpdateCardRequestTest.php | 54 - .../Message/UpdateCustomerRequestTest.php | 74 - .../Message/UpdateInvoiceItemRequestTest.php | 42 - .../Message/UpdateSubscriptionRequestTest.php | 48 - .../stripe/tests/Message/VoidRequestTest.php | 50 - .../tests/Mock/CancelSubscriptionFailure.txt | 16 - .../tests/Mock/CancelSubscriptionSuccess.txt | 44 - .../stripe/tests/Mock/CaptureFailure.txt | 16 - .../stripe/tests/Mock/CaptureSuccess.txt | 57 - .../stripe/tests/Mock/CreateCardFailure.txt | 17 - .../stripe/tests/Mock/CreateCardSuccess.txt | 32 - .../tests/Mock/CreateCustomerFailure.txt | 17 - .../tests/Mock/CreateCustomerSuccess.txt | 41 - .../tests/Mock/CreateInvoiceItemFailure.txt | 15 - .../tests/Mock/CreateInvoiceItemSuccess.txt | 29 - .../stripe/tests/Mock/CreatePlanFailure.txt | 15 - .../stripe/tests/Mock/CreatePlanSuccess.txt | 23 - .../tests/Mock/CreateSubscriptionFailure.txt | 16 - .../tests/Mock/CreateSubscriptionSuccess.txt | 41 - .../stripe/tests/Mock/DeleteCardFailure.txt | 17 - .../stripe/tests/Mock/DeleteCardSuccess.txt | 14 - .../tests/Mock/DeleteCustomerFailure.txt | 17 - .../tests/Mock/DeleteCustomerSuccess.txt | 14 - .../tests/Mock/DeleteInvoiceItemFailure.txt | 15 - .../tests/Mock/DeleteInvoiceItemSuccess.txt | 12 - .../stripe/tests/Mock/DeletePlanFailure.txt | 17 - .../stripe/tests/Mock/DeletePlanSuccess.txt | 14 - .../Mock/FetchBalanceTransactionFailure.txt | 17 - .../Mock/FetchBalanceTransactionSuccess.txt | 49 - .../stripe/tests/Mock/FetchChargeFailure.txt | 16 - .../stripe/tests/Mock/FetchChargeSuccess.txt | 70 - .../tests/Mock/FetchCustomerFailure.txt | 17 - .../tests/Mock/FetchCustomerSuccess.txt | 44 - .../stripe/tests/Mock/FetchEventFailure.txt | 16 - .../stripe/tests/Mock/FetchEventSuccess.txt | 53 - .../stripe/tests/Mock/FetchInvoiceFailure.txt | 16 - .../tests/Mock/FetchInvoiceItemsFailure.txt | 15 - .../tests/Mock/FetchInvoiceItemsSuccess.txt | 29 - .../tests/Mock/FetchInvoiceLinesFailure.txt | 16 - .../tests/Mock/FetchInvoiceLinesSuccess.txt | 48 - .../stripe/tests/Mock/FetchInvoiceSuccess.txt | 82 - .../stripe/tests/Mock/FetchPlanFailure.txt | 17 - .../stripe/tests/Mock/FetchPlanSuccess.txt | 24 - .../tests/Mock/FetchSubscriptionFailure.txt | 15 - .../tests/Mock/FetchSubscriptionSuccess.txt | 41 - .../stripe/tests/Mock/FetchTokenFailure.txt | 17 - .../stripe/tests/Mock/FetchTokenSuccess.txt | 40 - .../tests/Mock/FetchTransactionFailure.txt | 17 - .../tests/Mock/FetchTransactionSuccess.txt | 59 - .../stripe/tests/Mock/ListInvoicesFailure.txt | 15 - .../stripe/tests/Mock/ListInvoicesSuccess.txt | 90 - .../stripe/tests/Mock/ListPlansSuccess.txt | 46 - .../stripe/tests/Mock/PurchaseFailure.txt | 18 - .../tests/Mock/PurchaseFailureWithoutCode.txt | 17 - .../Mock/PurchaseFailureWithoutMessage.txt | 17 - .../stripe/tests/Mock/PurchaseSuccess.txt | 63 - .../tests/Mock/PurchaseWithSourceSuccess.txt | 40 - .../stripe/tests/Mock/RefundFailure.txt | 3 - .../stripe/tests/Mock/RefundSuccess.txt | 3 - .../stripe/tests/Mock/UpdateCardFailure.txt | 17 - .../stripe/tests/Mock/UpdateCardSuccess.txt | 23 - .../tests/Mock/UpdateCustomerFailure.txt | 17 - .../tests/Mock/UpdateCustomerSuccess.txt | 23 - .../tests/Mock/UpdateSubscriptionFailure.txt | 17 - .../tests/Mock/UpdateSubscriptionSuccess.txt | 43 - .../omnipay/stripe/tests/Mock/VoidFailure.txt | 3 - .../omnipay/stripe/tests/Mock/VoidSuccess.txt | 3 - vendor_old/omnipay/targetpay/.gitignore | 4 - vendor_old/omnipay/targetpay/.travis.yml | 13 - vendor_old/omnipay/targetpay/CONTRIBUTING.md | 10 - vendor_old/omnipay/targetpay/LICENSE | 20 - vendor_old/omnipay/targetpay/README.md | 52 - vendor_old/omnipay/targetpay/composer.json | 39 - vendor_old/omnipay/targetpay/phpunit.xml.dist | 25 - .../omnipay/targetpay/src/AbstractGateway.php | 31 - .../targetpay/src/DirectebankingGateway.php | 41 - .../omnipay/targetpay/src/IdealGateway.php | 54 - .../targetpay/src/Message/AbstractRequest.php | 25 - .../src/Message/AbstractResponse.php | 51 - .../src/Message/CompletePurchaseRequest.php | 41 - .../src/Message/CompletePurchaseResponse.php | 14 - .../DirectebankingCompletePurchaseRequest.php | 14 - .../Message/DirectebankingPurchaseRequest.php | 54 - .../src/Message/FetchIssuersRequest.php | 31 - .../src/Message/FetchIssuersResponse.php | 32 - .../Message/IdealCompletePurchaseRequest.php | 14 - .../src/Message/IdealPurchaseRequest.php | 43 - .../Message/MrcashCompletePurchaseRequest.php | 14 - .../src/Message/MrcashPurchaseRequest.php | 32 - .../targetpay/src/Message/PurchaseRequest.php | 28 - .../src/Message/PurchaseResponse.php | 66 - .../omnipay/targetpay/src/MrcashGateway.php | 41 - .../tests/DirectebankingGatewayTest.php | 59 - .../targetpay/tests/IdealGatewayTest.php | 66 - .../Message/CompletePurchaseRequestTest.php | 54 - ...ectebankingCompletePurchaseRequestTest.php | 23 - .../DirectebankingPurchaseRequestTest.php | 45 - .../tests/Message/FetchIssuersRequestTest.php | 43 - .../IdealCompletePurchaseRequestTest.php | 23 - .../Message/IdealPurchaseRequestTest.php | 42 - .../MrcashCompletePurchaseRequestTest.php | 23 - .../Message/MrcashPurchaseRequestTest.php | 41 - .../tests/Message/PurchaseRequestTest.php | 45 - .../tests/Mock/CompletePurchaseFailure.txt | 11 - .../tests/Mock/CompletePurchaseSuccess.txt | 11 - .../tests/Mock/FetchIssuersSuccess.txt | 9 - .../targetpay/tests/Mock/PurchaseFailure.txt | 11 - .../targetpay/tests/Mock/PurchaseSuccess.txt | 11 - .../targetpay/tests/MrcashGatewayTest.php | 112 - vendor_old/omnipay/worldpay/.gitignore | 4 - vendor_old/omnipay/worldpay/.travis.yml | 13 - vendor_old/omnipay/worldpay/CONTRIBUTING.md | 10 - vendor_old/omnipay/worldpay/LICENSE | 20 - vendor_old/omnipay/worldpay/README.md | 50 - vendor_old/omnipay/worldpay/composer.json | 39 - vendor_old/omnipay/worldpay/phpunit.xml.dist | 25 - vendor_old/omnipay/worldpay/src/Gateway.php | 81 - .../src/Message/CompletePurchaseRequest.php | 26 - .../src/Message/CompletePurchaseResponse.php | 50 - .../worldpay/src/Message/PurchaseRequest.php | 106 - .../worldpay/src/Message/PurchaseResponse.php | 37 - .../omnipay/worldpay/tests/GatewayTest.php | 82 - .../Message/CompletePurchaseResponseTest.php | 72 - .../tests/Message/PurchaseRequestTest.php | 54 - .../tests/Message/PurchaseResponseTest.php | 26 - vendor_old/paragonie/random_compat/LICENSE | 22 - .../paragonie/random_compat/build-phar.sh | 5 - .../paragonie/random_compat/composer.json | 37 - .../dist/random_compat.phar.pubkey | 5 - .../dist/random_compat.phar.pubkey.asc | 11 - .../random_compat/lib/byte_safe_strings.php | 181 - .../random_compat/lib/cast_to_int.php | 74 - .../random_compat/lib/error_polyfill.php | 49 - .../paragonie/random_compat/lib/random.php | 223 - .../lib/random_bytes_com_dotnet.php | 88 - .../lib/random_bytes_dev_urandom.php | 167 - .../lib/random_bytes_libsodium.php | 88 - .../lib/random_bytes_libsodium_legacy.php | 92 - .../random_compat/lib/random_bytes_mcrypt.php | 77 - .../random_compat/lib/random_int.php | 190 - .../random_compat/other/build_phar.php | 57 - .../random_compat/psalm-autoload.php | 9 - vendor_old/paragonie/random_compat/psalm.xml | 15 - vendor_old/phpmailer/phpmailer/LICENSE | 504 - .../phpmailer/phpmailer/PHPMailerAutoload.php | 49 - vendor_old/phpmailer/phpmailer/VERSION | 1 - .../phpmailer/phpmailer/class.phpmailer.php | 4039 --- .../phpmailer/class.phpmaileroauth.php | 197 - .../phpmailer/class.phpmaileroauthgoogle.php | 77 - vendor_old/phpmailer/phpmailer/class.pop3.php | 407 - vendor_old/phpmailer/phpmailer/class.smtp.php | 1251 - vendor_old/phpmailer/phpmailer/composer.json | 60 - vendor_old/phpmailer/phpmailer/composer.lock | 3593 -- .../phpmailer/phpmailer/examples/DKIM.phps | 38 - .../phpmailer/examples/code_generator.phps | 597 - .../phpmailer/examples/contactform.phps | 71 - .../phpmailer/examples/contents.html | 17 - .../phpmailer/examples/contentsutf8.html | 21 - .../phpmailer/examples/exceptions.phps | 35 - .../phpmailer/phpmailer/examples/gmail.phps | 75 - .../phpmailer/examples/gmail_xoauth.phps | 85 - .../phpmailer/examples/images/phpmailer.png | Bin 5831 -> 0 bytes .../examples/images/phpmailer_mini.png | Bin 1842 -> 0 bytes .../phpmailer/phpmailer/examples/index.html | 48 - .../phpmailer/phpmailer/examples/mail.phps | 31 - .../phpmailer/examples/mailing_list.phps | 59 - .../phpmailer/examples/pop_before_smtp.phps | 54 - .../phpmailer/examples/scripts/XRegExp.js | 664 - .../examples/scripts/shAutoloader.js | 122 - .../phpmailer/examples/scripts/shBrushPhp.js | 72 - .../phpmailer/examples/scripts/shCore.js | 1 - .../phpmailer/examples/scripts/shLegacy.js | 140 - .../phpmailer/examples/send_file_upload.phps | 49 - .../examples/send_multiple_file_upload.phps | 51 - .../phpmailer/examples/sendmail.phps | 33 - .../phpmailer/examples/signed-mail.phps | 89 - .../phpmailer/phpmailer/examples/smtp.phps | 54 - .../phpmailer/examples/smtp_check.phps | 55 - .../phpmailer/examples/smtp_no_auth.phps | 50 - .../phpmailer/examples/ssl_options.phps | 74 - .../phpmailer/examples/styles/shCore.css | 46 - .../examples/styles/shCoreDefault.css | 77 - .../examples/styles/shCoreDjango.css | 78 - .../examples/styles/shCoreEclipse.css | 80 - .../phpmailer/examples/styles/shCoreEmacs.css | 76 - .../examples/styles/shCoreFadeToGrey.css | 77 - .../examples/styles/shCoreMDUltra.css | 76 - .../examples/styles/shCoreMidnight.css | 76 - .../phpmailer/examples/styles/shCoreRDark.css | 76 - .../examples/styles/shThemeAppleScript.css | 21 - .../examples/styles/shThemeDefault.css | 31 - .../examples/styles/shThemeDjango.css | 32 - .../examples/styles/shThemeEclipse.css | 34 - .../examples/styles/shThemeEmacs.css | 30 - .../examples/styles/shThemeFadeToGrey.css | 31 - .../examples/styles/shThemeMDUltra.css | 30 - .../examples/styles/shThemeMidnight.css | 30 - .../examples/styles/shThemeRDark.css | 30 - .../examples/styles/shThemeVisualStudio.css | 31 - .../phpmailer/examples/styles/wrapping.png | Bin 631 -> 0 bytes .../phpmailer/extras/EasyPeasyICS.php | 148 - .../phpmailer/phpmailer/extras/README.md | 17 - .../phpmailer/phpmailer/extras/htmlfilter.php | 1159 - .../phpmailer/extras/ntlm_sasl_client.php | 185 - .../phpmailer/phpmailer/get_oauth_token.php | 162 - .../phpmailer/language/phpmailer.lang-am.php | 26 - .../phpmailer/language/phpmailer.lang-ar.php | 27 - .../phpmailer/language/phpmailer.lang-az.php | 26 - .../phpmailer/language/phpmailer.lang-be.php | 26 - .../phpmailer/language/phpmailer.lang-bg.php | 26 - .../phpmailer/language/phpmailer.lang-ca.php | 26 - .../phpmailer/language/phpmailer.lang-ch.php | 26 - .../phpmailer/language/phpmailer.lang-cs.php | 25 - .../phpmailer/language/phpmailer.lang-da.php | 26 - .../phpmailer/language/phpmailer.lang-de.php | 25 - .../phpmailer/language/phpmailer.lang-el.php | 25 - .../phpmailer/language/phpmailer.lang-eo.php | 25 - .../phpmailer/language/phpmailer.lang-es.php | 26 - .../phpmailer/language/phpmailer.lang-et.php | 27 - .../phpmailer/language/phpmailer.lang-fa.php | 27 - .../phpmailer/language/phpmailer.lang-fi.php | 27 - .../phpmailer/language/phpmailer.lang-fo.php | 26 - .../phpmailer/language/phpmailer.lang-fr.php | 29 - .../phpmailer/language/phpmailer.lang-gl.php | 26 - .../phpmailer/language/phpmailer.lang-he.php | 26 - .../phpmailer/language/phpmailer.lang-hr.php | 26 - .../phpmailer/language/phpmailer.lang-hu.php | 26 - .../phpmailer/language/phpmailer.lang-id.php | 26 - .../phpmailer/language/phpmailer.lang-it.php | 27 - .../phpmailer/language/phpmailer.lang-ja.php | 27 - .../phpmailer/language/phpmailer.lang-ka.php | 26 - .../phpmailer/language/phpmailer.lang-ko.php | 26 - .../phpmailer/language/phpmailer.lang-lt.php | 26 - .../phpmailer/language/phpmailer.lang-lv.php | 26 - .../phpmailer/language/phpmailer.lang-ms.php | 26 - .../phpmailer/language/phpmailer.lang-nb.php | 25 - .../phpmailer/language/phpmailer.lang-nl.php | 26 - .../phpmailer/language/phpmailer.lang-pl.php | 26 - .../phpmailer/language/phpmailer.lang-pt.php | 26 - .../language/phpmailer.lang-pt_br.php | 28 - .../phpmailer/language/phpmailer.lang-ro.php | 26 - .../phpmailer/language/phpmailer.lang-ru.php | 27 - .../phpmailer/language/phpmailer.lang-sk.php | 26 - .../phpmailer/language/phpmailer.lang-sl.php | 26 - .../phpmailer/language/phpmailer.lang-sr.php | 26 - .../phpmailer/language/phpmailer.lang-sv.php | 26 - .../phpmailer/language/phpmailer.lang-tr.php | 29 - .../phpmailer/language/phpmailer.lang-uk.php | 27 - .../phpmailer/language/phpmailer.lang-vi.php | 26 - .../phpmailer/language/phpmailer.lang-zh.php | 28 - .../language/phpmailer.lang-zh_cn.php | 27 - vendor_old/psr/log/.gitignore | 1 - vendor_old/psr/log/LICENSE | 19 - vendor_old/psr/log/Psr/Log/AbstractLogger.php | 128 - .../log/Psr/Log/InvalidArgumentException.php | 7 - vendor_old/psr/log/Psr/Log/LogLevel.php | 18 - .../psr/log/Psr/Log/LoggerAwareInterface.php | 18 - .../psr/log/Psr/Log/LoggerAwareTrait.php | 26 - .../psr/log/Psr/Log/LoggerInterface.php | 123 - vendor_old/psr/log/Psr/Log/LoggerTrait.php | 140 - vendor_old/psr/log/Psr/Log/NullLogger.php | 28 - .../log/Psr/Log/Test/LoggerInterfaceTest.php | 140 - vendor_old/psr/log/README.md | 45 - vendor_old/psr/log/composer.json | 26 - vendor_old/setasign/fpdf/FAQ.htm | 272 - vendor_old/setasign/fpdf/README.md | 21 - vendor_old/setasign/fpdf/changelog.htm | 163 - vendor_old/setasign/fpdf/composer.json | 21 - vendor_old/setasign/fpdf/doc/__construct.htm | 63 - .../setasign/fpdf/doc/acceptpagebreak.htm | 63 - vendor_old/setasign/fpdf/doc/addfont.htm | 55 - vendor_old/setasign/fpdf/doc/addlink.htm | 26 - vendor_old/setasign/fpdf/doc/addpage.htm | 61 - vendor_old/setasign/fpdf/doc/aliasnbpages.htm | 45 - vendor_old/setasign/fpdf/doc/cell.htm | 104 - vendor_old/setasign/fpdf/doc/close.htm | 21 - vendor_old/setasign/fpdf/doc/error.htm | 26 - vendor_old/setasign/fpdf/doc/footer.htm | 35 - .../setasign/fpdf/doc/getpageheight.htm | 18 - vendor_old/setasign/fpdf/doc/getpagewidth.htm | 18 - .../setasign/fpdf/doc/getstringwidth.htm | 23 - vendor_old/setasign/fpdf/doc/getx.htm | 20 - vendor_old/setasign/fpdf/doc/gety.htm | 20 - vendor_old/setasign/fpdf/doc/header.htm | 37 - vendor_old/setasign/fpdf/doc/image.htm | 99 - vendor_old/setasign/fpdf/doc/index.htm | 59 - vendor_old/setasign/fpdf/doc/line.htm | 38 - vendor_old/setasign/fpdf/doc/link.htm | 46 - vendor_old/setasign/fpdf/doc/ln.htm | 28 - vendor_old/setasign/fpdf/doc/multicell.htm | 76 - vendor_old/setasign/fpdf/doc/output.htm | 46 - vendor_old/setasign/fpdf/doc/pageno.htm | 18 - vendor_old/setasign/fpdf/doc/rect.htm | 48 - vendor_old/setasign/fpdf/doc/setauthor.htm | 33 - .../setasign/fpdf/doc/setautopagebreak.htm | 33 - .../setasign/fpdf/doc/setcompression.htm | 31 - vendor_old/setasign/fpdf/doc/setcreator.htm | 34 - .../setasign/fpdf/doc/setdisplaymode.htm | 45 - vendor_old/setasign/fpdf/doc/setdrawcolor.htm | 41 - vendor_old/setasign/fpdf/doc/setfillcolor.htm | 40 - vendor_old/setasign/fpdf/doc/setfont.htm | 92 - vendor_old/setasign/fpdf/doc/setfontsize.htm | 25 - vendor_old/setasign/fpdf/doc/setkeywords.htm | 33 - .../setasign/fpdf/doc/setleftmargin.htm | 30 - vendor_old/setasign/fpdf/doc/setlinewidth.htm | 29 - vendor_old/setasign/fpdf/doc/setlink.htm | 34 - vendor_old/setasign/fpdf/doc/setmargins.htm | 37 - .../setasign/fpdf/doc/setrightmargin.htm | 28 - vendor_old/setasign/fpdf/doc/setsubject.htm | 33 - vendor_old/setasign/fpdf/doc/settextcolor.htm | 40 - vendor_old/setasign/fpdf/doc/settitle.htm | 33 - vendor_old/setasign/fpdf/doc/settopmargin.htm | 28 - vendor_old/setasign/fpdf/doc/setx.htm | 29 - vendor_old/setasign/fpdf/doc/setxy.htm | 31 - vendor_old/setasign/fpdf/doc/sety.htm | 33 - vendor_old/setasign/fpdf/doc/text.htm | 39 - vendor_old/setasign/fpdf/doc/write.htm | 51 - vendor_old/setasign/fpdf/font/courier.php | 10 - vendor_old/setasign/fpdf/font/courierb.php | 10 - vendor_old/setasign/fpdf/font/courierbi.php | 10 - vendor_old/setasign/fpdf/font/courieri.php | 10 - vendor_old/setasign/fpdf/font/helvetica.php | 21 - vendor_old/setasign/fpdf/font/helveticab.php | 21 - vendor_old/setasign/fpdf/font/helveticabi.php | 21 - vendor_old/setasign/fpdf/font/helveticai.php | 21 - vendor_old/setasign/fpdf/font/symbol.php | 20 - vendor_old/setasign/fpdf/font/times.php | 21 - vendor_old/setasign/fpdf/font/timesb.php | 21 - vendor_old/setasign/fpdf/font/timesbi.php | 21 - vendor_old/setasign/fpdf/font/timesi.php | 21 - .../setasign/fpdf/font/zapfdingbats.php | 20 - vendor_old/setasign/fpdf/fpdf.css | 21 - vendor_old/setasign/fpdf/fpdf.php | 1898 - vendor_old/setasign/fpdf/install.txt | 15 - vendor_old/setasign/fpdf/license.txt | 6 - vendor_old/setasign/fpdf/makefont/cp1250.map | 251 - vendor_old/setasign/fpdf/makefont/cp1251.map | 255 - vendor_old/setasign/fpdf/makefont/cp1252.map | 251 - vendor_old/setasign/fpdf/makefont/cp1253.map | 239 - vendor_old/setasign/fpdf/makefont/cp1254.map | 249 - vendor_old/setasign/fpdf/makefont/cp1255.map | 233 - vendor_old/setasign/fpdf/makefont/cp1257.map | 244 - vendor_old/setasign/fpdf/makefont/cp1258.map | 247 - vendor_old/setasign/fpdf/makefont/cp874.map | 225 - .../setasign/fpdf/makefont/iso-8859-1.map | 256 - .../setasign/fpdf/makefont/iso-8859-11.map | 248 - .../setasign/fpdf/makefont/iso-8859-15.map | 256 - .../setasign/fpdf/makefont/iso-8859-16.map | 256 - .../setasign/fpdf/makefont/iso-8859-2.map | 256 - .../setasign/fpdf/makefont/iso-8859-4.map | 256 - .../setasign/fpdf/makefont/iso-8859-5.map | 256 - .../setasign/fpdf/makefont/iso-8859-7.map | 250 - .../setasign/fpdf/makefont/iso-8859-9.map | 256 - vendor_old/setasign/fpdf/makefont/koi8-r.map | 256 - vendor_old/setasign/fpdf/makefont/koi8-u.map | 256 - .../setasign/fpdf/makefont/makefont.php | 451 - .../setasign/fpdf/makefont/ttfparser.php | 723 - vendor_old/setasign/fpdf/tutorial/20k_c1.txt | 10 - vendor_old/setasign/fpdf/tutorial/20k_c2.txt | 23 - .../setasign/fpdf/tutorial/calligra.php | 25 - .../setasign/fpdf/tutorial/calligra.ttf | Bin 40120 -> 0 bytes vendor_old/setasign/fpdf/tutorial/calligra.z | Bin 22477 -> 0 bytes .../setasign/fpdf/tutorial/countries.txt | 15 - vendor_old/setasign/fpdf/tutorial/index.htm | 20 - vendor_old/setasign/fpdf/tutorial/logo.png | Bin 2373 -> 0 bytes .../setasign/fpdf/tutorial/makefont.php | 6 - vendor_old/setasign/fpdf/tutorial/tuto1.htm | 76 - vendor_old/setasign/fpdf/tutorial/tuto1.php | 9 - vendor_old/setasign/fpdf/tutorial/tuto2.htm | 80 - vendor_old/setasign/fpdf/tutorial/tuto2.php | 41 - vendor_old/setasign/fpdf/tutorial/tuto3.htm | 115 - vendor_old/setasign/fpdf/tutorial/tuto3.php | 81 - vendor_old/setasign/fpdf/tutorial/tuto4.htm | 132 - vendor_old/setasign/fpdf/tutorial/tuto4.php | 109 - vendor_old/setasign/fpdf/tutorial/tuto5.htm | 134 - vendor_old/setasign/fpdf/tutorial/tuto5.php | 102 - vendor_old/setasign/fpdf/tutorial/tuto6.htm | 154 - vendor_old/setasign/fpdf/tutorial/tuto6.php | 113 - vendor_old/setasign/fpdf/tutorial/tuto7.htm | 187 - vendor_old/setasign/fpdf/tutorial/tuto7.php | 11 - vendor_old/setasign/fpdi-fpdf/LICENSE | 21 - vendor_old/setasign/fpdi-fpdf/README.md | 18 - vendor_old/setasign/fpdi-fpdf/composer.json | 25 - vendor_old/setasign/fpdi-fpdf/fpdi_bridge.php | 13 - vendor_old/setasign/fpdi/LICENSE | 21 - vendor_old/setasign/fpdi/README.md | 87 - vendor_old/setasign/fpdi/composer.json | 30 - .../setasign/fpdi/filters/FilterASCII85.php | 106 - .../fpdi/filters/FilterASCIIHexDecode.php | 43 - .../setasign/fpdi/filters/FilterLZW.php | 164 - vendor_old/setasign/fpdi/fpdf_tpl.php | 548 - vendor_old/setasign/fpdi/fpdi.php | 705 - vendor_old/setasign/fpdi/fpdi_bridge.php | 206 - vendor_old/setasign/fpdi/fpdi_pdf_parser.php | 355 - vendor_old/setasign/fpdi/pdf_context.php | 151 - vendor_old/setasign/fpdi/pdf_parser.php | 925 - .../symfony/event-dispatcher/.gitignore | 3 - .../symfony/event-dispatcher/CHANGELOG.md | 23 - .../ContainerAwareEventDispatcher.php | 197 - .../Debug/TraceableEventDispatcher.php | 382 - .../TraceableEventDispatcherInterface.php | 34 - .../Debug/WrappedListener.php | 71 - .../RegisterListenersPass.php | 113 - vendor_old/symfony/event-dispatcher/Event.php | 120 - .../event-dispatcher/EventDispatcher.php | 198 - .../EventDispatcherInterface.php | 88 - .../EventSubscriberInterface.php | 46 - .../symfony/event-dispatcher/GenericEvent.php | 186 - .../ImmutableEventDispatcher.php | 101 - vendor_old/symfony/event-dispatcher/LICENSE | 19 - vendor_old/symfony/event-dispatcher/README.md | 15 - .../Tests/AbstractEventDispatcherTest.php | 398 - .../ContainerAwareEventDispatcherTest.php | 277 - .../Debug/TraceableEventDispatcherTest.php | 254 - .../RegisterListenersPassTest.php | 195 - .../Tests/EventDispatcherTest.php | 22 - .../event-dispatcher/Tests/EventTest.php | 97 - .../Tests/GenericEventTest.php | 140 - .../Tests/ImmutableEventDispatcherTest.php | 106 - .../symfony/event-dispatcher/composer.json | 44 - .../symfony/event-dispatcher/phpunit.xml.dist | 31 - vendor_old/symfony/http-foundation/.gitignore | 3 - .../symfony/http-foundation/AcceptHeader.php | 172 - .../http-foundation/AcceptHeaderItem.php | 226 - .../symfony/http-foundation/ApacheRequest.php | 43 - .../http-foundation/BinaryFileResponse.php | 359 - .../symfony/http-foundation/CHANGELOG.md | 128 - vendor_old/symfony/http-foundation/Cookie.php | 190 - .../Exception/ConflictingHeadersException.php | 23 - .../ExpressionRequestMatcher.php | 47 - .../File/Exception/AccessDeniedException.php | 30 - .../File/Exception/FileException.php | 21 - .../File/Exception/FileNotFoundException.php | 30 - .../Exception/UnexpectedTypeException.php | 20 - .../File/Exception/UploadException.php | 21 - .../symfony/http-foundation/File/File.php | 136 - .../File/MimeType/ExtensionGuesser.php | 96 - .../MimeType/ExtensionGuesserInterface.php | 27 - .../MimeType/FileBinaryMimeTypeGuesser.php | 87 - .../File/MimeType/FileinfoMimeTypeGuesser.php | 71 - .../MimeType/MimeTypeExtensionGuesser.php | 808 - .../File/MimeType/MimeTypeGuesser.php | 144 - .../MimeType/MimeTypeGuesserInterface.php | 35 - .../http-foundation/File/UploadedFile.php | 293 - .../symfony/http-foundation/FileBag.php | 145 - .../symfony/http-foundation/HeaderBag.php | 324 - .../symfony/http-foundation/IpUtils.php | 136 - .../symfony/http-foundation/JsonResponse.php | 218 - vendor_old/symfony/http-foundation/LICENSE | 19 - .../symfony/http-foundation/ParameterBag.php | 312 - vendor_old/symfony/http-foundation/README.md | 14 - .../http-foundation/RedirectResponse.php | 99 - .../symfony/http-foundation/Request.php | 2000 -- .../http-foundation/RequestMatcher.php | 178 - .../RequestMatcherInterface.php | 29 - .../symfony/http-foundation/RequestStack.php | 103 - .../symfony/http-foundation/Response.php | 1191 - .../http-foundation/ResponseHeaderBag.php | 304 - .../symfony/http-foundation/ServerBag.php | 102 - .../Session/Attribute/AttributeBag.php | 157 - .../Attribute/AttributeBagInterface.php | 72 - .../Attribute/NamespacedAttributeBag.php | 160 - .../Session/Flash/AutoExpireFlashBag.php | 175 - .../Session/Flash/FlashBag.php | 182 - .../Session/Flash/FlashBagInterface.php | 95 - .../http-foundation/Session/Session.php | 249 - .../Session/SessionBagInterface.php | 48 - .../Session/SessionInterface.php | 182 - .../Handler/LegacyPdoSessionHandler.php | 271 - .../Handler/MemcacheSessionHandler.php | 119 - .../Handler/MemcachedSessionHandler.php | 125 - .../Storage/Handler/MongoDbSessionHandler.php | 232 - .../Handler/NativeFileSessionHandler.php | 58 - .../Storage/Handler/NativeSessionHandler.php | 24 - .../Storage/Handler/NullSessionHandler.php | 70 - .../Storage/Handler/PdoSessionHandler.php | 721 - .../Handler/WriteCheckSessionHandler.php | 91 - .../Session/Storage/MetadataBag.php | 170 - .../Storage/MockArraySessionStorage.php | 268 - .../Storage/MockFileSessionStorage.php | 138 - .../Session/Storage/NativeSessionStorage.php | 431 - .../Storage/PhpBridgeSessionStorage.php | 68 - .../Session/Storage/Proxy/AbstractProxy.php | 154 - .../Session/Storage/Proxy/NativeProxy.php | 41 - .../Storage/Proxy/SessionHandlerProxy.php | 95 - .../Storage/SessionStorageInterface.php | 139 - .../http-foundation/StreamedResponse.php | 137 - .../Tests/AcceptHeaderItemTest.php | 113 - .../Tests/AcceptHeaderTest.php | 103 - .../Tests/ApacheRequestTest.php | 93 - .../Tests/BinaryFileResponseTest.php | 330 - .../http-foundation/Tests/CookieTest.php | 169 - .../Tests/ExpressionRequestMatcherTest.php | 69 - .../http-foundation/Tests/File/FakeFile.php | 45 - .../http-foundation/Tests/File/FileTest.php | 180 - .../Tests/File/Fixtures/.unknownextension | 1 - .../Tests/File/Fixtures/directory/.empty | 0 .../Tests/File/Fixtures/other-file.example | 0 .../http-foundation/Tests/File/Fixtures/test | Bin 35 -> 0 bytes .../Tests/File/Fixtures/test.gif | Bin 35 -> 0 bytes .../Tests/File/MimeType/MimeTypeTest.php | 90 - .../Tests/File/UploadedFileTest.php | 273 - .../http-foundation/Tests/FileBagTest.php | 149 - .../http-foundation/Tests/HeaderBagTest.php | 196 - .../http-foundation/Tests/IpUtilsTest.php | 85 - .../Tests/JsonResponseTest.php | 235 - .../Tests/ParameterBagTest.php | 229 - .../Tests/RedirectResponseTest.php | 84 - .../Tests/RequestMatcherTest.php | 151 - .../Tests/RequestStackTest.php | 70 - .../http-foundation/Tests/RequestTest.php | 2116 -- .../Tests/ResponseHeaderBagTest.php | 302 - .../http-foundation/Tests/ResponseTest.php | 956 - .../Tests/ResponseTestCase.php | 89 - .../http-foundation/Tests/ServerBagTest.php | 170 - .../Session/Attribute/AttributeBagTest.php | 189 - .../Attribute/NamespacedAttributeBagTest.php | 185 - .../Session/Flash/AutoExpireFlashBagTest.php | 156 - .../Tests/Session/Flash/FlashBagTest.php | 155 - .../Tests/Session/SessionTest.php | 224 - .../Handler/LegacyPdoSessionHandlerTest.php | 114 - .../Handler/MemcacheSessionHandlerTest.php | 133 - .../Handler/MemcachedSessionHandlerTest.php | 139 - .../Handler/MongoDbSessionHandlerTest.php | 338 - .../Handler/NativeFileSessionHandlerTest.php | 82 - .../Handler/NativeSessionHandlerTest.php | 41 - .../Handler/NullSessionHandlerTest.php | 59 - .../Storage/Handler/PdoSessionHandlerTest.php | 370 - .../Handler/WriteCheckSessionHandlerTest.php | 95 - .../Tests/Session/Storage/MetadataBagTest.php | 142 - .../Storage/MockArraySessionStorageTest.php | 131 - .../Storage/MockFileSessionStorageTest.php | 127 - .../Storage/NativeSessionStorageTest.php | 275 - .../Storage/PhpBridgeSessionStorageTest.php | 123 - .../Storage/Proxy/AbstractProxyTest.php | 206 - .../Session/Storage/Proxy/NativeProxyTest.php | 36 - .../Storage/Proxy/SessionHandlerProxyTest.php | 128 - .../Tests/StreamedResponseTest.php | 124 - .../Tests/schema/http-status-codes.rng | 31 - .../Tests/schema/iana-registry.rng | 198 - .../symfony/http-foundation/composer.json | 39 - .../symfony/http-foundation/phpunit.xml.dist | 31 - vendor_old/symfony/polyfill-mbstring/LICENSE | 19 - .../symfony/polyfill-mbstring/Mbstring.php | 664 - .../symfony/polyfill-mbstring/README.md | 13 - .../Resources/unidata/lowerCase.php | 1101 - .../Resources/unidata/upperCase.php | 1109 - .../symfony/polyfill-mbstring/bootstrap.php | 56 - .../symfony/polyfill-mbstring/composer.json | 34 - vendor_old/symfony/polyfill-php54/LICENSE | 19 - vendor_old/symfony/polyfill-php54/Php54.php | 36 - vendor_old/symfony/polyfill-php54/README.md | 17 - .../stubs/CallbackFilterIterator.php | 28 - .../stubs/RecursiveCallbackFilterIterator.php | 33 - .../stubs/SessionHandlerInterface.php | 102 - .../symfony/polyfill-php54/bootstrap.php | 34 - .../symfony/polyfill-php54/composer.json | 32 - vendor_old/symfony/polyfill-php55/LICENSE | 19 - vendor_old/symfony/polyfill-php55/Php55.php | 63 - .../polyfill-php55/Php55ArrayColumn.php | 64 - vendor_old/symfony/polyfill-php55/README.md | 18 - .../symfony/polyfill-php55/bootstrap.php | 27 - .../symfony/polyfill-php55/composer.json | 32 - vendor_old/vlucas/phpdotenv/LICENSE.txt | 32 - vendor_old/vlucas/phpdotenv/composer.json | 29 - vendor_old/vlucas/phpdotenv/src/Dotenv.php | 105 - .../src/Exception/ExceptionInterface.php | 11 - .../Exception/InvalidCallbackException.php | 13 - .../src/Exception/InvalidFileException.php | 13 - .../src/Exception/InvalidPathException.php | 13 - .../src/Exception/ValidationException.php | 13 - vendor_old/vlucas/phpdotenv/src/Loader.php | 381 - vendor_old/vlucas/phpdotenv/src/Validator.php | 130 - 2817 files changed, 28333 insertions(+), 387145 deletions(-) rename vendor_old/mpdf/mpdf/data/no_image.jpg => application/.DS_Store (50%) delete mode 100644 application/logs/.gitignore delete mode 100644 application/logs/index.html create mode 100644 application/modules/.DS_Store create mode 100644 application/modules/invoices/models/Mdl_reports.php create mode 100644 application/modules/invoices/models/view.php create mode 100644 application/modules/invoices/views/view_asn.php create mode 100644 application/modules/invoices_1/controllers/Ajax.php create mode 100644 application/modules/invoices_1/controllers/Cron.php create mode 100644 application/modules/invoices_1/controllers/Invoices.php create mode 100644 application/modules/invoices_1/controllers/Recurring.php create mode 100644 application/modules/invoices_1/models/Mdl_invoice_amounts.php create mode 100644 application/modules/invoices_1/models/Mdl_invoice_sumex.php create mode 100644 application/modules/invoices_1/models/Mdl_invoice_tax_rates.php create mode 100644 application/modules/invoices_1/models/Mdl_invoices.php create mode 100644 application/modules/invoices_1/models/Mdl_invoices_recurring.php create mode 100644 application/modules/invoices_1/models/Mdl_item_amounts.php create mode 100644 application/modules/invoices_1/models/Mdl_items.php create mode 100644 application/modules/invoices_1/models/Mdl_reports.php create mode 100644 application/modules/invoices_1/models/Mdl_templates.php create mode 100644 application/modules/invoices_1/models/view.php create mode 100644 application/modules/invoices_1/views/archive.php create mode 100644 application/modules/invoices_1/views/index.php create mode 100644 application/modules/invoices_1/views/index_client.php create mode 100644 application/modules/invoices_1/views/index_recurring.php create mode 100644 application/modules/invoices_1/views/modal_add_invoice_tax.php create mode 100644 application/modules/invoices_1/views/modal_change_client.php create mode 100644 application/modules/invoices_1/views/modal_copy_invoice.php create mode 100644 application/modules/invoices_1/views/modal_create_credit.php create mode 100644 application/modules/invoices_1/views/modal_create_invoice.php create mode 100644 application/modules/invoices_1/views/modal_create_recurring.php create mode 100644 application/modules/invoices_1/views/modal_delete_invoice.php create mode 100644 application/modules/invoices_1/views/partial_invoice_archive.php create mode 100644 application/modules/invoices_1/views/partial_invoice_table.php create mode 100644 application/modules/invoices_1/views/partial_item_table.php create mode 100644 application/modules/invoices_1/views/view.php create mode 100644 application/modules/invoices_1/views/view_sumex.php create mode 100644 application/modules/payments/views/editform.php create mode 100644 application/modules/payments/views/paymentslip.php create mode 100644 application/modules/quotes/views/invoice_details.php create mode 100644 application/modules/quotes/views/partialitemq.php create mode 100644 application/modules/quotes/views/quotes_to_polist.php create mode 100644 application/modules/reports/.DS_Store create mode 100644 application/modules/reports/views/Reports.php create mode 100644 application/modules/reports/views/all_invoice.php create mode 100644 application/modules/reports/views/consolidate_sales.php create mode 100644 application/modules/reports/views/cumulative_report.php create mode 100644 application/modules/reports/views/cumulative_report_day.php create mode 100644 application/modules/reports/views/cumulative_report_month.php create mode 100644 application/modules/reports/views/cumulative_report_year.php create mode 100644 application/modules/reports/views/customer_wise.php create mode 100644 application/modules/reports/views/deliver_perform.php create mode 100644 application/modules/reports/views/gstin_wise.php create mode 100644 application/modules/reports/views/hsn_san.php create mode 100644 application/modules/reports/views/hsn_wise.php create mode 100644 application/modules/reports/views/month_wise.php create mode 100644 application/modules/reports/views/sales.php create mode 100644 application/modules/reports/views/year_wise.php create mode 100644 application/modules/reports/views/year_wise_total.php create mode 100644 application/views/.DS_Store create mode 100644 application/views/invoice_templates/.DS_Store create mode 100644 application/views/invoice_templates/pdf.zip create mode 100644 application/views/reports/year_wise_pdf.php create mode 100644 assets/core/img/favicon_old.png delete mode 100644 uploads/.gitignore delete mode 100644 uploads/archive/.gitignore delete mode 100644 uploads/customer_files/.gitignore delete mode 100644 uploads/customer_files/.htaccess delete mode 100644 uploads/import/.gitignore delete mode 100644 uploads/temp/.gitignore delete mode 100644 uploads/temp/.htaccess delete mode 100644 uploads/temp/mpdf/.gitignore delete mode 100644 vendor_old/autoload.php delete mode 100644 vendor_old/codeigniter/framework/system/.htaccess delete mode 100644 vendor_old/codeigniter/framework/system/core/Benchmark.php delete mode 100644 vendor_old/codeigniter/framework/system/core/CodeIgniter.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Common.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Config.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Controller.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Exceptions.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Hooks.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Input.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Lang.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Loader.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Log.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Model.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Output.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Router.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Security.php delete mode 100644 vendor_old/codeigniter/framework/system/core/URI.php delete mode 100644 vendor_old/codeigniter/framework/system/core/Utf8.php delete mode 100644 vendor_old/codeigniter/framework/system/core/compat/hash.php delete mode 100644 vendor_old/codeigniter/framework/system/core/compat/index.html delete mode 100644 vendor_old/codeigniter/framework/system/core/compat/mbstring.php delete mode 100644 vendor_old/codeigniter/framework/system/core/compat/password.php delete mode 100644 vendor_old/codeigniter/framework/system/core/compat/standard.php delete mode 100644 vendor_old/codeigniter/framework/system/core/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/DB.php delete mode 100644 vendor_old/codeigniter/framework/system/database/DB_cache.php delete mode 100644 vendor_old/codeigniter/framework/system/database/DB_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/DB_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/DB_query_builder.php delete mode 100644 vendor_old/codeigniter/framework/system/database/DB_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/DB_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/cubrid/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/ibase/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mssql/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysql/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysqli/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/oci8/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/odbc/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/postgre/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite3/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/index.html delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_forge.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_result.php delete mode 100644 vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_utility.php delete mode 100644 vendor_old/codeigniter/framework/system/database/index.html delete mode 100644 vendor_old/codeigniter/framework/system/fonts/index.html delete mode 100644 vendor_old/codeigniter/framework/system/fonts/texb.ttf delete mode 100644 vendor_old/codeigniter/framework/system/helpers/array_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/captcha_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/cookie_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/date_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/directory_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/download_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/email_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/file_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/form_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/html_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/index.html delete mode 100644 vendor_old/codeigniter/framework/system/helpers/inflector_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/language_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/number_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/path_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/security_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/smiley_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/string_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/text_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/typography_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/url_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/helpers/xml_helper.php delete mode 100644 vendor_old/codeigniter/framework/system/index.html delete mode 100644 vendor_old/codeigniter/framework/system/language/english/calendar_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/date_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/db_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/email_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/form_validation_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/ftp_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/imglib_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/index.html delete mode 100644 vendor_old/codeigniter/framework/system/language/english/migration_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/number_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/pagination_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/profiler_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/unit_test_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/english/upload_lang.php delete mode 100644 vendor_old/codeigniter/framework/system/language/index.html delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/Cache.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/drivers/Cache_apc.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/drivers/Cache_dummy.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/drivers/Cache_file.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/drivers/Cache_memcached.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/drivers/Cache_redis.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/drivers/Cache_wincache.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/drivers/index.html delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cache/index.html delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Calendar.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Cart.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Driver.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Email.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Encrypt.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Encryption.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Form_validation.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Ftp.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Image_lib.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Javascript.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Javascript/Jquery.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Javascript/index.html delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Migration.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Pagination.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Parser.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Profiler.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/Session.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/SessionHandlerInterface.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/Session_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/drivers/Session_database_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/drivers/Session_files_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/drivers/Session_memcached_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/drivers/Session_redis_driver.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/drivers/index.html delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Session/index.html delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Table.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Trackback.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Typography.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Unit_test.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Upload.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/User_agent.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Xmlrpc.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Xmlrpcs.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/Zip.php delete mode 100644 vendor_old/codeigniter/framework/system/libraries/index.html delete mode 100644 vendor_old/composer/ClassLoader.php delete mode 100644 vendor_old/composer/LICENSE delete mode 100644 vendor_old/composer/autoload_classmap.php delete mode 100644 vendor_old/composer/autoload_files.php delete mode 100644 vendor_old/composer/autoload_namespaces.php delete mode 100644 vendor_old/composer/autoload_psr4.php delete mode 100644 vendor_old/composer/autoload_real.php delete mode 100644 vendor_old/composer/autoload_static.php delete mode 100644 vendor_old/composer/installed.json delete mode 100644 vendor_old/guzzle/guzzle/.gitignore delete mode 100644 vendor_old/guzzle/guzzle/.travis.yml delete mode 100644 vendor_old/guzzle/guzzle/CHANGELOG.md delete mode 100644 vendor_old/guzzle/guzzle/LICENSE delete mode 100644 vendor_old/guzzle/guzzle/README.md delete mode 100644 vendor_old/guzzle/guzzle/UPGRADING.md delete mode 100644 vendor_old/guzzle/guzzle/build.xml delete mode 100644 vendor_old/guzzle/guzzle/composer.json delete mode 100644 vendor_old/guzzle/guzzle/docs/Makefile delete mode 100644 vendor_old/guzzle/guzzle/docs/_downloads/guzzle-schema-1.0.json delete mode 100644 vendor_old/guzzle/guzzle/docs/_static/guzzle-icon.png delete mode 100644 vendor_old/guzzle/guzzle/docs/_static/homepage.css delete mode 100644 vendor_old/guzzle/guzzle/docs/_static/logo.png delete mode 100644 vendor_old/guzzle/guzzle/docs/_static/prettify.css delete mode 100644 vendor_old/guzzle/guzzle/docs/_static/prettify.js delete mode 100644 vendor_old/guzzle/guzzle/docs/_templates/index.html delete mode 100644 vendor_old/guzzle/guzzle/docs/_templates/leftbar.html delete mode 100644 vendor_old/guzzle/guzzle/docs/_templates/nav_links.html delete mode 100644 vendor_old/guzzle/guzzle/docs/batching/batching.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/conf.py delete mode 100644 vendor_old/guzzle/guzzle/docs/docs.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/getting-started/faq.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/getting-started/installation.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/getting-started/overview.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/http-client/client.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/http-client/entity-bodies.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/http-client/http-redirects.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/http-client/request.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/http-client/response.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/http-client/uri-templates.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/index.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/iterators/guzzle-iterators.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/iterators/resource-iterators.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/async-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/backoff-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/cache-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/cookie-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/creating-plugins.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/curl-auth-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/history-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/log-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/md5-validator-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/mock-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/oauth-plugin.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/plugins-list.rst.inc delete mode 100644 vendor_old/guzzle/guzzle/docs/plugins/plugins-overview.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/requirements.txt delete mode 100644 vendor_old/guzzle/guzzle/docs/testing/unit-testing.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/webservice-client/guzzle-service-descriptions.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/webservice-client/using-the-service-builder.rst delete mode 100644 vendor_old/guzzle/guzzle/docs/webservice-client/webservice-client.rst delete mode 100644 vendor_old/guzzle/guzzle/phar-stub.php delete mode 100644 vendor_old/guzzle/guzzle/phing/build.properties.dist delete mode 100644 vendor_old/guzzle/guzzle/phing/imports/dependencies.xml delete mode 100644 vendor_old/guzzle/guzzle/phing/imports/deploy.xml delete mode 100644 vendor_old/guzzle/guzzle/phing/tasks/ComposerLintTask.php delete mode 100644 vendor_old/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php delete mode 100644 vendor_old/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php delete mode 100644 vendor_old/guzzle/guzzle/phpunit.xml.dist delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/AbstractBatchDecorator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/Batch.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchBuilder.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchClosureDivisor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchClosureTransfer.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchCommandTransfer.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchDivisorInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchRequestTransfer.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchSizeDivisor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/BatchTransferInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/Exception/BatchTransferException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/ExceptionBufferingBatch.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/FlushingBatch.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/HistoryBatch.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/NotifyingBatch.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Batch/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/AbstractCacheAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/CacheAdapterInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/ClosureCacheAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/DoctrineCacheAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/NullCacheAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/Zf1CacheAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/Zf2CacheAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Cache/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/AbstractHasDispatcher.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Collection.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Event.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Exception/BadMethodCallException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Exception/ExceptionCollection.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Exception/GuzzleException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Exception/InvalidArgumentException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Exception/RuntimeException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Exception/UnexpectedValueException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/FromConfigInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/HasDispatcherInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/ToArrayInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/Version.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Common/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/AbstractEntityBodyDecorator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/CachingEntityBody.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Client.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/ClientInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Curl/CurlHandle.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMultiProxy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Curl/CurlVersion.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Curl/RequestMediator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/EntityBody.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/EntityBodyInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/BadResponseException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/ClientErrorResponseException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/CouldNotRewindStreamException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/CurlException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/HttpException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/MultiTransferException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/RequestException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/ServerErrorResponseException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Exception/TooManyRedirectsException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/IoEmittingEntityBody.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/AbstractMessage.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequest.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/EntityEnclosingRequestInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Header.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Header/CacheControl.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderCollection.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderFactoryInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Header/HeaderInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Header/Link.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/MessageInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/PostFile.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/PostFileInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Request.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/RequestFactoryInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/RequestInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Message/Response.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Mimetypes.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/CommaAggregator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/DuplicateAggregator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/PhpAggregator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/QueryString.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/ReadLimitEntityBody.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/RedirectPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Resources/cacert.pem delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/StaticClient.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/Url.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Http/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Inflection/Inflector.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Inflection/InflectorInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Inflection/MemoizingInflector.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Inflection/PreComputedInflector.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Inflection/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Iterator/AppendIterator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Iterator/ChunkedIterator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Iterator/FilterIterator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Iterator/MapIterator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Iterator/MethodProxyIterator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Iterator/README.md delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Iterator/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/AbstractLogAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/ArrayLogAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/ClosureLogAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/LogAdapterInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/MessageFormatter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/MonologLogAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/PsrLogAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/Zf1LogAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/Zf2LogAdapter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Log/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParser.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Cookie/CookieParserInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Message/AbstractMessageParser.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParser.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Message/MessageParserInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Message/PeclHttpMessageParser.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/ParserRegistry.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/PeclUriTemplate.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplate.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/UriTemplate/UriTemplateInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParser.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/Url/UrlParserInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Parser/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Async/AsyncPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Async/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/AbstractErrorCodeBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffLogger.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/BackoffStrategyInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CallbackBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ConstantBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/CurlBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ExponentialBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/HttpBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/LinearBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/ReasonPhraseBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/TruncatedBackoffStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Backoff/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheKeyProviderInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/CachePlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/CacheStorageInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/CallbackCanCacheStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/CanCacheStrategyInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheKeyProvider.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCacheStorage.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultCanCacheStrategy.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/DefaultRevalidation.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/DenyRevalidation.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/RevalidationInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/SkipRevalidation.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cache/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Cookie.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/ArrayCookieJar.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/CookieJarInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookieJar/FileCookieJar.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cookie/CookiePlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cookie/Exception/InvalidCookieException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Cookie/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/CurlAuthPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/CurlAuth/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponseExceptionInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/ErrorResponsePlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/Exception/ErrorResponseException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/ErrorResponse/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/History/HistoryPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/History/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Log/LogPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Log/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Md5/CommandContentMd5Plugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Md5/Md5ValidatorPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Md5/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Mock/MockPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Mock/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Oauth/OauthPlugin.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/Oauth/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Plugin/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/AbstractConfigLoader.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilder.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Builder/ServiceBuilderLoader.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/CachingConfigLoader.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Client.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/ClientInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/AbstractCommand.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/ClosureCommand.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/CommandInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/CreateResponseClassEvent.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/DefaultRequestSerializer.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/DefaultResponseParser.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/Factory/AliasFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/Factory/CompositeFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ConcreteClassFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/Factory/FactoryInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/Factory/MapFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/Factory/ServiceDescriptionFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/AbstractRequestVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/BodyVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/HeaderVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/JsonVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFieldVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/PostFileVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/QueryVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/RequestVisitorInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/ResponseBodyVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/AbstractResponseVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/BodyVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/HeaderVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/JsonVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ReasonPhraseVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/ResponseVisitorInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/StatusCodeVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Response/XmlVisitor.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/VisitorFlyweight.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/OperationCommand.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/OperationResponseParser.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/RequestSerializerInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/ResponseClassInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Command/ResponseParserInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/ConfigLoaderInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/Operation.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/OperationInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/Parameter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/SchemaFormatter.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/SchemaValidator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescription.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/ServiceDescriptionLoader.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Description/ValidatorInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/CommandException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/CommandTransferException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/DescriptionBuilderException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/InconsistentClientTransferException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/ResponseClassException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/ServiceBuilderException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/ServiceNotFoundException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Exception/ValidationException.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/AbstractResourceIteratorFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/CompositeResourceIteratorFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/MapResourceIteratorFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/Model.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIterator.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorApplyBatched.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorClassFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorFactoryInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/Resource/ResourceIteratorInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Service/composer.json delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Stream/PhpStreamRequestFactory.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Stream/Stream.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Stream/StreamInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Stream/StreamRequestFactoryInterface.php delete mode 100644 vendor_old/guzzle/guzzle/src/Guzzle/Stream/composer.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/AbstractBatchDecoratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/BatchBuilderTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/BatchClosureDivisorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/BatchClosureTransferTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/BatchCommandTransferTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/BatchRequestTransferTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/BatchSizeDivisorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/BatchTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/ExceptionBufferingBatchTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/FlushingBatchTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/HistoryBatchTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Batch/NotifyingBatchTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Cache/CacheAdapterFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Cache/CacheAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Cache/ClosureCacheAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Cache/NullCacheAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Cache/Zf2CacheAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Common/AbstractHasDispatcherTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Common/CollectionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Common/EventTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Common/Exception/BatchTransferExceptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Common/Exception/ExceptionCollectionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Common/VersionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/GuzzleTestCase.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/AbstractEntityBodyDecoratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/CachingEntityBodyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/ClientTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlHandleTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlMultiProxyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlMultiTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/CurlVersionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Curl/RequestMediatorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/EntityBodyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Exception/CurlExceptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Exception/ExceptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Exception/MultiTransferExceptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/IoEmittingEntityBodyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/AbstractMessageTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/EntityEnclosingRequestTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/Header/HeaderFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/Header/LinkTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/HeaderComparison.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/HeaderComparisonTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/HeaderTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/PostFileTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/RequestTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Message/ResponseTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/MimetypesTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryAggregator/CommaAggregatorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryAggregator/DuplicateAggregatorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryAggregator/PhpAggregatorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/QueryStringTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/ReadLimitEntityBodyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/RedirectPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/Server.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/StaticClientTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/UrlTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Http/server.js delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Inflection/InflectorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Inflection/MemoizingInflectorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Inflection/PreComputedInflectorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Iterator/AppendIteratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Iterator/ChunkedIteratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Iterator/FilterIteratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Iterator/MapIteratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Iterator/MethodProxyIteratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Log/ArrayLogAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Log/ClosureLogAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Log/MessageFormatterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Log/PsrLogAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Log/Zf2LogAdapterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Mock/CustomResponseModel.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Mock/ErrorResponseMock.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Mock/ExceptionMock.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Mock/MockMulti.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Mock/MockObserver.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Mock/MockSubject.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/Cookie/CookieParserProvider.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/Cookie/CookieParserTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/Message/MessageParserProvider.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/Message/MessageParserTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/Message/PeclHttpMessageParserTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/ParserRegistryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/UriTemplate/AbstractUriTemplateTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/UriTemplate/PeclUriTemplateTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Parser/UriTemplate/UriTemplateTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Async/AsyncPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/AbstractBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/BackoffLoggerTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/BackoffPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/CallbackBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/ConstantBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/CurlBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/ExponentialBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/HttpBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/LinearBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/ReasonPhraseBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Backoff/TruncatedBackoffStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/CachePluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/CallbackCanCacheStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultCacheStorageTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultCanCacheStrategyTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DefaultRevalidationTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/DenyRevalidationTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cache/SkipRevalidationTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieJar/ArrayCookieJarTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieJar/FileCookieJarTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookiePluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Cookie/CookieTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/CurlAuth/CurlAuthPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/ErrorResponse/ErrorResponsePluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/History/HistoryPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Log/LogPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Md5/CommandContentMd5PluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Md5/Md5ValidatorPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Mock/MockPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Plugin/Oauth/OauthPluginTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/AbstractConfigLoaderTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderLoaderTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Builder/ServiceBuilderTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/CachingConfigLoaderTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/ClientTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/AbstractCommandTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/ClosureCommandTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/CommandTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultRequestSerializerTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/DefaultResponseParserTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/AliasFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/CompositeFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ConcreteClassFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/MapFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/Factory/ServiceDescriptionFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/AbstractVisitorTestCase.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/BodyVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/HeaderVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/JsonVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFieldVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/PostFileVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/QueryVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/ResponseBodyVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Request/XmlVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/AbstractResponseVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/BodyVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/HeaderVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/JsonVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/ReasonPhraseVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/StatusCodeVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/Response/XmlVisitorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/LocationVisitor/VisitorFlyweightTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationCommandTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Command/OperationResponseParserTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/OperationTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ParameterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaFormatterTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/SchemaValidatorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionLoaderTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Description/ServiceDescriptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/CommandTransferExceptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/InconsistentClientTransferExceptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Exception/ValidationExceptionTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/IterableCommand.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/MockCommand.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/OtherCommand.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Command/Sub/Sub.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/MockClient.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Mock/Model/MockCommandIterator.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/CompositeResourceIteratorFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/MapResourceIteratorFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ModelTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorClassFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Service/Resource/ResourceIteratorTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Stream/PhpStreamRequestFactoryTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/Stream/StreamTest.php delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/FileBody.txt delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/description/bar.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/description/baz.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/description/foo.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/description/recursive.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/mock_response delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/services/json1.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/services/json2.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/services/services.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/test_service.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/test_service2.json delete mode 100644 vendor_old/guzzle/guzzle/tests/Guzzle/Tests/TestData/test_service_3.json delete mode 100644 vendor_old/guzzle/guzzle/tests/bootstrap.php delete mode 100644 vendor_old/ircmaxell/password-compat/LICENSE.md delete mode 100644 vendor_old/ircmaxell/password-compat/composer.json delete mode 100644 vendor_old/ircmaxell/password-compat/lib/password.php delete mode 100644 vendor_old/ircmaxell/password-compat/version-test.php delete mode 100644 vendor_old/mpdf/mpdf/.gitattributes delete mode 100644 vendor_old/mpdf/mpdf/.github/CONTRIBUTING.md delete mode 100644 vendor_old/mpdf/mpdf/.github/ISSUE_TEMPLATE.md delete mode 100644 vendor_old/mpdf/mpdf/.gitignore delete mode 100644 vendor_old/mpdf/mpdf/.travis.yml delete mode 100644 vendor_old/mpdf/mpdf/CHANGELOG.md delete mode 100644 vendor_old/mpdf/mpdf/CREDITS.txt delete mode 100644 vendor_old/mpdf/mpdf/LICENSE.txt delete mode 100644 vendor_old/mpdf/mpdf/README.md delete mode 100644 vendor_old/mpdf/mpdf/composer.json delete mode 100644 vendor_old/mpdf/mpdf/data/CJKdata.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Afrikaans_South_Africa.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Albanian_Albania.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Alsatian_France.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Algeria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Bahrain.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Egypt.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Iraq.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Jordan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Kuwait.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Lebanon.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Libya.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Morocco.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Oman.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Pseudo_RTL.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Qatar.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Saudi_Arabia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Syria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Tunisia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Arabic_Yemen.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Azeri_(Cyrillic)_Azerbaijan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Azeri_(Latin)_Azerbaijan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Bashkir_Russia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Basque_Spain.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Belarusian_Belarus.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Bosnian_(Cyrillic)_Bosnia_and_Herzegovina.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Bosnian_(Latin)_Bosnia_and_Herzegovina.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Breton_France.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Bulgarian_Bulgaria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Catalan_Spain.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Corsican_France.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Croatian_(Latin)_Bosnia_and_Herzegovina.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Croatian_Croatia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Czech_Czech_Republic.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Danish_Denmark.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Dari_Afghanistan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Dutch_Belgium.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Dutch_Netherlands.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Australia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Belize.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Canada.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Caribbean.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_India.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Ireland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Jamaica.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Malaysia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_New_Zealand.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Republic_of_the_Philippines.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Singapore.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_South_Africa.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Trinidad_and_Tobago.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_United_Kingdom.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_United_States.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/English_Zimbabwe.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Estonian_Estonia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Faroese_Faroe_Islands.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Filipino_Philippines.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Finnish_Finland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/French_Belgium.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/French_Canada.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/French_France.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/French_Luxembourg.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/French_Principality_of_Monaco.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/French_Switzerland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Frisian_Netherlands.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Galician_Spain.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/German_Austria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/German_Germany.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/German_Liechtenstein.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/German_Luxembourg.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/German_Switzerland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Greek_Greece.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Greenlandic_Greenland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Hausa_(Latin)_Nigeria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Hebrew_Israel.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Hungarian_Hungary.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Icelandic_Iceland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Igbo_Nigeria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Indonesian_Indonesia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Inuktitut_(Latin)_Canada.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Invariant_Language_Invariant_Country.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Irish_Ireland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Italian_Italy.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Italian_Switzerland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Kinyarwanda_Rwanda.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Kiswahili_Kenya.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Kyrgyz_Kyrgyzstan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Latvian_Latvia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Lithuanian_Lithuania.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Lower_Sorbian_Germany.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Luxembourgish_Luxembourg.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Macedonian_(FYROM)_Macedonia_(FYROM).php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Malay_Brunei_Darussalam.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Malay_Malaysia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Mapudungun_Chile.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Mohawk_Canada.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Mongolian_(Cyrillic)_Mongolia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Norwegian_(Nynorsk)_Norway.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Occitan_France.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Persian_Iran.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Polish_Poland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Portuguese_Brazil.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Portuguese_Portugal.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Quechua_Bolivia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Quechua_Ecuador.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Quechua_Peru.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Romanian_Romania.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Romansh_Switzerland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Russian_Russia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Inari)_Finland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Lule)_Norway.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Lule)_Sweden.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Northern)_Finland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Northern)_Norway.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Northern)_Sweden.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Skolt)_Finland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Southern)_Norway.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sami_(Southern)_Sweden.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Bosnia_and_Herzegovina.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Serbian_(Cyrillic)_Serbia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Serbian_(Latin)_Bosnia_and_Herzegovina.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Serbian_(Latin)_Serbia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Sesotho_sa_Leboa_South_Africa.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Setswana_South_Africa.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Slovak_Slovakia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Slovenian_Slovenia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Argentina.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Bolivia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Chile.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Colombia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Costa_Rica.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Dominican_Republic.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Ecuador.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_El_Salvador.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Guatemala.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Honduras.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Mexico.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Nicaragua.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Panama.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Paraguay.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Peru.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Puerto_Rico.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Spain.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_United_States.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Uruguay.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Spanish_Venezuela.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Swedish_Finland.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Swedish_Sweden.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Tajik_(Cyrillic)_Tajikistan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Tamazight_(Latin)_Algeria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Tatar_Russia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Turkish_Turkey.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Turkmen_Turkmenistan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Ukrainian_Ukraine.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Upper_Sorbian_Germany.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Urdu_Islamic_Republic_of_Pakistan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Uzbek_(Cyrillic)_Uzbekistan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Uzbek_(Latin)_Uzbekistan.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Vietnamese_Vietnam.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Welsh_United_Kingdom.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Wolof_Senegal.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Yakut_Russia.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/Yoruba_Nigeria.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/isiXhosa_South_Africa.php delete mode 100644 vendor_old/mpdf/mpdf/data/collations/isiZulu_South_Africa.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ccourier.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ccourierb.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ccourierbi.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ccourieri.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/chelvetica.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/chelveticab.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/chelveticabi.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/chelveticai.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/csymbol.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ctimes.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ctimesb.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ctimesbi.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/ctimesi.php delete mode 100644 vendor_old/mpdf/mpdf/data/font/czapfdingbats.php delete mode 100644 vendor_old/mpdf/mpdf/data/iccprofiles/sRGB_IEC61966-2-1.icc delete mode 100644 vendor_old/mpdf/mpdf/data/lang2fonts.css delete mode 100644 vendor_old/mpdf/mpdf/data/linebrdictK.dat delete mode 100644 vendor_old/mpdf/mpdf/data/linebrdictL.dat delete mode 100644 vendor_old/mpdf/mpdf/data/linebrdictT.dat delete mode 100644 vendor_old/mpdf/mpdf/data/mpdf.css delete mode 100644 vendor_old/mpdf/mpdf/data/out.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/NOTES.txt delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/de.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/dictionary.txt delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/en.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/es.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/fi.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/fr.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/it.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/nl.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/pl.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/ru.php delete mode 100644 vendor_old/mpdf/mpdf/data/patterns/sv.php delete mode 100644 vendor_old/mpdf/mpdf/data/subs_core.php delete mode 100644 vendor_old/mpdf/mpdf/data/subs_win-1252.php delete mode 100644 vendor_old/mpdf/mpdf/data/upperCase.php delete mode 100644 vendor_old/mpdf/mpdf/phpunit.xml delete mode 100644 vendor_old/mpdf/mpdf/ruleset.xml delete mode 100644 vendor_old/mpdf/mpdf/src/Barcode.php delete mode 100644 vendor_old/mpdf/mpdf/src/Cache.php delete mode 100644 vendor_old/mpdf/mpdf/src/Color/ColorConvertor.php delete mode 100644 vendor_old/mpdf/mpdf/src/Color/NamedColors.php delete mode 100644 vendor_old/mpdf/mpdf/src/Config/ConfigVariables.php delete mode 100644 vendor_old/mpdf/mpdf/src/Config/FontVariables.php delete mode 100644 vendor_old/mpdf/mpdf/src/Conversion/DecToAlpha.php delete mode 100644 vendor_old/mpdf/mpdf/src/Conversion/DecToCjk.php delete mode 100644 vendor_old/mpdf/mpdf/src/Conversion/DecToHebrew.php delete mode 100644 vendor_old/mpdf/mpdf/src/Conversion/DecToOther.php delete mode 100644 vendor_old/mpdf/mpdf/src/Conversion/DecToRoman.php delete mode 100644 vendor_old/mpdf/mpdf/src/Css/Border.php delete mode 100644 vendor_old/mpdf/mpdf/src/Css/DefaultCss.php delete mode 100644 vendor_old/mpdf/mpdf/src/Css/TextVars.php delete mode 100644 vendor_old/mpdf/mpdf/src/CssManager.php delete mode 100644 vendor_old/mpdf/mpdf/src/DirectWrite.php delete mode 100644 vendor_old/mpdf/mpdf/src/Fonts/FontCache.php delete mode 100644 vendor_old/mpdf/mpdf/src/Fonts/FontFileFinder.php delete mode 100644 vendor_old/mpdf/mpdf/src/Fonts/GlyphOperator.php delete mode 100644 vendor_old/mpdf/mpdf/src/Fonts/MetricsGenerator.php delete mode 100644 vendor_old/mpdf/mpdf/src/Form.php delete mode 100644 vendor_old/mpdf/mpdf/src/Gif/ColorTable.php delete mode 100644 vendor_old/mpdf/mpdf/src/Gif/FileHeader.php delete mode 100644 vendor_old/mpdf/mpdf/src/Gif/Gif.php delete mode 100644 vendor_old/mpdf/mpdf/src/Gif/Image.php delete mode 100644 vendor_old/mpdf/mpdf/src/Gif/ImageHeader.php delete mode 100644 vendor_old/mpdf/mpdf/src/Gif/Lzw.php delete mode 100644 vendor_old/mpdf/mpdf/src/Gradient.php delete mode 100644 vendor_old/mpdf/mpdf/src/Hyphenator.php delete mode 100644 vendor_old/mpdf/mpdf/src/Image/Bmp.php delete mode 100644 vendor_old/mpdf/mpdf/src/Image/ImageProcessor.php delete mode 100644 vendor_old/mpdf/mpdf/src/Image/ImageTypeGuesser.php delete mode 100644 vendor_old/mpdf/mpdf/src/Image/Svg.php delete mode 100644 vendor_old/mpdf/mpdf/src/Image/Wmf.php delete mode 100644 vendor_old/mpdf/mpdf/src/LangToFont.php delete mode 100644 vendor_old/mpdf/mpdf/src/Log/Context.php delete mode 100644 vendor_old/mpdf/mpdf/src/Meter.php delete mode 100644 vendor_old/mpdf/mpdf/src/Mpdf.php delete mode 100644 vendor_old/mpdf/mpdf/src/MpdfException.php delete mode 100644 vendor_old/mpdf/mpdf/src/MpdfImageException.php delete mode 100644 vendor_old/mpdf/mpdf/src/Otl.php delete mode 100644 vendor_old/mpdf/mpdf/src/OtlDump.php delete mode 100644 vendor_old/mpdf/mpdf/src/Output/Destination.php delete mode 100644 vendor_old/mpdf/mpdf/src/PageFormat.php delete mode 100644 vendor_old/mpdf/mpdf/src/Pdf/Protection.php delete mode 100644 vendor_old/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php delete mode 100644 vendor_old/mpdf/mpdf/src/QrCode/QrCode.php delete mode 100644 vendor_old/mpdf/mpdf/src/ScriptToLang.php delete mode 100644 vendor_old/mpdf/mpdf/src/Shaper/Indic.php delete mode 100644 vendor_old/mpdf/mpdf/src/Shaper/Myanmar.php delete mode 100644 vendor_old/mpdf/mpdf/src/Shaper/Sea.php delete mode 100644 vendor_old/mpdf/mpdf/src/SizeConvertor.php delete mode 100644 vendor_old/mpdf/mpdf/src/TTFontFile.php delete mode 100644 vendor_old/mpdf/mpdf/src/TTFontFileAnalysis.php delete mode 100644 vendor_old/mpdf/mpdf/src/TableOfContents.php delete mode 100644 vendor_old/mpdf/mpdf/src/Tag.php delete mode 100644 vendor_old/mpdf/mpdf/src/Ucdn.php delete mode 100644 vendor_old/mpdf/mpdf/src/functions.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/AddFontTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/ColorConvertorTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/FpdiTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/HyphenatorTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/MpdfTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/Pdf/Protection/UniqidGeneratorTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/Pdf/ProtectionTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/SizeConvertorTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/Mpdf/WriteHtmlTest.php delete mode 100644 vendor_old/mpdf/mpdf/tests/bootstrap.php delete mode 100644 vendor_old/mpdf/mpdf/tests/data/pdfs/2-Page-PDF_1_4.pdf delete mode 100644 vendor_old/mpdf/mpdf/tests/data/xml/test.xml delete mode 100644 vendor_old/mpdf/mpdf/tests/mPDFTest.php delete mode 100644 vendor_old/mpdf/mpdf/tmp/.gitignore delete mode 100644 vendor_old/mpdf/mpdf/tmp/ttfontdata/.gitkeep delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSans-Bold.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSans-BoldOblique.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSans-Oblique.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSans.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansCondensed-BoldOblique.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansCondensed-Oblique.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansCondensed.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansMono-Bold.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansMono-BoldOblique.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansMono-Oblique.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSansMono.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerif-Bold.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerif-BoldItalic.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerif-Italic.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerif.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerifCondensed-Bold.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerifCondensed-BoldItalic.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerifCondensed-Italic.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuSerifCondensed.ttf delete mode 100644 vendor_old/mpdf/mpdf/ttfonts/DejaVuinfo.txt delete mode 100644 vendor_old/mpdf/mpdf/utils/data/UnicodeData.txt delete mode 100644 vendor_old/mpdf/mpdf/utils/data/UnicodeRanges.php delete mode 100644 vendor_old/mpdf/mpdf/utils/font_collections.php delete mode 100644 vendor_old/mpdf/mpdf/utils/font_coverage.php delete mode 100644 vendor_old/mpdf/mpdf/utils/font_dump.php delete mode 100644 vendor_old/mpdf/mpdf/utils/font_dump_otl.php delete mode 100644 vendor_old/mpdf/mpdf/utils/font_names.php delete mode 100644 vendor_old/mpdf/mpdf/utils/image_details.php delete mode 100644 vendor_old/omnipay/2checkout/.gitignore delete mode 100644 vendor_old/omnipay/2checkout/.travis.yml delete mode 100644 vendor_old/omnipay/2checkout/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/2checkout/LICENSE delete mode 100644 vendor_old/omnipay/2checkout/README.md delete mode 100644 vendor_old/omnipay/2checkout/composer.json delete mode 100644 vendor_old/omnipay/2checkout/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/2checkout/src/Gateway.php delete mode 100644 vendor_old/omnipay/2checkout/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/2checkout/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/2checkout/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/2checkout/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/2checkout/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/2checkout/tests/Message/CompletePurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/2checkout/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/2checkout/tests/Message/PurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/.gitignore delete mode 100644 vendor_old/omnipay/authorizenet/.travis.yml delete mode 100644 vendor_old/omnipay/authorizenet/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/authorizenet/LICENSE delete mode 100644 vendor_old/omnipay/authorizenet/README.md delete mode 100644 vendor_old/omnipay/authorizenet/composer.json delete mode 100644 vendor_old/omnipay/authorizenet/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/authorizenet/src/AIMGateway.php delete mode 100644 vendor_old/omnipay/authorizenet/src/CIMGateway.php delete mode 100644 vendor_old/omnipay/authorizenet/src/DPMGateway.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/AIMAbstractRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/AIMAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/AIMCaptureRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/AIMPurchaseRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/AIMRefundRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/AIMResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/AIMVoidRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMAbstractRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMAbstractResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMCaptureRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMCreateCardRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMCreateCardResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMCreatePaymentProfileRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMCreatePaymentProfileResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMDeletePaymentProfileRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMDeletePaymentProfileResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMGetPaymentProfileRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMGetPaymentProfileResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMGetProfileRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMGetProfileResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMPurchaseRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMRefundRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMUpdatePaymentProfileRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMUpdatePaymentProfileResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/CIMVoidRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/DPMAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/DPMCompleteRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/DPMCompleteResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/DPMPurchaseRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/DPMResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMAbstractRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMCaptureRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMCompleteAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMCompleteAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMPurchaseRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Message/SIMVoidRequest.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Model/CardReference.php delete mode 100644 vendor_old/omnipay/authorizenet/src/Model/TransactionReference.php delete mode 100644 vendor_old/omnipay/authorizenet/src/SIMGateway.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/AIMGatewayIntegrationTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/AIMGatewayTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/CIMGatewayIntegrationTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/CIMGatewayTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/DPMGatewayTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/AIMAbstractRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/AIMAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/AIMPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/AIMRefundRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/AIMResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMCaptureRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMCreateCardRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMCreateCardResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMCreatePaymentProfileRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMCreatePaymentProfileResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMGetPaymentProfileRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMGetPaymentProfileResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMGetProfileRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMGetProfileResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMRefundRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMUpdatePaymentProfileRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/CIMUpdatePaymentProfileResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/DPMAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/DPMCompleteRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/DPMCompleteResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/DPMPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/SIMAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/SIMCompleteAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Message/SIMCompleteAuthorizeResponseTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMAuthorizeFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMAuthorizeInvalid.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMAuthorizeInvalidOTSToken.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMAuthorizeSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMCaptureFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMCaptureSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMRefundFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMRefundSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMVoidFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/AIMVoidSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMCreateCardFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMCreateCardFailureWithDuplicate.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMCreateCardSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMCreatePaymentProfileFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMCreatePaymentProfileFailureMaxProfileLimit.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMCreatePaymentProfileSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMGetPaymentProfileSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMGetProfileSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/CIMUpdatePaymentProfileSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/DPMAuthorizeFailure.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Mock/DPMAuthorizeSuccess.txt delete mode 100644 vendor_old/omnipay/authorizenet/tests/Model/CardReferenceTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/Model/TransactionReferenceTest.php delete mode 100644 vendor_old/omnipay/authorizenet/tests/SIMGatewayTest.php delete mode 100644 vendor_old/omnipay/buckaroo/.gitignore delete mode 100644 vendor_old/omnipay/buckaroo/.travis.yml delete mode 100644 vendor_old/omnipay/buckaroo/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/buckaroo/LICENSE delete mode 100644 vendor_old/omnipay/buckaroo/README.md delete mode 100644 vendor_old/omnipay/buckaroo/composer.json delete mode 100644 vendor_old/omnipay/buckaroo/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/buckaroo/src/BuckarooGateway.php delete mode 100644 vendor_old/omnipay/buckaroo/src/CreditCardGateway.php delete mode 100644 vendor_old/omnipay/buckaroo/src/IdealGateway.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/CreditCardPurchaseRequest.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/IdealPurchaseRequest.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/PayPalPurchaseRequest.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/buckaroo/src/Message/SepaDirectDebitPurchaseRequest.php delete mode 100644 vendor_old/omnipay/buckaroo/src/PayPalGateway.php delete mode 100644 vendor_old/omnipay/buckaroo/src/SepaDirectDebitGateway.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/BuckarooGatewayTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/CreditCardGatewayTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/IdealGatewayTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/AbstractRequestTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/CompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/CompletePurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/CreditCardPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/IdealPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/PayPalPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/Message/SepaDirectDebitPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/PayPalGatewayTest.php delete mode 100644 vendor_old/omnipay/buckaroo/tests/SepaDirectDebitGatewayTest.php delete mode 100644 vendor_old/omnipay/cardsave/.gitignore delete mode 100644 vendor_old/omnipay/cardsave/.travis.yml delete mode 100644 vendor_old/omnipay/cardsave/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/cardsave/LICENSE delete mode 100644 vendor_old/omnipay/cardsave/README.md delete mode 100644 vendor_old/omnipay/cardsave/composer.json delete mode 100644 vendor_old/omnipay/cardsave/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/cardsave/src/Gateway.php delete mode 100644 vendor_old/omnipay/cardsave/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/cardsave/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/cardsave/src/Message/ReferencedPurchaseRequest.php delete mode 100644 vendor_old/omnipay/cardsave/src/Message/RefundRequest.php delete mode 100644 vendor_old/omnipay/cardsave/src/Message/Response.php delete mode 100644 vendor_old/omnipay/cardsave/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/cardsave/tests/Message/ReferencedPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/cardsave/tests/Message/RefundRequestTest.php delete mode 100644 vendor_old/omnipay/cardsave/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/cardsave/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/cardsave/tests/Mock/PurchaseFailureWithoutStatusCode.txt delete mode 100644 vendor_old/omnipay/cardsave/tests/Mock/PurchaseRedirect.txt delete mode 100644 vendor_old/omnipay/cardsave/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/coinbase/.gitignore delete mode 100644 vendor_old/omnipay/coinbase/.travis.yml delete mode 100644 vendor_old/omnipay/coinbase/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/coinbase/LICENSE delete mode 100644 vendor_old/omnipay/coinbase/README.md delete mode 100644 vendor_old/omnipay/coinbase/composer.json delete mode 100644 vendor_old/omnipay/coinbase/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/coinbase/src/Gateway.php delete mode 100644 vendor_old/omnipay/coinbase/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/coinbase/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/coinbase/src/Message/FetchTransactionRequest.php delete mode 100644 vendor_old/omnipay/coinbase/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/coinbase/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/coinbase/src/Message/Response.php delete mode 100644 vendor_old/omnipay/coinbase/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/coinbase/tests/Message/AbstractRequestTest.php delete mode 100644 vendor_old/omnipay/coinbase/tests/Message/CompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/coinbase/tests/Message/FetchTransactionRequestTest.php delete mode 100644 vendor_old/omnipay/coinbase/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/coinbase/tests/Message/PurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/coinbase/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/coinbase/tests/Mock/FetchTransactionFailure.txt delete mode 100644 vendor_old/omnipay/coinbase/tests/Mock/FetchTransactionSuccess.txt delete mode 100644 vendor_old/omnipay/coinbase/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/coinbase/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/coinbase/tests/Mock/PurchaseUnauthorized.txt delete mode 100644 vendor_old/omnipay/common/.gitignore delete mode 100644 vendor_old/omnipay/common/.travis.yml delete mode 100644 vendor_old/omnipay/common/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/common/LICENSE delete mode 100644 vendor_old/omnipay/common/README.md delete mode 100644 vendor_old/omnipay/common/composer.json delete mode 100644 vendor_old/omnipay/common/makedoc.sh delete mode 100644 vendor_old/omnipay/common/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/AbstractGateway.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/CreditCard.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Currency.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Exception/BadMethodCallException.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Exception/InvalidCreditCardException.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Exception/InvalidRequestException.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Exception/InvalidResponseException.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Exception/OmnipayException.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Exception/RuntimeException.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/GatewayFactory.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/GatewayInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Helper.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Issuer.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Item.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/ItemBag.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/ItemInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/AbstractResponse.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/FetchIssuersResponseInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/FetchPaymentMethodsResponseInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/MessageInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/RedirectResponseInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/RequestInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/Message/ResponseInterface.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Common/PaymentMethod.php delete mode 100644 vendor_old/omnipay/common/src/Omnipay/Omnipay.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/AbstractGatewayTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/CreditCardTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/CurrencyTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/Exception/BadMethodCallExceptionTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/Exception/InvalidCreditCardExceptionTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/Exception/InvalidRequestExceptionTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/Exception/InvalidResponseExceptionTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/Exception/RuntimeExceptionTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/GatewayFactoryTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/HelperTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/IssuerTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/ItemBagTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/ItemTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/Message/AbstractRequestTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/Message/AbstractResponseTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/Common/PaymentMethodTest.php delete mode 100644 vendor_old/omnipay/common/tests/Omnipay/OmnipayTest.php delete mode 100644 vendor_old/omnipay/common/tests/bootstrap.php delete mode 100644 vendor_old/omnipay/dummy/.gitignore delete mode 100644 vendor_old/omnipay/dummy/.travis.yml delete mode 100644 vendor_old/omnipay/dummy/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/dummy/LICENSE delete mode 100644 vendor_old/omnipay/dummy/README.md delete mode 100644 vendor_old/omnipay/dummy/composer.json delete mode 100644 vendor_old/omnipay/dummy/makedoc.sh delete mode 100644 vendor_old/omnipay/dummy/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/dummy/runtests.sh delete mode 100644 vendor_old/omnipay/dummy/src/Gateway.php delete mode 100644 vendor_old/omnipay/dummy/src/Message/AuthorizeRequest.php delete mode 100644 vendor_old/omnipay/dummy/src/Message/Response.php delete mode 100644 vendor_old/omnipay/dummy/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/dummy/tests/Message/AuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/dummy/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/eway/.gitignore delete mode 100644 vendor_old/omnipay/eway/.travis.yml delete mode 100644 vendor_old/omnipay/eway/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/eway/LICENSE delete mode 100644 vendor_old/omnipay/eway/README.md delete mode 100644 vendor_old/omnipay/eway/composer.json delete mode 100644 vendor_old/omnipay/eway/makedoc.sh delete mode 100644 vendor_old/omnipay/eway/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/eway/runtests.sh delete mode 100644 vendor_old/omnipay/eway/src/DirectGateway.php delete mode 100644 vendor_old/omnipay/eway/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/AbstractResponse.php delete mode 100644 vendor_old/omnipay/eway/src/Message/DirectAbstractRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/DirectAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/DirectCaptureRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/DirectPurchaseRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/DirectRefundRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/DirectResponse.php delete mode 100644 vendor_old/omnipay/eway/src/Message/DirectVoidRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidCaptureRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidDirectAbstractRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidDirectAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidDirectCreateCardRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidDirectPurchaseRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidDirectUpdateCardRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidPurchaseRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidResponse.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidSharedPurchaseRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RapidSharedResponse.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RefundRequest.php delete mode 100644 vendor_old/omnipay/eway/src/Message/RefundResponse.php delete mode 100644 vendor_old/omnipay/eway/src/RapidDirectGateway.php delete mode 100644 vendor_old/omnipay/eway/src/RapidGateway.php delete mode 100644 vendor_old/omnipay/eway/src/RapidSharedGateway.php delete mode 100644 vendor_old/omnipay/eway/tests/DirectGatewayTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/AbstractRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/AbstractResponseTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidCaptureRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidDirectAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidDirectCreateCardRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidDirectPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidDirectUpdateCardRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidResponseTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RapidSharedPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Message/RefundRequestTest.php delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectAuthorizeFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectAuthorizeSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectCaptureFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectCaptureSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectRefundFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectRefundSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectVoidFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/DirectVoidSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidCaptureRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidCaptureRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidCompletePurchaseRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidCompletePurchaseRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectAuthoriseRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectAuthoriseRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectCreateCardRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectCreateCardRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectPurchaseRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectPurchaseRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectUpdateCardRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidDirectUpdateCardRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidPurchaseRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidPurchaseRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidRefundRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidRefundRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidSharedPurchaseRequestFailure.txt delete mode 100644 vendor_old/omnipay/eway/tests/Mock/RapidSharedPurchaseRequestSuccess.txt delete mode 100644 vendor_old/omnipay/eway/tests/RapidDirectGatewayTest.php delete mode 100644 vendor_old/omnipay/eway/tests/RapidGatewayTest.php delete mode 100644 vendor_old/omnipay/eway/tests/RapidSharedGatewayTest.php delete mode 100644 vendor_old/omnipay/firstdata/.gitignore delete mode 100644 vendor_old/omnipay/firstdata/.travis.yml delete mode 100644 vendor_old/omnipay/firstdata/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/firstdata/LICENSE delete mode 100644 vendor_old/omnipay/firstdata/README.md delete mode 100644 vendor_old/omnipay/firstdata/composer.json delete mode 100644 vendor_old/omnipay/firstdata/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/firstdata/runtests.sh delete mode 100644 vendor_old/omnipay/firstdata/src/ConnectGateway.php delete mode 100644 vendor_old/omnipay/firstdata/src/GlobalGateway.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PayeezyAbstractRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PayeezyAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PayeezyCaptureRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PayeezyPurchaseRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PayeezyRefundRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PayeezyResponse.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PayeezyVoidRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/WebserviceAbstractRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/WebserviceAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/WebserviceCaptureRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/WebservicePurchaseRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/WebserviceRefundRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/WebserviceResponse.php delete mode 100644 vendor_old/omnipay/firstdata/src/Message/WebserviceVoidRequest.php delete mode 100644 vendor_old/omnipay/firstdata/src/PayeezyGateway.php delete mode 100644 vendor_old/omnipay/firstdata/src/WebserviceGateway.php delete mode 100644 vendor_old/omnipay/firstdata/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/CompletePurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/PayeezyAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/PayeezyPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/PayeezyPurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/PayeezyRefundRequestTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/PurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/WebserviceCaptureRequestTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/WebservicePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/WebserviceRefundRequestTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Message/WebserviceVoidRequestTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/firstdata/tests/Mock/RefundError.txt delete mode 100644 vendor_old/omnipay/firstdata/tests/Mock/RefundSuccess.txt delete mode 100644 vendor_old/omnipay/firstdata/tests/Mock/WebservicePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/firstdata/tests/PayeezyGatewayTest.php delete mode 100644 vendor_old/omnipay/firstdata/tests/WebserviceGatewayTest.php delete mode 100644 vendor_old/omnipay/gocardless/.gitignore delete mode 100644 vendor_old/omnipay/gocardless/.travis.yml delete mode 100644 vendor_old/omnipay/gocardless/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/gocardless/LICENSE delete mode 100644 vendor_old/omnipay/gocardless/README.md delete mode 100644 vendor_old/omnipay/gocardless/composer.json delete mode 100644 vendor_old/omnipay/gocardless/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/gocardless/src/Gateway.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/AuthorizeRequest.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/AuthorizeResponse.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/CaptureRequest.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/CaptureResponse.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/CompleteAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/CompleteAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/gocardless/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/gocardless/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/gocardless/tests/Message/CompletePurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/gocardless/tests/Mock/CapturePaymentFailure.txt delete mode 100644 vendor_old/omnipay/gocardless/tests/Mock/CapturePaymentSuccess.txt delete mode 100644 vendor_old/omnipay/gocardless/tests/Mock/CompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/gocardless/tests/Mock/CompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/manual/.gitignore delete mode 100644 vendor_old/omnipay/manual/.travis.yml delete mode 100644 vendor_old/omnipay/manual/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/manual/LICENSE delete mode 100644 vendor_old/omnipay/manual/README.md delete mode 100644 vendor_old/omnipay/manual/composer.json delete mode 100644 vendor_old/omnipay/manual/makedoc.sh delete mode 100644 vendor_old/omnipay/manual/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/manual/runtests.sh delete mode 100644 vendor_old/omnipay/manual/src/Gateway.php delete mode 100644 vendor_old/omnipay/manual/src/Message/Request.php delete mode 100644 vendor_old/omnipay/manual/src/Message/Response.php delete mode 100644 vendor_old/omnipay/manual/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/migs/.gitignore delete mode 100644 vendor_old/omnipay/migs/.travis.yml delete mode 100644 vendor_old/omnipay/migs/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/migs/LICENSE delete mode 100644 vendor_old/omnipay/migs/README.md delete mode 100644 vendor_old/omnipay/migs/composer.json delete mode 100644 vendor_old/omnipay/migs/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/migs/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/migs/src/Message/Response.php delete mode 100644 vendor_old/omnipay/migs/src/Message/ThreePartyCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/migs/src/Message/ThreePartyPurchaseRequest.php delete mode 100644 vendor_old/omnipay/migs/src/Message/ThreePartyPurchaseResponse.php delete mode 100644 vendor_old/omnipay/migs/src/Message/ThreePartyRefundRequest.php delete mode 100644 vendor_old/omnipay/migs/src/Message/TwoPartyPurchaseRequest.php delete mode 100644 vendor_old/omnipay/migs/src/ThreePartyGateway.php delete mode 100644 vendor_old/omnipay/migs/src/TwoPartyGateway.php delete mode 100644 vendor_old/omnipay/migs/tests/Message/ThreePartyCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/migs/tests/Message/ThreePartyPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/migs/tests/Message/ThreePartyPurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/migs/tests/Message/ThreePartyRefundRequestTest.php delete mode 100644 vendor_old/omnipay/migs/tests/Message/TwoPartyPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/migs/tests/Message/TwoPartyPurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/migs/tests/Mock/TwoPartyPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/migs/tests/Mock/TwoPartyPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/migs/tests/ThreePartyGatewayTest.php delete mode 100644 vendor_old/omnipay/migs/tests/TwoPartyGatewayTest.php delete mode 100644 vendor_old/omnipay/mollie/.gitignore delete mode 100644 vendor_old/omnipay/mollie/.travis.yml delete mode 100644 vendor_old/omnipay/mollie/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/mollie/LICENSE delete mode 100644 vendor_old/omnipay/mollie/README.md delete mode 100644 vendor_old/omnipay/mollie/composer.json delete mode 100644 vendor_old/omnipay/mollie/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/mollie/src/Gateway.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/AbstractResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/CreateCustomerRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/CreateCustomerResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchCustomerRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchCustomerResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchIssuersRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchIssuersResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchPaymentMethodsRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchPaymentMethodsResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchTransactionRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/FetchTransactionResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/RefundRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/RefundResponse.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/UpdateCustomerRequest.php delete mode 100644 vendor_old/omnipay/mollie/src/Message/UpdateCustomerResponse.php delete mode 100644 vendor_old/omnipay/mollie/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/CompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/CreateCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/FetchCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/FetchIssuersRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/FetchPaymentMethodsRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/FetchTransactionRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/RefundRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Message/UpdateCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/CompletePurchaseExpired.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/CompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/CompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/CreateCustomerFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/CreateCustomerSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchCustomerFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchCustomerSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchIssuersFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchIssuersSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchPaymentMethodsFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchPaymentMethodsSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchTransactionExpired.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchTransactionFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/FetchTransactionSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/PurchaseIssuerFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/PurchaseSystemFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/RefundSuccess.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/UpdateCustomerFailure.txt delete mode 100644 vendor_old/omnipay/mollie/tests/Mock/UpdateCustomerSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/.gitignore delete mode 100644 vendor_old/omnipay/multisafepay/.travis.yml delete mode 100644 vendor_old/omnipay/multisafepay/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/multisafepay/LICENSE delete mode 100644 vendor_old/omnipay/multisafepay/README.md delete mode 100644 vendor_old/omnipay/multisafepay/composer.json delete mode 100644 vendor_old/omnipay/multisafepay/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/multisafepay/src/Gateway.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/AbstractResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/FetchIssuersRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/FetchIssuersResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/FetchPaymentMethodsRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/FetchPaymentMethodsResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestAbstractRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestAbstractResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestCompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestFetchIssuersRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestFetchIssuersResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestFetchPaymentMethodsRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestFetchPaymentMethodsResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestFetchTransactionRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestFetchTransactionResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestPurchaseRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestPurchaseResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestRefundRequest.php delete mode 100644 vendor_old/omnipay/multisafepay/src/Message/RestRefundResponse.php delete mode 100644 vendor_old/omnipay/multisafepay/src/RestGateway.php delete mode 100644 vendor_old/omnipay/multisafepay/src/XmlGateway.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/RestFetchIssuersRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/RestFetchPaymentMethodsRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/RestPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/XmlAbstractRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/XmlCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/XmlFetchIssuersRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/XmlFetchPaymentMethodsRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Message/XmlPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/RestFetchIssuersFailure.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/RestFetchIssuersSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/RestFetchPaymentMethodsSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/RestInvalidApiKeyFailure.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/RestPurchaseInvalidAmount.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/RestPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlCompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlCompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlFetchIssuersFailure.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlFetchIssuersSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlFetchPaymentMethodsFailure.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlFetchPaymentMethodsSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/Mock/XmlPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/multisafepay/tests/RestGatewayTest.php delete mode 100644 vendor_old/omnipay/multisafepay/tests/XmlGatewayTest.php delete mode 100644 vendor_old/omnipay/netaxept/.gitignore delete mode 100644 vendor_old/omnipay/netaxept/.travis.yml delete mode 100644 vendor_old/omnipay/netaxept/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/netaxept/LICENSE delete mode 100644 vendor_old/omnipay/netaxept/README.md delete mode 100644 vendor_old/omnipay/netaxept/composer.json delete mode 100644 vendor_old/omnipay/netaxept/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/netaxept/src/Gateway.php delete mode 100644 vendor_old/omnipay/netaxept/src/Message/AnnulRequest.php delete mode 100644 vendor_old/omnipay/netaxept/src/Message/CaptureRequest.php delete mode 100644 vendor_old/omnipay/netaxept/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/netaxept/src/Message/CreditRequest.php delete mode 100644 vendor_old/omnipay/netaxept/src/Message/ErrorResponse.php delete mode 100644 vendor_old/omnipay/netaxept/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/netaxept/src/Message/Response.php delete mode 100644 vendor_old/omnipay/netaxept/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/netaxept/tests/Message/AnnulRequestTest.php delete mode 100644 vendor_old/omnipay/netaxept/tests/Message/CaptureRequestTest.php delete mode 100644 vendor_old/omnipay/netaxept/tests/Message/CompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/netaxept/tests/Message/CreditRequestTest.php delete mode 100644 vendor_old/omnipay/netaxept/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/netaxept/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/AnnulFailure.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/AnnulSuccess.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/CaptureFailure.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/CaptureSuccess.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/CompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/CompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/CreditFailure.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/CreditSuccess.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/netaxept/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/.gitignore delete mode 100644 vendor_old/omnipay/netbanx/.travis.yml delete mode 100644 vendor_old/omnipay/netbanx/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/netbanx/LICENSE delete mode 100644 vendor_old/omnipay/netbanx/README.md delete mode 100644 vendor_old/omnipay/netbanx/composer.json delete mode 100644 vendor_old/omnipay/netbanx/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/netbanx/src/Gateway.php delete mode 100644 vendor_old/omnipay/netbanx/src/HostedGateway.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/AuthorizeRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/CaptureRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedAbstractRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedAbstractResponse.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedCaptureRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedCaptureResponse.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedCompleteAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedPurchaseRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedPurchaseResponse.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedRefundRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/HostedRefundResponse.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/Response.php delete mode 100644 vendor_old/omnipay/netbanx/src/Message/VoidRequest.php delete mode 100644 vendor_old/omnipay/netbanx/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/netbanx/tests/HostedGatewayTest.php delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/AuthorizeFailure.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/AuthorizeSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/CaptureFailure.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/CaptureSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/CreateCard.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/HostedCompleteAuthorizeSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/HostedCompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/HostedPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/HostedPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/StoredDataAuthorizeFailure.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/StoredDataAuthorizeSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/StoredDataPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/StoredDataPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/VoidFailure.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/Mock/VoidSuccess.txt delete mode 100644 vendor_old/omnipay/netbanx/tests/bootstrap.php delete mode 100644 vendor_old/omnipay/payfast/.gitignore delete mode 100644 vendor_old/omnipay/payfast/.travis.yml delete mode 100644 vendor_old/omnipay/payfast/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/payfast/LICENSE delete mode 100644 vendor_old/omnipay/payfast/README.md delete mode 100644 vendor_old/omnipay/payfast/composer.json delete mode 100644 vendor_old/omnipay/payfast/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/payfast/src/Gateway.php delete mode 100644 vendor_old/omnipay/payfast/src/Message/CompletePurchaseItnResponse.php delete mode 100644 vendor_old/omnipay/payfast/src/Message/CompletePurchasePdtResponse.php delete mode 100644 vendor_old/omnipay/payfast/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/payfast/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/payfast/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/payfast/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/payfast/tests/Message/CompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/payfast/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/payfast/tests/Message/PurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/payfast/tests/Mock/CompletePurchaseItnFailure.txt delete mode 100644 vendor_old/omnipay/payfast/tests/Mock/CompletePurchaseItnSuccess.txt delete mode 100644 vendor_old/omnipay/payfast/tests/Mock/CompletePurchasePdtFailure.txt delete mode 100644 vendor_old/omnipay/payfast/tests/Mock/CompletePurchasePdtSuccess.txt delete mode 100644 vendor_old/omnipay/payflow/.gitignore delete mode 100644 vendor_old/omnipay/payflow/.travis.yml delete mode 100644 vendor_old/omnipay/payflow/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/payflow/LICENSE delete mode 100644 vendor_old/omnipay/payflow/README.md delete mode 100644 vendor_old/omnipay/payflow/composer.json delete mode 100644 vendor_old/omnipay/payflow/makedoc.sh delete mode 100644 vendor_old/omnipay/payflow/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/payflow/runtests.sh delete mode 100644 vendor_old/omnipay/payflow/src/Message/AuthorizeRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/CaptureRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/CreateCardRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/FetchTransactionRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/InquiryRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/RefundRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/Response.php delete mode 100644 vendor_old/omnipay/payflow/src/Message/VoidRequest.php delete mode 100644 vendor_old/omnipay/payflow/src/ProGateway.php delete mode 100644 vendor_old/omnipay/payflow/tests/Message/AuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/payflow/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/payflow/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/payflow/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/payflow/tests/ProGatewayTest.php delete mode 100644 vendor_old/omnipay/paymentexpress/.gitignore delete mode 100644 vendor_old/omnipay/paymentexpress/.travis.yml delete mode 100644 vendor_old/omnipay/paymentexpress/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/paymentexpress/LICENSE delete mode 100644 vendor_old/omnipay/paymentexpress/README.md delete mode 100644 vendor_old/omnipay/paymentexpress/composer.json delete mode 100644 vendor_old/omnipay/paymentexpress/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPayAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPayAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPayCompleteAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPayCreateCardRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPayPurchaseRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPostAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPostCaptureRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPostCreateCardRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPostPurchaseRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/PxPostRefundRequest.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/Message/Response.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/PxPayGateway.php delete mode 100644 vendor_old/omnipay/paymentexpress/src/PxPostGateway.php delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Message/PxPayAuthorizeResponseTest.php delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Message/PxPayCreateCardRequestTest.php delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayCompleteCreateCardFailure.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayCompleteCreateCardSuccess.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayCompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayCompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayCreateCardFailure.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayCreateCardSuccess.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPayPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPostCreateCardFailure.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPostCreateCardSuccess.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPostPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/Mock/PxPostPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paymentexpress/tests/PxPayGatewayTest.php delete mode 100644 vendor_old/omnipay/paymentexpress/tests/PxPostGatewayTest.php delete mode 100644 vendor_old/omnipay/paypal/.gitignore delete mode 100644 vendor_old/omnipay/paypal/.travis.yml delete mode 100644 vendor_old/omnipay/paypal/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/paypal/LICENSE delete mode 100644 vendor_old/omnipay/paypal/README.md delete mode 100644 vendor_old/omnipay/paypal/composer.json delete mode 100644 vendor_old/omnipay/paypal/makedoc.sh delete mode 100644 vendor_old/omnipay/paypal/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/paypal/src/ExpressGateway.php delete mode 100644 vendor_old/omnipay/paypal/src/ExpressInContextGateway.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/AbstractRestRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/CaptureRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressCompleteAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressCompleteOrderRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressCompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressFetchCheckoutRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressInContextAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressInContextAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressInContextOrderRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressOrderRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressTransactionSearchRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressTransactionSearchResponse.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ExpressVoidRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/FetchTransactionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ProAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/ProPurchaseRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RefundRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/Response.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestCancelSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestCaptureRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestCompleteSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestCreateCardRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestCreatePlanRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestCreateSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestDeleteCardRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestFetchPurchaseRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestFetchTransactionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestListPurchaseRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestPurchaseRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestReactivateSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestRefundCaptureRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestRefundRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestResponse.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestSearchTransactionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestSuspendSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestTokenRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestUpdatePlanRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/Message/RestVoidRequest.php delete mode 100644 vendor_old/omnipay/paypal/src/PayPalItem.php delete mode 100644 vendor_old/omnipay/paypal/src/PayPalItemBag.php delete mode 100644 vendor_old/omnipay/paypal/src/ProGateway.php delete mode 100644 vendor_old/omnipay/paypal/src/RestGateway.php delete mode 100644 vendor_old/omnipay/paypal/src/Support/InstantUpdateApi/ShippingOption.php delete mode 100644 vendor_old/omnipay/paypal/tests/ExpressGatewayTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/ExpressInContextGatewayTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/CaptureRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressAuthorizeResponseTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressCompleteAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressFetchCheckoutRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressInContextAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressInContextAuthorizeResponseTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressTransactionSearchRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressTransactionSearchResponseTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ExpressVoidRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/FetchTransactionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ProAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ProPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RefundRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestAuthorizeResponseTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestCancelSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestCompleteSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestCreateCardRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestCreatePlanRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestCreateSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestDeleteCardRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestFetchPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestFetchTransactionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestReactivateSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestResponseTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestSearchTransactionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestSuspendSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Message/RestUpdatePlanRequestTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressCompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressCompletePurchaseFailureRedirect.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressCompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressFetchCheckoutFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressFetchCheckoutSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressOrderFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressOrderSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressTransactionSearchResponse.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressVoidFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ExpressVoidSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ProPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/ProPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestAuthorizationSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestCaptureSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestCompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestCompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestCreateCardSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestExecuteSubscriptionSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestFetchPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestGenericSubscriptionSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestPurchaseWithoutCardSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestRefundSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestTokenFailure.txt delete mode 100644 vendor_old/omnipay/paypal/tests/Mock/RestTokenSuccess.txt delete mode 100644 vendor_old/omnipay/paypal/tests/ProGatewayTest.php delete mode 100644 vendor_old/omnipay/paypal/tests/RestGatewayTest.php delete mode 100644 vendor_old/omnipay/pin/.gitignore delete mode 100644 vendor_old/omnipay/pin/.travis.yml delete mode 100644 vendor_old/omnipay/pin/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/pin/LICENSE delete mode 100644 vendor_old/omnipay/pin/README.md delete mode 100644 vendor_old/omnipay/pin/composer.json delete mode 100644 vendor_old/omnipay/pin/makedoc.sh delete mode 100644 vendor_old/omnipay/pin/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/pin/runtests.sh delete mode 100644 vendor_old/omnipay/pin/src/Gateway.php delete mode 100644 vendor_old/omnipay/pin/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/pin/src/Message/AuthorizeRequest.php delete mode 100644 vendor_old/omnipay/pin/src/Message/CaptureRequest.php delete mode 100644 vendor_old/omnipay/pin/src/Message/CaptureResponse.php delete mode 100644 vendor_old/omnipay/pin/src/Message/CreateCardRequest.php delete mode 100644 vendor_old/omnipay/pin/src/Message/CreateCustomerRequest.php delete mode 100644 vendor_old/omnipay/pin/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/pin/src/Message/RefundRequest.php delete mode 100644 vendor_old/omnipay/pin/src/Message/Response.php delete mode 100644 vendor_old/omnipay/pin/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Message/CaptureRequestTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Message/CaptureResponseTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Message/CreateCardRequestTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Message/CreateCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Message/RefundRequestTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/pin/tests/Mock/CaptureFailure.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/CaptureSuccess.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/CardFailure.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/CardSuccess.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/CustomerFailure.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/CustomerSuccess.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/RefundFailure.txt delete mode 100644 vendor_old/omnipay/pin/tests/Mock/RefundSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/.gitignore delete mode 100644 vendor_old/omnipay/sagepay/.travis.yml delete mode 100644 vendor_old/omnipay/sagepay/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/sagepay/LICENSE delete mode 100644 vendor_old/omnipay/sagepay/README.md delete mode 100644 vendor_old/omnipay/sagepay/composer.json delete mode 100644 vendor_old/omnipay/sagepay/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/sagepay/src/DirectGateway.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/DirectAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/DirectCompleteAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/DirectPurchaseRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/DirectRepeatPaymentRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/DirectTokenRegistrationRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/Response.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerCompleteAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerCompleteAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerNotifyRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerNotifyResponse.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerPurchaseRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerTokenRegistrationCompleteRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerTokenRegistrationCompleteResponse.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerTokenRegistrationRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/ServerTokenRegistrationResponse.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/SharedAbortRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/SharedCaptureRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/SharedRefundRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/SharedRepeatAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/SharedRepeatPurchaseRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/SharedTokenRemovalRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/Message/SharedVoidRequest.php delete mode 100644 vendor_old/omnipay/sagepay/src/ServerGateway.php delete mode 100644 vendor_old/omnipay/sagepay/tests/DirectGatewayTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/DirectAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/DirectRepeatPaymentRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/DirectTokenRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerAuthorizeResponseTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerCompleteAuthorizeResponseTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerNotifyResponseTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerTokenRegistrationCompleteRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerTokenRegistrationCompleteResponseTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerTokenRegistrationRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/ServerTokenRegistrationResponseTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/SharedAbortRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/SharedRefundRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/SharedRepeatAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/SharedRepeatPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/SharedTokenRemovalRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Message/SharedVoidRequestTest.php delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/DirectPurchase3dSecure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/DirectPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/DirectPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/DirectPurchaseWithToken.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/ServerPurchaseFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/ServerPurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/ServerPurchaseWithToken.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/ServerTokenRegistrationFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/ServerTokenRegistrationSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedAbortFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedAbortSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedCaptureFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedCaptureSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedRefundFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedRefundSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedRepeatAuthorize.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedRepeatAuthorizeFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedVoidFailure.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/Mock/SharedVoidSuccess.txt delete mode 100644 vendor_old/omnipay/sagepay/tests/ServerGatewayTest.php delete mode 100644 vendor_old/omnipay/securepay/.gitignore delete mode 100644 vendor_old/omnipay/securepay/.travis.yml delete mode 100644 vendor_old/omnipay/securepay/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/securepay/LICENSE delete mode 100644 vendor_old/omnipay/securepay/README.md delete mode 100644 vendor_old/omnipay/securepay/composer.json delete mode 100644 vendor_old/omnipay/securepay/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/securepay/src/DirectPostGateway.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/DirectPostAbstractRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/DirectPostAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/DirectPostAuthorizeResponse.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/DirectPostCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/DirectPostCompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/DirectPostPurchaseRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/SecureXMLAbstractRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/SecureXMLAuthorizeRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/SecureXMLCaptureRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/SecureXMLEchoTestRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/SecureXMLPurchaseRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/SecureXMLRefundRequest.php delete mode 100644 vendor_old/omnipay/securepay/src/Message/SecureXMLResponse.php delete mode 100644 vendor_old/omnipay/securepay/src/SecureXMLGateway.php delete mode 100644 vendor_old/omnipay/securepay/tests/DirectPostGatewayTest.php delete mode 100644 vendor_old/omnipay/securepay/tests/Message/DirectPostAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/securepay/tests/Message/DirectPostCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/securepay/tests/Message/DirectPostPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/securepay/tests/Message/SecureXMLAuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/securepay/tests/Message/SecureXMLEchoTestRequestTest.php delete mode 100644 vendor_old/omnipay/securepay/tests/Message/SecureXMLPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLAuthorizeRequestFailure.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLAuthorizeRequestInsufficientFundsFailure.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLAuthorizeRequestInvalidMerchantFailure.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLAuthorizeRequestInvalidMerchantIDFailure.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLAuthorizeRequestSuccess.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLEchoTestRequestSuccess.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLPurchaseRequestInsufficientFundsFailure.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLPurchaseRequestSendFailure.txt delete mode 100644 vendor_old/omnipay/securepay/tests/Mock/SecureXMLPurchaseRequestSendSuccess.txt delete mode 100644 vendor_old/omnipay/securepay/tests/SecureXMLGatewayTest.php delete mode 100644 vendor_old/omnipay/stripe/.gitignore delete mode 100644 vendor_old/omnipay/stripe/.travis.yml delete mode 100644 vendor_old/omnipay/stripe/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/stripe/LICENSE delete mode 100644 vendor_old/omnipay/stripe/README.md delete mode 100644 vendor_old/omnipay/stripe/composer.json delete mode 100644 vendor_old/omnipay/stripe/makedoc.sh delete mode 100644 vendor_old/omnipay/stripe/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/stripe/runtests.sh delete mode 100644 vendor_old/omnipay/stripe/src/Gateway.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/AuthorizeRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/CancelSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/CaptureRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/CreateCardRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/CreateCustomerRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/CreateInvoiceItemRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/CreatePlanRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/CreateSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/DeleteCardRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/DeleteCustomerRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/DeleteInvoiceItemRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/DeletePlanRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchBalanceTransactionRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchChargeRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchCustomerRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchEventRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchInvoiceItemRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchInvoiceLinesRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchInvoiceRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchPlanRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchTokenRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/FetchTransactionRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/ListInvoicesRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/ListPlansRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/RefundRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/Response.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/UpdateCardRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/UpdateCustomerRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/UpdateSubscriptionRequest.php delete mode 100644 vendor_old/omnipay/stripe/src/Message/VoidRequest.php delete mode 100644 vendor_old/omnipay/stripe/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/AbstractRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/AuthorizeRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/CancelSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/CaptureRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/CreateCardRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/CreateCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/CreateInvoiceItemRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/CreatePlanRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/CreateSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/DeleteCardRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/DeleteCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/DeleteInvoiceItemRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/DeletePlanRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchBalanceTransactionTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchChargeRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchEventRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchInvoiceItemsRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchInvoiceLinesRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchInvoiceRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchPlanRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchTokenRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/FetchTransactionTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/ListInvoicesRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/ListPlansTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/RefundRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/ResponseTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/UpdateCardRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/UpdateCustomerRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/UpdateInvoiceItemRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/UpdateSubscriptionRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Message/VoidRequestTest.php delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CancelSubscriptionFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CancelSubscriptionSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CaptureFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CaptureSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateCardFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateCardSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateCustomerFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateCustomerSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateInvoiceItemFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateInvoiceItemSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreatePlanFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreatePlanSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateSubscriptionFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/CreateSubscriptionSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeleteCardFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeleteCardSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeleteCustomerFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeleteCustomerSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeleteInvoiceItemFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeleteInvoiceItemSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeletePlanFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/DeletePlanSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchBalanceTransactionFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchBalanceTransactionSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchChargeFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchChargeSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchCustomerFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchCustomerSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchEventFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchEventSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchInvoiceFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchInvoiceItemsFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchInvoiceItemsSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchInvoiceLinesFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchInvoiceLinesSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchInvoiceSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchPlanFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchPlanSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchSubscriptionFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchSubscriptionSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchTokenFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchTokenSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchTransactionFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/FetchTransactionSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/ListInvoicesFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/ListInvoicesSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/ListPlansSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/PurchaseFailureWithoutCode.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/PurchaseFailureWithoutMessage.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/PurchaseWithSourceSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/RefundFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/RefundSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/UpdateCardFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/UpdateCardSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/UpdateCustomerFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/UpdateCustomerSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/UpdateSubscriptionFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/UpdateSubscriptionSuccess.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/VoidFailure.txt delete mode 100644 vendor_old/omnipay/stripe/tests/Mock/VoidSuccess.txt delete mode 100644 vendor_old/omnipay/targetpay/.gitignore delete mode 100644 vendor_old/omnipay/targetpay/.travis.yml delete mode 100644 vendor_old/omnipay/targetpay/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/targetpay/LICENSE delete mode 100644 vendor_old/omnipay/targetpay/README.md delete mode 100644 vendor_old/omnipay/targetpay/composer.json delete mode 100644 vendor_old/omnipay/targetpay/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/targetpay/src/AbstractGateway.php delete mode 100644 vendor_old/omnipay/targetpay/src/DirectebankingGateway.php delete mode 100644 vendor_old/omnipay/targetpay/src/IdealGateway.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/AbstractRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/AbstractResponse.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/DirectebankingCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/DirectebankingPurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/FetchIssuersRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/FetchIssuersResponse.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/IdealCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/IdealPurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/MrcashCompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/MrcashPurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/targetpay/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/targetpay/src/MrcashGateway.php delete mode 100644 vendor_old/omnipay/targetpay/tests/DirectebankingGatewayTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/IdealGatewayTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/CompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/DirectebankingCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/DirectebankingPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/FetchIssuersRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/IdealCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/IdealPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/MrcashCompletePurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/MrcashPurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/targetpay/tests/Mock/CompletePurchaseFailure.txt delete mode 100644 vendor_old/omnipay/targetpay/tests/Mock/CompletePurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/targetpay/tests/Mock/FetchIssuersSuccess.txt delete mode 100644 vendor_old/omnipay/targetpay/tests/Mock/PurchaseFailure.txt delete mode 100644 vendor_old/omnipay/targetpay/tests/Mock/PurchaseSuccess.txt delete mode 100644 vendor_old/omnipay/targetpay/tests/MrcashGatewayTest.php delete mode 100644 vendor_old/omnipay/worldpay/.gitignore delete mode 100644 vendor_old/omnipay/worldpay/.travis.yml delete mode 100644 vendor_old/omnipay/worldpay/CONTRIBUTING.md delete mode 100644 vendor_old/omnipay/worldpay/LICENSE delete mode 100644 vendor_old/omnipay/worldpay/README.md delete mode 100644 vendor_old/omnipay/worldpay/composer.json delete mode 100644 vendor_old/omnipay/worldpay/phpunit.xml.dist delete mode 100644 vendor_old/omnipay/worldpay/src/Gateway.php delete mode 100644 vendor_old/omnipay/worldpay/src/Message/CompletePurchaseRequest.php delete mode 100644 vendor_old/omnipay/worldpay/src/Message/CompletePurchaseResponse.php delete mode 100644 vendor_old/omnipay/worldpay/src/Message/PurchaseRequest.php delete mode 100644 vendor_old/omnipay/worldpay/src/Message/PurchaseResponse.php delete mode 100644 vendor_old/omnipay/worldpay/tests/GatewayTest.php delete mode 100644 vendor_old/omnipay/worldpay/tests/Message/CompletePurchaseResponseTest.php delete mode 100644 vendor_old/omnipay/worldpay/tests/Message/PurchaseRequestTest.php delete mode 100644 vendor_old/omnipay/worldpay/tests/Message/PurchaseResponseTest.php delete mode 100644 vendor_old/paragonie/random_compat/LICENSE delete mode 100644 vendor_old/paragonie/random_compat/build-phar.sh delete mode 100644 vendor_old/paragonie/random_compat/composer.json delete mode 100644 vendor_old/paragonie/random_compat/dist/random_compat.phar.pubkey delete mode 100644 vendor_old/paragonie/random_compat/dist/random_compat.phar.pubkey.asc delete mode 100644 vendor_old/paragonie/random_compat/lib/byte_safe_strings.php delete mode 100644 vendor_old/paragonie/random_compat/lib/cast_to_int.php delete mode 100644 vendor_old/paragonie/random_compat/lib/error_polyfill.php delete mode 100644 vendor_old/paragonie/random_compat/lib/random.php delete mode 100644 vendor_old/paragonie/random_compat/lib/random_bytes_com_dotnet.php delete mode 100644 vendor_old/paragonie/random_compat/lib/random_bytes_dev_urandom.php delete mode 100644 vendor_old/paragonie/random_compat/lib/random_bytes_libsodium.php delete mode 100644 vendor_old/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php delete mode 100644 vendor_old/paragonie/random_compat/lib/random_bytes_mcrypt.php delete mode 100644 vendor_old/paragonie/random_compat/lib/random_int.php delete mode 100644 vendor_old/paragonie/random_compat/other/build_phar.php delete mode 100644 vendor_old/paragonie/random_compat/psalm-autoload.php delete mode 100644 vendor_old/paragonie/random_compat/psalm.xml delete mode 100644 vendor_old/phpmailer/phpmailer/LICENSE delete mode 100644 vendor_old/phpmailer/phpmailer/PHPMailerAutoload.php delete mode 100644 vendor_old/phpmailer/phpmailer/VERSION delete mode 100644 vendor_old/phpmailer/phpmailer/class.phpmailer.php delete mode 100644 vendor_old/phpmailer/phpmailer/class.phpmaileroauth.php delete mode 100644 vendor_old/phpmailer/phpmailer/class.phpmaileroauthgoogle.php delete mode 100644 vendor_old/phpmailer/phpmailer/class.pop3.php delete mode 100644 vendor_old/phpmailer/phpmailer/class.smtp.php delete mode 100644 vendor_old/phpmailer/phpmailer/composer.json delete mode 100644 vendor_old/phpmailer/phpmailer/composer.lock delete mode 100644 vendor_old/phpmailer/phpmailer/examples/DKIM.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/code_generator.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/contactform.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/contents.html delete mode 100644 vendor_old/phpmailer/phpmailer/examples/contentsutf8.html delete mode 100644 vendor_old/phpmailer/phpmailer/examples/exceptions.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/gmail.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/gmail_xoauth.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/images/phpmailer.png delete mode 100644 vendor_old/phpmailer/phpmailer/examples/images/phpmailer_mini.png delete mode 100644 vendor_old/phpmailer/phpmailer/examples/index.html delete mode 100644 vendor_old/phpmailer/phpmailer/examples/mail.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/mailing_list.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/pop_before_smtp.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/scripts/XRegExp.js delete mode 100644 vendor_old/phpmailer/phpmailer/examples/scripts/shAutoloader.js delete mode 100644 vendor_old/phpmailer/phpmailer/examples/scripts/shBrushPhp.js delete mode 100644 vendor_old/phpmailer/phpmailer/examples/scripts/shCore.js delete mode 100644 vendor_old/phpmailer/phpmailer/examples/scripts/shLegacy.js delete mode 100644 vendor_old/phpmailer/phpmailer/examples/send_file_upload.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/send_multiple_file_upload.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/sendmail.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/signed-mail.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/smtp.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/smtp_check.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/smtp_no_auth.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/ssl_options.phps delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCore.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreDefault.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreDjango.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreEclipse.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreEmacs.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreFadeToGrey.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreMDUltra.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreMidnight.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shCoreRDark.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeAppleScript.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeDefault.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeDjango.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeEclipse.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeEmacs.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeFadeToGrey.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeMDUltra.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeMidnight.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeRDark.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/shThemeVisualStudio.css delete mode 100644 vendor_old/phpmailer/phpmailer/examples/styles/wrapping.png delete mode 100644 vendor_old/phpmailer/phpmailer/extras/EasyPeasyICS.php delete mode 100644 vendor_old/phpmailer/phpmailer/extras/README.md delete mode 100644 vendor_old/phpmailer/phpmailer/extras/htmlfilter.php delete mode 100644 vendor_old/phpmailer/phpmailer/extras/ntlm_sasl_client.php delete mode 100644 vendor_old/phpmailer/phpmailer/get_oauth_token.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-am.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ar.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-az.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-be.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-bg.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ca.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ch.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-cs.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-da.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-de.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-el.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-eo.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-es.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-et.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-fa.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-fi.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-fo.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-fr.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-gl.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-he.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-hr.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-hu.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-id.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-it.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ja.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ka.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ko.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-lt.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-lv.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ms.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-nb.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-nl.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-pl.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-pt.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-pt_br.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ro.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-ru.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-sk.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-sl.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-sr.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-sv.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-tr.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-uk.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-vi.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-zh.php delete mode 100644 vendor_old/phpmailer/phpmailer/language/phpmailer.lang-zh_cn.php delete mode 100644 vendor_old/psr/log/.gitignore delete mode 100644 vendor_old/psr/log/LICENSE delete mode 100644 vendor_old/psr/log/Psr/Log/AbstractLogger.php delete mode 100644 vendor_old/psr/log/Psr/Log/InvalidArgumentException.php delete mode 100644 vendor_old/psr/log/Psr/Log/LogLevel.php delete mode 100644 vendor_old/psr/log/Psr/Log/LoggerAwareInterface.php delete mode 100644 vendor_old/psr/log/Psr/Log/LoggerAwareTrait.php delete mode 100644 vendor_old/psr/log/Psr/Log/LoggerInterface.php delete mode 100644 vendor_old/psr/log/Psr/Log/LoggerTrait.php delete mode 100644 vendor_old/psr/log/Psr/Log/NullLogger.php delete mode 100644 vendor_old/psr/log/Psr/Log/Test/LoggerInterfaceTest.php delete mode 100644 vendor_old/psr/log/README.md delete mode 100644 vendor_old/psr/log/composer.json delete mode 100644 vendor_old/setasign/fpdf/FAQ.htm delete mode 100644 vendor_old/setasign/fpdf/README.md delete mode 100644 vendor_old/setasign/fpdf/changelog.htm delete mode 100644 vendor_old/setasign/fpdf/composer.json delete mode 100644 vendor_old/setasign/fpdf/doc/__construct.htm delete mode 100644 vendor_old/setasign/fpdf/doc/acceptpagebreak.htm delete mode 100644 vendor_old/setasign/fpdf/doc/addfont.htm delete mode 100644 vendor_old/setasign/fpdf/doc/addlink.htm delete mode 100644 vendor_old/setasign/fpdf/doc/addpage.htm delete mode 100644 vendor_old/setasign/fpdf/doc/aliasnbpages.htm delete mode 100644 vendor_old/setasign/fpdf/doc/cell.htm delete mode 100644 vendor_old/setasign/fpdf/doc/close.htm delete mode 100644 vendor_old/setasign/fpdf/doc/error.htm delete mode 100644 vendor_old/setasign/fpdf/doc/footer.htm delete mode 100644 vendor_old/setasign/fpdf/doc/getpageheight.htm delete mode 100644 vendor_old/setasign/fpdf/doc/getpagewidth.htm delete mode 100644 vendor_old/setasign/fpdf/doc/getstringwidth.htm delete mode 100644 vendor_old/setasign/fpdf/doc/getx.htm delete mode 100644 vendor_old/setasign/fpdf/doc/gety.htm delete mode 100644 vendor_old/setasign/fpdf/doc/header.htm delete mode 100644 vendor_old/setasign/fpdf/doc/image.htm delete mode 100644 vendor_old/setasign/fpdf/doc/index.htm delete mode 100644 vendor_old/setasign/fpdf/doc/line.htm delete mode 100644 vendor_old/setasign/fpdf/doc/link.htm delete mode 100644 vendor_old/setasign/fpdf/doc/ln.htm delete mode 100644 vendor_old/setasign/fpdf/doc/multicell.htm delete mode 100644 vendor_old/setasign/fpdf/doc/output.htm delete mode 100644 vendor_old/setasign/fpdf/doc/pageno.htm delete mode 100644 vendor_old/setasign/fpdf/doc/rect.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setauthor.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setautopagebreak.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setcompression.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setcreator.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setdisplaymode.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setdrawcolor.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setfillcolor.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setfont.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setfontsize.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setkeywords.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setleftmargin.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setlinewidth.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setlink.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setmargins.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setrightmargin.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setsubject.htm delete mode 100644 vendor_old/setasign/fpdf/doc/settextcolor.htm delete mode 100644 vendor_old/setasign/fpdf/doc/settitle.htm delete mode 100644 vendor_old/setasign/fpdf/doc/settopmargin.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setx.htm delete mode 100644 vendor_old/setasign/fpdf/doc/setxy.htm delete mode 100644 vendor_old/setasign/fpdf/doc/sety.htm delete mode 100644 vendor_old/setasign/fpdf/doc/text.htm delete mode 100644 vendor_old/setasign/fpdf/doc/write.htm delete mode 100644 vendor_old/setasign/fpdf/font/courier.php delete mode 100644 vendor_old/setasign/fpdf/font/courierb.php delete mode 100644 vendor_old/setasign/fpdf/font/courierbi.php delete mode 100644 vendor_old/setasign/fpdf/font/courieri.php delete mode 100644 vendor_old/setasign/fpdf/font/helvetica.php delete mode 100644 vendor_old/setasign/fpdf/font/helveticab.php delete mode 100644 vendor_old/setasign/fpdf/font/helveticabi.php delete mode 100644 vendor_old/setasign/fpdf/font/helveticai.php delete mode 100644 vendor_old/setasign/fpdf/font/symbol.php delete mode 100644 vendor_old/setasign/fpdf/font/times.php delete mode 100644 vendor_old/setasign/fpdf/font/timesb.php delete mode 100644 vendor_old/setasign/fpdf/font/timesbi.php delete mode 100644 vendor_old/setasign/fpdf/font/timesi.php delete mode 100644 vendor_old/setasign/fpdf/font/zapfdingbats.php delete mode 100644 vendor_old/setasign/fpdf/fpdf.css delete mode 100644 vendor_old/setasign/fpdf/fpdf.php delete mode 100644 vendor_old/setasign/fpdf/install.txt delete mode 100644 vendor_old/setasign/fpdf/license.txt delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1250.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1251.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1252.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1253.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1254.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1255.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1257.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp1258.map delete mode 100644 vendor_old/setasign/fpdf/makefont/cp874.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-1.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-11.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-15.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-16.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-2.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-4.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-5.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-7.map delete mode 100644 vendor_old/setasign/fpdf/makefont/iso-8859-9.map delete mode 100644 vendor_old/setasign/fpdf/makefont/koi8-r.map delete mode 100644 vendor_old/setasign/fpdf/makefont/koi8-u.map delete mode 100644 vendor_old/setasign/fpdf/makefont/makefont.php delete mode 100644 vendor_old/setasign/fpdf/makefont/ttfparser.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/20k_c1.txt delete mode 100644 vendor_old/setasign/fpdf/tutorial/20k_c2.txt delete mode 100644 vendor_old/setasign/fpdf/tutorial/calligra.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/calligra.ttf delete mode 100644 vendor_old/setasign/fpdf/tutorial/calligra.z delete mode 100644 vendor_old/setasign/fpdf/tutorial/countries.txt delete mode 100644 vendor_old/setasign/fpdf/tutorial/index.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/logo.png delete mode 100644 vendor_old/setasign/fpdf/tutorial/makefont.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto1.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto1.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto2.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto2.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto3.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto3.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto4.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto4.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto5.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto5.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto6.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto6.php delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto7.htm delete mode 100644 vendor_old/setasign/fpdf/tutorial/tuto7.php delete mode 100644 vendor_old/setasign/fpdi-fpdf/LICENSE delete mode 100644 vendor_old/setasign/fpdi-fpdf/README.md delete mode 100644 vendor_old/setasign/fpdi-fpdf/composer.json delete mode 100644 vendor_old/setasign/fpdi-fpdf/fpdi_bridge.php delete mode 100644 vendor_old/setasign/fpdi/LICENSE delete mode 100644 vendor_old/setasign/fpdi/README.md delete mode 100644 vendor_old/setasign/fpdi/composer.json delete mode 100644 vendor_old/setasign/fpdi/filters/FilterASCII85.php delete mode 100644 vendor_old/setasign/fpdi/filters/FilterASCIIHexDecode.php delete mode 100644 vendor_old/setasign/fpdi/filters/FilterLZW.php delete mode 100644 vendor_old/setasign/fpdi/fpdf_tpl.php delete mode 100644 vendor_old/setasign/fpdi/fpdi.php delete mode 100644 vendor_old/setasign/fpdi/fpdi_bridge.php delete mode 100644 vendor_old/setasign/fpdi/fpdi_pdf_parser.php delete mode 100644 vendor_old/setasign/fpdi/pdf_context.php delete mode 100644 vendor_old/setasign/fpdi/pdf_parser.php delete mode 100644 vendor_old/symfony/event-dispatcher/.gitignore delete mode 100644 vendor_old/symfony/event-dispatcher/CHANGELOG.md delete mode 100644 vendor_old/symfony/event-dispatcher/ContainerAwareEventDispatcher.php delete mode 100644 vendor_old/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php delete mode 100644 vendor_old/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php delete mode 100644 vendor_old/symfony/event-dispatcher/Debug/WrappedListener.php delete mode 100644 vendor_old/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php delete mode 100644 vendor_old/symfony/event-dispatcher/Event.php delete mode 100644 vendor_old/symfony/event-dispatcher/EventDispatcher.php delete mode 100644 vendor_old/symfony/event-dispatcher/EventDispatcherInterface.php delete mode 100644 vendor_old/symfony/event-dispatcher/EventSubscriberInterface.php delete mode 100644 vendor_old/symfony/event-dispatcher/GenericEvent.php delete mode 100644 vendor_old/symfony/event-dispatcher/ImmutableEventDispatcher.php delete mode 100644 vendor_old/symfony/event-dispatcher/LICENSE delete mode 100644 vendor_old/symfony/event-dispatcher/README.md delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/EventDispatcherTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/EventTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/GenericEventTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/Tests/ImmutableEventDispatcherTest.php delete mode 100644 vendor_old/symfony/event-dispatcher/composer.json delete mode 100644 vendor_old/symfony/event-dispatcher/phpunit.xml.dist delete mode 100644 vendor_old/symfony/http-foundation/.gitignore delete mode 100644 vendor_old/symfony/http-foundation/AcceptHeader.php delete mode 100644 vendor_old/symfony/http-foundation/AcceptHeaderItem.php delete mode 100644 vendor_old/symfony/http-foundation/ApacheRequest.php delete mode 100644 vendor_old/symfony/http-foundation/BinaryFileResponse.php delete mode 100644 vendor_old/symfony/http-foundation/CHANGELOG.md delete mode 100644 vendor_old/symfony/http-foundation/Cookie.php delete mode 100644 vendor_old/symfony/http-foundation/Exception/ConflictingHeadersException.php delete mode 100644 vendor_old/symfony/http-foundation/ExpressionRequestMatcher.php delete mode 100644 vendor_old/symfony/http-foundation/File/Exception/AccessDeniedException.php delete mode 100644 vendor_old/symfony/http-foundation/File/Exception/FileException.php delete mode 100644 vendor_old/symfony/http-foundation/File/Exception/FileNotFoundException.php delete mode 100644 vendor_old/symfony/http-foundation/File/Exception/UnexpectedTypeException.php delete mode 100644 vendor_old/symfony/http-foundation/File/Exception/UploadException.php delete mode 100644 vendor_old/symfony/http-foundation/File/File.php delete mode 100644 vendor_old/symfony/http-foundation/File/MimeType/ExtensionGuesser.php delete mode 100644 vendor_old/symfony/http-foundation/File/MimeType/ExtensionGuesserInterface.php delete mode 100644 vendor_old/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php delete mode 100644 vendor_old/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php delete mode 100644 vendor_old/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php delete mode 100644 vendor_old/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php delete mode 100644 vendor_old/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php delete mode 100644 vendor_old/symfony/http-foundation/File/UploadedFile.php delete mode 100644 vendor_old/symfony/http-foundation/FileBag.php delete mode 100644 vendor_old/symfony/http-foundation/HeaderBag.php delete mode 100644 vendor_old/symfony/http-foundation/IpUtils.php delete mode 100644 vendor_old/symfony/http-foundation/JsonResponse.php delete mode 100644 vendor_old/symfony/http-foundation/LICENSE delete mode 100644 vendor_old/symfony/http-foundation/ParameterBag.php delete mode 100644 vendor_old/symfony/http-foundation/README.md delete mode 100644 vendor_old/symfony/http-foundation/RedirectResponse.php delete mode 100644 vendor_old/symfony/http-foundation/Request.php delete mode 100644 vendor_old/symfony/http-foundation/RequestMatcher.php delete mode 100644 vendor_old/symfony/http-foundation/RequestMatcherInterface.php delete mode 100644 vendor_old/symfony/http-foundation/RequestStack.php delete mode 100644 vendor_old/symfony/http-foundation/Response.php delete mode 100644 vendor_old/symfony/http-foundation/ResponseHeaderBag.php delete mode 100644 vendor_old/symfony/http-foundation/ServerBag.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Attribute/AttributeBag.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Flash/FlashBag.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Flash/FlashBagInterface.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Session.php delete mode 100644 vendor_old/symfony/http-foundation/Session/SessionBagInterface.php delete mode 100644 vendor_old/symfony/http-foundation/Session/SessionInterface.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/LegacyPdoSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/MetadataBag.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/NativeSessionStorage.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php delete mode 100644 vendor_old/symfony/http-foundation/Session/Storage/SessionStorageInterface.php delete mode 100644 vendor_old/symfony/http-foundation/StreamedResponse.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/AcceptHeaderItemTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/AcceptHeaderTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/ApacheRequestTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/BinaryFileResponseTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/CookieTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/FakeFile.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/FileTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/Fixtures/.unknownextension delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/Fixtures/directory/.empty delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/Fixtures/other-file.example delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/Fixtures/test delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/Fixtures/test.gif delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/File/UploadedFileTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/FileBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/HeaderBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/IpUtilsTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/JsonResponseTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/ParameterBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/RedirectResponseTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/RequestMatcherTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/RequestStackTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/RequestTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/ResponseHeaderBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/ResponseTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/ResponseTestCase.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/ServerBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/SessionTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/LegacyPdoSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/StreamedResponseTest.php delete mode 100644 vendor_old/symfony/http-foundation/Tests/schema/http-status-codes.rng delete mode 100644 vendor_old/symfony/http-foundation/Tests/schema/iana-registry.rng delete mode 100644 vendor_old/symfony/http-foundation/composer.json delete mode 100644 vendor_old/symfony/http-foundation/phpunit.xml.dist delete mode 100644 vendor_old/symfony/polyfill-mbstring/LICENSE delete mode 100644 vendor_old/symfony/polyfill-mbstring/Mbstring.php delete mode 100644 vendor_old/symfony/polyfill-mbstring/README.md delete mode 100644 vendor_old/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php delete mode 100644 vendor_old/symfony/polyfill-mbstring/Resources/unidata/upperCase.php delete mode 100644 vendor_old/symfony/polyfill-mbstring/bootstrap.php delete mode 100644 vendor_old/symfony/polyfill-mbstring/composer.json delete mode 100644 vendor_old/symfony/polyfill-php54/LICENSE delete mode 100644 vendor_old/symfony/polyfill-php54/Php54.php delete mode 100644 vendor_old/symfony/polyfill-php54/README.md delete mode 100644 vendor_old/symfony/polyfill-php54/Resources/stubs/CallbackFilterIterator.php delete mode 100644 vendor_old/symfony/polyfill-php54/Resources/stubs/RecursiveCallbackFilterIterator.php delete mode 100644 vendor_old/symfony/polyfill-php54/Resources/stubs/SessionHandlerInterface.php delete mode 100644 vendor_old/symfony/polyfill-php54/bootstrap.php delete mode 100644 vendor_old/symfony/polyfill-php54/composer.json delete mode 100644 vendor_old/symfony/polyfill-php55/LICENSE delete mode 100644 vendor_old/symfony/polyfill-php55/Php55.php delete mode 100644 vendor_old/symfony/polyfill-php55/Php55ArrayColumn.php delete mode 100644 vendor_old/symfony/polyfill-php55/README.md delete mode 100644 vendor_old/symfony/polyfill-php55/bootstrap.php delete mode 100644 vendor_old/symfony/polyfill-php55/composer.json delete mode 100644 vendor_old/vlucas/phpdotenv/LICENSE.txt delete mode 100644 vendor_old/vlucas/phpdotenv/composer.json delete mode 100644 vendor_old/vlucas/phpdotenv/src/Dotenv.php delete mode 100644 vendor_old/vlucas/phpdotenv/src/Exception/ExceptionInterface.php delete mode 100644 vendor_old/vlucas/phpdotenv/src/Exception/InvalidCallbackException.php delete mode 100644 vendor_old/vlucas/phpdotenv/src/Exception/InvalidFileException.php delete mode 100644 vendor_old/vlucas/phpdotenv/src/Exception/InvalidPathException.php delete mode 100644 vendor_old/vlucas/phpdotenv/src/Exception/ValidationException.php delete mode 100644 vendor_old/vlucas/phpdotenv/src/Loader.php delete mode 100644 vendor_old/vlucas/phpdotenv/src/Validator.php diff --git a/vendor_old/mpdf/mpdf/data/no_image.jpg b/application/.DS_Store similarity index 50% rename from vendor_old/mpdf/mpdf/data/no_image.jpg rename to application/.DS_Store index a690485ec13f25d2509e3f34d0188ff5a7af789f..1988a45ceb5e5515374f3a0a29b6de3d6c5e3f8c 100644 GIT binary patch literal 6148 zcmeHKyH3ME5S)b|EYYN-ykFoCPEq&*et?G~gk*3LCA9ANZD#j2D3L=;fo7$>aprdJ zOQDE(m#)5 zoNfp| zeJD)Fnm9F#PY0J60f-CI5qyqWf>@j&*2JkH8HP0}u}LjQ3~O@oCF^S9)Ue56Ieb{& zY&oG=+|Kh$l*4L6t#UvPoI2pMH)HAj|DO5F{O>giIUooAsROoHKde`Lx$Ld8*YsXn un2*duur|uML@OpnE9MVx#kWUw#h4txV-+8~es literal 7888 zcmeI1Yfuwc6vyvoH`xTS5>%`XQ)1Lctzk(bDlvo+Fa>5PRq@%@&SrOkD0z@9CeUg| ztq)pC3$3N1)v>-GW3@%J)hR_$Y{w3xRuF70h_sbr0iRKW+q)1S?WfYtIMZ=YCfRfE zo;~OOfA@YkljY8HO&}!2lxzYBf`BCW0bFxP(NvEm1Ax?2FcttH1sF0Jh@dBfgOpVk zfI%ODe){@P_$vqnAcSoT2RNJyhGQfAg77x@Bjr881Ofs9fq+0jARrKU8VMwmHbp#1 zEri;UM}2}6_83B+@HCzWL9;+WARrJB2nYoJN+21Kzy=f`9$qQHHw;{J5ShiY4n0BG zT#+PgH#3ox-AZ^!2ce0KB7h;z7ro|Sk>Ns4fQdsC%)$Hihs8mM+lVwTD zcQP~bUrML)7g8~_D$dwH$l%d?tPU%~k_wMC+vd`HVwFAF_0Z?138m5Cq%-u>6HS2# zIEqyU*5Y=%Bi*`4yEBu}#Kgo9QCdQ)Rl^9iE6>J~9<|LiB9I`FaZyf-gSFUg3O*re zw&$|3%G_KFt~nSpq`YERH(ssqt*^Pu-|tKpN1CtyO6K0y|63Ap-1pijZV=@M}Di9nx%h12yv z!}X|LWNffUbi-zly8sgS7hsQ@NW_m&5i}IVFccbwNyHc?hQ1gVizU2aVjRaMIPdaF z0tw(#s02eXe!6eQeFNlD5CWb-5hW1G5mb(F)gS`?Z6@x`{h(V$L?|Yf;8IyoKNxTz z1c(q66=A3tt`J5qhW7y`7l#hlOpy$nM&inxLE5Foo1`P+_g4*`e!6p{&g@(!3knz??Gj@FRgo%@4^a+VmO)n-Tr_4y7IcxTux$`KR$;iyIEO4>8i`<^P{N-=0 zSh;F-!P_Mte7NSL(vR1ceY$ze)@|E&?A-PF7v%>k4j%gQtE0!NkDsVH`R#XS&i-(& zuKs*OWAmk!%dNls`rDPZu4~tC+`M($cjqpz3jt^V8N$Cug!VUGa;QrL>0>yr3lX{b z068Weu91XJnTC@&1C`pP(n0aXoAy`9M(Cz@4mLYa2ZfCs-#n^|m)4`~p9x#`uarF$ z_DEMF2u2aOd8i!3f%|1lo!88PhIO~*be9^(`n}z2{e-(|z!3inotONHzN_2b6rDYi zu-)f+d0o=7q{!&5VEdA=yRH7!e<&*srInv7n0%C3U3r}Y9Ke%3%hP;$9Kf2o-~W1o zU*t=^RD1sL@t;F0v+l9yZoEbutC%nADx8;I_T0{qv�J$+Rx@@6P*vPf2NE``nT- z#Vu*|8~ZJ}_)l3cL4JQugq+2=V=)S(TK}+fw^p*zEkl73FMF``-B+ zNL;v?T5K3yFR#AsI91nrIV(83z2?pp4lLi`wRHGY_0@Kt3U4pHXS`n>S6)-afx=<- zs*c9^(|i1~rq7CMPR!d|ys7_ynMKOl9CvI(c|mIt_T$xXDY;^iq5v;mxqZX9Yt9`l zH(z;U_k5d`@Gh#m*!a_e3#Hn04wz19j6>6otsgZ`J?wYG%!q^QOYR=tntx>1#*SCl Vq>{C&RFlON^{y&qOP7~x_!D__T&4g3 diff --git a/application/language/english/ip_lang.php b/application/language/english/ip_lang.php index 6b12456..e5d5cb0 100644 --- a/application/language/english/ip_lang.php +++ b/application/language/english/ip_lang.php @@ -11,7 +11,7 @@ $lang = array( 'add_note' => 'Add Note', 'add_notes' => 'Add Notes', 'add_product' => 'Add product', - 'add_quote_tax' => 'Add Quote Tax', + 'add_quote_tax' => 'Add Sales Order Tax', 'add_unit' => 'Add Unit', 'address' => 'Address', 'administrator' => 'Administrator', @@ -25,7 +25,7 @@ $lang = array( 'apply_after_item_tax' => 'Apply After Item Tax', 'apply_before_item_tax' => 'Apply Before Item Tax', 'approve' => 'Approve', - 'approve_this_quote' => 'Approve This Quote', + 'approve_this_quote' => 'Approve This Sales order', 'approved' => 'Approved', 'assign_client' => 'Assign Customer', 'assigned_clients' => 'Assigned Customers', @@ -80,13 +80,13 @@ $lang = array( 'contact_information' => 'Contact Information', 'continue' => 'Continue', 'copy_invoice' => 'Copy Invoice', - 'copy_quote' => 'Copy Quote', + 'copy_quote' => 'Copy Sales Order', 'country' => 'Country', 'create_credit_invoice' => 'Create credit note', 'create_credit_invoice_alert' => 'Creating a credit note will make the current invoice read-only which means you will not be able to edit the invoice anymore. The credit invoice will contain the current state with all items but with negative amounts and balances.', 'create_invoice' => 'Create Invoice', 'create_product' => 'Create product', - 'create_quote' => 'Create Quote', + 'create_quote' => 'Create Sales Order', 'create_recurring' => 'Create Recurring', 'created' => 'Created', 'credit_invoice' => 'Credit Note', @@ -128,16 +128,16 @@ $lang = array( 'default_payment_method' => 'Default Payment Method', 'default_pdf_template' => 'Default PDF Template', 'default_public_template' => 'Default Public Template', - 'default_quote_group' => 'Default Quote Group', + 'default_quote_group' => 'Default Sales Order Group', 'default_terms' => 'Default Terms', 'delete' => 'Delete', 'delete_attachment_warning' => 'Are you sure you wish to delete this attachment?', 'delete_client' => 'Delete Customer', - 'delete_client_warning' => 'If you delete this customer you will also delete any invoices, quotes and payments related to this customer. Are you sure you want to permanently delete this client?', + 'delete_client_warning' => 'If you delete this customer you will also delete any invoices, Sales Order and payments related to this customer. Are you sure you want to permanently delete this client?', 'delete_invoice' => 'Delete Invoice', 'delete_invoice_warning' => 'If you delete this invoice you will not be able to recover it later. Are you sure you want to permanently delete this invoice?', - 'delete_quote' => 'Delete Quote', - 'delete_quote_warning' => 'If you delete this quote you will not be able to recover it later. Are you sure you want to permanently delete this quote?', + 'delete_quote' => 'Delete Sales Order', + 'delete_quote_warning' => 'If you delete this Sales Order you will not be able to recover it later. Are you sure you want to permanently delete this quote?', 'delete_record_warning' => 'Are you sure you wish to delete this record?', 'description' => 'Description', 'details' => 'Details', @@ -157,8 +157,8 @@ $lang = array( 'email_invoice' => 'Email Invoice', 'email_not_configured' => 'Before you can send Email, you have to configure your Email settings in the System Settings area.', 'email_to_address_missing' => 'You have to specify an email address the email should be sent to.', - 'email_pdf_attachment' => 'Attach Quote/Invoice on email?', - 'email_quote' => 'Email Quote', + 'email_pdf_attachment' => 'Attach Sales Order/Invoice on email?', + 'email_quote' => 'Email Sales Order', 'email_send_method' => 'Email Sending Method', 'email_send_method_phpmail' => 'PHP Mail', 'email_send_method_sendmail' => 'Sendmail', @@ -176,7 +176,7 @@ $lang = array( 'enabled' => 'Enabled', 'enable_debug_mode' => 'Enable the Debug Mode', 'end_date' => 'End Date', - 'enter_payment' => 'Enter Payment', + 'enter_payment' => 'Enter Receipts', 'errors' => 'Errors', 'error_duplicate_file' => 'Error: Duplicate file name, please change it!', 'every' => 'Every', @@ -195,8 +195,8 @@ $lang = array( 'field' => 'Field', 'filter_clients' => 'Filter Customers', 'filter_invoices' => 'Filter Invoices', - 'filter_payments' => 'Filter Payments', - 'filter_quotes' => 'Filter Quotes', + 'filter_payments' => 'Filter Receipts', + 'filter_quotes' => 'Filter Sales Orders', 'first' => 'First', 'first_day_of_week' => 'Fist day of week', 'footer' => 'Footer', @@ -208,7 +208,7 @@ $lang = array( 'general_settings' => 'General Settings', 'generate' => 'Generate', 'generate_invoice_number_for_draft' => 'Generate the invoice number for draft invoices', - 'generate_quote_number_for_draft' => 'Generate the quote number for draft quotes', + 'generate_quote_number_for_draft' => 'Generate the sales order number for draft Sales Orders', 'generate_sumex' => 'Generate Sumex PDF', 'guest_account_denied' => 'This account is not configured. Please contact the system administrator.', 'guest_read_only' => 'Guest (Read Only)', @@ -283,7 +283,7 @@ $lang = array( 'loginalert_wrong_auth_code' => 'Password reset denied. You provided an invalid auth token.', 'logout' => 'Logout', 'mark_invoices_sent_pdf' => 'Mark invoices as sent when PDF is generated', - 'mark_quotes_sent_pdf' => 'Mark quotes as sent when PDF is generated', + 'mark_quotes_sent_pdf' => 'Mark Sales Orders as sent when PDF is generated', 'max_quantity' => 'Maximum Quantity', 'menu' => 'Menu', 'min_quantity' => 'Minimal Quantity', @@ -303,7 +303,7 @@ $lang = array( 'next_id' => 'Next ID', 'no' => 'No', 'no_overdue_invoices' => 'No overdue Invoices', - 'no_quotes_requiring_approval' => 'There are no quotes requiring approval.', + 'no_quotes_requiring_approval' => 'There are no sales order requiring approval.', 'no_updates_available' => 'No updates available.', 'none' => 'None', 'note' => 'Note', @@ -311,7 +311,7 @@ $lang = array( 'not_set' => 'Not set yet', 'open' => 'Open', 'open_invoices' => 'Open Invoices', - 'open_quotes' => 'Open Quotes', + 'open_quotes' => 'Open Sales Orders', 'open_reports_in_new_tab' => 'Open Reports in a new Browser Tab', 'optional' => 'Optional', 'options' => 'Options', @@ -328,16 +328,16 @@ $lang = array( 'password_reset_info' => 'You will get an Email with a link to reset your password.', 'password_reset_failed' => 'An error occurred while trying to send your password reset email. Please review the application logs or contact the system administrator.', 'pay_now' => 'Pay Now', - 'payment' => 'Payment', - 'payment_cannot_exceed_balance' => 'Payment amount cannot exceed invoice balance.', - 'payment_date' => 'Payment Date', - 'payment_form' => 'Payment Form', - 'payment_history' => 'Payment History', - 'payment_method' => 'Payment Method', + 'payment' => 'Receipt', + 'payment_cannot_exceed_balance' => 'Receipt amount cannot exceed invoice balance.', + 'payment_date' => 'Receipt Date', + 'payment_form' => 'Receipt Form', + 'payment_history' => 'Receipt History', + 'payment_method' => 'Receipt Method', 'payment_method_already_exists' => 'Payment Method already exists!', 'payment_method_form' => 'Payment Method Form', 'payment_methods' => 'Payment Methods', - 'payments' => 'Payments', + 'payments' => 'Receipts', 'per_item' => 'per Item', 'pdf' => 'PDF', 'pdf_invoice_footer' => 'PDF Footer', @@ -384,36 +384,36 @@ $lang = array( 'quantity' => 'Quantity', 'quarter' => 'Quarter', 'quick_actions' => 'Quick Actions', - 'quote' => 'Quote', - 'quote_approved' => 'This quote has been approved', - 'quote_date' => 'Quote Date', - 'quote_group' => 'Quote Group', - 'quote_overview' => 'Quote Overview', - 'quote_overview_period' => 'Quote Overview Period', - 'quote_password' => 'Quote PDF password (optional)', - 'quote_pre_password' => 'Quote standard PDF password (optional)', - 'quote_rejected' => 'This quote has been rejected', - 'quote_status_email_body' => 'The customer %1$s has %2$s the quote %3$s.' . "\n\n" . 'Link to Quote: %4$s', - 'quote_status_email_subject' => 'Customer %1$s %2$s quote %3$s', - 'quote_tax' => 'Quote Tax', - 'quote_template' => 'Quote Template', - 'quote_templates' => 'Quote Templates', - 'quote_to_invoice' => 'Quote to Invoice', - 'quotes' => 'Quotes', - 'quotes_expire_after' => 'Quotes Expire After (Days)', - 'quotes_requiring_approval' => 'Quotes Requiring Approval', + 'quote' => 'Sales Order', + 'quote_approved' => 'This Sales Order has been approved', + 'quote_date' => 'Sales Order Date', + 'quote_group' => 'Sales Order Group', + 'quote_overview' => 'sales Order Orderte Overview', + 'quote_overview_period' => 'Sales Order Overview Period', + 'quote_password' => 'Sales Order PDF password (optional)', + 'quote_pre_password' => 'Sales Order standard PDF password (optional)', + 'quote_rejected' => 'This Sales Order has been rejected', + 'quote_status_email_body' => 'The customer %1$s has %2$s the Sales Order %3$s.' . "\n\n" . 'Link to Sales Order: %4$s', + 'quote_status_email_subject' => 'Customer %1$s %2$s Sales Order %3$s', + 'quote_tax' => 'Sales Order Tax', + 'quote_template' => 'Sales Order Template', + 'quote_templates' => 'Sales Order Templates', + 'quote_to_invoice' => 'Sales Order to Invoice', + 'quotes' => 'Sales Orders', + 'quotes_expire_after' => 'Sales Orders Expire After (Days)', + 'quotes_requiring_approval' => 'Sales Orders Requiring Approval', 'read_only' => 'Read only', 'recent_clients' => 'Recent Customers', 'recent_invoices' => 'Recent Invoices', 'recent_payments' => 'Recent Payments', - 'recent_quotes' => 'Recent Quotes', + 'recent_quotes' => 'Recent Sales Orders', 'record_successfully_created' => 'Record successfully created', 'record_successfully_deleted' => 'Record successfully deleted', 'record_successfully_updated' => 'Record successfully updated', 'recurring' => 'Recurring', 'recurring_invoices' => 'Recurring Invoices', 'reject' => 'Reject', - 'reject_this_quote' => 'Reject This Quote', + 'reject_this_quote' => 'Reject This Sales Order', 'rejected' => 'Rejected', 'remove' => 'Remove', 'remove_logo' => 'Remove Logo', @@ -500,8 +500,8 @@ $lang = array( 'system_settings' => 'System Settings', 'table' => 'Table', 'tax' => 'Tax', - 'tax_code' => 'Taxes Code', - 'tax_code_short' => 'Tax Code', + 'tax_code' => 'GST', + 'tax_code_short' => 'GST', 'tax_information' => 'Taxes Information', 'tax_rate' => 'Tax Rate', 'tax_rate_decimal_places' => 'Tax Rate Decimal Places', @@ -556,9 +556,9 @@ $lang = array( 'view_client' => 'View Customer', 'view_clients' => 'View Customers', 'view_invoices' => 'View Invoices', - 'view_payments' => 'View Payments', + 'view_payments' => 'View Receipts', 'view_products' => 'View products', - 'view_quotes' => 'View Quotes', + 'view_quotes' => 'View Sales Orders', 'view_recurring_invoices' => 'View Recurring Invoices', 'viewed' => 'Viewed', 'warning' => 'Warning', diff --git a/application/logs/.gitignore b/application/logs/.gitignore deleted file mode 100644 index 6b6c592..0000000 --- a/application/logs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!index.html -!.gitignore diff --git a/application/logs/index.html b/application/logs/index.html deleted file mode 100644 index 43a0179..0000000 --- a/application/logs/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - \ No newline at end of file diff --git a/application/modules/.DS_Store b/application/modules/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4e2ce6655090957d5314faa2daf44fdfe819a535 GIT binary patch literal 6148 zcmeHKJ8l9&47C%aAf=(CoGWmH(P}wCE`S1bNQ*+!Z?5Ae3Km*J8> z>~0g7r2load->model('mdl_clients'); + $this->load->model('custom_fields/mdl_custom_fields'); + $this->load->model('custom_fields/mdl_client_custom'); } public function index() diff --git a/application/modules/clients/models/Mdl_clients.php b/application/modules/clients/models/Mdl_clients.php index 0c83ba3..d438a13 100644 --- a/application/modules/clients/models/Mdl_clients.php +++ b/application/modules/clients/models/Mdl_clients.php @@ -26,6 +26,7 @@ class Mdl_Clients extends Response_Model 'SQL_CALC_FOUND_ROWS ' . $this->table . '.*, ' . 'CONCAT(' . $this->table . '.client_name, " ", ' . $this->table . '.client_surname) as client_fullname' , false); + } public function default_order_by() diff --git a/application/modules/clients/views/partial_client_table.php b/application/modules/clients/views/partial_client_table.php index 4b0128a..0dbef84 100644 --- a/application/modules/clients/views/partial_client_table.php +++ b/application/modules/clients/views/partial_client_table.php @@ -1,12 +1,16 @@ + + +
+ - + @@ -14,10 +18,11 @@ - + + - + + + + + + +
client_active) ? trans('yes') : trans('no'); ?>client_id, htmlsc(format_client($client))); ?> client_id, htmlsc(format_client($client))); ?>client_tax_code); ?> client_email); ?> client_phone ? $client->client_phone : ($client->client_mobile ? $client->client_mobile : '')); ?>client_invoice_balance); ?>
diff --git a/application/modules/custom_fields/models/Mdl_invoice_custom.php b/application/modules/custom_fields/models/Mdl_invoice_custom.php index 99f8be6..3d4743a 100644 --- a/application/modules/custom_fields/models/Mdl_invoice_custom.php +++ b/application/modules/custom_fields/models/Mdl_invoice_custom.php @@ -24,22 +24,42 @@ class Mdl_Invoice_Custom extends Validator public function default_select() { - $this->db->select('SQL_CALC_FOUND_ROWS ip_invoice_custom.*, ip_custom_fields.*', false); + $this->db->select('SQL_CALC_FOUND_ROWS ip_invoice_custom.*, ip_custom_fields.*,ip_quote_custom.*', false); } public function default_join() { $this->db->join('ip_custom_fields', 'ip_invoice_custom.invoice_custom_fieldid = ip_custom_fields.custom_field_id'); + + $this->db->join('ip_quotetoinvoice', 'ip_invoice_custom.invoice_id = ip_quotetoinvoice.invoice_id','left'); + + $this->db->join('ip_quote_custom', 'ip_quotetoinvoice.quote_id = ip_quote_custom.quote_id','left'); } public function default_order_by() { $this->db->order_by('custom_field_table ASC, custom_field_order ASC, custom_field_label ASC'); + //print_r( $this->db->last_query()); } + + + public function save_custom($invoice_id, $db_array) - { + { + + //print_r($db_array); + //echo $invoice_id; + //die(); + + $result = $this->validate($db_array); + //print_r($result); + //die(); +//$result="success"; + + + if ($result === true) { $form_data = isset($this->_formdata) ? $this->_formdata : null; @@ -56,7 +76,7 @@ class Mdl_Invoice_Custom extends Validator 'invoice_custom_fieldvalue' => $value ); - $invoice_custom = $this->where('invoice_id', $invoice_id)->where('invoice_custom_fieldid', $key)->get(); + $invoice_custom = $this->where('ip_invoice_custom.invoice_id', $invoice_id)->where('invoice_custom_fieldid', $key)->get(); if ($invoice_custom->num_rows()) { $invoice_custom_id = $invoice_custom->row()->invoice_custom_id; @@ -68,12 +88,17 @@ class Mdl_Invoice_Custom extends Validator return true; } + // echo $result; + return $result; } public function by_id($invoice_id) { + $this->db->where('ip_invoice_custom.invoice_id', $invoice_id); + + //print_r($this->db->last_query()); return $this; } diff --git a/application/modules/dashboard/controllers/Dashboard.php b/application/modules/dashboard/controllers/Dashboard.php index 33ea3e8..6d0eb8d 100644 --- a/application/modules/dashboard/controllers/Dashboard.php +++ b/application/modules/dashboard/controllers/Dashboard.php @@ -17,35 +17,25 @@ class Dashboard extends Admin_Controller { public function index() { - $this->load->model('invoices/mdl_invoice_amounts'); - $this->load->model('quotes/mdl_quote_amounts'); - $this->load->model('invoices/mdl_invoices'); - $this->load->model('quotes/mdl_quotes'); - $this->load->model('projects/mdl_projects'); - $this->load->model('tasks/mdl_tasks'); - - $quote_overview_period = get_setting('quote_overview_period'); - $invoice_overview_period = get_setting('invoice_overview_period'); + + $this->load->model('invoices/mdl_items'); // added code for item vaues + $this->load->model('reports/mdl_reports'); $this->layout->set( array( - 'invoice_status_totals' => $this->mdl_invoice_amounts->get_status_totals($invoice_overview_period), - 'quote_status_totals' => $this->mdl_quote_amounts->get_status_totals($quote_overview_period), - 'invoice_status_period' => str_replace('-', '_', $invoice_overview_period), - 'quote_status_period' => str_replace('-', '_', $quote_overview_period), - 'invoices' => $this->mdl_invoices->limit(10)->get()->result(), - 'quotes' => $this->mdl_quotes->limit(10)->get()->result(), - 'invoice_statuses' => $this->mdl_invoices->statuses(), - 'quote_statuses' => $this->mdl_quotes->statuses(), - 'overdue_invoices' => $this->mdl_invoices->is_overdue()->get()->result(), - 'projects' => $this->mdl_projects->get_latest()->get()->result(), - 'tasks' => $this->mdl_tasks->get_latest()->get()->result(), - 'task_statuses' => $this->mdl_tasks->statuses(), + 'results' => $this->mdl_reports->sales_dashboard(), + 'items' => $this->mdl_items->get()->result(), // added for geting value of item + 'resu' => $this->mdl_items->today(), + 'result' => $this->mdl_items->month(), + 'res' => $this->mdl_items->year(), + ) ); $this->layout->buffer('content', 'dashboard/index'); $this->layout->render(); } + + } diff --git a/application/modules/dashboard/views/index.php b/application/modules/dashboard/views/index.php index 1cd54fd..20fe5c0 100644 --- a/application/modules/dashboard/views/index.php +++ b/application/modules/dashboard/views/index.php @@ -1,7 +1,8 @@
+ layout->load_view('layout/alerts'); ?> -
+ + + +
+ + +
+
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
(kgs)
invoice_id,$result->invoice_number); ?>invoice_date_created)); + echo $d; ?>invoice_time_created; ?>vehicle_no; ?>product_description; ?>client_id,$result->client_name); ?>item_quantity); + echo round($result->item_quantity); ?>item_price; + echo format_currency($result->item_price); ?>item_subtotal); + echo format_currency(round($result->item_subtotal)); ?>cgst); + echo format_currency(round($result->cgst)); ?>sgst); + echo format_currency(round($result->sgst)); ?>igst); + echo format_currency(round($result->igst)); ?>tcs); + echo format_currency(round($result->tcs)); ?>total); + echo format_currency(round($result->total)); ?>
Total + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
diff --git a/application/modules/invoices/controllers/Ajax.php b/application/modules/invoices/controllers/Ajax.php index 26d27ff..be584e5 100644 --- a/application/modules/invoices/controllers/Ajax.php +++ b/application/modules/invoices/controllers/Ajax.php @@ -4,10 +4,10 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); /* * InvoicePlane * - * @author InvoicePlane Developers & Contributors - * @copyright Copyright (c) 2012 - 2017 InvoicePlane.com - * @license https://invoiceplane.com/license.txt - * @link https://invoiceplane.com + * @author InvoicePlane Developers & Contributors + * @copyright Copyright (c) 2012 - 2017 InvoicePlane.com + * @license https://invoiceplane.com/license.txt + * @link https://invoiceplane.com */ /** @@ -19,51 +19,405 @@ class Ajax extends Admin_Controller public function save() { + + $this->load->model('invoices/mdl_items'); $this->load->model('invoices/mdl_invoices'); $this->load->model('units/mdl_units'); $this->load->model('invoices/mdl_invoice_sumex'); + + $this->load->library('email'); $invoice_id = $this->input->post('invoice_id'); + + /*tamilbala */ + //$deletestatus = $this->input->post('deletestatus'); + /*tamilbala*/ + + //print_r($deletestatus); + //print_r('delete'); + // $quoteid = $this->input->post('quoteid '); + // echo $quoteid; + // die(); + + $this->mdl_invoices->set_id($invoice_id); - + if ($this->mdl_invoices->run_validation('validation_rules_save_invoice')) { $items = json_decode($this->input->post('items')); + $quoteid = $this->input->post('quoteid'); + $qu = $this->input->post('qu'); + + + if(($quoteid == 0) && ($qu !=0)) + { + $quoteid1=$qu; + } + + else + { + $quoteid1=$quoteid; + } + + ///echo $quoteid1; + // print_r($items); + + //die(); + //print_r($items); + //die(); foreach ($items as $item) { + // Check if an item has either a quantity + price or name or description if (!empty($item->item_name)) { - $item->item_quantity = ($item->item_quantity ? standardize_amount($item->item_quantity) : floatval(0)); - $item->item_price = ($item->item_quantity ? standardize_amount($item->item_price) : floatval(0)); - $item->item_discount_amount = ($item->item_discount_amount) ? standardize_amount($item->item_discount_amount) : null; - $item->item_product_id = ($item->item_product_id ? $item->item_product_id : null); - if (property_exists($item, 'item_date')) { - $item->item_date = ($item->item_date ? date_to_mysql($item->item_date) : null); - } - $item->item_product_unit_id = ($item->item_product_unit_id ? $item->item_product_unit_id : null); - $item->item_product_unit = $this->mdl_units->get_name($item->item_product_unit_id, $item->item_quantity); - $item_id = ($item->item_id) ?: null; - unset($item->item_id); - if (!$item->item_task_id) { + + $item->item_quantity = ($item->item_quantity ? standardize_amount($item->item_quantity) : floatval(0)); + + $item->item_price = ($item->item_price ? standardize_amount($item->item_price) : floatval(0)); + + $item->item_discount_amount = ($item->item_discount_amount) ? standardize_amount($item->item_discount_amount) : null; + + $item->item_product_id = ($item->item_product_id ? $item->item_product_id : null); + + $itemproductid= $item->item_product_id; + $itemprice = $item->item_price; + $itemqty = $item->item_quantity; + + + // echo $item->item_price; + // die(); + + if($quoteid1 != 0) + { + + + $reqqty= $this->mdl_invoices->GetOrder_qty($quoteid1,$itemproductid); + + $qidcheck= $this->mdl_invoices->Check_Qid($quoteid1); + + $item_chek =$this->mdl_invoices->check_item($quoteid1,$itemproductid); + + //echo count($item_chek); + //echo "
"; + + //die(); + $innv=''; + $Isqid=''; + + + foreach($qidcheck as $q) + { + $Isqid = $q->quotecount; + $Isinv = $q->invoice_id; + + if($Isinv == $invoice_id) + { + $innv = 1; + } + + } + + if($innv == 1) + { + $invorderdqty= $this->mdl_invoices->GetInvOrdered($invoice_id); + + foreach($invorderdqty as $in) + { + $previousorder= $in->item_quantity; + } + } + + else if($Isqid !='') + { + + $invorderdqty= $this->mdl_invoices->GetquoteOrdered($quoteid1); + + foreach($invorderdqty as $in) + { + $previousorder= $in->item_suppliedquantity; + + } + } + + + // echo $Isqid; + // die(); + $orderqty=0; + $supqty=0; + $balqty=0; + + if(!empty($reqqty)) + { + + foreach($reqqty as $req) + { + $orderqty = $req->orderedqty; + $supqty = $req->supqty; + $balqty = $req->balqty; + } + } + + // echo "or".$orderqty."sup".$supqty."bal".$balqty."pre".$previousorder; + // die(); + + $oqty =$orderqty; + + if($innv == 1) + { + $suppliedqty = $item->item_quantity+$supqty-$previousorder; + $balanceqty = $oqty - $suppliedqty; + + } + + else if($Isqid !='') + { + $suppliedqty=$item->item_quantity+$previousorder; + $balanceqty = $oqty - $suppliedqty; + + } + + + + else + { + + $suppliedqty = ($item->item_quantity); + $balanceqty = ($oqty - ($item->item_quantity)); + } + + + if($balanceqty == 0) + { + $item_status="0"; + } + + else + { + $item_status ="1"; + } + + $updatearray = array('item_balancequantity'=>$balanceqty,'item_suppliedquantity'=>$suppliedqty,'item_status'=>$item_status); + + //print_r($updatearray); + // die(); + if(count($item_chek) !=0) + { + $quoteupdate= $this->mdl_invoices->Update_Qty($quoteid1,$updatearray,$itemproductid); + } + } + + else + { + $oqty =$item->item_quantity; + $suppliedqty =$oqty; + $balanceqty = 0; + + } + + // + $item->item_product_unit_id = ($item->item_product_unit_id ? $item->item_product_unit_id : null); + + $item->item_product_unit = $this->mdl_units->get_name($item->item_product_unit_id, $item->item_quantity); + + $item_id = ($item->item_id) ?: null; + + + unset($item->item_id); + + if (!$item->item_task_id) + { unset($item->item_task_id); - } else { + } + else + { $this->load->model('tasks/mdl_tasks'); $this->mdl_tasks->update_status(4, $item->item_task_id); } + // print_r($item); + // die(); + // $prodate = + + $dt = new DateTime('now', new DateTimeZone('Asia/Kolkata')); + $prodate = $dt->format('Y-m-d'); + + +$productcheck = $this->mdl_items->Check_invoice($invoice_id,$itemproductid); + +//echo count($productcheck); + +$iten_check = count($productcheck); + +//echo $iten_check; + +$Getmaterial_code = $this->mdl_items->GetMaterialCode($itemproductid); + +$material_code=''; +foreach($Getmaterial_code as $mas) +{ +$material_code = $mas->MaterialCode; +} +//echo $material_code;die(); + +$GetclientId = $this->mdl_items->GetClientID($invoice_id); + +$clientId=''; + +foreach($GetclientId as $cs) +{ +$clientId = $cs->client_id; +} + +$dt = new DateTime('now', new DateTimeZone('Asia/Kolkata')); +$createddt = $dt->format('Y-m-d H:i:s'); + + +$get_transctiontype = $this->mdl_items->GetTransactionType($invoice_id); + + +//$getcreditdet = $this->mdl_items->CheckCredit($invoice_id); + +//print_r($getcreditdet);die(); + +//$crecheck = count($getcreditdet); + + + + // print_r($get_transctiontype);die(); + + $count_of_inv=''; + + $tratype=''; + + $ReType =''; + + foreach($get_transctiontype as $ge) + { + $count_of_inv= $ge->creditinvoice_parent_id; + } + + + + if(count($count_of_inv)<=0) + { + $tratype='Reduce'; + + $ReType ='Invoice'; + } + + else + { + $tratype='Add'; + $ReType ='Credit Note'; + } + + + $creditQty = abs($itemqty); + + + //echo $creditQty;die(); + +if($count_of_inv>0) +{ + // if($crecheck<=0) + // { + // $stockHistory = array('MaterialCode'=>$material_code,'Transaction_type'=>'Add','Ref_Type'=>'Credit Note','Ref_No'=>$invoice_id,'SupplierID'=>$clientId,'Quantity'=>$creditQty,'ItemValue'=>$itemprice,'CreatedOn'=>$createddt); + + // //$saveStockHistory = $this->mdl_items->SaveStockHistory($stockHistory); + // } + + // else + // { + // $stockHistory = array('MaterialCode'=>$material_code,'Quantity'=>$creditQty,'ItemValue'=>$itemprice,'UpdatedOn'=>$createddt); + + // //$updateFinalHistory = $this->mdl_items->UpdateStockHistory($stockHistory,$invoice_id,$material_code); + + // } +} + + + +if($iten_check>0) +{ + + +//echo 'if';die(); + $final_productarray=array('ProductCode'=>$itemproductid,'Quantity'=>$itemqty,'Price'=>$itemprice,'Transactiondate'=>$prodate); + + //$savefinal = $this->mdl_items->UpdateFinalHistory($final_productarray,$invoice_id,$itemproductid); + + + $stockHistory = array('MaterialCode'=>$material_code,'Quantity'=>$itemqty,'ItemValue'=>$itemprice,'UpdatedOn'=>$createddt); + + //$updateFinalHistory = $this->mdl_items->UpdateStockHistory($stockHistory,$invoice_id,$material_code); + + +} + +else +{ + + + //echo 'else';die(); + // $invoice_details= $this->mdl_items->GetInvoiceDeatisl($invoice_id); + // $inv_no=''; + + // if(!empty($invoice_details)) + // { + // foreach($invoice_details as $in) + // { + // $inv_no = $in->invoice_number; + // } + // } + + + //$finalhistory= array('RefID'=>$inv_no,'invoice_id'=>$invoice_id,'TransactionType'=>'Outward','ProductCode'=>$itemproductid,'Quantity'=>$itemqty,'Price'=>$itemprice,'Transactiondate'=>$prodate); + + //$saveinvhistory=$this->mdl_items->SaveFinalHistory($finalhistory); + + + + // $tratype=''; + + // $get_transctiontype = $this->mdl_items->GetTransactionType($invoice_id); + + // print_r($get_transctiontype);die(); + + + //$stockHistory = array('MaterialCode'=>$material_code,'Transaction_type'=>'Reduce','Ref_Type'=>'Invoice','Ref_No'=>$invoice_id,'SupplierID'=>$clientId,'Quantity'=>$itemqty,'ItemValue'=>$itemprice,'CreatedOn'=>$createddt); + + + + + //$saveStockHistory = $this->mdl_items->SaveStockHistory($stockHistory); +} + // echo $invoice_id; + //echo $item_id; + $invexist= $this->mdl_items->Check_invoice($invoice_id,$item_id); + + //echo count($invexist); + //die(); $this->mdl_items->save($item_id, $item); - } else { + + + + + + } + + else + { // Throw an error message and use the form validation for that $this->load->library('form_validation'); - $this->form_validation->set_rules('item_name', trans('item'), 'required'); + // $this->form_validation->set_rules('item_name', trans('item'), 'required'); $this->form_validation->run(); $response = array( 'success' => 0, 'validation_errors' => array( - 'item_name' => form_error('item_name', '', ''), + 'item_name' => form_error('item_name', '', ''), ) ); @@ -72,14 +426,45 @@ class Ajax extends Admin_Controller } } + + $invoicedetails=array('invoice_id'=>$invoice_id,'quote_id'=>$quoteid1); + + $InvId_check= $this->mdl_invoices->CheckInvId($invoice_id); + + + + foreach($InvId_check as $idc) + { + $cid = $idc->invcount; + } + + + if($quoteid1 !=0) + { + if($cid == 0) + { + + $saveinvtable=$this->mdl_invoices->Save_quote_to_invtable($invoicedetails); + } + } + + $invoice_status = $this->input->post('invoice_status_id'); - if ($this->input->post('invoice_discount_amount') === '') { + //echo $invoice_status; + + + if ($this->input->post('invoice_discount_amount') === '') + { $invoice_discount_amount = floatval(0); - } else { + } + else + { $invoice_discount_amount = $this->input->post('invoice_discount_amount'); } + + if ($this->input->post('invoice_discount_percent') === '') { $invoice_discount_percent = floatval(0); } else { @@ -94,6 +479,8 @@ class Ajax extends Admin_Controller $invoice_number = $this->mdl_invoices->get_invoice_number($invoice_group_id); } + + $db_array = array( 'invoice_number' => $invoice_number, 'invoice_terms' => $this->input->post('invoice_terms'), @@ -106,6 +493,11 @@ class Ajax extends Admin_Controller 'invoice_discount_percent' => standardize_amount($invoice_discount_percent), ); + + //print_r($db_array); + + + // check if status changed to sent, the feature is enabled and settings is set to sent if ($this->config->item('disable_read_only') === false) { if ($invoice_status == get_setting('read_only_toggle')) { @@ -116,6 +508,8 @@ class Ajax extends Admin_Controller $this->mdl_invoices->save($invoice_id, $db_array); $sumexInvoice = $this->mdl_invoices->where('sumex_invoice', $invoice_id)->get()->num_rows(); + + if ($sumexInvoice >= 1) { $sumex_array = array( 'sumex_invoice' => $invoice_id, @@ -130,9 +524,12 @@ class Ajax extends Admin_Controller $this->mdl_invoice_sumex->save($invoice_id, $sumex_array); } + + + // Recalculate for discounts $this->load->model('invoices/mdl_invoice_amounts'); - $this->mdl_invoice_amounts->calculate($invoice_id); + // $this->mdl_invoice_amounts->calculate($invoice_id); $response = array( 'success' => 1, @@ -144,30 +541,153 @@ class Ajax extends Admin_Controller 'validation_errors' => json_errors() ); } - + //print_r($this->input->post('custom')); +$values = []; + if($quoteid1 == 0) + { // Save all custom fields if ($this->input->post('custom')) { + + //print_r($this->input->post('custom')); + + $varray=$this->input->post('custom'); + + $db_array = array(); - $values = []; - foreach ($this->input->post('custom') as $custom) { - if (preg_match("/^(.*)\[\]$/i", $custom['name'], $matches)) { + + foreach ($this->input->post('custom') as $custom) + { + + // print_r($custom); + if (preg_match("/^(.*)\[\]$/i", $custom['name'], $matches)) + { $values[$matches[1]][] = $custom['value']; - } else { + + //echo $custom['value']; + } + + else + { $values[$custom['name']] = $custom['value']; + + //echo $values[$custom['name']]; } } - foreach ($values as $key => $value) { + foreach ($values as $key => $value) + { + preg_match("/^custom\[(.*?)\](?:\[\]|)$/", $key, $matches); - if ($matches) { + if ($matches) + { + $db_array[$matches[1]] = $value; } } + + $this->load->model('custom_fields/mdl_invoice_custom'); - $this->load->model('custom_fields/mdl_invoice_custom'); + $result = $this->mdl_invoice_custom->save_custom($invoice_id, $db_array); + +//die(); + if ($result !== true) { + $response = array( + 'success' => 0, + 'validation_errors' => $result + ); + + echo json_encode($response); + exit; + } + } + } + + else + { +//$this->load->model('invoices/mdl_items'); + + if ($this->input->post('custom')) { + + // print_r($this->input->post('custom')); + + $varray=$this->input->post('custom'); + + $Quotecustomvalue= $this->mdl_items->get_quoteproduct($quoteid1); + // print_r($Quotecustomvalue); + + + $pono = $Quotecustomvalue[0]->quote_pono; + $dmy = date('d-m-Y',strtotime($Quotecustomvalue[0]->po_date_created)); + + // echo $pono; + // echo $dmy; + // die(); + + + $db_array = array(); + + + foreach ($this->input->post('custom') as $custom) + { + + + if (preg_match("/^(.*)\[\]$/i", $custom['name'], $matches)) + { + $values[$matches[1]][] = $custom['value']; + + + } + + else + { + $values[$custom['name']] = $custom['value']; + + + } + } + + foreach ($values as $key => $value) + { + + if(($key !="custom[15]") && ($key !="custom[14]")) + { + + + + }else{ + + if($key == "custom[14]") + { + $value=$pono; + } + else if($key == "custom[15]") + { + $value=$dmy; + } + + } + + preg_match("/^custom\[(.*?)\](?:\[\]|)$/", $key, $matches); + if ($matches) + { + + $db_array[$matches[1]] = $value; + } + + + // print_r($db_array); + $this->load->model('custom_fields/mdl_invoice_custom'); + + + $result = $this->mdl_invoice_custom->save_custom($invoice_id, $db_array); + + + } + //print_r($db_array); + if ($result !== true) { $response = array( 'success' => 0, @@ -179,11 +699,23 @@ class Ajax extends Admin_Controller } } + + + + + + } + echo json_encode($response); } + + + public function save_invoice_tax_rate() { + + $this->load->model('invoices/mdl_invoice_tax_rates'); if ($this->mdl_invoice_tax_rates->run_validation()) { @@ -205,12 +737,14 @@ class Ajax extends Admin_Controller public function create() { $this->load->model('invoices/mdl_invoices'); + $this->load->model('invoices/mdl_items'); if ($this->mdl_invoices->run_validation()) { $invoice_id = $this->mdl_invoices->create(); $response = array( 'success' => 1, + //'drpcheck'=>$dropcheck, 'invoice_id' => $invoice_id ); } else { @@ -221,6 +755,20 @@ class Ajax extends Admin_Controller ); } + // $invoice_details= $this->mdl_items->GetInvoiceDeatis($invoice_id); + // $inv_no=''; + + // if(!empty($invoice_details)) + // { + // foreach($invoice_details as $in) + // { + // $inv_no = $in->invoice_number; + // } + // } + + // $finalhistory= array('RefID'=>$inv_no,'invoice_id'=>$invoice_id,'TransactionType'=>'Outward'); + // $saveinvhistory=$this->mdl_items->SaveFinalHistory($finalhistory); + echo json_encode($response); } @@ -250,12 +798,14 @@ class Ajax extends Admin_Controller $this->load->model('invoices/mdl_items'); $item = $this->mdl_items->get_by_id($this->input->post('item_id')); - + print_r($item); echo json_encode($item); } public function modal_create_invoice() { + + $this->load->module('layout'); $this->load->model('invoice_groups/mdl_invoice_groups'); $this->load->model('tax_rates/mdl_tax_rates'); @@ -267,10 +817,45 @@ class Ajax extends Admin_Controller 'client' => $this->mdl_clients->get_by_id($this->input->post('client_id')), 'clients' => $this->mdl_clients->get_latest(), ); - + $this->layout->load_view('invoices/modal_create_invoice', $data); } + + + // public function modal_create_poinvoice() + // { + + + // $this->load->module('layout'); + // $this->load->model('invoice_groups/mdl_invoice_groups'); + // $this->load->model('tax_rates/mdl_tax_rates'); + // $this->load->model('clients/mdl_clients'); + + // $data = array( + // 'invoice_groups' => $this->mdl_invoice_groups->get()->result(), + // 'tax_rates' => $this->mdl_tax_rates->get()->result(), + // 'client' => $this->mdl_clients->get_by_id($this->input->post('client_id')), + // 'clients' => $this->mdl_clients->get_latest(), + // ); + + // $this->layout->load_view('invoices/modal_create_poinvoice', $data); + // } + + + + public function test() + { + + echo "erv"; + + + } + + + + + public function modal_create_recurring() { $this->load->module('layout'); @@ -295,7 +880,7 @@ class Ajax extends Admin_Controller public function modal_change_client() { - $this->load->module('layout'); + $this->load->module('layout'); $this->load->model('clients/mdl_clients'); $data = array( @@ -303,7 +888,7 @@ class Ajax extends Admin_Controller 'invoice_id' => $this->input->post('invoice_id'), 'clients' => $this->mdl_clients->get_latest(), ); - + $this->layout->load_view('invoices/modal_change_client', $data); } @@ -415,10 +1000,12 @@ class Ajax extends Admin_Controller $this->mdl_invoices->copy_credit_invoice($source_id, $target_id); + $sourceinv_array= array('is_read_only'=>'1','invoice_status_id'=>'2'); + // Set source invoice to read-only if ($this->config->item('disable_read_only') == false) { $this->mdl_invoices->where('invoice_id', $source_id); - $this->mdl_invoices->update('ip_invoices', array('is_read_only' => '1')); + $this->mdl_invoices->update('ip_invoices', $sourceinv_array); } // Set target invoice to credit invoice diff --git a/application/modules/invoices/controllers/Invoices.php b/application/modules/invoices/controllers/Invoices.php index 3e8cd82..8ac8048 100644 --- a/application/modules/invoices/controllers/Invoices.php +++ b/application/modules/invoices/controllers/Invoices.php @@ -23,6 +23,8 @@ class Invoices extends Admin_Controller parent::__construct(); $this->load->model('mdl_invoices'); + $this->load->model('Mdl_items'); + } public function index() @@ -61,6 +63,8 @@ class Invoices extends Admin_Controller $this->mdl_invoices->paginate(site_url('invoices/status/' . $status), $page); $invoices = $this->mdl_invoices->result(); + //print_r($invoices); + $this->layout->set( array( 'invoices' => $invoices, @@ -117,7 +121,8 @@ class Invoices extends Admin_Controller */ public function view($invoice_id) { - //echo 'Edit'; + + $this->load->model( array( 'mdl_items', @@ -132,7 +137,7 @@ class Invoices extends Admin_Controller $this->load->helper("client"); $this->load->model('units/mdl_units'); $this->load->module('payments'); - + $this->load->model('products/mdl_products'); $this->load->model('custom_values/mdl_custom_values'); $this->load->model('custom_fields/mdl_invoice_custom'); @@ -150,10 +155,19 @@ class Invoices extends Admin_Controller } }*/ + + // $quo = $this->input->post('quote_id'); + + + $fields = $this->mdl_invoice_custom->by_id($invoice_id)->get()->result(); //print_r($fields); $invoice = $this->mdl_invoices->get_by_id($invoice_id); - //print_r($invoice); + + //print_r($invoice); + + + //print_r($invoice_id);die; if (!$invoice) { show_404(); } @@ -161,27 +175,130 @@ class Invoices extends Admin_Controller // foreach ($invoice[0] as $key ) { $InvoiceDetails = json_decode(json_encode($invoice),true); $ClientID = $InvoiceDetails['client_id']; + + ///print_r($InvoiceDetails); + + $quote=$InvoiceDetails['Qid']; + $bqty =''; + $sqty =''; + $oqty = ''; + if($InvoiceDetails['quote_id'] !="") + { + // echo "quoteid"; + // echo $InvoiceDetails['quote_id']; + $balqty =$this->mdl_invoices->getinvbalqty($InvoiceDetails['quote_id']); + + } + else if($InvoiceDetails['Qid']!="") + { + // echo "qid"; + // echo $InvoiceDetails['Qid']; + $balqty =$this->mdl_invoices->getinvbalqty($InvoiceDetails['Qid']); + } + + + // print_r($balqty); + if(!empty($balqty)) + { + foreach($balqty as $bal) + { + $bqty= $bal->item_balancequantity; + $sqty= $bal->item_suppliedquantity; + $oqty= $bal->item_quantity; + } + } + + //echo $bqty; + // if($InvoiceDetails['quote_id'] != '') + // { + // $quoteid = $InvoiceDetails['quote_id']; + + // $GetQuotetax = $this->mdl_invoices->GetQuoteamount($quoteid); + + // } + + // $quoteid = $InvoiceDetails['quote_id']; + // // echo $quo; //echo $ClientID; // } /*foreach ($invoice as $inv) { $ClientID = $inv->client_id; } + echo $ClientID; */ $PaymentDays = $this->mdl_invoices->GetPaymentDays($invoice_id,$ClientID,'51'); $GetSecondaryAddress = $this->mdl_invoices->GetSecondaryAddress($ClientID); + + //print_r($GetSecondaryAddress); + + $GetClientState = $this->mdl_invoices->GetState($ClientID); + + // $GetClientStateCode = $this->mdl_invoices->GetStateCode($ClientID,'12'); + + //print_r( $GetClientStateCode); + + $get_invoice_items= $this->mdl_invoices->Get_invoiceitems($invoice_id); + + if(empty($get_invoice_items)) + { + $drp_check=1; + } + + else + { + $drp_check=0; + + } + + + + $GetClientPrimaryStateCode = $this->mdl_invoices->GetPrimaryStateCode($ClientID,'12'); + + + $GetClientSecondaryStateCode = $this->mdl_invoices->GetSecondaryStateCode($ClientID,'57'); + + // print_r($GetClientPrimaryStateCode); + // print_r($GetClientSecondaryStateCode); + + + + + $primarystatecode=''; + foreach ($GetClientPrimaryStateCode as $primary) + { + $primarystatecode=$primary->client_custom_fieldvalue; + } + + + $secondarystatecode=''; + + foreach ($GetClientSecondaryStateCode as $secondary) + { + $secondarystatecode=$secondary->client_custom_fieldvalue; + } + + // echo $secondarystatecode; + // echo $primarystatecode; + + + $getSecondayAddressSelected = $this->mdl_invoices->getSecondayAddressSelected($invoice_id,'44'); - // print_r($GetSecondaryAddress); + //print_r($GetSecondaryAddress); $custom_fields = $this->mdl_custom_fields->by_table('ip_invoice_custom')->get()->result(); $custom_values = []; + + //print_r($custom_fields); foreach ($custom_fields as $custom_field) { if (in_array($custom_field->custom_field_type, $this->mdl_custom_values->custom_value_fields())) { $values = $this->mdl_custom_values->get_by_fid($custom_field->custom_field_id)->result(); + //print_r($values); $custom_values[$custom_field->custom_field_id] = $values; + } } - + //print_r($custom_fields);die; foreach ($custom_fields as $cfield) { foreach ($fields as $fvalue) { if ($fvalue->invoice_custom_fieldid == $cfield->custom_field_id) { @@ -189,7 +306,7 @@ class Invoices extends Admin_Controller //echo $fvalue->invoice_custom_fieldid ; if ($fvalue->invoice_custom_fieldid == "7" && $fvalue->invoice_custom_fieldvalue == '') { - echo 'Mode'. $fvalue->invoice_custom_fieldvalue; + echo $fvalue->invoice_custom_fieldvalue; $this->mdl_invoices->set_form_value( 'custom[' . $cfield->custom_field_id . ']', 'By Road' @@ -207,29 +324,108 @@ class Invoices extends Admin_Controller } } + + $clientid = $this->mdl_invoices->get_clientid($invoice_id); + foreach($clientid as $cl) + { + $client_id= $cl->client_id; + } + + $creditststus= $this->mdl_invoices->getcreditstatus($invoice_id); + + //print_r($creditststus); + $crestatus=''; + foreach($creditststus as $cre) + { + $crestatus=$cre->credit_status; + } + + + $parentqty= $this->mdl_invoices->getinv_parentqty($invoice_id); + // print_r($parentqty); + + $parent_inv_qty = ''; + + if(!empty($parentqty)) + { + foreach($parentqty as $pa) + { + $parent_inv_qty = $pa->item_quantity; + } + } + + //echo $parent_inv_qty; + + +//$taxcheck=$this->mdl_invoices->get_taxcheck($invoice_id); +//print_r($taxcheck); + +// if(!empty($taxcheck)) +// { +// $exctax=$taxcheck[0]->taxcheck; +// } +// else +// { +// $exctax=0; +// } + +//echo $exctax; + + + // $quotes = $this->Mdl_items->get_quotes($client_id); + // print_r($quotes); + + // $inv_status= $this->mdl_invoices->get_status($invoice_id) + //$product = $this->Mdl_items->get_product(); + //print_r($product);die; + // $state=$this->test(); + // echo $state; + + $this->layout->set( array( 'invoice' => $invoice, - 'Duedate' =>$PaymentDays, - 'GetSecondary' =>$GetSecondaryAddress, - 'getSecondaySelected' => $getSecondayAddressSelected, + 'Duedate' =>$PaymentDays, + 'GetSecondary' =>$GetSecondaryAddress, + 'GetState'=>$GetClientState, + 'getSecondaySelected' => $getSecondayAddressSelected, + 'GetClientPrimaryStateCode'=>$GetClientPrimaryStateCode, + 'GetClientSecondaryStateCode'=>$GetClientSecondaryStateCode, 'items' => $this->mdl_items->where('invoice_id', $invoice_id)->get()->result(), 'invoice_id' => $invoice_id, + 'drop_check' => $drp_check, + 'clientid' => $this->mdl_invoices->get_clientid($invoice_id), + 'products' => $this->Mdl_items->get_product(), + 'quotes' => $this->Mdl_items->get_quotes($client_id), + 'producttax'=>$this->Mdl_items->get_tax(), 'tax_rates' => $this->mdl_tax_rates->get()->result(), 'invoice_tax_rates' => $this->mdl_invoice_tax_rates->where('invoice_id', $invoice_id)->get()->result(), + 'creditstatus'=>$crestatus, + + 'balancequoteqty'=>$bqty, + 'parentinvoiceqty'=>$parent_inv_qty, + 'suppliedquoteqty'=>$sqty, + 'orderedquoteqty'=>$oqty, 'units' => $this->mdl_units->get()->result(), 'payment_methods' => $this->mdl_payment_methods->get()->result(), 'custom_fields' => $custom_fields, 'custom_values' => $custom_values, + 'fields'=>$fields, 'custom_js_vars' => array( - 'currency_symbol' => get_setting('currency_symbol'), - 'currency_symbol_placement' => get_setting('currency_symbol_placement'), - 'decimal_point' => get_setting('decimal_point') + 'currency_symbol' => get_setting('currency_symbol'), + 'currency_symbol_placement' => get_setting('currency_symbol_placement'), + 'decimal_point' => get_setting('decimal_point') ), - 'invoice_statuses' => $this->mdl_invoices->statuses() + 'invoice_statuses' => $this->mdl_invoices->statuses(), + 'quoteid' =>$InvoiceDetails['quote_id'], + 'qid' =>$quote, + 'inv_status'=> $this->mdl_invoices->get_status($invoice_id) ) ); + + // print_r($custom_values); + if ($invoice->sumex_id != null) { $this->layout->buffer( array( @@ -253,6 +449,69 @@ class Invoices extends Admin_Controller $this->layout->render(); } + + + + public function view1($invoice_id) + { + + //echo 'Edit';die; + + + + $this->layout->buffer('content', 'invoices/view'); + $this->layout->render(); + + + } + + + public function get_quote_items() + { + + $this->load->model('quotes/mdl_quote_items'); + + $quote_id = $this->input->post('qid'); + $quote_no = $this->input->post('quno'); + $invoice_id = $this->input->post('invoice_id'); + $pono=''; + $podate=''; + + $quote_item = $this->Mdl_items->get_quoteproduct($quote_id); + foreach($quote_item as $qu) + { + $pono= $qu->quote_pono; + $podate= $qu->po_date_created; + $cpofieldid= '14'; + $cdatefieldid = '15'; + $timestamp = strtotime($podate); + $dmy = date("d-m-Y", $timestamp); + + } + + //echo "pono".$pono; + //echo "podate".$dmy; + //die(); + + $db_array = array('61'=>'','40'=>'','42'=>'','38'=>'','41'=>'','53'=>'','39'=>'','43'=>'','54'=>'','44'=>'','10'=>'','14'=>$pono,'15'=>$dmy,'7'=>'','8'=>'','58'=>'','62'=>'','64'=>''); + + //print_r($db_array); + + $this->load->model('custom_fields/mdl_invoice_custom'); + + $result = $this->mdl_invoice_custom->save_custom($invoice_id, $db_array); + + + die(json_encode(array('quotedetails' =>$quote_item))); + } + + + + + + + + /** * @param $invoice_id */ @@ -306,6 +565,7 @@ class Invoices extends Admin_Controller public function generate_pdf($invoice_id, $stream = true, $invoice_template = null) { + $this->load->helper('pdf'); if (get_setting('mark_invoices_sent_pdf') == 1) { @@ -360,16 +620,39 @@ class Invoices extends Admin_Controller * @param $invoice_id * @param $invoice_tax_rate_id */ - public function delete_invoice_tax($invoice_id, $invoice_tax_rate_id) + //$invoice_id,$invoice_tax_rate_id + public function delete_invoice_tax() { - $this->load->model('mdl_invoice_tax_rates'); - $this->mdl_invoice_tax_rates->delete($invoice_tax_rate_id); - - $this->load->model('mdl_invoice_amounts'); - $this->mdl_invoice_amounts->calculate($invoice_id); - - redirect('invoices/view/' . $invoice_id); + + + $tcsamount=$this->input->post('tcs'); + $invoice_id=$this->input->post('inv_id'); + $invoice_amount=$this->input->post('invoiceamount'); + $invoice_balance=$this->input->post('inv_balance'); + + $this->load->model('mdl_invoice_tax_rates'); + $res=$this->mdl_invoice_tax_rates->invoice_delete($invoice_id,$invoice_amount,$invoice_balance); + $res1=$this->mdl_invoice_tax_rates->invoice_delete_tax($invoice_id); + //$res = $this->mdl_invoice_amounts->invoice_delete($bankdata,$bankid); } + // public function delete_invoice_tax() + // { + + // print_r('maran'); + // $tcsamount=$this->input->post('tcs'); + // $invoice_id=$this->input->post('inv_id'); + // print_r($tcsamount); + // print_r($invoice_id); + // die(); + + // $this->load->model('mdl_invoice_tax_rates'); + // $this->mdl_invoice_tax_rates->delete($invoice_tax_rate_id); + + // $this->load->model('mdl_invoice_amounts'); + // $this->mdl_invoice_amounts->calculate($invoice_id); + + // redirect('invoices/view/' . $invoice_id); + // } public function recalculate_all_invoices() { @@ -383,4 +666,52 @@ class Invoices extends Admin_Controller } } + function test(){ + + $data = $this->input->post('state'); + + // $invoice = $this->input->post('invoice_id'); + echo $data; + //return $data; + + $obj=json_encode($data); + return $obj; + } + + + public function po_details() + { + $this->layout->buffer('content', 'invoices/po_details'); + $this->layout->render(); + } + + // public function polistcheck() + // { + // $this->layout->buffer('content', 'invoices/polistcheck'); + // $this->layout->render(); + // } + + + public function modal_create_poinvoice() + { + + $this->load->module('layout'); + $this->load->model('invoice_groups/mdl_invoice_groups'); + $this->load->model('tax_rates/mdl_tax_rates'); + $this->load->model('clients/mdl_clients'); + + $customerid = $this->input->post('customerid'); + + + // $data = array( + // 'invoice_groups' => $this->mdl_invoice_groups->get()->result(), + // 'tax_rates' => $this->mdl_tax_rates->get()->result(), + // 'client' => $this->mdl_clients->get_by_id($customerid ), + // 'clients' => $this->mdl_clients->get_latest(), + // ); + + // $this->layout->load_view('invoices/modal_create_poinvoice', $data); + } + + } diff --git a/application/modules/invoices/models/Mdl_invoice_tax_rates.php b/application/modules/invoices/models/Mdl_invoice_tax_rates.php index d58c0c3..522e214 100644 --- a/application/modules/invoices/models/Mdl_invoice_tax_rates.php +++ b/application/modules/invoices/models/Mdl_invoice_tax_rates.php @@ -47,6 +47,27 @@ class Mdl_Invoice_Tax_Rates extends Response_Model $this->mdl_invoice_amounts->calculate($invoice_id); } } + public function invoice_delete($invoice_id,$invoice_amount,$invoice_balance) + { + + + $this->db->where('invoice_id', $invoice_id); + $this->db->set('invoice_tax_total',0); + $this->db->set('invoice_total',$invoice_amount); + $this->db->set('invoice_balance',$invoice_balance); + $this->db->update('ip_invoice_amounts'); + $r = $this->db->affected_rows(); + return $r; + } + public function invoice_delete_tax($invoice_id) + { + $this->db->where('invoice_id', $invoice_id); + $this->db->set('invoice_tax_rate_amount',0); + $this->db->set('tax_rate_id',10); + $this->db->update('ip_invoice_tax_rates'); + $r = $this->db->affected_rows(); + return $r; + } /** * @return array diff --git a/application/modules/invoices/models/Mdl_invoices.php b/application/modules/invoices/models/Mdl_invoices.php index e5bbbe0..a4b0eac 100644 --- a/application/modules/invoices/models/Mdl_invoices.php +++ b/application/modules/invoices/models/Mdl_invoices.php @@ -68,7 +68,83 @@ class Mdl_Invoices extends Response_Model return $query->result(); - } + } + + + public function GetClient_Details() + { + + $subQuery = "select * from ip_clients"; + + $query = $this->db->query($subQuery,array()); + + return $query->result(); + + } + + + public function get_status($invoice_id) + { + $subQuery = "select invoice_status_id from ip_invoices where invoice_id=?"; + + $query = $this->db->query($subQuery,array($invoice_id)); + + return $query->result(); + + } + + + + public function GetState($ClientID) + { + //echo $ClientID; + $subQuery = "select client_id,client_name,client_state from ip_clients where client_id =?"; + + $query = $this->db->query($subQuery,array($ClientID)); + + return $query->result(); + + } + + + // public function GetStateCode($ClientID,$CustomId) + // { + // //echo $ClientID; + // $subQuery = "select client_id,client_custom_fieldid,client_custom_fieldvalue from ip_client_custom where client_id =? and client_custom_fieldid=?"; + + // $query = $this->db->query($subQuery,array($ClientID,$CustomId)); + + // return $query->result(); + + // } + + + public function GetPrimaryStateCode($ClientID,$CustomId) + { + //echo $ClientID; + $subQuery = "select client_custom_fieldvalue from ip_client_custom where client_id =? and client_custom_fieldid=?"; + + $query = $this->db->query($subQuery,array($ClientID,$CustomId)); + + return $query->result(); + + } + + + public function GetSecondaryStateCode($ClientID,$CustomId) + { + //echo $ClientID; + $subQuery = "select client_custom_fieldvalue from ip_client_custom where client_id =? and client_custom_fieldid=?"; + + $query = $this->db->query($subQuery,array($ClientID,$CustomId)); + + return $query->result(); + + } + + + + public function getSecondayAddressSelected($InvID,$client_custom_fieldid) { @@ -76,12 +152,13 @@ class Mdl_Invoices extends Response_Model invoice_custom_fieldid=?"; $query = $this->db->query($subQuery,array($InvID,$client_custom_fieldid)); - + //print_r( $this->db->last_query()); return $query->result(); } public function default_select() - { + { + $this->db->select(" SQL_CALC_FOUND_ROWS ip_quotes.*, @@ -106,6 +183,7 @@ class Mdl_Invoices extends Response_Model ip_users.user_rcc, ip_clients.*, ip_invoice_sumex.*, + ip_invoice_amounts.invoice_id, ip_invoice_amounts.invoice_amount_id, IFnull(ip_invoice_amounts.invoice_item_subtotal, '0.00') AS invoice_item_subtotal, IFnull(ip_invoice_amounts.invoice_item_tax_total, '0.00') AS invoice_item_tax_total, @@ -123,6 +201,7 @@ class Mdl_Invoices extends Response_Model public function default_order_by() { $this->db->order_by('ip_invoices.invoice_number DESC'); + $this->db->group_by('ip_invoices.invoice_number'); } public function default_join() diff --git a/application/modules/invoices/models/Mdl_item_amounts.php b/application/modules/invoices/models/Mdl_item_amounts.php index fd8f20c..8ff65fe 100644 --- a/application/modules/invoices/models/Mdl_item_amounts.php +++ b/application/modules/invoices/models/Mdl_item_amounts.php @@ -26,21 +26,38 @@ class Mdl_Item_Amounts extends CI_Model */ public function calculate($item_id) { + + // echo(""); + + // die(); + $amount=''; $this->load->model('invoices/mdl_items'); $item = $this->mdl_items->get_by_id($item_id); + $item_subtotal = $item->item_quantity * $item->item_price; $amount = $item->item_subtotal - $item->item_discount; $item_tax_total = $amount * (($item->Sgst_item_tax_rate_percent + $item->Cgst_item_tax_rate_percent +$item->Igst_item_tax_rate_percent) / 100); $item_discount_total = $item->item_discount_amount * $item->item_quantity; $item_total = $item_subtotal + $item_tax_total - $item_discount_total; + $item_cgst= $amount * ($item->Cgst_item_tax_rate_percent)/100; + $item_sgst= $amount * ($item->Sgst_item_tax_rate_percent)/100; + $item_igst= $amount * ($item->Igst_item_tax_rate_percent)/100; + + + $db_array = array( 'item_id' => $item_id, 'item_subtotal' => $item_subtotal, 'item_tax_total' => $item_tax_total, 'item_discount' => $item_discount_total, - 'item_total' => $item_total + 'item_total' => $item_total, + 'item_cgst_amt'=> $item_cgst, + 'item_sgst_amt'=> $item_sgst, + 'item_igst_amt'=> $item_igst + + ); $this->db->where('item_id', $item_id); diff --git a/application/modules/invoices/models/Mdl_items.php b/application/modules/invoices/models/Mdl_items.php index c2ca08a..d1e7b3d 100644 --- a/application/modules/invoices/models/Mdl_items.php +++ b/application/modules/invoices/models/Mdl_items.php @@ -18,12 +18,172 @@ class Mdl_Items extends Response_Model public $table = 'ip_invoice_items'; public $primary_key = 'ip_invoice_items.item_id'; public $date_created_field = 'item_date_added'; + + public function today() + { + $sql="SELECT count(inv.invoice_id) as today,ifnull(sum(it.item_quantity),0) as sum_of_quan,ifnull(sum(it.item_quantity * it.item_price),0) as sum_of_today FROM ip_invoice_items it +join ip_invoices inv on inv.invoice_id = it.invoice_id +where inv.invoice_status_id != 1 and date(invoice_date_created) = CURRENT_DATE;"; + $query = $this->db->query($sql); + return $query->result(); + + } + public function month() + { + +if (date('m') >= 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $sql="SELECT (SELECT count(distinct inv.invoice_id) FROM ip_invoices inv +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and MONTH(inv.invoice_date_created) = MONTH(CURRENT_DATE()) and +(inv.invoice_date_created >= '".$fa."-04-01' and inv.invoice_date_created <= '".$aa."-03-31') and creditinvoice_parent_id is null) as months,ifnull(sum(it.item_quantity),0) as sum_of_quantity,ifnull(sum(if(it.item_quantity=0,1,it.item_quantity) * it.item_price),0) as sum_of_month FROM ip_invoice_items it +join ip_invoices inv on inv.invoice_id = it.invoice_id +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and MONTH(inv.invoice_date_created) = MONTH(CURRENT_DATE()) and +(inv.invoice_date_created >= '".$fa."-04-01' and inv.invoice_date_created <= '".$aa."-03-31');"; + $query = $this->db->query($sql); + return $query->result(); + + } + public function year() + { + if (date('m') >= 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $sql="SELECT (SELECT count(distinct inv.invoice_id) FROM ip_invoices inv +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and +(inv.invoice_date_created >= '".$fa."-04-01' and inv.invoice_date_created <= '".$aa."-03-31') and creditinvoice_parent_id is null) as year,ifnull(sum(iit.item_quantity),0) as sum_of_quantity,ifnull(sum(if(iit.item_quantity=0,1,iit.item_quantity) * iit.item_price),0) as sum_of_year +FROM ip_invoice_items iit +join ip_invoices ii on ii.invoice_id = iit.invoice_id +join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id +where ii.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and (ii.invoice_date_created >= '".$fa."-04-01' and ii.invoice_date_created <= '".$aa."-03-31');"; + $query = $this->db->query($sql); + return $query->result(); + + } + + public function vehicle() + { + $sql="select iit.invoice_id as invoice_id,iic.invoice_custom_fieldvalue as invoice_custom_fieldvalue from ip_invoice_custom iic +join ip_invoice_items iit on iit.invoice_id = iic.invoice_id where invoice_custom_fieldid = '8'"; + $query = $this->db->query($sql); + return $query->result(); + + } + public function item_name() + { + $sql="SELECT product_description as item_name FROM ip_products"; + $query = $this->db->query($sql); + return $query->result(); + + } + public function year_wise($a,$b) + { + $sql="SELECT inv.invoice_date_created as months,sum(it.item_quantity) as quantity,sum(it.item_quantity * it.item_price) as value FROM ip_invoice_items it +join ip_invoices inv on inv.invoice_id = it.invoice_id where inv.invoice_status_id != 1 and (inv.invoice_date_created) >= '$a-04-01' and date(inv.invoice_date_created) <= '$b-03-31' +group by month(months) +ORDER BY month(months);"; + $query = $this->db->query($sql); + return $query->result(); + + } + public function month_wise($new) + { + //echo $new; + $month= date("m",strtotime($new)); + $year = date("Y",strtotime($new)); + //echo $month;// + //echo $year;die(); + $sql="select clt.client_id as client_id,clt.client_name as client_name,ip.product_description as product_name,sum(item_quantity) as quantity,sum(item_quantity * item_price) as value +from ip_clients clt +join ip_invoices inv on inv.client_id = clt.client_id +join ip_invoice_items items on items.invoice_id = inv.invoice_id +join ip_products ip on ip.product_id = items.item_product_id +where inv.invoice_status_id != 1 and month(inv.invoice_date_created) = ? and year(inv.invoice_date_created) = ? +group by client_name,product_name"; + $query = $this->db->query($sql,array($month,$year)); + //print_r($query->result()); + return $query->result(); + + } + public function year_wise_total($a,$b) + { + + $sql="select clt.client_id as client_id,clt.client_name as client_name,ip.product_description as product_name,sum(item_quantity) as quantity,sum(item_quantity * item_price) as value +from ip_clients clt +join ip_invoices inv on inv.client_id = clt.client_id +join ip_invoice_items items on items.invoice_id = inv.invoice_id +join ip_products ip on ip.product_id = items.item_product_id +where inv.invoice_status_id != 1 and (inv.invoice_date_created) >= '$a-04-01' and date(inv.invoice_date_created) <= '$b-03-31' +group by client_name,product_name"; + $query = $this->db->query($sql,array($a,$b)); + //print_r($a); + return $query->result(); + + } + public function fiscalYear() + { + $sql="SELECT + CASE WHEN MONTH(invoice_date_created)>=4 THEN + concat(YEAR(invoice_date_created), '-',YEAR(invoice_date_created)+1) + ELSE concat(YEAR(invoice_date_created)-1,'-', YEAR(invoice_date_created)) END AS financial_year + FROM ip_invoices +GROUP BY financial_year "; + $query = $this->db->query($sql); + //print_r($query->result()); + return $query->result(); + } + public function selectmonth($a,$b) + { + $sql="SELECT + monthname(invoice_date_created) as months +FROM ip_invoices +where case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = $a and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = $b+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = $a-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = $b and MONTH(invoice_date_created) <= 3 ) +end +GROUP BY months +ORDER BY FIELD(months, +'December', 'November', 'October', +'September', 'August', 'July', +'June', 'May', 'April', +'March', 'February', 'January') DESC, months ASC"; + $query = $this->db->query($sql,array($a,$b)); + + return $query->result(); + } + public function customer() + { + + $sql="SELECT client_name,client_id FROM ip_clients +order by client_name;"; + $query = $this->db->query($sql); + //print_r($a); + return $query->result(); + + } + + public function default_select() { $this->db->select('ip_invoice_item_amounts.*, ip_products.*, ip_invoice_items.*, Sgst_item_tax_rates.tax_rate_percent AS Sgst_item_tax_rate_percent, - Sgst_item_tax_rates.tax_rate_name AS Sgst_item_tax_rate_name,(((ip_invoice_items.item_quantity * ip_invoice_items.item_price) - (ip_invoice_items.item_quantity * ip_invoice_items.item_discount_amount)) * Sgst_item_tax_rates.tax_rate_percent /100) AS Sgst_item_tax_rate_amount,Cgst_item_tax_rates.tax_rate_percent AS Cgst_item_tax_rate_percent, + Sgst_item_tax_rates.tax_rate_name AS Sgst_item_tax_rate_name,(((ip_invoice_items.item_quantity * ip_invoice_items.item_price) - (ip_invoice_items.item_quantity * ip_invoice_items.item_discount_amount)) * Sgst_item_tax_rates.tax_rate_percent /100) AS Sgst_item_tax_rate_amount,Cgst_item_tax_rates.tax_rate_percent AS Cgst_item_tax_rate_percent, Cgst_item_tax_rates.tax_rate_name AS Cgst_item_tax_rate_name,(((ip_invoice_items.item_quantity * ip_invoice_items.item_price) - (ip_invoice_items.item_quantity * ip_invoice_items.item_discount_amount)) * Cgst_item_tax_rates.tax_rate_percent /100) AS Cgst_item_tax_rate_amount,Igst_item_tax_rates.tax_rate_percent AS Igst_item_tax_rate_percent, Igst_item_tax_rates.tax_rate_name AS Igst_item_tax_rate_name,(((ip_invoice_items.item_quantity * ip_invoice_items.item_price) - (ip_invoice_items.item_quantity * ip_invoice_items.item_discount_amount)) * Igst_item_tax_rates.tax_rate_percent /100) AS Igst_item_tax_rate_amount'); } @@ -40,6 +200,7 @@ class Mdl_Items extends Response_Model $this->db->join('ip_tax_rates AS Cgst_item_tax_rates', 'Cgst_item_tax_rates.tax_rate_id = ip_invoice_items.Cgst_item_tax_rate_id', 'left'); $this->db->join('ip_tax_rates AS Igst_item_tax_rates', 'Igst_item_tax_rates.tax_rate_id = ip_invoice_items.Igst_item_tax_rate_id', 'left'); $this->db->join('ip_products', 'ip_products.product_id = ip_invoice_items.item_product_id', 'left'); + } /** @@ -90,6 +251,35 @@ class Mdl_Items extends Response_Model 'label' => trans('item_date') ) ); + } + function get_product() + { + + //$this->db->select('product_id,product_description'); + + $this->db->join('ip_units unit','unit.unit_id = ip_products.unit_id'); + $this->db->from('ip_products'); + $query = $this->db->get(); + //print_r($query->result()); + + // print_r( $this->db->last_query()); + return $query->result(); + + } + + + + + function get_tax() + { + + $this->db->select('*'); + $this->db->from('ip_tax_rates'); + $query = $this->db->get(); + //print_r($query->result()); + //print_r( $this->db->last_query()); + return $query->result(); + } /** @@ -146,4 +336,79 @@ class Mdl_Items extends Response_Model $this->mdl_invoice_amounts->calculate($invoice_id); return $row; } + function get_quotes($client_id) + { + + $this->db->select('ip_quotes.quote_id,quote_number,quote_pono'); + // $this->db->join('ip_units unit','unit.unit_id = ip_products.unit_id'); + $this->db->from('ip_quotes'); + $this->db->join('ip_quote_items','ip_quote_items.quote_id = ip_quotes.quote_id'); + $this->db->where('client_id ',$client_id); + $this->db->where('item_status ',1); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + public function Check_invoice($invoice_id,$item_id) + { + $this->db->select('*'); + $this->db->from('ip_invoice_items'); + + $this->db->where('item_product_id',$item_id); + $this->db->where('invoice_id',$invoice_id); + + + + $query = $this->db->get(); + //print_r( $this->db->last_query()); + return $query->result(); + } + public function GetMaterialCode($itemproductid) + { + $this->db->select('product_sku'); + $this->db->from('ip_products'); + $this->db->where('product_id',$itemproductid); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + public function GetClientID($invoice_id) + { + $this->db->select('client_id'); + $this->db->from('ip_invoices'); + $this->db->where('invoice_id',$invoice_id); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + public function GetTransactionType($invoice_id) + { + + $this->db->select('creditinvoice_parent_id'); + $this->db->from('ip_invoices'); + $this->db->where('invoice_id',$invoice_id); + + $query = $this->db->get(); + return $query->result(); + + } + + + // public function CheckCredit($invoice_id) + // { + + // $this->db->select('Ref_No'); + // $this->db->from('T_Material_stock_history'); + // $this->db->where('Ref_No',$invoice_id); + + // $query = $this->db->get(); + + + // //print_r($this->db->last_query());die(); + // return $query->result(); + // } + } diff --git a/application/modules/invoices/models/Mdl_reports.php b/application/modules/invoices/models/Mdl_reports.php new file mode 100644 index 0000000..0b42d35 --- /dev/null +++ b/application/modules/invoices/models/Mdl_reports.php @@ -0,0 +1,1488 @@ +db->select('client_id, client_name, client_surname, CONCAT(client_name," ", client_surname) AS client_namesurname'); + + if ($from_date and $to_date and $client) { + + $from_date = date_to_mysql($from_date); + $to_date = date_to_mysql($to_date); + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + + ) AS quantity"); + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_date_created >=' . $this->db->escape($from_date) . ' + AND invoice_date_created <= ' . $this->db->escape($to_date) . ' and client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + )'); + + } + + else if ($from_date and $to_date) { + + $from_date = date_to_mysql($from_date); + $to_date = date_to_mysql($to_date); + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + + ) AS quantity"); + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_date_created >=' . $this->db->escape($from_date) . ' + AND invoice_date_created <= ' . $this->db->escape($to_date) . ' and invoice_status_id != 1 + )'); + + } else if ($a and $b and $c and $client){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = ' . $this->db->escape($c) . ' and client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + + )'); + + + + } + else if ($a and $b and $client){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + and case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + + + )'); + + + + } + else if ($a and $b and $c){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = ' . $this->db->escape($c) . ' and invoice_status_id != 1 + + )'); + + + + } + else if ($a and $b){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_status_id != 1 + and case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + + + )'); + + + + } + else if($client){ + // $a = date_to_mysql($a); + // $b = date_to_mysql($b); + // $c = date_to_mysql($c); + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE client_name = ' . $this->db->escape($client) . ' and invoice_status_id != 1 + + )'); + + + + } + //$this->db->group_by('client_namesurname,quantity,invoice_count'); + $this->db->order_by('client_namesurname'); + + return $this->db->get('ip_clients')->result(); + } + + /** + * @param null $from_date + * @param null $to_date + * @return mixed + */ + public function payment_history($from_date = null, $to_date = null) + { + $this->load->model('payments/mdl_payments'); + + if ($from_date and $to_date) { + $from_date = date_to_mysql($from_date); + $to_date = date_to_mysql($to_date); + + $this->mdl_payments->where('payment_date >=', $from_date); + $this->mdl_payments->where('payment_date <=', $to_date); + } + + return $this->mdl_payments->get()->result(); + } + + /** + * @return mixed + */ + // public function invoice_a() + // { + + // $sql="SELECT invoice_amount_id,invoice_id,invoice_sign,invoice_item_subtotal,invoice_tax_total,invoice_total FROM kasiram9_InvoiceDEV.ip_invoice_amounts;"; + // $query = $this->db->query($sql); + // return $query->result(); + // print_r($query); + // } + public function invoice_aging() + { + $this->db->select('client_name, client_surname'); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 1 DAY) + AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 30 DAY) + ) + ) AS range_1', false); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 30 DAY) + AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 60 DAY) + ) + ) AS range_2', false); + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 60 DAY) + AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 90 DAY) + ) + ) AS range_3', false); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 90 DAY) + ) + ) AS range_4', false); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(), INTERVAL 1 DAY) + ) + ) AS total_balance', false); + + $this->db->having('range_1 >', 0); + $this->db->or_having('range_2 >', 0); + $this->db->or_having('range_3 >', 0); + $this->db->or_having('range_4 >', 0); + $this->db->or_having('total_balance >', 0); + + return $this->db->get('ip_clients')->result(); + } + + + /** + * @param null $from_date + * @param null $to_date + * @param null $minQuantity + * @param null $maxQuantity + * @param bool $taxChecked + * @return mixed + */ + public function sales_by_year($from_date = null, $to_date = null, $minQuantity = null, $maxQuantity = null, $taxChecked = False) + { + if ($minQuantity == "") { + $minQuantity = 0; + } + + if ($from_date == "") { + $from_date = date("Y-m-d"); + } else { + $from_date = date_to_mysql($from_date); + } + + if ($to_date == "") { + $to_date = date("Y-m-d"); + } else { + $to_date = date_to_mysql($to_date); + } + + $from_date_year = intval(substr($from_date, 0, 4)); + $to_date_year = intval(substr($to_date, 0, 4)); + + $this->db->select('client_name as Name'); + $this->db->select('client_name'); + $this->db->select('client_surname'); + $this->db->select('CONCAT(client_name," ", client_surname) AS client_namesurname'); + + if ($taxChecked == false) { + + if ($maxQuantity) { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_item_subtotal) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) AND ' . $maxQuantity . ' >= + ( + SELECT SUM(amounts3.invoice_item_subtotal) FROM ip_invoice_amounts amounts3 + WHERE amounts3.invoice_id IN + ( + SELECT inv3.invoice_id FROM ip_invoices inv3 + WHERE inv3.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv3.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv3.invoice_date_created + ) + ) + ) + ) <>0'); + + } else { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select('client_name as Name'); + + $this->db->select(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_item_subtotal) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) + ) + ) <>0'); + + } + + } else if ($taxChecked == true) { + + if ($maxQuantity) { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select('client_name as Name'); + + $this->db->select(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_total) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) AND ' . $maxQuantity . ' >= + ( + SELECT SUM(amounts3.invoice_total) FROM ip_invoice_amounts amounts3 + WHERE amounts3.invoice_id IN + ( + SELECT inv3.invoice_id FROM ip_invoices inv3 + WHERE inv3.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv3.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv3.invoice_date_created + ) + ) + ) + ) <>0'); + + } else { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select('client_name as Name'); + + $this->db->select(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_total) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) + ) + ) <>0'); + + } + + } + + $this->db->order_by('client_namesurname'); + return $this->db->get('ip_clients')->result(); + } + public function cumulative_report() + { + $sql="select distinct Year.client_id,Year.client_name,Year.product_id,Year.product_name,Year.invoice_count,Year.Qty,Year.Value,Month.Qty as MQty,Month.Value as MValue,Today.Qty as TQty,Today.Value as TValue from + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_name,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE)+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE)-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) <= 3 ) + end and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Year left join + + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_name,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where month(invoice.invoice_date_created)=month(CURRENT_DATE()) and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Month on Year.client_name = Month.client_name and Year.product_id = Month.product_id + + left join + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_name,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where invoice.invoice_date_created=CURRENT_DATE and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Today on Year.client_name = Today.client_name and Year.product_id = Today.product_id + + group by Year.client_id,Year.product_id;"; + $query = $this->db->query($sql); + return $query->result(); + + } + + + public function cumulative_report_year($clientid,$productid) + { + + $sql = "SELECT invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_name,items.item_quantity as Qty,amt.item_subtotal as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE)+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE)-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) <= 3 ) + end + and invoice.invoice_status_id != 1 and invoice.client_id = ? and items.item_product_id = ?"; + + + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + + + } + + public function cumulative_report_month($clientid,$productid) + { + $sql = "SELECT invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_name,items.item_quantity as MQty,amt.item_subtotal as MValue from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where month(invoice.invoice_date_created)=month(CURRENT_DATE()) and invoice.invoice_status_id != 1 + and invoice.client_id = ? and items.item_product_id = ?"; + + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + } + + public function cumulative_report_day($clientid,$productid) + { + + $sql = "SELECT invoice.invoice_number as invoice_number,invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_name,items.item_quantity as TQty,amt.item_subtotal as TValue from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where invoice.invoice_date_created=CURRENT_DATE and invoice.invoice_status_id != 1 and + invoice.client_id = ? and items.item_product_id = ? + "; + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + + } + public function sales($cust=null,$prod=null,$a=null,$b=null,$c=null,$from=null,$to=null) + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 "; + + + if ($prod!= ''){ + + $sql.="and iit.item_description = '".$prod."'"; + + } + + if ($cust!= '') + { + $sql.="and ic.client_name = '".$cust."'"; + } + if ($a and $b != ''){ + + $sql.=" and (ii.invoice_date_created >= '".$a."-04-01' and ii.invoice_date_created <= '".$b."-03-31')"; + + } + + if ($c!= ''){ + + $sql.="and monthname(ii.invoice_date_created) = '".$c."'"; + + } + + if ($from and $to != ''){ + $fromdate= date("Y-m-d",strtotime($from)); + $todate=date("Y-m-d",strtotime($to)); + + $sql.="and ii.invoice_date_created >= '".$fromdate."' + and ii.invoice_date_created <= '".$todate."'"; + + } + + + // echo $fromdate; + // echo $sql; + $sql.="group by invoice_number,item_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + public function sales_l($cname=null,$fa=null,$aa=null,$m=null,$frm=null,$t=null,$prod=null,$datec=null,$dmon=null) + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 "; + + + + if ($cname!= ''){ + + $sql.="and ic.client_name = '".$cname."'"; + + } + + + + if ($fa and $aa != ''){ + + $sql.=" and (ii.invoice_date_created >= '".$fa."-04-01' and ii.invoice_date_created <= '".$aa."-03-31')"; + + } + if ($m!= ''){ + + $sql.="and monthname(ii.invoice_date_created) = '".$m."'"; + + } + + if ($frm and $t != ''){ + $fromd= date("Y-m-d",strtotime($frm)); + $tod=date("Y-m-d",strtotime($t)); + + $sql.="and ii.invoice_date_created >= '".$fromd."' + and ii.invoice_date_created <= '".$tod."'"; + + } + if ($prod!= ''){ + + $sql.=" and iit.item_description = '".$prod."' "; + + } + if ($dmon!= ''){ + $mon=substr($dmon,0,-5); + $mony=substr($dmon,3,4); + + $sql.="and year(ii.invoice_date_created) = year(CURRENT_DATE()) and month(ii.invoice_date_created) = MONTH(CURRENT_DATE())"; + + } + if ($datec!= ''){ + + $sql.="and ii.invoice_date_created = '".$datec."'"; + + } + + + // echo $mon; + // echo $mony; + // echo $sql; + $sql.=" group by invoice_number,item_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + public function sales_dashboard() + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 and ii.invoice_date_created = CURRENT_DATE"; + $sql.=" group by invoice_number,item_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + +} diff --git a/application/modules/invoices/models/view.php b/application/modules/invoices/models/view.php new file mode 100644 index 0000000..0ab14f9 --- /dev/null +++ b/application/modules/invoices/models/view.php @@ -0,0 +1,787 @@ +controller->view_data["custom_values"]; +$data=array(); +//print_r($cv); +$CustomVal = ''; +$Secondary = ''; + +//echo $quoteid; +//echo($qid); + +if($quoteid == '' && $qid != '') +{ + $quo = $qid; +} + +else if($qid == '' && $quoteid != '') +{ + $quo = $quoteid; +} + +else if($quoteid != '' || $qid != '') +{ + $quo = $qid; +} + +else +{ + $quo = ''; +} + + + + +if(!empty($Duedate)) +{ + foreach ($Duedate as $Due) + { + $CustomVal = $Due->client_custom_fieldvalue; + } +} + + +if(!empty($GetSecondary)) +{ + foreach ($GetSecondary as $GetSec) + { + $Secondary = $GetSec->Secondary; + } + + +} + + $inv_st=''; + //print_r($inv_status); + +foreach($inv_status as $st) +{ + $inv_st= $st->invoice_status_id; +} + +//echo $inv_st; + +$primarystatecode=''; +foreach ($GetClientPrimaryStateCode as $primary) +{ + $primarystatecode=$primary->client_custom_fieldvalue; +} + +$secondarystatecode=''; + +foreach ($GetClientSecondaryStateCode as $secondary) +{ + $secondarystatecode=$secondary->client_custom_fieldvalue; +} + + + + +//print_r($fields); +// echo $secondarystatecode; +// echo $primarystatecode; +//print_r($quotes); + + // echo $CustomVal ; +?> + + + + + +config->item('disable_read_only') == true) { + $invoice->is_read_only = 0; +} +?> + +
+

+ + + + invoice_status_id == 1 && !$invoice->creditinvoice_parent_id) { ?> + + +

+ + +
+ + + + + + + + +
+ + +
+ + + + +
+ +
+ + + + +
+ +
+ invoice_is_recurring) { ?> + + + is_read_only == 1) { ?> + + + + +
+ +
+ +
+ + + layout->load_view('layout/alerts'); ?> + + +
+
+ +
+
+ +
+
+

Primary Address

+ layout->load_view('clients/partial_client_address', array('client' => $invoice)); ?> +
+
+ + + + + + + + + + client_phone || $invoice->client_email) : ?> +
+ + client_phone): ?> +
+ :  + client_phone); ?> +
+ + client_email): ?> +
+ :  + client_email; ?> +
+ + +
+ +

+ +
+
+
+ + invoice_sign == -1) { ?> +
+
+   + mdl_invoices->get_parent_invoice_number($invoice->creditinvoice_parent_id); + echo anchor('/invoices/view/' . $invoice->creditinvoice_parent_id, $parent_invoice_number); + ?> +
+
+ + +
+ +
+ + + invoice_number) : ?> + value="invoice_number; ?>" + + placeholder="" + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + +
+ + +
+ + +
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 0 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + + + +
+ + +
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 4 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 5 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 6 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + +
+
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 1){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 2 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> +
+ custom_field_order == 3 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> +
+
+ custom_field_order == 16 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> +
+ + + + +
+ + + + + + +
+
+
+
+ + +
+ + layout->load_view('invoices/partial_item_table',$invoice_id); ?> + + +
+ +
+
+ is_read_only != 1 || $invoice->invoice_status_id != 4) { ?> + + + + +
+
+ + + + + diff --git a/application/modules/invoices/views/partial_item_table.php b/application/modules/invoices/views/partial_item_table.php index 0312b65..0138ecd 100644 --- a/application/modules/invoices/views/partial_item_table.php +++ b/application/modules/invoices/views/partial_item_table.php @@ -1,241 +1,188 @@ + +is_read_only; + +//echo $readonlycheck; + +$invqty=0; + +foreach($clientid as $c) +{ + $client = $c->client_id; +} + +if(!empty($items)) +{ +foreach($items as $item) +{ + +$invqty=$item->item_quantity; +} +} + + +//print_r($items); + + +$inv_st=''; + +if(!empty($GetSecondary)) +{ + foreach ($GetSecondary as $GetSec) + { + $Secondary = $GetSec->Secondary; + } + + +} + +//echo $Secondary; + +if(!empty($GetState)) +{ + foreach ($GetState as $GetState) + { + $State = $GetState->client_state; + } + + +} + +// print_r($statecode); + +$primarystatecode=''; +foreach ($GetClientPrimaryStateCode as $primary) +{ + $primarystatecode=$primary->client_custom_fieldvalue; +} + +$secondarystatecode=''; + +foreach ($GetClientSecondaryStateCode as $secondary) +{ + $secondarystatecode=$secondary->client_custom_fieldvalue; +} + +?> + + + + + + + + + + + + +
- - - - - - - - - - - - - - +

+

+ + + + + + + + + + + + + + +
+
+ - - - - -
- -
- - sumex_id == ""): ?> - - - - - - - - - - - - - - - - - + - - - - sumex_id == ""): ?> - - - - + for($i = $product->product_id; $i <= $product->product_id; $i++): ?> + + + - - - - - + + + + + + + + - + + - - + - - + + + + - - - - -
- - is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> - - -
- - is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> -
-
-
- - -
-
-
- - is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> -
-
-
- -
- - -
- - is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> -
-
-
- - is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> -
-
-
- - is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> -
-
-
- -
+ +
+ +
+ +
+ -
-
-
- - + +
+ -
-
-
- - + +
+ -
-
+ + + + is_read_only != 1): ?> @@ -292,133 +239,682 @@
-
-
+
+ + + + + + +
is_read_only != 1) { ?> + + + +
-
-
- is_read_only != 1) { ?> - - - - - - - - - - - -
+

+ +
+ layout->load_view('upload/dropzone-invoice-html'); ?> + layout->load_view('upload/dropzone-invoice-scripts'); ?>
- -

- -
+ +
+ class="amount" id="subtotal">invoice_item_subtotal); ?> - + - - - - - - - - - - + + + +
invoice_item_subtotal); ?>
invoice_item_tax_total); ?>invoice_item_tax_total); ?>
-
-
- is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> -
-
-
-
-
- is_read_only == 1) { - echo 'disabled="disabled"'; - } ?>> -
%
-
-
-
invoice_total); ?>
invoice_total); ?>
-
\ No newline at end of file + + + +
+ + + + diff --git a/application/modules/invoices/views/view.php b/application/modules/invoices/views/view.php index 6f7f75b..1ee728a 100644 --- a/application/modules/invoices/views/view.php +++ b/application/modules/invoices/views/view.php @@ -1,7 +1,36 @@ controller->view_data["custom_values"]; +$data=array(); +//print_r($cv); $CustomVal = ''; $Secondary = ''; + +//echo $quoteid; +//echo($qid); + +if($quoteid == '' && $qid != '') +{ + $quo = $qid; +} + +else if($qid == '' && $quoteid != '') +{ + $quo = $quoteid; +} + +else if($quoteid != '' || $qid != '') +{ + $quo = $qid; +} + +else +{ + $quo = ''; +} + + + + if(!empty($Duedate)) { foreach ($Duedate as $Due) @@ -9,16 +38,54 @@ if(!empty($Duedate)) $CustomVal = $Due->client_custom_fieldvalue; } } + + if(!empty($GetSecondary)) { foreach ($GetSecondary as $GetSec) { $Secondary = $GetSec->Secondary; } + + } + $inv_st=''; + //print_r($inv_status); + +foreach($inv_status as $st) +{ + $inv_st= $st->invoice_status_id; +} + +//echo $inv_st; + +$primarystatecode=''; +foreach ($GetClientPrimaryStateCode as $primary) +{ + $primarystatecode=$primary->client_custom_fieldvalue; +} + +$secondarystatecode=''; + +foreach ($GetClientSecondaryStateCode as $secondary) +{ + $secondarystatecode=$secondary->client_custom_fieldvalue; +} + + + + +//print_r($fields); +// echo $secondarystatecode; +// echo $primarystatecode; +//print_r($custom_fields); + + // echo $CustomVal ; ?> + + +function get_quotes(q) +{ + //alert(q); + + + var adID = q[q.selectedIndex].value; // get ID + var adVALUE = q[q.selectedIndex].id; + var invoice_id=inv_id; + //alert(invoice_id) + $('#quote').val(adVALUE); + // $('#quoteid').val(adVALUE); + $.ajax + ({ + + data:{qid:adVALUE,quno:adID,invoice_id:invoice_id}, + type:"POST", + dataType:"json", + url:"index.php/invoices/get_quote_items", + success:function(json) + { + //alert('Succes') + //alert(json.quotedetails[0]['item_name']) + + selectedquotedetails=json.quotedetails; + // console.log(selectedquotedetails); + + + var last_item_row = $('#item_table tbody:last'); + last_item_row.find('input[name=item_name]').val(json.quotedetails[0]['item_name']); + last_item_row.find('input[name=item_price]').val(json.quotedetails[0]['item_price']); + last_item_row.find('input[name= item_quantity]').val(json.quotedetails[0]['item_balancequantity']); + + last_item_row.find('input[name= item_product_id]').val(json.quotedetails[0]['item_product_id']); + + $('#item_name1').val(json.quotedetails[0]['item_name']); + $('#item_price1').val(json.quotedetails[0]['item_price']); + $('#item_quantity1').val(json.quotedetails[0]['item_balancequantity']); + $('#item_product_id1').val(json.quotedetails[0]['item_product_id']); + + + var uom= json.quotedetails[0]['unit_id']; + var sgst= json.quotedetails[0]['Sgst_item_tax_rate_id']; + var cgst= json.quotedetails[0]['Cgst_item_tax_rate_id']; + var igst= json.quotedetails[0]['Igst_item_tax_rate_id']; + var item= json.quotedetails[0]['item_description']; + var itemproductid= json.quotedetails[0]['']; + + var dropdownuom = document.getElementById('item_product_unit_id1'); + + //alert(dropdownuom); + + if(dropdownuom <=0) + { + alert('Please add a row before selecting the Sales Order') + } + + else + { + + var uomlength=dropdownuom.length; + for(var i=0;i<=uomlength;i++) + { + + var ouom=document.getElementById("item_product_unit_id1").options[i].text; + var optuom=document.getElementById("item_product_unit_id1").options[i].text; + //var optauom = optuom.substr(0,optsgst.indexOf('%')); + var optuomval=document.getElementById("item_product_unit_id1").options[i].value; + + if(uom==optuomval) + { + // alert('uomif') + + // $('[name=item_product_unit_id]').val(optuomval); + $('#item_product_unit_id1').val(optuomval); + break; + } + + } + + var dropdownsgst=document.getElementById('Sgst_item_tax_rate_id1'); + var sgstlength=dropdownsgst.length; + + for(var i=0;i + diff --git a/application/modules/invoices/views/view_asn.php b/application/modules/invoices/views/view_asn.php new file mode 100644 index 0000000..06a9483 --- /dev/null +++ b/application/modules/invoices/views/view_asn.php @@ -0,0 +1,600 @@ +controller->view_data["custom_values"]; +$CustomVal = ''; +$Secondary = ''; +if(!empty($Duedate)) +{ + foreach ($Duedate as $Due) + { + $CustomVal = $Due->client_custom_fieldvalue; + } +} +if(!empty($GetSecondary)) +{ + foreach ($GetSecondary as $GetSec) + { + $Secondary = $GetSec->Secondary; + } +} + +?> + + + +config->item('disable_read_only') == true) { + $invoice->is_read_only = 0; +} +?> + +
+

+ invoice_number ? '#' . $invoice->invoice_number : $invoice->invoice_id); + ?> +

+ +
+ +
+ + + + +
+ + is_read_only != 1 || $invoice->invoice_status_id != 4) { ?> + + + + +
+ +
+ invoice_is_recurring) { ?> + + + is_read_only == 1) { ?> + + + + +
+ +
+ +
+ + layout->load_view('layout/alerts'); ?> + +
+
+ +
+
+ +

+ + + + invoice_status_id == 1 && !$invoice->creditinvoice_parent_id) { ?> + + +

+
+
+ layout->load_view('clients/partial_client_address', array('client' => $invoice)); ?> +
+
+
+ + + + + + + + client_phone || $invoice->client_email) : ?> +
+ + client_phone): ?> +
+ :  + client_phone); ?> +
+ + client_email): ?> +
+ :  + client_email; ?> +
+ + +
+ +

+ +
+
+
+ + invoice_sign == -1) { ?> +
+
+   + mdl_invoices->get_parent_invoice_number($invoice->creditinvoice_parent_id); + echo anchor('/invoices/view/' . $invoice->creditinvoice_parent_id, $parent_invoice_number); + ?> +
+
+ + +
+ +
+ + invoice_number) : ?> + value="invoice_number; ?>" + + placeholder="" + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+ +
+ + +
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+
+ +
+ + +
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+
+ + + custom_field_label;} + $str = $invoice->client_name; + $str = str_replace(' ', '',$str); + $str = strtolower($str); + $str1 = strtolower("ASHOKLEYLANDLIMITED"); + if (($key = array_search("ASN Number",$labelfilter)) !== false && strpos($str,$str1) === false) {unset($labelfilter[$key]);unset($custom_fields[$key]);} + if (($key = array_search("ASN Date",$labelfilter)) !== false && strpos($str,$str1) === false) {unset($labelfilter[$key]);unset($custom_fields[$key]);} + ?> + + custom_field_location != 1) { + continue; + } ?> + mdl_invoices, $custom_field, $cv); ?> + + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+
+ + invoice_status_id != 1) { ?> +
+
+ +
+ + + + +
+
+
+ + +
+
+
+ +
+ +
+ + layout->load_view('invoices/partial_item_table'); ?> + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +

+ +
+
+ + layout->load_view('upload/dropzone-invoice-html'); ?> + +
+
+ + +
+ +
+
+ +layout->load_view('upload/dropzone-invoice-scripts'); ?> + diff --git a/application/modules/invoices_1/controllers/Ajax.php b/application/modules/invoices_1/controllers/Ajax.php new file mode 100644 index 0000000..c1b2c29 --- /dev/null +++ b/application/modules/invoices_1/controllers/Ajax.php @@ -0,0 +1,913 @@ +load->model('invoices/mdl_items'); + $this->load->model('invoices/mdl_invoices'); + $this->load->model('units/mdl_units'); + $this->load->model('invoices/mdl_invoice_sumex'); + + $this->load->library('email'); + + $invoice_id = $this->input->post('invoice_id'); + + + // $quoteid = $this->input->post('quoteid '); + + // echo $quoteid; + // die(); + + + $this->mdl_invoices->set_id($invoice_id); + + if ($this->mdl_invoices->run_validation('validation_rules_save_invoice')) { + $items = json_decode($this->input->post('items')); + + $quoteid = $this->input->post('quoteid'); + $qu = $this->input->post('qu'); + + + if(($quoteid == 0) && ($qu !=0)) + { + $quoteid1=$qu; + } + + else + { + $quoteid1=$quoteid; + } + + ///echo $quoteid1; + // print_r($items); + + //die(); + //print_r($items); + //die(); + foreach ($items as $item) { + + // Check if an item has either a quantity + price or name or description + if (!empty($item->item_name)) { + + + $item->item_quantity = ($item->item_quantity ? standardize_amount($item->item_quantity) : floatval(0)); + + $item->item_price = ($item->item_price ? standardize_amount($item->item_price) : floatval(0)); + + $item->item_discount_amount = ($item->item_discount_amount) ? standardize_amount($item->item_discount_amount) : null; + + $item->item_product_id = ($item->item_product_id ? $item->item_product_id : null); + + $itemproductid= $item->item_product_id; + $itemprice = $item->item_price; + $itemqty = $item->item_quantity; + + + // echo $item->item_price; + // die(); + + if($quoteid1 != 0) + { + + + $reqqty= $this->mdl_invoices->GetOrder_qty($quoteid1,$itemproductid); + + $qidcheck= $this->mdl_invoices->Check_Qid($quoteid1); + + $item_chek =$this->mdl_invoices->check_item($quoteid1,$itemproductid); + + //echo count($item_chek); + //echo "
"; + + //die(); + $innv=''; + $Isqid=''; + + + foreach($qidcheck as $q) + { + $Isqid = $q->quotecount; + $Isinv = $q->invoice_id; + + if($Isinv == $invoice_id) + { + $innv = 1; + } + + } + + if($innv == 1) + { + $invorderdqty= $this->mdl_invoices->GetInvOrdered($invoice_id); + + foreach($invorderdqty as $in) + { + $previousorder= $in->item_quantity; + } + } + + else if($Isqid !='') + { + + $invorderdqty= $this->mdl_invoices->GetquoteOrdered($quoteid1); + + foreach($invorderdqty as $in) + { + $previousorder= $in->item_suppliedquantity; + + } + } + + + // echo $Isqid; + // die(); + $orderqty=0; + $supqty=0; + $balqty=0; + + if(!empty($reqqty)) + { + + foreach($reqqty as $req) + { + $orderqty = $req->orderedqty; + $supqty = $req->supqty; + $balqty = $req->balqty; + } + } + + // echo "or".$orderqty."sup".$supqty."bal".$balqty."pre".$previousorder; + // die(); + + $oqty =$orderqty; + + if($innv == 1) + { + $suppliedqty = $item->item_quantity+$supqty-$previousorder; + $balanceqty = $oqty - $suppliedqty; + + } + + else if($Isqid !='') + { + $suppliedqty=$item->item_quantity+$previousorder; + $balanceqty = $oqty - $suppliedqty; + + } + + + + else + { + + $suppliedqty = ($item->item_quantity); + $balanceqty = ($oqty - ($item->item_quantity)); + } + + + if($balanceqty == 0) + { + $item_status="0"; + } + + else + { + $item_status ="1"; + } + + $updatearray = array('item_balancequantity'=>$balanceqty,'item_suppliedquantity'=>$suppliedqty,'item_status'=>$item_status); + + //print_r($updatearray); + // die(); + if(count($item_chek) !=0) + { + $quoteupdate= $this->mdl_invoices->Update_Qty($quoteid1,$updatearray,$itemproductid); + } + } + + else + { + $oqty =$item->item_quantity; + $suppliedqty =$oqty; + $balanceqty = 0; + + } + + // + $item->item_product_unit_id = ($item->item_product_unit_id ? $item->item_product_unit_id : null); + + $item->item_product_unit = $this->mdl_units->get_name($item->item_product_unit_id, $item->item_quantity); + + $item_id = ($item->item_id) ?: null; + + + unset($item->item_id); + + if (!$item->item_task_id) + { + unset($item->item_task_id); + } + else + { + $this->load->model('tasks/mdl_tasks'); + $this->mdl_tasks->update_status(4, $item->item_task_id); + } + // print_r($item); + // die(); + + // $prodate = + + $dt = new DateTime('now', new DateTimeZone('Asia/Kolkata')); + $prodate = $dt->format('Y-m-d'); + + +$productcheck = $this->mdl_items->Check_invoice($invoice_id,$itemproductid); + +//echo count($productcheck); + +$iten_check = count($productcheck); + +//echo $iten_check; + +if($iten_check>0) +{ + + $final_productarray=array('ProductCode'=>$itemproductid,'Quantity'=>$itemqty,'Price'=>$itemprice,'Transactiondate'=>$prodate); + + $savefinal = $this->mdl_items->UpdateFinalHistory($final_productarray,$invoice_id,$itemproductid); + +} + +else +{ + $invoice_details= $this->mdl_items->GetInvoiceDeatisl($invoice_id); + $inv_no=''; + + if(!empty($invoice_details)) + { + foreach($invoice_details as $in) + { + $inv_no = $in->invoice_number; + } + } + + + $finalhistory= array('RefID'=>$inv_no,'invoice_id'=>$invoice_id,'TransactionType'=>'Outward','ProductCode'=>$itemproductid,'Quantity'=>$itemqty,'Price'=>$itemprice,'Transactiondate'=>$prodate); + + $saveinvhistory=$this->mdl_items->SaveFinalHistory($finalhistory); +} + // echo $invoice_id; + //echo $item_id; + $invexist= $this->mdl_items->Check_invoice($invoice_id,$item_id); + + //echo count($invexist); + //die(); + $this->mdl_items->save($item_id, $item); + + + + + + } + + else + { + // Throw an error message and use the form validation for that + $this->load->library('form_validation'); + // $this->form_validation->set_rules('item_name', trans('item'), 'required'); + $this->form_validation->run(); + + $response = array( + 'success' => 0, + 'validation_errors' => array( + 'item_name' => form_error('item_name', '', ''), + ) + ); + + echo json_encode($response); + exit; + } + } + + + $invoicedetails=array('invoice_id'=>$invoice_id,'quote_id'=>$quoteid1); + + $InvId_check= $this->mdl_invoices->CheckInvId($invoice_id); + + + + foreach($InvId_check as $idc) + { + $cid = $idc->invcount; + } + + + if($quoteid1 !=0) + { + if($cid == 0) + { + + $saveinvtable=$this->mdl_invoices->Save_quote_to_invtable($invoicedetails); + } + } + + + $invoice_status = $this->input->post('invoice_status_id'); + + //echo $invoice_status; + + + if ($this->input->post('invoice_discount_amount') === '') + { + $invoice_discount_amount = floatval(0); + } + else + { + $invoice_discount_amount = $this->input->post('invoice_discount_amount'); + } + + + + if ($this->input->post('invoice_discount_percent') === '') { + $invoice_discount_percent = floatval(0); + } else { + $invoice_discount_percent = $this->input->post('invoice_discount_percent'); + } + + // Generate new invoice number if needed + $invoice_number = $this->input->post('invoice_number'); + + if (empty($invoice_number) && $invoice_status != 1) { + $invoice_group_id = $this->mdl_invoices->get_invoice_group_id($invoice_id); + $invoice_number = $this->mdl_invoices->get_invoice_number($invoice_group_id); + } + + + + $db_array = array( + 'invoice_number' => $invoice_number, + 'invoice_terms' => $this->input->post('invoice_terms'), + 'invoice_date_created' => date_to_mysql($this->input->post('invoice_date_created')), + 'invoice_date_due' => date_to_mysql($this->input->post('invoice_date_due')), + 'invoice_password' => $this->input->post('invoice_password'), + 'invoice_status_id' => $invoice_status, + 'payment_method' => $this->input->post('payment_method'), + 'invoice_discount_amount' => standardize_amount($invoice_discount_amount), + 'invoice_discount_percent' => standardize_amount($invoice_discount_percent), + ); + + + //print_r($db_array); + + + + // check if status changed to sent, the feature is enabled and settings is set to sent + if ($this->config->item('disable_read_only') === false) { + if ($invoice_status == get_setting('read_only_toggle')) { + $db_array['is_read_only'] = 1; + } + } + + $this->mdl_invoices->save($invoice_id, $db_array); + $sumexInvoice = $this->mdl_invoices->where('sumex_invoice', $invoice_id)->get()->num_rows(); + + + + if ($sumexInvoice >= 1) { + $sumex_array = array( + 'sumex_invoice' => $invoice_id, + 'sumex_reason' => $this->input->post('invoice_sumex_reason'), + 'sumex_diagnosis' => $this->input->post('invoice_sumex_diagnosis'), + 'sumex_treatmentstart' => date_to_mysql($this->input->post('invoice_sumex_treatmentstart')), + 'sumex_treatmentend' => date_to_mysql($this->input->post('invoice_sumex_treatmentend')), + 'sumex_casedate' => date_to_mysql($this->input->post('invoice_sumex_casedate')), + 'sumex_casenumber' => $this->input->post('invoice_sumex_casenumber'), + 'sumex_observations' => $this->input->post('invoice_sumex_observations') + ); + $this->mdl_invoice_sumex->save($invoice_id, $sumex_array); + } + + + + + // Recalculate for discounts + $this->load->model('invoices/mdl_invoice_amounts'); + // $this->mdl_invoice_amounts->calculate($invoice_id); + + $response = array( + 'success' => 1, + ); + } else { + $this->load->helper('json_error'); + $response = array( + 'success' => 0, + 'validation_errors' => json_errors() + ); + } + //print_r($this->input->post('custom')); +$values = []; + if($quoteid1 == 0) + { + // Save all custom fields + if ($this->input->post('custom')) { + + //print_r($this->input->post('custom')); + + $varray=$this->input->post('custom'); + + + $db_array = array(); + + + foreach ($this->input->post('custom') as $custom) + { + + // print_r($custom); + if (preg_match("/^(.*)\[\]$/i", $custom['name'], $matches)) + { + $values[$matches[1]][] = $custom['value']; + + //echo $custom['value']; + } + + else + { + $values[$custom['name']] = $custom['value']; + + //echo $values[$custom['name']]; + } + } + + foreach ($values as $key => $value) + { + + preg_match("/^custom\[(.*?)\](?:\[\]|)$/", $key, $matches); + if ($matches) + { + + $db_array[$matches[1]] = $value; + } + } + + + $this->load->model('custom_fields/mdl_invoice_custom'); + + + $result = $this->mdl_invoice_custom->save_custom($invoice_id, $db_array); + +//die(); + if ($result !== true) { + $response = array( + 'success' => 0, + 'validation_errors' => $result + ); + + echo json_encode($response); + exit; + } + } + } + + else + { +//$this->load->model('invoices/mdl_items'); + + if ($this->input->post('custom')) { + + // print_r($this->input->post('custom')); + + $varray=$this->input->post('custom'); + + $Quotecustomvalue= $this->mdl_items->get_quoteproduct($quoteid1); + // print_r($Quotecustomvalue); + + + $pono = $Quotecustomvalue[0]->quote_pono; + $dmy = date('d-m-Y',strtotime($Quotecustomvalue[0]->po_date_created)); + + // echo $pono; + // echo $dmy; + // die(); + + + $db_array = array(); + + + foreach ($this->input->post('custom') as $custom) + { + + + if (preg_match("/^(.*)\[\]$/i", $custom['name'], $matches)) + { + $values[$matches[1]][] = $custom['value']; + + + } + + else + { + $values[$custom['name']] = $custom['value']; + + + } + } + + foreach ($values as $key => $value) + { + + if(($key !="custom[15]") && ($key !="custom[14]")) + { + + + + }else{ + + if($key == "custom[14]") + { + $value=$pono; + } + else if($key == "custom[15]") + { + $value=$dmy; + } + + } + + preg_match("/^custom\[(.*?)\](?:\[\]|)$/", $key, $matches); + if ($matches) + { + + $db_array[$matches[1]] = $value; + } + + + // print_r($db_array); + $this->load->model('custom_fields/mdl_invoice_custom'); + + + $result = $this->mdl_invoice_custom->save_custom($invoice_id, $db_array); + + + } + //print_r($db_array); + + if ($result !== true) { + $response = array( + 'success' => 0, + 'validation_errors' => $result + ); + + echo json_encode($response); + exit; + } + } + + + + + + + } + + echo json_encode($response); + } + + + + + public function save_invoice_tax_rate() + { + + + $this->load->model('invoices/mdl_invoice_tax_rates'); + + if ($this->mdl_invoice_tax_rates->run_validation()) { + $this->mdl_invoice_tax_rates->save(); + + $response = array( + 'success' => 1 + ); + } else { + $response = array( + 'success' => 0, + 'validation_errors' => $this->mdl_invoice_tax_rates->validation_errors + ); + } + + echo json_encode($response); + } + + public function create() + { + $this->load->model('invoices/mdl_invoices'); + $this->load->model('invoices/mdl_items'); + + if ($this->mdl_invoices->run_validation()) { + $invoice_id = $this->mdl_invoices->create(); + + $response = array( + 'success' => 1, + //'drpcheck'=>$dropcheck, + 'invoice_id' => $invoice_id + ); + } else { + $this->load->helper('json_error'); + $response = array( + 'success' => 0, + 'validation_errors' => json_errors() + ); + } + + // $invoice_details= $this->mdl_items->GetInvoiceDeatis($invoice_id); + // $inv_no=''; + + // if(!empty($invoice_details)) + // { + // foreach($invoice_details as $in) + // { + // $inv_no = $in->invoice_number; + // } + // } + + // $finalhistory= array('RefID'=>$inv_no,'invoice_id'=>$invoice_id,'TransactionType'=>'Outward'); + // $saveinvhistory=$this->mdl_items->SaveFinalHistory($finalhistory); + + echo json_encode($response); + } + + public function create_recurring() + { + $this->load->model('invoices/mdl_invoices_recurring'); + + if ($this->mdl_invoices_recurring->run_validation()) { + $this->mdl_invoices_recurring->save(); + + $response = array( + 'success' => 1, + ); + } else { + $this->load->helper('json_error'); + $response = array( + 'success' => 0, + 'validation_errors' => json_errors() + ); + } + + echo json_encode($response); + } + + public function get_item() + { + $this->load->model('invoices/mdl_items'); + + $item = $this->mdl_items->get_by_id($this->input->post('item_id')); + print_r($item); + echo json_encode($item); + } + + public function modal_create_invoice() + { + + + $this->load->module('layout'); + $this->load->model('invoice_groups/mdl_invoice_groups'); + $this->load->model('tax_rates/mdl_tax_rates'); + $this->load->model('clients/mdl_clients'); + + $data = array( + 'invoice_groups' => $this->mdl_invoice_groups->get()->result(), + 'tax_rates' => $this->mdl_tax_rates->get()->result(), + 'client' => $this->mdl_clients->get_by_id($this->input->post('client_id')), + 'clients' => $this->mdl_clients->get_latest(), + ); + + $this->layout->load_view('invoices/modal_create_invoice', $data); + } + + + + // public function modal_create_poinvoice() + // { + + + // $this->load->module('layout'); + // $this->load->model('invoice_groups/mdl_invoice_groups'); + // $this->load->model('tax_rates/mdl_tax_rates'); + // $this->load->model('clients/mdl_clients'); + + // $data = array( + // 'invoice_groups' => $this->mdl_invoice_groups->get()->result(), + // 'tax_rates' => $this->mdl_tax_rates->get()->result(), + // 'client' => $this->mdl_clients->get_by_id($this->input->post('client_id')), + // 'clients' => $this->mdl_clients->get_latest(), + // ); + + // $this->layout->load_view('invoices/modal_create_poinvoice', $data); + // } + + + + public function test() + { + + echo "erv"; + + + } + + + + + + public function modal_create_recurring() + { + $this->load->module('layout'); + + $this->load->model('mdl_invoices_recurring'); + + $data = array( + 'invoice_id' => $this->input->post('invoice_id'), + 'recur_frequencies' => $this->mdl_invoices_recurring->recur_frequencies + ); + + $this->layout->load_view('invoices/modal_create_recurring', $data); + } + + public function get_recur_start_date() + { + $invoice_date = $this->input->post('invoice_date'); + $recur_frequency = $this->input->post('recur_frequency'); + + echo increment_user_date($invoice_date, $recur_frequency); + } + + public function modal_change_client() + { + $this->load->module('layout'); + $this->load->model('clients/mdl_clients'); + + $data = array( + 'client_id' => $this->input->post('client_id'), + 'invoice_id' => $this->input->post('invoice_id'), + 'clients' => $this->mdl_clients->get_latest(), + ); + + $this->layout->load_view('invoices/modal_change_client', $data); + } + + public function change_client() + { + $this->load->model('invoices/mdl_invoices'); + $this->load->model('clients/mdl_clients'); + + // Get the client ID + $client_id = $this->input->post('client_id'); + $client = $this->mdl_clients->where('ip_clients.client_id', $client_id)->get()->row(); + + if (!empty($client)) { + $invoice_id = $this->input->post('invoice_id'); + + $db_array = array( + 'client_id' => $client_id, + ); + $this->db->where('invoice_id', $invoice_id); + $this->db->update('ip_invoices', $db_array); + + $response = array( + 'success' => 1, + 'invoice_id' => $invoice_id, + ); + } else { + $this->load->helper('json_error'); + $response = array( + 'success' => 0, + 'validation_errors' => json_errors() + ); + } + + echo json_encode($response); + } + + public function modal_copy_invoice() + { + $this->load->module('layout'); + + $this->load->model('invoices/mdl_invoices'); + $this->load->model('invoice_groups/mdl_invoice_groups'); + $this->load->model('tax_rates/mdl_tax_rates'); + + $data = array( + 'invoice_groups' => $this->mdl_invoice_groups->get()->result(), + 'tax_rates' => $this->mdl_tax_rates->get()->result(), + 'invoice_id' => $this->input->post('invoice_id'), + 'invoice' => $this->mdl_invoices->where('ip_invoices.invoice_id', $this->input->post('invoice_id'))->get()->row(), + ); + + $this->layout->load_view('invoices/modal_copy_invoice', $data); + } + + public function copy_invoice() + { + $this->load->model('invoices/mdl_invoices'); + $this->load->model('invoices/mdl_items'); + $this->load->model('invoices/mdl_invoice_tax_rates'); + + if ($this->mdl_invoices->run_validation()) { + $target_id = $this->mdl_invoices->save(); + $source_id = $this->input->post('invoice_id'); + + $this->mdl_invoices->copy_invoice($source_id, $target_id); + + $response = array( + 'success' => 1, + 'invoice_id' => $target_id + ); + } else { + $this->load->helper('json_error'); + $response = array( + 'success' => 0, + 'validation_errors' => json_errors() + ); + } + + echo json_encode($response); + } + + public function modal_create_credit() + { + $this->load->module('layout'); + + $this->load->model('invoices/mdl_invoices'); + $this->load->model('invoice_groups/mdl_invoice_groups'); + $this->load->model('tax_rates/mdl_tax_rates'); + + $data = array( + 'invoice_groups' => $this->mdl_invoice_groups->get()->result(), + 'tax_rates' => $this->mdl_tax_rates->get()->result(), + 'invoice_id' => $this->input->post('invoice_id'), + 'invoice' => $this->mdl_invoices->where('ip_invoices.invoice_id', $this->input->post('invoice_id'))->get()->row() + ); + + $this->layout->load_view('invoices/modal_create_credit', $data); + } + + public function create_credit() + { + $this->load->model('invoices/mdl_invoices'); + $this->load->model('invoices/mdl_items'); + $this->load->model('invoices/mdl_invoice_tax_rates'); + + if ($this->mdl_invoices->run_validation()) { + $target_id = $this->mdl_invoices->save(); + $source_id = $this->input->post('invoice_id'); + + $this->mdl_invoices->copy_credit_invoice($source_id, $target_id); + + $sourceinv_array= array('is_read_only'=>'1','invoice_status_id'=>'2'); + + // Set source invoice to read-only + if ($this->config->item('disable_read_only') == false) { + $this->mdl_invoices->where('invoice_id', $source_id); + $this->mdl_invoices->update('ip_invoices', $sourceinv_array); + } + + // Set target invoice to credit invoice + $this->mdl_invoices->where('invoice_id', $target_id); + $this->mdl_invoices->update('ip_invoices', array('creditinvoice_parent_id' => $source_id)); + + $this->mdl_invoices->where('invoice_id', $target_id); + $this->mdl_invoices->update('ip_invoice_amounts', array('invoice_sign' => '-1')); + + $response = array( + 'success' => 1, + 'invoice_id' => $target_id + ); + } else { + $this->load->helper('json_error'); + $response = array( + 'success' => 0, + 'validation_errors' => json_errors() + ); + } + + echo json_encode($response); + } + +} diff --git a/application/modules/invoices_1/controllers/Cron.php b/application/modules/invoices_1/controllers/Cron.php new file mode 100644 index 0000000..d0c0607 --- /dev/null +++ b/application/modules/invoices_1/controllers/Cron.php @@ -0,0 +1,125 @@ +load->model('invoices/mdl_invoices_recurring'); + $this->load->model('invoices/mdl_invoices'); + $this->load->helper('mailer'); + + // Gather a list of recurring invoices to generate + $invoices_recurring = $this->mdl_invoices_recurring->active()->get()->result(); + + foreach ($invoices_recurring as $invoice_recurring) { + // This is the original invoice id + $source_id = $invoice_recurring->invoice_id; + + // This is the original invoice + // $invoice = $this->db->where('ip_invoices.invoice_id', $source_id)->get('ip_invoices')->row(); + $invoice = $this->mdl_invoices->get_by_id($source_id); + + // Create the new invoice + $db_array = array( + 'client_id' => $invoice->client_id, + 'invoice_date_created' => $invoice_recurring->recur_next_date, + 'invoice_date_due' => $this->mdl_invoices->get_date_due($invoice_recurring->recur_next_date), + 'invoice_group_id' => $invoice->invoice_group_id, + 'user_id' => $invoice->user_id, + 'invoice_number' => $this->mdl_invoices->get_invoice_number($invoice->invoice_group_id), + 'invoice_url_key' => $this->mdl_invoices->get_url_key(), + 'invoice_terms' => $invoice->invoice_terms + ); + + // This is the new invoice id + $target_id = $this->mdl_invoices->create($db_array, false); + + // Copy the original invoice to the new invoice + $this->mdl_invoices->copy_invoice($source_id, $target_id); + + // Update the next recur date for the recurring invoice + $this->mdl_invoices_recurring->set_next_recur_date($invoice_recurring->invoice_recurring_id); + + // Email the new invoice if applicable + if (get_setting('automatic_email_on_recur') && mailer_configured()) { + $new_invoice = $this->mdl_invoices->get_by_id($target_id); + + // Set the email body, use default email template if available + $this->load->model('email_templates/mdl_email_templates'); + + $email_template_id = get_setting('email_invoice_template'); + if (!$email_template_id) { + return; + } + + $email_template = $this->mdl_email_templates->where('email_template_id', $email_template_id)->get(); + if ($email_template->num_rows() == 0) { + return; + } + + $tpl = $email_template->row(); + + // Prepare the attachments + $this->load->model('upload/mdl_uploads'); + $attachment_files = $this->mdl_uploads->get_invoice_uploads($target_id); + + // Prepare the body + $body = $tpl->email_template_body; + if (strlen($body) != strlen(strip_tags($body))) { + $body = htmlspecialchars_decode($body); + } else { + $body = htmlspecialchars_decode(nl2br($body)); + } + + $from = !empty($tpl->email_template_from_email) ? + array($tpl->email_template_from_email, $tpl->email_template_from_name) : + array($invoice->user_email, ""); + + $subject = !empty($tpl->email_template_subject) ? + $tpl->email_template_subject : + trans('invoice') . ' #' . $new_invoice->invoice_number; + + $pdf_template = $tpl->email_template_pdf_template; + $to = $invoice->client_email; + $cc = $tpl->email_template_cc; + $bcc = $tpl->email_template_bcc; + + $email_invoice = email_invoice($target_id, $pdf_template, $from, $to, $subject, $body, $cc, $bcc, $attachment_files); + + if ($email_invoice) { + $this->mdl_invoices->mark_sent($target_id); + $this->mdl_invoice_amounts->calculate($target_id); + } else { + log_message('error', 'Invoice ' . $target_id . 'could not be sent. Please review your Email settings.'); + } + } + } + + log_message('debug', '[Recurring Invoices] ' . count($invoices_recurring) . ' recurring invoices processed'); + } + +} diff --git a/application/modules/invoices_1/controllers/Invoices.php b/application/modules/invoices_1/controllers/Invoices.php new file mode 100644 index 0000000..f4ff098 --- /dev/null +++ b/application/modules/invoices_1/controllers/Invoices.php @@ -0,0 +1,480 @@ +load->model('mdl_invoices'); + $this->load->model('Mdl_items'); + + } + + public function index() + { + + // Display all invoices by default + redirect('invoices/status/all'); + } + + /** + * @param string $status + * @param int $page + */ + public function status($status = 'all', $page = 0) + { + //echo 'main'; + // Determine which group of invoices to load + switch ($status) { + case 'draft': + $this->mdl_invoices->is_draft(); + break; + case 'sent': + $this->mdl_invoices->is_sent(); + break; + case 'viewed': + $this->mdl_invoices->is_viewed(); + break; + case 'paid': + $this->mdl_invoices->is_paid(); + break; + case 'overdue': + $this->mdl_invoices->is_overdue(); + break; + } + + $this->mdl_invoices->paginate(site_url('invoices/status/' . $status), $page); + $invoices = $this->mdl_invoices->result(); + + //print_r($invoices); + + $this->layout->set( + array( + 'invoices' => $invoices, + 'status' => $status, + 'filter_display' => true, + 'filter_placeholder' => trans('filter_invoices'), + 'filter_method' => 'filter_invoices', + 'invoice_statuses' => $this->mdl_invoices->statuses() + ) + ); + + $this->layout->buffer('content', 'invoices/index'); + $this->layout->render(); + } + + public function archive() + { + $invoice_array = array(); + if (isset($_POST['invoice_number'])) { + $invoiceNumber = $_POST['invoice_number']; + $invoice_array = glob('./uploads/archive/*' . '_' . $invoiceNumber . '.pdf'); + $this->layout->set( + array( + 'invoices_archive' => $invoice_array)); + $this->layout->buffer('content', 'invoices/archive'); + $this->layout->render(); + + } else { + foreach (glob('./uploads/archive/*.pdf') as $file) { + array_push($invoice_array, $file); + } + rsort($invoice_array); + $this->layout->set( + array( + 'invoices_archive' => $invoice_array)); + $this->layout->buffer('content', 'invoices/archive'); + $this->layout->render(); + } + + } + + /** + * @param $invoice + */ + public function download($invoice) + { + header('Content-type: application/pdf'); + header('Content-Disposition: attachment; filename="' . $invoice . '"'); + readfile('./uploads/archive/' . $invoice); + } + + /** + * @param $invoice_id + */ + public function view($invoice_id) + { + + //echo 'Edit';die; + $this->load->model( + array( + 'mdl_items', + 'tax_rates/mdl_tax_rates', + 'payment_methods/mdl_payment_methods', + 'mdl_invoice_tax_rates', + 'custom_fields/mdl_custom_fields', + ) + ); + + $this->load->helper("custom_values"); + $this->load->helper("client"); + $this->load->model('units/mdl_units'); + $this->load->module('payments'); + $this->load->model('products/mdl_products'); + $this->load->model('custom_values/mdl_custom_values'); + $this->load->model('custom_fields/mdl_invoice_custom'); + + $this->db->reset_query(); + + /*$invoice_custom = $this->mdl_invoice_custom->where('invoice_id', $invoice_id)->get(); + + if ($invoice_custom->num_rows()) { + $invoice_custom = $invoice_custom->row(); + + unset($invoice_custom->invoice_id, $invoice_custom->invoice_custom_id); + + foreach ($invoice_custom as $key => $val) { + $this->mdl_invoices->set_form_value('custom[' . $key . ']', $val); + } + }*/ + + $fields = $this->mdl_invoice_custom->by_id($invoice_id)->get()->result(); + //print_r($fields); + $invoice = $this->mdl_invoices->get_by_id($invoice_id); + + + //print_r($invoice_id);die; + if (!$invoice) { + show_404(); + } + //$ClientID = ''; + // foreach ($invoice[0] as $key ) { + $InvoiceDetails = json_decode(json_encode($invoice),true); + $ClientID = $InvoiceDetails['client_id']; + //echo $ClientID; + // } + /*foreach ($invoice as $inv) { + $ClientID = $inv->client_id; + } + echo $ClientID; */ + $PaymentDays = $this->mdl_invoices->GetPaymentDays($invoice_id,$ClientID,'51'); + $GetSecondaryAddress = $this->mdl_invoices->GetSecondaryAddress($ClientID); + + //print_r($GetSecondaryAddress); + + $GetClientState = $this->mdl_invoices->GetState($ClientID); + + // $GetClientStateCode = $this->mdl_invoices->GetStateCode($ClientID,'12'); + + //print_r( $GetClientStateCode); + + + $GetClientPrimaryStateCode = $this->mdl_invoices->GetPrimaryStateCode($ClientID,'12'); + + + $GetClientSecondaryStateCode = $this->mdl_invoices->GetSecondaryStateCode($ClientID,'57'); + + // print_r($GetClientPrimaryStateCode); + // print_r($GetClientSecondaryStateCode); + + + + + $primarystatecode=''; + foreach ($GetClientPrimaryStateCode as $primary) + { + $primarystatecode=$primary->client_custom_fieldvalue; + } + + + $secondarystatecode=''; + + foreach ($GetClientSecondaryStateCode as $secondary) + { + $secondarystatecode=$secondary->client_custom_fieldvalue; + } + + // echo $secondarystatecode; + // echo $primarystatecode; + + + + + $getSecondayAddressSelected = $this->mdl_invoices->getSecondayAddressSelected($invoice_id,'44'); + //print_r($GetSecondaryAddress); + + $custom_fields = $this->mdl_custom_fields->by_table('ip_invoice_custom')->get()->result(); + $custom_values = []; + + //print_r($custom_fields); + foreach ($custom_fields as $custom_field) { + if (in_array($custom_field->custom_field_type, $this->mdl_custom_values->custom_value_fields())) { + $values = $this->mdl_custom_values->get_by_fid($custom_field->custom_field_id)->result(); + //print_r($values); + $custom_values[$custom_field->custom_field_id] = $values; + + } + } + //print_r($custom_field);die; + foreach ($custom_fields as $cfield) { + foreach ($fields as $fvalue) { + if ($fvalue->invoice_custom_fieldid == $cfield->custom_field_id) { + // TODO: Hackish, may need a better optimization + //echo $fvalue->invoice_custom_fieldid ; + if ($fvalue->invoice_custom_fieldid == "7" && $fvalue->invoice_custom_fieldvalue == '') + { + echo $fvalue->invoice_custom_fieldvalue; + $this->mdl_invoices->set_form_value( + 'custom[' . $cfield->custom_field_id . ']', + 'By Road' + ); + } + else + { + $this->mdl_invoices->set_form_value( + 'custom[' . $cfield->custom_field_id . ']', + $fvalue->invoice_custom_fieldvalue + ); + } + break; + } + } + } + + + // $inv_status= $this->mdl_invoices->get_status($invoice_id) + //$product = $this->Mdl_items->get_product(); + //print_r($product);die; + // $state=$this->test(); + // echo $state; + + + $this->layout->set( + array( + 'invoice' => $invoice, + 'Duedate' =>$PaymentDays, + 'GetSecondary' =>$GetSecondaryAddress, + 'GetState'=>$GetClientState, + 'getSecondaySelected' => $getSecondayAddressSelected, + 'GetClientPrimaryStateCode'=>$GetClientPrimaryStateCode, + 'GetClientSecondaryStateCode'=>$GetClientSecondaryStateCode, + 'items' => $this->mdl_items->where('invoice_id', $invoice_id)->get()->result(), + 'invoice_id' => $invoice_id, + 'products' => $this->Mdl_items->get_product(), + 'producttax'=>$this->Mdl_items->get_tax(), + 'tax_rates' => $this->mdl_tax_rates->get()->result(), + 'invoice_tax_rates' => $this->mdl_invoice_tax_rates->where('invoice_id', $invoice_id)->get()->result(), + 'units' => $this->mdl_units->get()->result(), + 'payment_methods' => $this->mdl_payment_methods->get()->result(), + 'custom_fields' => $custom_fields, + 'custom_values' => $custom_values, + 'custom_js_vars' => array( + 'currency_symbol' => get_setting('currency_symbol'), + 'currency_symbol_placement' => get_setting('currency_symbol_placement'), + 'decimal_point' => get_setting('decimal_point') + ), + 'invoice_statuses' => $this->mdl_invoices->statuses(), + 'inv_status'=> $this->mdl_invoices->get_status($invoice_id) + ) + ); + + + // print_r($custom_values); + + if ($invoice->sumex_id != null) { + $this->layout->buffer( + array( + array('modal_delete_invoice', 'invoices/modal_delete_invoice'), + array('modal_add_invoice_tax', 'invoices/modal_add_invoice_tax'), + array('modal_add_payment', 'payments/modal_add_payment'), + array('content', 'invoices/view_sumex') + ) + ); + } else { + $this->layout->buffer( + array( + array('modal_delete_invoice', 'invoices/modal_delete_invoice'), + array('modal_add_invoice_tax', 'invoices/modal_add_invoice_tax'), + array('modal_add_payment', 'payments/modal_add_payment'), + array('content', 'invoices/view') + ) + ); + } + + $this->layout->render(); + } + + /** + * @param $invoice_id + */ + public function delete($invoice_id) + { + // Get the status of the invoice + $invoice = $this->mdl_invoices->get_by_id($invoice_id); + $invoice_status = $invoice->invoice_status_id; + + if ($invoice_status == 1 || $this->config->item('enable_invoice_deletion') === true) { + // If invoice refers to tasks, mark those tasks back to 'Complete' + $this->load->model('tasks/mdl_tasks'); + $tasks = $this->mdl_tasks->update_on_invoice_delete($invoice_id); + + // Delete the invoice + $this->mdl_invoices->delete($invoice_id); + } else { + // Add alert that invoices can't be deleted + $this->session->set_flashdata('alert_error', trans('invoice_deletion_forbidden')); + } + + // Redirect to invoice index + redirect('invoices/index'); + } + + /** + * @param $invoice_id + * @param $item_id + */ + public function delete_item($invoice_id, $item_id) + { + // Delete invoice item + $this->load->model('mdl_items'); + $item = $this->mdl_items->delete($item_id); + + // Mark item back to complete: + if ($item && $item->item_task_id) { + $this->load->model('tasks/mdl_tasks'); + $this->mdl_tasks->update_status(3, $item->item_task_id); + } + + // Redirect to invoice view + redirect('invoices/view/' . $invoice_id); + } + + /** + * @param $invoice_id + * @param bool $stream + * @param null $invoice_template + */ + public function generate_pdf($invoice_id, $stream = true, $invoice_template = null) + { + + $this->load->helper('pdf'); + + if (get_setting('mark_invoices_sent_pdf') == 1) { + + $this->mdl_invoices->mark_sent($invoice_id); + } + + generate_invoice_pdf($invoice_id, $stream, $invoice_template, null); + } + + /** + * @param $invoice_id + */ + public function generate_zugferd_xml($invoice_id) + { + $this->load->model('invoices/mdl_items'); + $this->load->library('ZugferdXml', array( + 'invoice' => $this->mdl_invoices->get_by_id($invoice_id), + 'items' => $this->mdl_items->where('invoice_id', $invoice_id)->get()->result() + )); + + $this->output->set_content_type('text/xml'); + $this->output->set_output($this->zugferdxml->xml()); + } + + public function generate_sumex_pdf($invoice_id) + { + $this->load->helper('pdf'); + + generate_invoice_sumex($invoice_id); + } + + public function generate_sumex_copy($invoice_id) + { + + + $this->load->model('invoices/mdl_items'); + $this->load->library('Sumex', array( + 'invoice' => $this->mdl_invoices->get_by_id($invoice_id), + 'items' => $this->mdl_items->where('invoice_id', $invoice_id)->get()->result(), + 'options' => array( + 'copy' => "1", + 'storno' => "0" + ) + )); + + $this->output->set_content_type('application/pdf'); + $this->output->set_output($this->sumex->pdf()); + } + + public function delete_invoice_tax() + { + + + $tcsamount=$this->input->post('tcs'); + $invoice_id=$this->input->post('inv_id'); + $invoice_amount=$this->input->post('invoiceamount'); + $invoice_balance=$this->input->post('inv_balance'); + + $this->load->model('mdl_invoice_tax_rates'); + $res=$this->mdl_invoice_tax_rates->invoice_delete($invoice_id,$invoice_amount,$invoice_balance); + $res1=$this->mdl_invoice_tax_rates->invoice_delete_tax($invoice_id); + //$res = $this->mdl_invoice_amounts->invoice_delete($bankdata,$bankid); + } + /** + * @param $invoice_id + * @param $invoice_tax_rate_id + */ + // public function delete_invoice_tax($invoice_id, $invoice_tax_rate_id) + // { + // $this->load->model('mdl_invoice_tax_rates'); + // $this->mdl_invoice_tax_rates->delete($invoice_tax_rate_id); + + // $this->load->model('mdl_invoice_amounts'); + // $this->mdl_invoice_amounts->calculate($invoice_id); + + // redirect('invoices/view/' . $invoice_id); + // } + + public function recalculate_all_invoices() + { + $this->db->select('invoice_id'); + $invoice_ids = $this->db->get('ip_invoices')->result(); + + $this->load->model('mdl_invoice_amounts'); + + foreach ($invoice_ids as $invoice_id) { + $this->mdl_invoice_amounts->calculate($invoice_id->invoice_id); + } + } + + function test(){ + + $data = $this->input->post('state'); + + // $invoice = $this->input->post('invoice_id'); + echo $data; + //return $data; + + $obj=json_encode($data); + return $obj; + } + +} diff --git a/application/modules/invoices_1/controllers/Recurring.php b/application/modules/invoices_1/controllers/Recurring.php new file mode 100644 index 0000000..ce3fe53 --- /dev/null +++ b/application/modules/invoices_1/controllers/Recurring.php @@ -0,0 +1,60 @@ +load->model('mdl_invoices_recurring'); + } + + /** + * @param int $page + */ + public function index($page = 0) + { + $this->mdl_invoices_recurring->paginate(site_url('invoices/recurring'), $page); + $recurring_invoices = $this->mdl_invoices_recurring->result(); + + $this->layout->set('recur_frequencies', $this->mdl_invoices_recurring->recur_frequencies); + $this->layout->set('recurring_invoices', $recurring_invoices); + $this->layout->buffer('content', 'invoices/index_recurring'); + $this->layout->render(); + } + + /** + * @param $invoice_recurring_id + */ + public function stop($invoice_recurring_id) + { + $this->mdl_invoices_recurring->stop($invoice_recurring_id); + redirect('invoices/recurring/index'); + } + + /** + * @param $invoice_recurring_id + */ + public function delete($invoice_recurring_id) + { + $this->mdl_invoices_recurring->delete($invoice_recurring_id); + redirect('invoices/recurring/index'); + } + +} diff --git a/application/modules/invoices_1/models/Mdl_invoice_amounts.php b/application/modules/invoices_1/models/Mdl_invoice_amounts.php new file mode 100644 index 0000000..fca804c --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_invoice_amounts.php @@ -0,0 +1,407 @@ +db->query(" + SELECT SUM(item_subtotal) AS invoice_item_subtotal, + SUM(item_tax_total) AS invoice_item_tax_total, + SUM(item_subtotal) + SUM(item_tax_total) AS invoice_total, + SUM(item_discount) AS invoice_item_discount + FROM ip_invoice_item_amounts + WHERE item_id IN ( + SELECT item_id FROM ip_invoice_items WHERE invoice_id = " . $this->db->escape($invoice_id) . " + ) + "); + + $invoice_amounts = $query->row(); + + $invoice_item_subtotal = $invoice_amounts->invoice_item_subtotal - $invoice_amounts->invoice_item_discount; + $invoice_subtotal = $invoice_item_subtotal + $invoice_amounts->invoice_item_tax_total; + $invoice_total = $this->calculate_discount($invoice_id, $invoice_subtotal); + + // Get the amount already paid + $query = $this->db->query(" + SELECT SUM(payment_amount) AS invoice_paid + FROM ip_payments + WHERE invoice_id = " . $this->db->escape($invoice_id) + ); + + $invoice_paid = $query->row()->invoice_paid ? floatval($query->row()->invoice_paid) : 0; + + // Create the database array and insert or update + $db_array = array( + 'invoice_id' => $invoice_id, + 'invoice_item_subtotal' => $invoice_item_subtotal, + 'invoice_item_tax_total' => $invoice_amounts->invoice_item_tax_total, + 'invoice_total' => $invoice_total, + 'invoice_paid' => $invoice_paid, + 'invoice_balance' => $invoice_total - $invoice_paid + ); + + $this->db->where('invoice_id', $invoice_id); + + if ($this->db->get('ip_invoice_amounts')->num_rows()) { + // The record already exists; update it + $this->db->where('invoice_id', $invoice_id); + $this->db->update('ip_invoice_amounts', $db_array); + } else { + // The record does not yet exist; insert it + $this->db->insert('ip_invoice_amounts', $db_array); + } + + // Calculate the invoice taxes + $this->calculate_invoice_taxes($invoice_id); + + // Get invoice status + $this->load->model('invoices/mdl_invoices'); + $invoice = $this->mdl_invoices->get_by_id($invoice_id); + $invoice_is_credit = ($invoice->creditinvoice_parent_id > 0 ? true : false); + + // Set to paid if balance is zero + if ($invoice->invoice_balance == 0) { + // Check if the invoice total is not zero or negative + if ($invoice->invoice_total != 0 || $invoice_is_credit) { + $this->db->where('invoice_id', $invoice_id); + $payment = $this->db->get('ip_payments')->row(); + $payment_method_id = ($payment->payment_method_id ? $payment->payment_method_id : 0); + + $this->db->where('invoice_id', $invoice_id); + $this->db->set('invoice_status_id', 4); + $this->db->set('payment_method', $payment_method_id); + $this->db->update('ip_invoices'); + + // Set to read-only if applicable + if ( + $this->config->item('disable_read_only') == false + && $invoice->invoice_status_id == get_setting('read_only_toggle') + ) { + $this->db->where('invoice_id', $invoice_id); + $this->db->set('is_read_only', 1); + $this->db->update('ip_invoices'); + } + } + } + } + + /** + * @param $invoice_id + * @param $invoice_total + * @return float + */ + public function calculate_discount($invoice_id, $invoice_total) + { + $this->db->where('invoice_id', $invoice_id); + $invoice_data = $this->db->get('ip_invoices')->row(); + + $total = (float)number_format($invoice_total, 2, '.', ''); + $discount_amount = (float)number_format($invoice_data->invoice_discount_amount, 2, '.', ''); + $discount_percent = (float)number_format($invoice_data->invoice_discount_percent, 2, '.', ''); + + $total = $total - $discount_amount; + $total = $total - round(($total / 100 * $discount_percent), 2); + + return $total; + } + + /** + * @param $invoice_id + */ + public function calculate_invoice_taxes($invoice_id) + { + // First check to see if there are any invoice taxes applied + $this->load->model('invoices/mdl_invoice_tax_rates'); + $invoice_tax_rates = $this->mdl_invoice_tax_rates->where('invoice_id', $invoice_id)->get()->result(); + + if ($invoice_tax_rates) { + // There are invoice taxes applied + // Get the current invoice amount record + $invoice_amount = $this->db->where('invoice_id', $invoice_id)->get('ip_invoice_amounts')->row(); + + // Loop through the invoice taxes and update the amount for each of the applied invoice taxes + foreach ($invoice_tax_rates as $invoice_tax_rate) { + if ($invoice_tax_rate->include_item_tax) { + // The invoice tax rate should include the applied item tax + $invoice_tax_rate_amount = ($invoice_amount->invoice_item_subtotal + $invoice_amount->invoice_item_tax_total) * ($invoice_tax_rate->invoice_tax_rate_percent / 100); + } else { + // The invoice tax rate should not include the applied item tax + $invoice_tax_rate_amount = $invoice_amount->invoice_item_subtotal * ($invoice_tax_rate->invoice_tax_rate_percent / 100); + } + + // Update the invoice tax rate record + $db_array = array( + 'invoice_tax_rate_amount' => $invoice_tax_rate_amount + ); + $this->db->where('invoice_tax_rate_id', $invoice_tax_rate->invoice_tax_rate_id); + $this->db->update('ip_invoice_tax_rates', $db_array); + } + + // Update the invoice amount record with the total invoice tax amount + $this->db->query(" + UPDATE ip_invoice_amounts + SET invoice_tax_total = ( + SELECT SUM(invoice_tax_rate_amount) + FROM ip_invoice_tax_rates + WHERE invoice_id = " . $this->db->escape($invoice_id) . ") + WHERE invoice_id = " . $this->db->escape($invoice_id)); + + // Get the updated invoice amount record + $invoice_amount = $this->db->where('invoice_id', $invoice_id)->get('ip_invoice_amounts')->row(); + + // Recalculate the invoice total and balance + $invoice_total = $invoice_amount->invoice_item_subtotal + $invoice_amount->invoice_item_tax_total + $invoice_amount->invoice_tax_total; + $invoice_total = $this->calculate_discount($invoice_id, $invoice_total); + $invoice_balance = $invoice_total - $invoice_amount->invoice_paid; + + // Update the invoice amount record + $db_array = array( + 'invoice_total' => $invoice_total, + 'invoice_balance' => $invoice_balance + ); + + $this->db->where('invoice_id', $invoice_id); + $this->db->update('ip_invoice_amounts', $db_array); + } else { + // No invoice taxes applied + + $db_array = array( + 'invoice_tax_total' => '0.00' + ); + + $this->db->where('invoice_id', $invoice_id); + $this->db->update('ip_invoice_amounts', $db_array); + } + } + + /** + * @param null $period + * @return mixed + */ + public function get_total_invoiced($period = null) + { + switch ($period) { + case 'month': + return $this->db->query(" + SELECT SUM(invoice_total) AS total_invoiced + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices + WHERE MONTH(invoice_date_created) = MONTH(NOW()) + AND YEAR(invoice_date_created) = YEAR(NOW()))")->row()->total_invoiced; + case 'last_month': + return $this->db->query(" + SELECT SUM(invoice_total) AS total_invoiced + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices + WHERE MONTH(invoice_date_created) = MONTH(NOW() - INTERVAL 1 MONTH) + AND YEAR(invoice_date_created) = YEAR(NOW() - INTERVAL 1 MONTH))")->row()->total_invoiced; + case 'year': + return $this->db->query(" + SELECT SUM(invoice_total) AS total_invoiced + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices WHERE YEAR(invoice_date_created) = YEAR(NOW()))")->row()->total_invoiced; + case 'last_year': + return $this->db->query(" + SELECT SUM(invoice_total) AS total_invoiced + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices WHERE YEAR(invoice_date_created) = YEAR(NOW() - INTERVAL 1 YEAR))")->row()->total_invoiced; + default: + return $this->db->query("SELECT SUM(invoice_total) AS total_invoiced FROM ip_invoice_amounts")->row()->total_invoiced; + } + } + + /** + * @param null $period + * @return mixed + */ + public function get_total_paid($period = null) + { + switch ($period) { + case 'month': + return $this->db->query(" + SELECT SUM(invoice_paid) AS total_paid + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices + WHERE MONTH(invoice_date_created) = MONTH(NOW()) + AND YEAR(invoice_date_created) = YEAR(NOW()))")->row()->total_paid; + case 'last_month': + return $this->db->query("SELECT SUM(invoice_paid) AS total_paid + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices + WHERE MONTH(invoice_date_created) = MONTH(NOW() - INTERVAL 1 MONTH) + AND YEAR(invoice_date_created) = YEAR(NOW() - INTERVAL 1 MONTH))")->row()->total_paid; + case 'year': + return $this->db->query("SELECT SUM(invoice_paid) AS total_paid + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices WHERE YEAR(invoice_date_created) = YEAR(NOW()))")->row()->total_paid; + case 'last_year': + return $this->db->query("SELECT SUM(invoice_paid) AS total_paid + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices WHERE YEAR(invoice_date_created) = YEAR(NOW() - INTERVAL 1 YEAR))")->row()->total_paid; + default: + return $this->db->query("SELECT SUM(invoice_paid) AS total_paid FROM ip_invoice_amounts")->row()->total_paid; + } + } + + /** + * @param null $period + * @return mixed + */ + public function get_total_balance($period = null) + { + switch ($period) { + case 'month': + return $this->db->query("SELECT SUM(invoice_balance) AS total_balance + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices + WHERE MONTH(invoice_date_created) = MONTH(NOW()) + AND YEAR(invoice_date_created) = YEAR(NOW()))")->row()->total_balance; + case 'last_month': + return $this->db->query("SELECT SUM(invoice_balance) AS total_balance + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices + WHERE MONTH(invoice_date_created) = MONTH(NOW() - INTERVAL 1 MONTH) + AND YEAR(invoice_date_created) = YEAR(NOW() - INTERVAL 1 MONTH))")->row()->total_balance; + case 'year': + return $this->db->query("SELECT SUM(invoice_balance) AS total_balance + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices WHERE YEAR(invoice_date_created) = YEAR(NOW()))")->row()->total_balance; + case 'last_year': + return $this->db->query("SELECT SUM(invoice_balance) AS total_balance + FROM ip_invoice_amounts + WHERE invoice_id IN + (SELECT invoice_id FROM ip_invoices WHERE YEAR(invoice_date_created) = (YEAR(NOW() - INTERVAL 1 YEAR)))")->row()->total_balance; + default: + return $this->db->query("SELECT SUM(invoice_balance) AS total_balance FROM ip_invoice_amounts")->row()->total_balance; + } + } + + /** + * @param string $period + * @return array + */ + public function get_status_totals($period = '') + { + switch ($period) { + default: + case 'this-month': + $results = $this->db->query(" + SELECT ip_invoices.invoice_status_id, (CASE ip_invoices.invoice_status_id WHEN 4 THEN SUM(ip_invoice_amounts.invoice_paid) ELSE SUM(ip_invoice_amounts.invoice_balance) END) AS sum_total, COUNT(*) AS num_total + FROM ip_invoice_amounts + JOIN ip_invoices ON ip_invoices.invoice_id = ip_invoice_amounts.invoice_id + AND MONTH(ip_invoices.invoice_date_created) = MONTH(NOW()) + AND YEAR(ip_invoices.invoice_date_created) = YEAR(NOW()) + GROUP BY ip_invoices.invoice_status_id")->result_array(); + break; + case 'last-month': + $results = $this->db->query(" + SELECT invoice_status_id, (CASE ip_invoices.invoice_status_id WHEN 4 THEN SUM(invoice_paid) ELSE SUM(invoice_balance) END) AS sum_total, COUNT(*) AS num_total + FROM ip_invoice_amounts + JOIN ip_invoices ON ip_invoices.invoice_id = ip_invoice_amounts.invoice_id + AND MONTH(ip_invoices.invoice_date_created) = MONTH(NOW() - INTERVAL 1 MONTH) + AND YEAR(ip_invoices.invoice_date_created) = YEAR(NOW()) + GROUP BY ip_invoices.invoice_status_id")->result_array(); + break; + case 'this-quarter': + $results = $this->db->query(" + SELECT invoice_status_id, (CASE ip_invoices.invoice_status_id WHEN 4 THEN SUM(ip_invoice_amounts.invoice_paid) ELSE SUM(ip_invoice_amounts.invoice_balance) END) AS sum_total, COUNT(*) AS num_total + FROM ip_invoice_amounts + JOIN ip_invoices ON ip_invoices.invoice_id = ip_invoice_amounts.invoice_id + AND QUARTER(ip_invoices.invoice_date_created) = QUARTER(NOW()) + AND YEAR(ip_invoices.invoice_date_created) = YEAR(NOW()) + GROUP BY ip_invoices.invoice_status_id")->result_array(); + break; + case 'last-quarter': + $results = $this->db->query(" + SELECT invoice_status_id, (CASE ip_invoices.invoice_status_id WHEN 4 THEN SUM(invoice_paid) ELSE SUM(invoice_balance) END) AS sum_total, COUNT(*) AS num_total + FROM ip_invoice_amounts + JOIN ip_invoices ON ip_invoices.invoice_id = ip_invoice_amounts.invoice_id + AND QUARTER(ip_invoices.invoice_date_created) = QUARTER(NOW() - INTERVAL 1 QUARTER) + AND YEAR(ip_invoices.invoice_date_created) = YEAR(NOW()) + GROUP BY ip_invoices.invoice_status_id")->result_array(); + break; + case 'this-year': + $results = $this->db->query(" + SELECT invoice_status_id, (CASE ip_invoices.invoice_status_id WHEN 4 THEN SUM(ip_invoice_amounts.invoice_paid) ELSE SUM(ip_invoice_amounts.invoice_balance) END) AS sum_total, COUNT(*) AS num_total + FROM ip_invoice_amounts + JOIN ip_invoices ON ip_invoices.invoice_id = ip_invoice_amounts.invoice_id + AND YEAR(ip_invoices.invoice_date_created) = YEAR(NOW()) + GROUP BY ip_invoices.invoice_status_id")->result_array(); + break; + case 'last-year': + $results = $this->db->query(" + SELECT invoice_status_id, (CASE ip_invoices.invoice_status_id WHEN 4 THEN SUM(invoice_paid) ELSE SUM(invoice_balance) END) AS sum_total, COUNT(*) AS num_total + FROM ip_invoice_amounts + JOIN ip_invoices ON ip_invoices.invoice_id = ip_invoice_amounts.invoice_id + AND YEAR(ip_invoices.invoice_date_created) = YEAR(NOW() - INTERVAL 1 YEAR) + GROUP BY ip_invoices.invoice_status_id")->result_array(); + break; + } + + $return = array(); + + foreach ($this->mdl_invoices->statuses() as $key => $status) { + $return[$key] = array( + 'invoice_status_id' => $key, + 'class' => $status['class'], + 'label' => $status['label'], + 'href' => $status['href'], + 'sum_total' => 0, + 'num_total' => 0 + ); + } + + foreach ($results as $result) { + $return[$result['invoice_status_id']] = array_merge($return[$result['invoice_status_id']], $result); + } + + return $return; + } + +} diff --git a/application/modules/invoices_1/models/Mdl_invoice_sumex.php b/application/modules/invoices_1/models/Mdl_invoice_sumex.php new file mode 100644 index 0000000..64ad0a6 --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_invoice_sumex.php @@ -0,0 +1,83 @@ +db->select('ip_invoice_sumex.*'); + } + + /** + * @param null $id + * @param null $db_array + * @return void + */ + public function save($id = null, $db_array = null) + { + $id = $this->where('sumex_invoice', $id)->get()->row()->sumex_id; + parent::save($id, $db_array); + } + + /** + * @return array + */ + public function validation_rules() + { + return array( + 'sumex_invoice' => array( + 'field' => 'sumex_invoice', + 'label' => trans('invoice'), + 'rules' => 'required' + ), + 'sumex_reason' => array( + 'field' => 'sumex_reason', + 'label' => trans('reason'), + 'rules' => 'required|greater_than_equal_to[0]|less_than_equal_to[5]' + ), + 'sumex_diagnosis' => array( + 'field' => 'sumex_diagnosis', + 'label' => trans('diagnosis') + ), + 'sumex_observations' => array( + 'field' => 'sumex_observations', + 'label' => trans('sumex_observations') + ), + 'sumex_treatmentstart' => array( + 'field' => 'sumex_treatmentstart', + 'label' => trans('start'), + 'rules' => 'required' + ), + 'sumex_treatmentend' => array( + 'field' => 'sumex_treatmentend', + 'label' => trans('end'), + 'rules' => 'required' + ), + 'sumex_casedate' => array( + 'field' => 'sumex_casedate', + 'label' => trans('case_date'), + 'rules' => 'required' + ), + 'sumex_casenumber' => array( + 'field' => 'sumex_casenumber', + 'label' => trans('case_number') + ) + ); + } + +} diff --git a/application/modules/invoices_1/models/Mdl_invoice_tax_rates.php b/application/modules/invoices_1/models/Mdl_invoice_tax_rates.php new file mode 100644 index 0000000..6dc3a67 --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_invoice_tax_rates.php @@ -0,0 +1,96 @@ +db->select('ip_tax_rates.tax_rate_name AS invoice_tax_rate_name'); + $this->db->select('ip_tax_rates.tax_rate_percent AS invoice_tax_rate_percent'); + $this->db->select('ip_invoice_tax_rates.*'); + } + + public function default_join() + { + $this->db->join('ip_tax_rates', 'ip_tax_rates.tax_rate_id = ip_invoice_tax_rates.tax_rate_id'); + } + + /** + * @param null $id + * @param null $db_array + * @return void + */ + public function save($id = null, $db_array = null) + { + parent::save($id, $db_array); + + $this->load->model('invoices/mdl_invoice_amounts'); + + $invoice_id = $this->input->post('invoice_id'); + + if ($invoice_id) { + $this->mdl_invoice_amounts->calculate($invoice_id); + } + } + public function invoice_delete($invoice_id,$invoice_amount,$invoice_balance) + { + + + $this->db->where('invoice_id', $invoice_id); + $this->db->set('invoice_tax_total',0); + $this->db->set('invoice_total',$invoice_amount); + $this->db->set('invoice_balance',$invoice_balance); + $this->db->update('ip_invoice_amounts'); + $r = $this->db->affected_rows(); + return $r; + } + public function invoice_delete_tax($invoice_id) + { + $this->db->where('invoice_id', $invoice_id); + $this->db->set('invoice_tax_rate_amount',0); + $this->db->set('tax_rate_id',14); + $this->db->update('ip_invoice_tax_rates'); + $r = $this->db->affected_rows(); + return $r; + } + + /** + * @return array + */ + public function validation_rules() + { + return array( + 'invoice_id' => array( + 'field' => 'invoice_id', + 'label' => trans('invoice'), + 'rules' => 'required' + ), + 'tax_rate_id' => array( + 'field' => 'tax_rate_id', + 'label' => trans('tax_rate'), + 'rules' => 'required' + ), + 'include_item_tax' => array( + 'field' => 'include_item_tax', + 'label' => trans('tax_rate_placement'), + 'rules' => 'required' + ) + ); + } + +} diff --git a/application/modules/invoices_1/models/Mdl_invoices.php b/application/modules/invoices_1/models/Mdl_invoices.php new file mode 100644 index 0000000..a048fec --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_invoices.php @@ -0,0 +1,973 @@ + array( + 'label' => trans('draft'), + 'class' => 'draft', + 'href' => 'invoices/status/draft' + ), + '2' => array( + 'label' => trans('sent'), + 'class' => 'sent', + 'href' => 'invoices/status/sent' + ), + '3' => array( + 'label' => trans('viewed'), + 'class' => 'viewed', + 'href' => 'invoices/status/viewed' + ), + '4' => array( + 'label' => trans('paid'), + 'class' => 'paid', + 'href' => 'invoices/status/paid' + ), + // '5' => array( + // 'label' => trans('Credit Note Created'), + // 'class' => 'credit', + // 'href' => 'invoices/status/credit' + // ) + ); + } + public function GetPaymentDays($InvID,$ClientID,$client_custom_fieldid) + { + $this->db->select('inv.client_id,client_custom_fieldid,client_custom_fieldvalue,invoice_id'); + $this->db->from('ip_client_custom clients'); + $this->db->join('ip_invoices inv', 'clients.client_id=inv.client_id'); + $this->db->where('inv.invoice_id',$InvID); + $this->db->where('client_custom_fieldid',$client_custom_fieldid); + $this->db->where('inv.client_id',$ClientID); + $query = $this->db->get(); + return $query->result(); + } + public function GetSecondaryAddress($ClientID) + { + + $subQuery = "select group_concat(client_custom_fieldvalue separator '
') as Secondary from ip_client_custom where + client_id =? and client_custom_fieldid in (12,45,46,47,48,50,49)"; + + $query = $this->db->query($subQuery,array($ClientID)); + + return $query->result(); + + } + + + public function GetClient_Details() + { + + $subQuery = "select * from ip_clients"; + + $query = $this->db->query($subQuery,array()); + + return $query->result(); + + } + + + + + + // public function GetQuoteamount($quoteid) + // { + + // $subQuery = "select item_sgst_percentage,item_cgst_percentage,item_igst_percentage from ip_quote_item_amounts where invoice_id=?"; + + // $query = $this->db->query($subQuery,array($invoice_id)); + + // return $query->result(); + + // } + + + public function get_status($invoice_id) + { + $subQuery = "select invoice_status_id from ip_invoices where invoice_id=?"; + + $query = $this->db->query($subQuery,array($invoice_id)); + + return $query->result(); + + } + + + public function Get_invoiceitems($invoice_id) + { + $subQuery = "select item_quantity from ip_invoice_items where invoice_id=?"; + + $query = $this->db->query($subQuery,array($invoice_id)); + + return $query->result(); + + } + + + + public function GetState($ClientID) + { + //echo $ClientID; + $subQuery = "select client_id,client_name,client_state from ip_clients where client_id =?"; + + $query = $this->db->query($subQuery,array($ClientID)); + + return $query->result(); + + } + + + // public function GetStateCode($ClientID,$CustomId) + // { + // //echo $ClientID; + // $subQuery = "select client_id,client_custom_fieldid,client_custom_fieldvalue from ip_client_custom where client_id =? and client_custom_fieldid=?"; + + // $query = $this->db->query($subQuery,array($ClientID,$CustomId)); + + // return $query->result(); + + // } + + + public function GetPrimaryStateCode($ClientID,$CustomId) + { + //echo $ClientID; + $subQuery = "select client_custom_fieldvalue from ip_client_custom where client_id =? and client_custom_fieldid=?"; + + $query = $this->db->query($subQuery,array($ClientID,$CustomId)); + + return $query->result(); + + } + + + public function GetSecondaryStateCode($ClientID,$CustomId) + { + //echo $ClientID; + $subQuery = "select client_custom_fieldvalue from ip_client_custom where client_id =? and client_custom_fieldid=?"; + + $query = $this->db->query($subQuery,array($ClientID,$CustomId)); + + return $query->result(); + + } + + + + public function getinvbalqty($quoteid) + { + $subQuery = "select item_balancequantity,item_quantity,item_suppliedquantity from ip_quote_items where quote_id =?"; + + $query = $this->db->query($subQuery,array($quoteid)); + + return $query->result(); + + } + + + + + + public function getSecondayAddressSelected($InvID,$client_custom_fieldid) + { + $subQuery = "select invoice_custom_fieldvalue as secondary from ip_invoice_custom where invoice_id=? and + invoice_custom_fieldid=?"; + + $query = $this->db->query($subQuery,array($InvID,$client_custom_fieldid)); + //print_r( $this->db->last_query()); + return $query->result(); + } + + public function default_select() + { + + $this->db->select(" + SQL_CALC_FOUND_ROWS + ip_quotes.*, + ip_users.user_name, + ip_users.user_company, + ip_users.user_address_1, + ip_users.user_address_2, + ip_users.user_city, + ip_users.user_state, + ip_users.user_zip, + ip_users.user_country, + ip_users.user_phone, + ip_users.user_fax, + ip_users.user_mobile, + ip_users.user_email, + ip_users.user_web, + ip_users.user_vat_id, + ip_users.user_tax_code, + ip_users.user_subscribernumber, + ip_users.user_iban, + ip_users.user_gln, + ip_users.user_rcc, + ip_clients.*, + ip_invoice_sumex.*, + ip_invoice_amounts.invoice_id, + ip_quotetoinvoice.quote_id as Qid, + ip_invoice_amounts.invoice_amount_id, + IFnull(ip_invoice_amounts.invoice_item_subtotal, '0.00') AS invoice_item_subtotal, + IFnull(ip_invoice_amounts.invoice_item_tax_total, '0.00') AS invoice_item_tax_total, + IFnull(ip_invoice_amounts.invoice_tax_total, '0.00') AS invoice_tax_total, + IFnull(ip_invoice_amounts.invoice_total, '0.00') AS invoice_total, + IFnull(ip_invoice_amounts.invoice_paid, '0.00') AS invoice_paid, + IFnull(ip_invoice_amounts.invoice_balance, '0.00') AS invoice_balance, + ip_invoice_amounts.invoice_sign AS invoice_sign, + (CASE WHEN ip_invoices.invoice_status_id NOT IN (1,4) AND DATEDIFF(NOW(), invoice_date_due) > 0 THEN 1 ELSE 0 END) is_overdue, + DATEDIFF(NOW(), invoice_date_due) AS days_overdue, + (CASE (SELECT COUNT(*) FROM ip_invoices_recurring WHERE ip_invoices_recurring.invoice_id = ip_invoices.invoice_id and ip_invoices_recurring.recur_next_date <> '0000-00-00') WHEN 0 THEN 0 ELSE 1 END) AS invoice_is_recurring, + ip_invoices.*", false); + } + + public function default_order_by() + { + $this->db->order_by('ip_invoices.invoice_number DESC'); + $this->db->group_by('ip_invoices.invoice_number'); + } + + public function default_join() + { + $this->db->join('ip_clients', 'ip_clients.client_id = ip_invoices.client_id'); + $this->db->join('ip_users', 'ip_users.user_id = ip_invoices.user_id'); + $this->db->join('ip_invoice_amounts', 'ip_invoice_amounts.invoice_id = ip_invoices.invoice_id', 'left'); + $this->db->join('ip_invoice_sumex', 'sumex_invoice = ip_invoices.invoice_id', 'left'); + $this->db->join('ip_quotes', 'ip_quotes.invoice_id = ip_invoices.invoice_id', 'left'); + $this->db->join('ip_payments', 'ip_payments.invoice_id = ip_invoices.invoice_id', 'left'); + $this->db->join('ip_quotetoinvoice', 'ip_invoices.invoice_id = ip_quotetoinvoice.invoice_id', 'left'); + + // print_r( $this->db->last_query()); + } + + + + /** + * @return array + */ + public function validation_rules() + { + return array( + 'client_id' => array( + 'field' => 'client_id', + 'label' => trans('client'), + 'rules' => 'required' + ), + 'invoice_date_created' => array( + 'field' => 'invoice_date_created', + 'label' => trans('invoice_date'), + 'rules' => 'required' + ), + 'invoice_time_created' => array( + 'rules' => 'required' + ), + 'invoice_group_id' => array( + 'field' => 'invoice_group_id', + 'label' => trans('invoice_group'), + 'rules' => 'required' + ), + 'invoice_password' => array( + 'field' => 'invoice_password', + 'label' => trans('invoice_password') + ), + 'user_id' => array( + 'field' => 'user_id', + 'label' => trans('user'), + 'rule' => 'required' + ), + + ); + } + + /** + * @return array + */ + public function validation_rules_save_invoice() + { + return array( + 'invoice_number' => array( + 'field' => 'invoice_number', + 'label' => trans('invoice') . ' #', + 'rules' => 'is_unique[ip_invoices.invoice_number' . (($this->id) ? '.invoice_id.' . $this->id : '') . ']' + ), + 'invoice_date_created' => array( + 'field' => 'invoice_date_created', + 'label' => trans('date'), + 'rules' => 'required' + ), + 'invoice_date_due' => array( + 'field' => 'invoice_date_due', + 'label' => trans('due_date'), + 'rules' => 'required' + ), + 'invoice_time_created' => array( + 'rules' => 'required' + ), + 'invoice_password' => array( + 'field' => 'invoice_password', + 'label' => trans('invoice_password') + ) + ); + } + + /** + * @param null $db_array + * @param bool $include_invoice_tax_rates + * @return int|null + */ + public function create($db_array = null, $include_invoice_tax_rates = true) + { + + $invoice_id = parent::save(null, $db_array); + + $inv = $this->where('ip_invoices.invoice_id', $invoice_id)->get()->row(); + $invoice_group = $inv->invoice_group_id; + + // Create an invoice amount record + $db_array = array( + 'invoice_id' => $invoice_id + ); + + $this->db->insert('ip_invoice_amounts', $db_array); + + if ($include_invoice_tax_rates) { + // Create the default invoice tax record if applicable + if (get_setting('default_invoice_tax_rate')) { + $db_array = array( + 'invoice_id' => $invoice_id, + 'tax_rate_id' => get_setting('default_invoice_tax_rate'), + 'include_item_tax' => get_setting('default_include_item_tax', 0), + 'invoice_tax_rate_amount' => 0 + ); + + $this->db->insert('ip_invoice_tax_rates', $db_array); + } + } + $invgroup = $this->mdl_invoice_groups->where('invoice_group_id', $invoice_group)->get()->row(); + if (preg_match("/sumex/i", $invgroup->invoice_group_name)) { + // If the Invoice Group includes "Sumex", make the invoice a Sumex one + $db_array = array( + 'sumex_invoice' => $invoice_id + ); + $this->db->insert('ip_invoice_sumex', $db_array); + } + + return $invoice_id; + } + + /** + * Copies invoice items, tax rates, etc from source to target + * @param int $source_id + * @param int $target_id + */ + public function copy_invoice($source_id, $target_id) + { + $this->load->model('invoices/mdl_items'); + + $invoice_items = $this->mdl_items->where('invoice_id', $source_id)->get()->result(); + + foreach ($invoice_items as $invoice_item) { + $db_array = array( + 'invoice_id' => $target_id, + 'item_tax_rate_id' => $invoice_item->item_tax_rate_id, + 'item_name' => $invoice_item->item_name, + 'item_description' => $invoice_item->item_description, + 'item_quantity' => $invoice_item->item_quantity, + 'item_price' => $invoice_item->item_price, + 'item_order' => $invoice_item->item_order + ); + + $this->mdl_items->save(null, $db_array); + } + + $invoice_tax_rates = $this->mdl_invoice_tax_rates->where('invoice_id', $source_id)->get()->result(); + + foreach ($invoice_tax_rates as $invoice_tax_rate) { + $db_array = array( + 'invoice_id' => $target_id, + 'tax_rate_id' => $invoice_tax_rate->tax_rate_id, + 'include_item_tax' => $invoice_tax_rate->include_item_tax, + 'invoice_tax_rate_amount' => $invoice_tax_rate->invoice_tax_rate_amount + ); + + $this->mdl_invoice_tax_rates->save(null, $db_array); + } + + // Copy the custom fields + $this->load->model('custom_fields/mdl_invoice_custom'); + $db_array = $this->mdl_invoice_custom->where('invoice_id', $source_id)->get()->row_array(); + + if (count($db_array) > 2) { + unset($db_array['invoice_custom_id']); + $db_array['invoice_id'] = $target_id; + $this->mdl_invoice_custom->save_custom($target_id, $db_array); + } + } + + /** + * Copies invoice items, tax rates, etc from source to target + * @param int $source_id + * @param int $target_id + */ + public function copy_credit_invoice($source_id, $target_id) + { + $this->load->model('invoices/mdl_items'); + + // echo "target/cre".$target_id; + // echo "source/inv".$source_id; + // die(); + + $invoice_items = $this->mdl_items->where('invoice_id', $source_id)->get()->result(); + + // $custom_items = $this->mdl_items->get_invoice_custom_values($source_id); + + //print_r($invoice_items); + //die(); + + + + + foreach ($invoice_items as $invoice_item) { + $db_array = array( + 'invoice_id' => $target_id, + //'item_tax_rate_id' => $invoice_item->item_tax_rate_id, + 'Sgst_item_tax_rate_id'=>$invoice_item->Sgst_item_tax_rate_id, + 'Cgst_item_tax_rate_id'=>$invoice_item->Cgst_item_tax_rate_id, + 'Igst_item_tax_rate_id'=>$invoice_item->Igst_item_tax_rate_id, + 'item_name' => $invoice_item->item_name, + 'item_product_unit' =>$invoice_item->item_product_unit, + 'item_product_unit_id'=> $invoice_item->item_product_unit_id, + 'item_product_id'=>$invoice_item->item_product_id, + 'item_description' => $invoice_item->item_description, + 'item_quantity' => -$invoice_item->item_quantity, + 'item_price' => $invoice_item->item_price, + 'item_order' => $invoice_item->item_order + ); + + $this->mdl_items->save(null, $db_array); + + + } + + $invoice_tax_rates = $this->mdl_invoice_tax_rates->where('invoice_id', $source_id)->get()->result(); + + + + foreach ($invoice_tax_rates as $invoice_tax_rate) { + $db_array = array( + 'invoice_id' => $target_id, + 'tax_rate_id' => $invoice_tax_rate->tax_rate_id, + 'include_item_tax' => $invoice_tax_rate->include_item_tax, + 'invoice_tax_rate_amount' => -$invoice_tax_rate->invoice_tax_rate_amount + ); + + $this->mdl_invoice_tax_rates->save(null, $db_array); + } + + + + /// Copy the custom fields + $this->load->model('custom_fields/mdl_invoice_custom'); + $db_array = $this->mdl_invoice_custom->where('ip_invoice_custom.invoice_id', $source_id)->get()->row_array(); + + $custom_item = $this->get_invoice_custom_values($source_id); + + +//echo "vdc"; + foreach($custom_item as $cus) + { + //$invoice_id = $target_id; + + $customarray= array( + 'invoice_id'=>$target_id, + 'invoice_custom_fieldid'=>$cus->invoice_custom_fieldid, + 'invoice_custom_fieldvalue'=>$cus->invoice_custom_fieldvalue + + + ); + + $this->save_credit_custom($customarray); + + } + + + $updatearray = array('invoice_status_id'=>'4'); + + $inv_status= $this->saveinvoicestatus($source_id,$updatearray); + + + + //print_r($db_array); + + //die(); + + // if (count($db_array) > 2) { + // unset($db_array['invoice_custom_id']); + // $db_array['invoice_id'] = $target_id; + // $this->mdl_invoice_custom->save_custom($target_id, $db_array); + // } + } + + /** + * @return array + */ + public function db_array() + { + $db_array = parent::db_array(); + + + // print_r($db_array); + // $receivedstatus='ST066'; + $credit_status='0'; + + // Get the client id for the submitted invoice + $this->load->model('clients/mdl_clients'); + + // Check if is SUMEX + $this->load->model('invoice_groups/mdl_invoice_groups'); + + $db_array['invoice_date_created'] = date_to_mysql($db_array['invoice_date_created']); + $db_array['invoice_date_due'] = $this->get_date_due($db_array['invoice_date_created']); + $db_array['invoice_terms'] = get_setting('default_invoice_terms'); + //$db_array['receivedstatus'] = $receivedstatus; + // $db_array['credit_status'] = $credit_status; + + if (!isset($db_array['invoice_status_id'])) { + $db_array['invoice_status_id'] = 1; + } + + $generate_invoice_number = get_setting('generate_invoice_number_for_draft'); + + if ($db_array['invoice_status_id'] === 1 && $generate_invoice_number == 1) { + $db_array['invoice_number'] = $this->get_invoice_number($db_array['invoice_group_id']); + } elseif ($db_array['invoice_status_id'] != 1) { + $db_array['invoice_number'] = $this->get_invoice_number($db_array['invoice_group_id']); + } else { + $db_array['invoice_number'] = ''; + } + + // Set default values + $db_array['payment_method'] = (empty($db_array['payment_method']) ? 0 : $db_array['payment_method']); + + // Generate the unique url key + $db_array['invoice_url_key'] = $this->get_url_key(); + + return $db_array; + } + + /** + * @param string $invoice_date_created + * @return string + */ + public function get_date_due($invoice_date_created) + { + $invoice_date_due = new DateTime($invoice_date_created); + $invoice_date_due->add(new DateInterval('P' . get_setting('invoices_due_after') . 'D')); + return $invoice_date_due->format('Y-m-d'); + } + + /** + * @param $invoice_group_id + * @return mixed + */ + public function get_invoice_number($invoice_group_id) + { + $this->load->model('invoice_groups/mdl_invoice_groups'); + return $this->mdl_invoice_groups->generate_invoice_number($invoice_group_id); + } + + /** + * @return string + */ + public function get_url_key() + { + $this->load->helper('string'); + return random_string('alnum', 15); + } + + /** + * @param $invoice_id + * @return mixed + */ + public function get_invoice_group_id($invoice_id) + { + $invoice = $this->get_by_id($invoice_id); + return $invoice->invoice_group_id; + } + + /** + * @param int $parent_invoice_id + * @return mixed + */ + public function get_parent_invoice_number($parent_invoice_id) + { + $parent_invoice = $this->get_by_id($parent_invoice_id); + return $parent_invoice->invoice_number; + } + + /** + * @return mixed + */ + public function get_custom_values($id) + { + $this->load->module('custom_fields/Mdl_invoice_custom'); + return $this->invoice_custom->get_by_invid($id); + } + + + /** + * @param int $invoice_id + */ + public function delete($invoice_id) + { + parent::delete($invoice_id); + + $this->load->helper('orphan'); + delete_orphans(); + } + + // Used from the guest module, excludes draft and paid + public function is_open() + { + $this->filter_where_in('invoice_status_id', array(2, 3)); + return $this; + } + + // Used to check if the invoice is Sumex + public function is_sumex() + { + $this->where('sumex_id is NOT NULL', null, FALSE); + return $this; + } + + public function guest_visible() + { + $this->filter_where_in('invoice_status_id', array(2, 3, 4)); + return $this; + } + + public function is_draft() + { + $this->filter_where('invoice_status_id', 1); + return $this; + } + + public function is_sent() + { + $this->filter_where('invoice_status_id', 2); + return $this; + } + + public function is_viewed() + { + $this->filter_where('invoice_status_id', 3); + return $this; + } + + public function is_paid() + { + $this->filter_where('invoice_status_id', 4); + return $this; + } + + public function is_overdue() + { + $this->filter_having('is_overdue', 1); + return $this; + } + + public function by_client($client_id) + { + $this->filter_where('ip_invoices.client_id', $client_id); + return $this; + } + + /** + * @param $invoice_id + */ + public function mark_viewed($invoice_id) + { + $invoice = $this->get_by_id($invoice_id); + + if (!empty($invoice)) { + if ($invoice->invoice_status_id == 2) { + $this->db->where('invoice_id', $invoice_id); + $this->db->where('invoice_id', $invoice_id); + $this->db->set('invoice_status_id', 3); + $this->db->update('ip_invoices'); + } + + // Set the invoice to read-only if feature is not disabled and setting is view + if ($this->config->item('disable_read_only') == false && get_setting('read_only_toggle') == 3) { + $this->db->where('invoice_id', $invoice_id); + $this->db->set('is_read_only', 1); + $this->db->update('ip_invoices'); + } + } + } + + /** + * @param $invoice_id + */ + public function mark_sent($invoice_id) + { + $invoice = $this->mdl_invoices->get_by_id($invoice_id); + if (!empty($invoice)) { + if ($invoice->invoice_status_id == 1) { + // Generate new invoice number if applicable + if (get_setting('generate_invoice_number_for_draft') == 0) { + $invoice_number = $this->mdl_invoices->get_invoice_number($invoice->invoice_group_id); + } else { + $invoice_number = $invoice->invoice_number; + } + + // Set new date and save + $this->db->where('invoice_id', $invoice_id); + $this->db->set('invoice_status_id', 2); + $this->db->set('invoice_number', $invoice_number); + $this->db->update('ip_invoices'); + } + + // Set the invoice to read-only if feature is not disabled and setting is sent + if ($this->config->item('disable_read_only') == false && get_setting('read_only_toggle') == 2) { + $this->db->where('invoice_id', $invoice_id); + $this->db->set('is_read_only', 1); + $this->db->update('ip_invoices'); + } + } + } + + + + function Save_quote_to_invtable($invoicedetails) + { + $this->db->trans_start(); + $this->db->insert('ip_quotetoinvoice', $invoicedetails); + $insert_id = $this->db->affected_rows(); + $this->db->trans_complete(); + return TRUE; + } + + + public function CheckInvId($invoice_id) + { + + $this->db->select('count(invoice_id) as invcount'); + $this->db->from('ip_quotetoinvoice'); + $this->db->where('invoice_id ',$invoice_id); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + + + function GetOrder_qty($quoteid,$item_product_id) + { + + $this->db->select('item_quantity as orderedqty,item_suppliedquantity as supqty, item_balancequantity as balqty '); + $this->db->from('ip_quote_items'); + $this->db->where('quote_id',$quoteid); + $this->db->where('item_product_id',$item_product_id); + $query = $this->db->get(); + return $query->result(); + + } + + function check_item($quoteid,$itemproductid) + { + + // echo $quoteid; + // die(); + $this->db->select('*'); + $this->db->from('ip_quote_items'); + $this->db->where('quote_id',$quoteid); + $this->db->where('item_product_id',$itemproductid); + $query = $this->db->get(); + return $query->result(); + } + + + function Update_Qty($quoteid,$updatearray,$item_product_id) + { + // echo $item_product_id; + // die(); + $this->db->where('quote_id', $quoteid); + $this->db->where('item_product_id',$item_product_id); + $this->db->update('ip_quote_items', $updatearray); + //print_r( $this->db->last_query()); + + //return TRUE; + + } + + function Check_Qid($quoteid) + { + + $this->db->select('quote_id as quotecount,invoice_id'); + $this->db->from('ip_quotetoinvoice'); + $this->db->where('quote_id ',$quoteid); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + + + function GetInvOrdered($invoice_id) + { + + $this->db->select('item_quantity,invoice_id'); + $this->db->from('ip_invoice_items'); + $this->db->where('invoice_id ',$invoice_id); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + } + + + function GetquoteOrdered($quoteid1) + { + + + $this->db->select('item_quantity,item_balancequantity,item_suppliedquantity'); + $this->db->from('ip_quote_items'); + $this->db->where('quote_id ',$quoteid1); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + + + function get_clientid($invoice_id) + { + + $this->db->select('client_id'); + $this->db->from('ip_invoices'); + $this->db->where('invoice_id ',$invoice_id); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + } + + + // function get_taxcheck($invoice_id) + // { + + // $this->db->select('taxcheck'); + // $this->db->from('ip_invoice_item_amounts'); + // $this->db->join('ip_invoice_items', 'ip_invoice_items.item_id = ip_invoice_item_amounts.item_id'); + // $this->db->where('ip_invoice_items.invoice_id ',$invoice_id); + // $query = $this->db->get(); + // // print_r( $this->db->last_query()); + // return $query->result(); + + // } + + + public function get_invoice_custom_values($source_id) + { + + //echo $source_id; + $this->db->select('*'); + $this->db->from('ip_invoice_custom'); + $this->db->where('ip_invoice_custom.invoice_id',$source_id); + $query = $this->db->get(); + // print_r($this->db->last_query()); + return $query->result(); + return $this; + } + + + public function save_credit_custom($customarray) + { + $this->db->trans_start(); + $this->db->insert('ip_invoice_custom', $customarray); + $insert_id = $this->db->affected_rows(); + $this->db->trans_complete(); + return true; + } + + + public function saveinvoicestatus($source_id,$updatearray) + { + // echo "ff"; + + // print_r($updatearray); + $this->db->where('invoice_id', $source_id); + $this->db->update('ip_invoices',$updatearray); + $insert_id = $this->db->affected_rows(); + //return $insert_id; + + return true; + } + + + public function getcreditstatus($invoice_id) + { + $this->db->select('credit_status'); + $this->db->from('ip_invoices'); + $this->db->where('ip_invoices.invoice_id',$invoice_id); + $query = $this->db->get(); + return $query->result(); + //return $this; + } + + + public function getinv_parentqty($invoice_id) + { + $this->db->select('creditinvoice_parent_id'); + $this->db->from('ip_invoices'); + $this->db->where('ip_invoices.invoice_id',$invoice_id); + $query = $this->db->get(); + // print_r($this->db->last_query()); + + // print_r($query->result()); + + $qty = ''; + + foreach($query->result() as $re) + { + $qty = $re->creditinvoice_parent_id; + } + + //echo "qt".$qty; + if($qty =="") + { + + } + else + { + $this->db->select('item_quantity'); + $this->db->from('ip_invoice_items'); + $this->db->where('invoice_id',$qty); + $qtyquery = $this->db->get(); + return $qtyquery->result(); + + } + } + + +} diff --git a/application/modules/invoices_1/models/Mdl_invoices_recurring.php b/application/modules/invoices_1/models/Mdl_invoices_recurring.php new file mode 100644 index 0000000..5a1c516 --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_invoices_recurring.php @@ -0,0 +1,135 @@ + 'calendar_week_1', + '14D' => 'calendar_week_2', + '21D' => 'calendar_week_3', + '28D' => 'calendar_week_4', + '1M' => 'calendar_month_1', + '2M' => 'calendar_month_2', + '3M' => 'calendar_month_3', + '4M' => 'calendar_month_4', + '5M' => 'calendar_month_5', + '6M' => 'calendar_month_6', + '1Y' => 'calendar_year_1', + ); + + public function default_select() + { + $this->db->select("SQL_CALC_FOUND_ROWS ip_invoices.*, + ip_clients.client_name, + ip_invoices_recurring.*, + IF(recur_end_date > date(NOW()) OR recur_end_date = '0000-00-00', 'active', 'inactive') AS recur_status", false); + } + + public function default_join() + { + $this->db->join('ip_invoices', 'ip_invoices.invoice_id = ip_invoices_recurring.invoice_id'); + $this->db->join('ip_clients', 'ip_clients.client_id = ip_invoices.client_id'); + } + + /** + * @return array + */ + public function validation_rules() + { + return array( + 'invoice_id' => array( + 'field' => 'invoice_id', + 'rules' => 'required' + ), + 'recur_start_date' => array( + 'field' => 'recur_start_date', + 'label' => trans('start_date'), + 'rules' => 'required' + ), + 'recur_end_date' => array( + 'field' => 'recur_end_date', + 'label' => trans('end_date') + ), + 'recur_frequency' => array( + 'field' => 'recur_frequency', + 'label' => trans('every'), + 'rules' => 'required' + ), + ); + } + + /** + * @return array + */ + public function db_array() + { + $db_array = parent::db_array(); + + $db_array['recur_start_date'] = date_to_mysql($db_array['recur_start_date']); + $db_array['recur_next_date'] = $db_array['recur_start_date']; + + if ($db_array['recur_end_date']) { + $db_array['recur_end_date'] = date_to_mysql($db_array['recur_end_date']); + } else { + $db_array['recur_end_date'] = '0000-00-00'; + } + + return $db_array; + } + + /** + * @param $invoice_recurring_id + */ + public function stop($invoice_recurring_id) + { + $db_array = array( + 'recur_end_date' => date('Y-m-d'), + 'recur_next_date' => '0000-00-00' + ); + + $this->db->where('invoice_recurring_id', $invoice_recurring_id); + $this->db->update('ip_invoices_recurring', $db_array); + } + + /** + * Sets filter to only recurring invoices which should be generated now + * @return \Mdl_Invoices_Recurring + */ + public function active() + { + $this->filter_where("recur_next_date <= date(NOW()) AND (recur_end_date > date(NOW()) OR recur_end_date = '0000-00-00')"); + return $this; + } + + /** + * @param $invoice_recurring_id + */ + public function set_next_recur_date($invoice_recurring_id) + { + $invoice_recurring = $this->where('invoice_recurring_id', $invoice_recurring_id)->get()->row(); + + $recur_next_date = increment_date($invoice_recurring->recur_next_date, $invoice_recurring->recur_frequency); + + $db_array = array( + 'recur_next_date' => $recur_next_date + ); + + $this->db->where('invoice_recurring_id', $invoice_recurring_id); + $this->db->update('ip_invoices_recurring', $db_array); + } + +} diff --git a/application/modules/invoices_1/models/Mdl_item_amounts.php b/application/modules/invoices_1/models/Mdl_item_amounts.php new file mode 100644 index 0000000..ca29721 --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_item_amounts.php @@ -0,0 +1,83 @@ +console.log('PHP: ".$item_id."');"); + + // die(); + + $amount=''; + $this->load->model('invoices/mdl_items'); + $item = $this->mdl_items->get_by_id($item_id); + + $item_subtotal = $item->item_quantity * $item->item_price; + $amount = $item->item_subtotal - $item->item_discount; + $item_tax_total = $amount * (($item->Sgst_item_tax_rate_percent + $item->Cgst_item_tax_rate_percent +$item->Igst_item_tax_rate_percent) / 100); + $item_discount_total = $item->item_discount_amount * $item->item_quantity; + $item_total = $item_subtotal + $item_tax_total - $item_discount_total; + + $item_cgst= $amount * ($item->Cgst_item_tax_rate_percent)/100; + $item_sgst= $amount * ($item->Sgst_item_tax_rate_percent)/100; + $item_igst= $amount * ($item->Igst_item_tax_rate_percent)/100; + + + // if($item_subtotal == $item_total) + // { + // $taxcheck=0; + // } + // else + // { + // $taxcheck=1; + // } + + + + $db_array = array( + 'item_id' => $item_id, + 'item_subtotal' => $item_subtotal, + 'item_tax_total' => $item_tax_total, + 'item_discount' => $item_discount_total, + 'item_total' => $item_total, + 'item_cgst_amt'=> $item_cgst, + 'item_sgst_amt'=> $item_sgst, + + 'item_igst_amt'=> $item_igst + + + ); + + $this->db->where('item_id', $item_id); + if ($this->db->get('ip_invoice_item_amounts')->num_rows()) { + $this->db->where('item_id', $item_id); + $this->db->update('ip_invoice_item_amounts', $db_array); + } else { + $this->db->insert('ip_invoice_item_amounts', $db_array); + } + } + +} diff --git a/application/modules/invoices_1/models/Mdl_items.php b/application/modules/invoices_1/models/Mdl_items.php new file mode 100644 index 0000000..6e9bc0e --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_items.php @@ -0,0 +1,501 @@ +db->query($sql); + return $query->result(); + + } + public function month() + { + + + +if (date('m') >= 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + +$sql="SELECT (SELECT count(distinct inv.invoice_id) FROM ip_invoices inv +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and MONTH(inv.invoice_date_created) = MONTH(CURRENT_DATE()) and +(inv.invoice_date_created >= '".$fa."-04-01' and inv.invoice_date_created <= '".$aa."-03-31') and creditinvoice_parent_id is null) as months,ifnull(sum(it.item_quantity),0) as sum_of_quantity,ifnull(sum(if(it.item_quantity=0,1,it.item_quantity) * it.item_price),0) as sum_of_month FROM ip_invoice_items it +join ip_invoices inv on inv.invoice_id = it.invoice_id +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and MONTH(inv.invoice_date_created) = MONTH(CURRENT_DATE()) and +(inv.invoice_date_created >= '".$fa."-04-01' and inv.invoice_date_created <= '".$aa."-03-31')"; + + + + + + $query = $this->db->query($sql); + return $query->result(); + + } + + + public function year() + { + if (date('m') >= 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $sql="SELECT (SELECT count(distinct inv.invoice_id) FROM ip_invoices inv +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and +(inv.invoice_date_created >= '".$fa."-04-01' and inv.invoice_date_created <= '".$aa."-03-31') and creditinvoice_parent_id is null) as year,ifnull(sum(iit.item_quantity),0) as sum_of_quantity,ifnull(sum(if(iit.item_quantity=0,1,iit.item_quantity) * iit.item_price),0) as sum_of_year +FROM ip_invoice_items iit +join ip_invoices ii on ii.invoice_id = iit.invoice_id +join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id +where ii.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and (ii.invoice_date_created >= '".$fa."-04-01' and ii.invoice_date_created <= '".$aa."-03-31');"; + +$query = $this->db->query($sql); + return $query->result(); + + } + + + + public function vehicle() + { + $sql="select iit.invoice_id as invoice_id,iic.invoice_custom_fieldvalue as invoice_custom_fieldvalue from ip_invoice_custom iic +join ip_invoice_items iit on iit.invoice_id = iic.invoice_id where invoice_custom_fieldid = '8'"; + $query = $this->db->query($sql); + return $query->result(); + + } + public function item_name() + { + $sql="SELECT product_description as item_name FROM ip_products"; + $query = $this->db->query($sql); + return $query->result(); + + } + +// public function year_wise($a,$b) +// { +// $sql="SELECT inv.invoice_date_created as months,sum(it.item_quantity) as quantity,sum(it.item_quantity * it.item_price) as value FROM ip_invoice_items it +// join ip_invoices inv on inv.invoice_id = it.invoice_id where inv.invoice_status_id != 1 and (YEAR(inv.invoice_date_created) = ? and MONTH(inv.invoice_date_created) >= 4 ) or ( YEAR(inv.invoice_date_created) = ? and MONTH(inv.invoice_date_created) <= 3 ) +// group by month(months) +// ORDER BY month(months);"; +// $query = $this->db->query($sql,array($a,$b)); +// return $query->result(); + +// } + + +public function year_wise($a,$b) + { + $sql="SELECT inv.invoice_date_created as months,sum(it.item_quantity) as quantity,sum(it.item_quantity * it.item_price) as value FROM ip_invoice_items it +join ip_invoices inv on inv.invoice_id = it.invoice_id +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8'and +(inv.invoice_date_created) >= '$a-04-01' and date(inv.invoice_date_created) <= '$b-03-31' +group by month(months) +ORDER BY month(months);"; +//echo $sql; + $query = $this->db->query($sql); + return $query->result(); + + } + + + + + + + public function month_wise($new) + { + //echo $new; + $month= date("m",strtotime($new)); + $year = date("Y",strtotime($new)); + //echo $month;// + //echo $year;die(); + $sql="select clt.client_id as client_id,clt.client_name as client_name,ip.product_description as product_name,sum(item_quantity) as quantity,sum(item_quantity * item_price) as value from ip_clients clt + join ip_invoices inv on inv.client_id = clt.client_id + join ip_invoice_items items on items.invoice_id = inv.invoice_id + join ip_products ip on ip.product_id = items.item_product_id + join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id + where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and month(inv.invoice_date_created) = ? and year(inv.invoice_date_created) = ? +group by client_name,product_name"; + + + $query = $this->db->query($sql,array($month,$year)); + //print_r($query->result()); + // echo $sql; + return $query->result(); + + } + public function year_wise_total($a,$b) + { + + $sql="select clt.client_id as client_id,clt.client_name as client_name,ip.product_description as product_name,sum(item_quantity) as quantity,sum(item_quantity * item_price) as value +from ip_clients clt +join ip_invoices inv on inv.client_id = clt.client_id +join ip_invoice_items items on items.invoice_id = inv.invoice_id +join ip_invoice_custom icf on icf.invoice_id = inv.invoice_id +join ip_products ip on ip.product_id = items.item_product_id +where inv.invoice_status_id != 1 and icf.invoice_custom_fieldid = '8' and (inv.invoice_date_created) >= '".$a."-04-01' and date(inv.invoice_date_created) <= '".$b."-03-31' group by client_name,product_name"; + $query = $this->db->query($sql); + //echo $sql; + //print_r($a); + return $query->result(); + + } + public function fiscalYear() + { + $sql="SELECT + CASE WHEN MONTH(inv.invoice_date_created)>=4 THEN + concat(YEAR(inv.invoice_date_created), '-',YEAR(inv.invoice_date_created)+1) + ELSE concat(YEAR(inv.invoice_date_created)-1,'-', YEAR(inv.invoice_date_created)) END AS financial_year, + SUM(it.item_quantity) +FROM ip_invoice_items it +join ip_invoices inv on inv.invoice_id = it.invoice_id +where inv.invoice_status_id != 1 +GROUP BY financial_year "; + $query = $this->db->query($sql); + //print_r($query->result()); + return $query->result(); + } + public function selectmonth($a,$b) + { + $sql="SELECT + monthname(invoice_date_created) as months +FROM ip_invoices +where case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = $a and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = $b+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = $a-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = $b and MONTH(invoice_date_created) <= 3 ) +end +GROUP BY months +ORDER BY FIELD(months, +'December', 'November', 'October', +'September', 'August', 'July', +'June', 'May', 'April', +'March', 'February', 'January') DESC, months ASC"; + $query = $this->db->query($sql,array($a,$b)); + + return $query->result(); + } + public function customer() + { + + $sql="SELECT client_name,client_id FROM ip_clients +order by client_name;"; + + $query = $this->db->query($sql); + //print_r($a); + return $query->result(); + + } + + + + public function default_select() + { + $this->db->select('ip_invoice_item_amounts.*, ip_products.*, ip_invoice_items.*, + Sgst_item_tax_rates.tax_rate_percent AS Sgst_item_tax_rate_percent, + Sgst_item_tax_rates.tax_rate_name AS Sgst_item_tax_rate_name,(((ip_invoice_items.item_quantity * ip_invoice_items.item_price) - (ip_invoice_items.item_quantity * ip_invoice_items.item_discount_amount)) * Sgst_item_tax_rates.tax_rate_percent /100) AS Sgst_item_tax_rate_amount,Cgst_item_tax_rates.tax_rate_percent AS Cgst_item_tax_rate_percent, + Cgst_item_tax_rates.tax_rate_name AS Cgst_item_tax_rate_name,(((ip_invoice_items.item_quantity * ip_invoice_items.item_price) - (ip_invoice_items.item_quantity * ip_invoice_items.item_discount_amount)) * Cgst_item_tax_rates.tax_rate_percent /100) AS Cgst_item_tax_rate_amount,Igst_item_tax_rates.tax_rate_percent AS Igst_item_tax_rate_percent, + Igst_item_tax_rates.tax_rate_name AS Igst_item_tax_rate_name,(((ip_invoice_items.item_quantity * ip_invoice_items.item_price) - (ip_invoice_items.item_quantity * ip_invoice_items.item_discount_amount)) * Igst_item_tax_rates.tax_rate_percent /100) AS Igst_item_tax_rate_amount'); + } + + public function default_order_by() + { + $this->db->order_by('ip_invoice_items.item_order'); + } + + public function default_join() + { + $this->db->join('ip_invoice_item_amounts', 'ip_invoice_item_amounts.item_id = ip_invoice_items.item_id', 'left'); + $this->db->join('ip_tax_rates AS Sgst_item_tax_rates', 'Sgst_item_tax_rates.tax_rate_id = ip_invoice_items.Sgst_item_tax_rate_id', 'left'); + $this->db->join('ip_tax_rates AS Cgst_item_tax_rates', 'Cgst_item_tax_rates.tax_rate_id = ip_invoice_items.Cgst_item_tax_rate_id', 'left'); + $this->db->join('ip_tax_rates AS Igst_item_tax_rates', 'Igst_item_tax_rates.tax_rate_id = ip_invoice_items.Igst_item_tax_rate_id', 'left'); + $this->db->join('ip_products', 'ip_products.product_id = ip_invoice_items.item_product_id', 'left'); + + } + + /** + * @return array + */ + public function validation_rules() + { + return array( + 'invoice_id' => array( + 'field' => 'invoice_id', + 'label' => trans('invoice'), + 'rules' => 'required' + ), + 'item_sku' => array( + 'field' => 'item_sku', + 'label' => trans('item_sku'), + 'rules' => 'required|unique' + ), + 'item_name' => array( + 'field' => 'item_name', + 'label' => trans('item_name'), + 'rules' => 'required' + ), + 'item_description' => array( + 'field' => 'item_description', + 'label' => trans('description') + ), + 'item_quantity' => array( + 'field' => 'item_quantity', + 'label' => trans('quantity'), + 'rules' => 'required' + ), + 'item_price' => array( + 'field' => 'item_price', + 'label' => trans('price'), + 'rules' => 'required' + ), + 'item_tax_rate_id' => array( + 'field' => 'item_tax_rate_id', + 'label' => trans('item_tax_rate') + ), + 'item_product_id' => array( + 'field' => 'item_product_id', + 'label' => trans('original_product') + ), + 'item_date' => array( + 'field' => 'item_date', + 'label' => trans('item_date') + ) + ); + } + + + function get_product() + { + + //$this->db->select('product_id,product_description'); + + $this->db->join('ip_units unit','unit.unit_id = ip_products.unit_id'); + $this->db->from('ip_products'); + $query = $this->db->get(); + //print_r($query->result()); + + // print_r( $this->db->last_query()); + return $query->result(); + + } + + function get_quotes($client_id) + { + + $this->db->select('ip_quotes.quote_id,quote_number,quote_pono'); + // $this->db->join('ip_units unit','unit.unit_id = ip_products.unit_id'); + $this->db->from('ip_quotes'); + $this->db->join('ip_quote_items','ip_quote_items.quote_id = ip_quotes.quote_id'); + $this->db->where('client_id ',$client_id); + $this->db->where('item_status ',1); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + + + // function get_quoteproduct($quote_id) + // { + + // $this->db->select('item_name,item_description,item_quantity,item_balancequantity,item_suppliedquantity,item_price,unit_id,Sgst_item_tax_rate_id,Cgst_item_tax_rate_id,Igst_item_tax_rate_id,product_id,item_product_id'); + // $this->db->from('ip_quote_items'); + // $this->db->join('ip_quotes','ip_quote_items.quote_id = ip_quotes.quote_id'); + // $this->db->join('ip_products','ip_quote_items.item_product_id = ip_products.product_id'); + // $this->db->where('ip_quote_items.quote_id =', $quote_id); + // $query = $this->db->get(); + // return $query->result(); + // } + + + + + function get_quoteproduct($quote_id) + { + + $this->db->select('item_name,item_description,item_quantity,item_balancequantity,item_suppliedquantity,item_price,unit_id,Sgst_item_tax_rate_id,Cgst_item_tax_rate_id,Igst_item_tax_rate_id,product_id,item_product_id,quote_pono,po_date_created'); + $this->db->from('ip_quote_items'); + $this->db->join('ip_quotes','ip_quote_items.quote_id = ip_quotes.quote_id'); + $this->db->join('ip_products','ip_quote_items.item_product_id = ip_products.product_id'); + $this->db->where('ip_quote_items.quote_id =', $quote_id); + $query = $this->db->get(); + return $query->result(); + } + + + + + + function get_tax() + { + + $this->db->select('*'); + $this->db->from('ip_tax_rates'); + $query = $this->db->get(); + //print_r($query->result()); + //print_r( $this->db->last_query()); + return $query->result(); + + } + + /** + * @param null $id + * @param null $db_array + * @return int|null + */ + public function save($id = null, $db_array = null) + { + + $id = parent::save($id, $db_array); + + // echo $id; + // die(); + + $this->load->model('invoices/mdl_item_amounts'); + + $this->mdl_item_amounts->calculate($id); + + $this->load->model('invoices/mdl_invoice_amounts'); + + if (is_object($db_array) && isset($db_array->invoice_id)) { + $this->mdl_invoice_amounts->calculate($db_array->invoice_id); + } elseif (is_array($db_array) && isset($db_array['invoice_id'])) { + $this->mdl_invoice_amounts->calculate($db_array['invoice_id']); + } + + return $id; + } + + /** + * @param int $item_id + */ + public function delete($item_id) + { + // Get item: + // the invoice id is needed to recalculate invoice amounts + // and the task id to update status if the item refers a task + $query = $this->db->get_where($this->table, + array('item_id' => $item_id)); + if ($query->num_rows() == 0) { + return null; + } + + $row = $query->row(); + $invoice_id = $row->invoice_id; + + // Delete the item + parent::delete($item_id); + + // Delete the item amounts + $this->db->where('item_id', $item_id); + $this->db->delete('ip_invoice_item_amounts'); + + // Recalculate invoice amounts + $this->load->model('invoices/mdl_invoice_amounts'); + $this->mdl_invoice_amounts->calculate($invoice_id); + return $row; + } + + + public function Check_invoice($invoice_id,$item_id) + { + $this->db->select('*'); + $this->db->from('ip_invoice_items'); + + $this->db->where('item_product_id',$item_id); + $this->db->where('invoice_id',$invoice_id); + + + + $query = $this->db->get(); + //print_r( $this->db->last_query()); + return $query->result(); + } + + + + // public function get_invoice_custom_values($source_id) + // { + + // //echo $source_id; + // $this->db->select('*'); + // $this->db->from('ip_invoice_custom'); + // $this->db->where('ip_invoice_custom.invoice_id',$source_id); + // $query = $this->db->get(); + // // print_r($this->db->last_query()); + // return $query->result(); + // } + + + public function SaveFinalHistory($final_productarray) + { + $this->db->trans_start(); + $this->db->insert('T_FinalProduct_History',$final_productarray); + $insert_id = $this->db->affected_rows(); + $this->db->trans_complete(); + return true; + } + + + public function GetInvoiceDeatisl($invoice_id) + { + $this->db->select('invoice_number'); + $this->db->from('ip_invoices'); + $this->db->where('invoice_id',$invoice_id); + $query = $this->db->get(); + // print_r( $this->db->last_query()); + return $query->result(); + + } + + + + public function UpdateFinalHistory($final_productarray,$invoice_id,$itemproductid) + { + $this->db->where('invoice_id', $invoice_id); + $this->db->where('ProductCode', $itemproductid); + $this->db->update('T_FinalProduct_History', $final_productarray); + return TRUE; + } + + + + + + + +} \ No newline at end of file diff --git a/application/modules/invoices_1/models/Mdl_reports.php b/application/modules/invoices_1/models/Mdl_reports.php new file mode 100644 index 0000000..0b42d35 --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_reports.php @@ -0,0 +1,1488 @@ +db->select('client_id, client_name, client_surname, CONCAT(client_name," ", client_surname) AS client_namesurname'); + + if ($from_date and $to_date and $client) { + + $from_date = date_to_mysql($from_date); + $to_date = date_to_mysql($to_date); + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + + ) AS quantity"); + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_date_created >=' . $this->db->escape($from_date) . ' + AND invoice_date_created <= ' . $this->db->escape($to_date) . ' and client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + )'); + + } + + else if ($from_date and $to_date) { + + $from_date = date_to_mysql($from_date); + $to_date = date_to_mysql($to_date); + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + + ) AS quantity"); + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_date_created >=' . $this->db->escape($from_date) . ' + AND invoice_date_created <= ' . $this->db->escape($to_date) . ' and invoice_status_id != 1 + )'); + + } else if ($a and $b and $c and $client){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = ' . $this->db->escape($c) . ' and client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + + )'); + + + + } + else if ($a and $b and $client){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + and case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + + + )'); + + + + } + else if ($a and $b and $c){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = ' . $this->db->escape($c) . ' and invoice_status_id != 1 + + )'); + + + + } + else if ($a and $b){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_status_id != 1 + and case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + + + )'); + + + + } + else if($client){ + // $a = date_to_mysql($a); + // $b = date_to_mysql($b); + // $c = date_to_mysql($c); + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE client_name = ' . $this->db->escape($client) . ' and invoice_status_id != 1 + + )'); + + + + } + //$this->db->group_by('client_namesurname,quantity,invoice_count'); + $this->db->order_by('client_namesurname'); + + return $this->db->get('ip_clients')->result(); + } + + /** + * @param null $from_date + * @param null $to_date + * @return mixed + */ + public function payment_history($from_date = null, $to_date = null) + { + $this->load->model('payments/mdl_payments'); + + if ($from_date and $to_date) { + $from_date = date_to_mysql($from_date); + $to_date = date_to_mysql($to_date); + + $this->mdl_payments->where('payment_date >=', $from_date); + $this->mdl_payments->where('payment_date <=', $to_date); + } + + return $this->mdl_payments->get()->result(); + } + + /** + * @return mixed + */ + // public function invoice_a() + // { + + // $sql="SELECT invoice_amount_id,invoice_id,invoice_sign,invoice_item_subtotal,invoice_tax_total,invoice_total FROM kasiram9_InvoiceDEV.ip_invoice_amounts;"; + // $query = $this->db->query($sql); + // return $query->result(); + // print_r($query); + // } + public function invoice_aging() + { + $this->db->select('client_name, client_surname'); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 1 DAY) + AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 30 DAY) + ) + ) AS range_1', false); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 30 DAY) + AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 60 DAY) + ) + ) AS range_2', false); + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 60 DAY) + AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 90 DAY) + ) + ) AS range_3', false); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 90 DAY) + ) + ) AS range_4', false); + + $this->db->select(' + ( + SELECT SUM(invoice_balance) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(), INTERVAL 1 DAY) + ) + ) AS total_balance', false); + + $this->db->having('range_1 >', 0); + $this->db->or_having('range_2 >', 0); + $this->db->or_having('range_3 >', 0); + $this->db->or_having('range_4 >', 0); + $this->db->or_having('total_balance >', 0); + + return $this->db->get('ip_clients')->result(); + } + + + /** + * @param null $from_date + * @param null $to_date + * @param null $minQuantity + * @param null $maxQuantity + * @param bool $taxChecked + * @return mixed + */ + public function sales_by_year($from_date = null, $to_date = null, $minQuantity = null, $maxQuantity = null, $taxChecked = False) + { + if ($minQuantity == "") { + $minQuantity = 0; + } + + if ($from_date == "") { + $from_date = date("Y-m-d"); + } else { + $from_date = date_to_mysql($from_date); + } + + if ($to_date == "") { + $to_date = date("Y-m-d"); + } else { + $to_date = date_to_mysql($to_date); + } + + $from_date_year = intval(substr($from_date, 0, 4)); + $to_date_year = intval(substr($to_date, 0, 4)); + + $this->db->select('client_name as Name'); + $this->db->select('client_name'); + $this->db->select('client_surname'); + $this->db->select('CONCAT(client_name," ", client_surname) AS client_namesurname'); + + if ($taxChecked == false) { + + if ($maxQuantity) { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_item_subtotal) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) AND ' . $maxQuantity . ' >= + ( + SELECT SUM(amounts3.invoice_item_subtotal) FROM ip_invoice_amounts amounts3 + WHERE amounts3.invoice_id IN + ( + SELECT inv3.invoice_id FROM ip_invoices inv3 + WHERE inv3.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv3.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv3.invoice_date_created + ) + ) + ) + ) <>0'); + + } else { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select('client_name as Name'); + + $this->db->select(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_item_subtotal) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_item_subtotal) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) + ) + ) <>0'); + + } + + } else if ($taxChecked == true) { + + if ($maxQuantity) { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select('client_name as Name'); + + $this->db->select(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_total) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) AND ' . $maxQuantity . ' >= + ( + SELECT SUM(amounts3.invoice_total) FROM ip_invoice_amounts amounts3 + WHERE amounts3.invoice_id IN + ( + SELECT inv3.invoice_id FROM ip_invoices inv3 + WHERE inv3.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv3.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv3.invoice_date_created + ) + ) + ) + ) <>0'); + + } else { + + $this->db->select('client_id'); + $this->db->select('client_vat_id AS VAT_ID'); + $this->db->select('client_name as Name'); + + $this->db->select(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + ) + ) AS total_payment', false); + + for ($index = $from_date_year; $index <= $to_date_year; $index++) { + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-01-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-02-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-03-%\' + ) + ) + ) AS payment_t1_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-04-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-05-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-06-%\' + ) + ) + ) AS payment_t2_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-07-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-08-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-09-%\' + ) + ) + ) AS payment_t3_' . $index . '', false); + + $this->db->select(' + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE invoice_id IN + ( + SELECT invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . '<= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . '>= inv.invoice_date_created + AND + ( + inv.invoice_date_created LIKE \'%' . $index . '-10-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-11-%\' + OR inv.invoice_date_created LIKE \'%' . $index . '-12-%\' + ) + ) + ) AS payment_t4_' . $index . '', false); + + } + + $this->db->where(' + ( + SELECT SUM(amounts.invoice_total) FROM ip_invoice_amounts amounts + WHERE amounts.invoice_id IN + ( + SELECT inv.invoice_id FROM ip_invoices inv + WHERE inv.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv.invoice_date_created + AND ' . $minQuantity . ' <= + ( + SELECT SUM(amounts2.invoice_total) FROM ip_invoice_amounts amounts2 + WHERE amounts2.invoice_id IN + ( + SELECT inv2.invoice_id FROM ip_invoices inv2 + WHERE inv2.client_id=ip_clients.client_id + AND ' . $this->db->escape($from_date) . ' <= inv2.invoice_date_created + AND ' . $this->db->escape($to_date) . ' >= inv2.invoice_date_created + ) + ) + ) + ) <>0'); + + } + + } + + $this->db->order_by('client_namesurname'); + return $this->db->get('ip_clients')->result(); + } + public function cumulative_report() + { + $sql="select distinct Year.client_id,Year.client_name,Year.product_id,Year.product_name,Year.invoice_count,Year.Qty,Year.Value,Month.Qty as MQty,Month.Value as MValue,Today.Qty as TQty,Today.Value as TValue from + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_name,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE)+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE)-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) <= 3 ) + end and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Year left join + + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_name,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where month(invoice.invoice_date_created)=month(CURRENT_DATE()) and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Month on Year.client_name = Month.client_name and Year.product_id = Month.product_id + + left join + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_name,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where invoice.invoice_date_created=CURRENT_DATE and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Today on Year.client_name = Today.client_name and Year.product_id = Today.product_id + + group by Year.client_id,Year.product_id;"; + $query = $this->db->query($sql); + return $query->result(); + + } + + + public function cumulative_report_year($clientid,$productid) + { + + $sql = "SELECT invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_name,items.item_quantity as Qty,amt.item_subtotal as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE)+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = YEAR(CURRENT_DATE)-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = YEAR(CURRENT_DATE) and MONTH(invoice_date_created) <= 3 ) + end + and invoice.invoice_status_id != 1 and invoice.client_id = ? and items.item_product_id = ?"; + + + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + + + } + + public function cumulative_report_month($clientid,$productid) + { + $sql = "SELECT invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_name,items.item_quantity as MQty,amt.item_subtotal as MValue from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where month(invoice.invoice_date_created)=month(CURRENT_DATE()) and invoice.invoice_status_id != 1 + and invoice.client_id = ? and items.item_product_id = ?"; + + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + } + + public function cumulative_report_day($clientid,$productid) + { + + $sql = "SELECT invoice.invoice_number as invoice_number,invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_name,items.item_quantity as TQty,amt.item_subtotal as TValue from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where invoice.invoice_date_created=CURRENT_DATE and invoice.invoice_status_id != 1 and + invoice.client_id = ? and items.item_product_id = ? + "; + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + + } + public function sales($cust=null,$prod=null,$a=null,$b=null,$c=null,$from=null,$to=null) + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 "; + + + if ($prod!= ''){ + + $sql.="and iit.item_description = '".$prod."'"; + + } + + if ($cust!= '') + { + $sql.="and ic.client_name = '".$cust."'"; + } + if ($a and $b != ''){ + + $sql.=" and (ii.invoice_date_created >= '".$a."-04-01' and ii.invoice_date_created <= '".$b."-03-31')"; + + } + + if ($c!= ''){ + + $sql.="and monthname(ii.invoice_date_created) = '".$c."'"; + + } + + if ($from and $to != ''){ + $fromdate= date("Y-m-d",strtotime($from)); + $todate=date("Y-m-d",strtotime($to)); + + $sql.="and ii.invoice_date_created >= '".$fromdate."' + and ii.invoice_date_created <= '".$todate."'"; + + } + + + // echo $fromdate; + // echo $sql; + $sql.="group by invoice_number,item_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + public function sales_l($cname=null,$fa=null,$aa=null,$m=null,$frm=null,$t=null,$prod=null,$datec=null,$dmon=null) + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 "; + + + + if ($cname!= ''){ + + $sql.="and ic.client_name = '".$cname."'"; + + } + + + + if ($fa and $aa != ''){ + + $sql.=" and (ii.invoice_date_created >= '".$fa."-04-01' and ii.invoice_date_created <= '".$aa."-03-31')"; + + } + if ($m!= ''){ + + $sql.="and monthname(ii.invoice_date_created) = '".$m."'"; + + } + + if ($frm and $t != ''){ + $fromd= date("Y-m-d",strtotime($frm)); + $tod=date("Y-m-d",strtotime($t)); + + $sql.="and ii.invoice_date_created >= '".$fromd."' + and ii.invoice_date_created <= '".$tod."'"; + + } + if ($prod!= ''){ + + $sql.=" and iit.item_description = '".$prod."' "; + + } + if ($dmon!= ''){ + $mon=substr($dmon,0,-5); + $mony=substr($dmon,3,4); + + $sql.="and year(ii.invoice_date_created) = year(CURRENT_DATE()) and month(ii.invoice_date_created) = MONTH(CURRENT_DATE())"; + + } + if ($datec!= ''){ + + $sql.="and ii.invoice_date_created = '".$datec."'"; + + } + + + // echo $mon; + // echo $mony; + // echo $sql; + $sql.=" group by invoice_number,item_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + public function sales_dashboard() + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 and ii.invoice_date_created = CURRENT_DATE"; + $sql.=" group by invoice_number,item_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + +} diff --git a/application/modules/invoices_1/models/Mdl_templates.php b/application/modules/invoices_1/models/Mdl_templates.php new file mode 100644 index 0000000..22f6307 --- /dev/null +++ b/application/modules/invoices_1/models/Mdl_templates.php @@ -0,0 +1,70 @@ +load->helper('directory'); + + if ($type == 'pdf') { + + $templates = directory_map(APPPATH . '/views/invoice_templates/pdf', true); + } elseif ($type == 'public') { + $templates = directory_map(APPPATH . '/views/invoice_templates/public', true); + } + + $templates = $this->remove_extension($templates); + + return $templates; + } + + /** + * @param $files + * @return mixed + */ + private function remove_extension($files) + { + foreach ($files as $key => $file) { + $files[$key] = str_replace('.php', '', $file); + } + + return $files; + } + + /** + * @param string $type + * @return array|mixed + */ + public function get_quote_templates($type = 'pdf') + { + $this->load->helper('directory'); + + if ($type == 'pdf') { + $templates = directory_map(APPPATH . '/views/quote_templates/pdf', true); + } elseif ($type == 'public') { + $templates = directory_map(APPPATH . '/views/quote_templates/public', true); + } + + $templates = $this->remove_extension($templates); + + return $templates; + } + +} diff --git a/application/modules/invoices_1/models/view.php b/application/modules/invoices_1/models/view.php new file mode 100644 index 0000000..0ab14f9 --- /dev/null +++ b/application/modules/invoices_1/models/view.php @@ -0,0 +1,787 @@ +controller->view_data["custom_values"]; +$data=array(); +//print_r($cv); +$CustomVal = ''; +$Secondary = ''; + +//echo $quoteid; +//echo($qid); + +if($quoteid == '' && $qid != '') +{ + $quo = $qid; +} + +else if($qid == '' && $quoteid != '') +{ + $quo = $quoteid; +} + +else if($quoteid != '' || $qid != '') +{ + $quo = $qid; +} + +else +{ + $quo = ''; +} + + + + +if(!empty($Duedate)) +{ + foreach ($Duedate as $Due) + { + $CustomVal = $Due->client_custom_fieldvalue; + } +} + + +if(!empty($GetSecondary)) +{ + foreach ($GetSecondary as $GetSec) + { + $Secondary = $GetSec->Secondary; + } + + +} + + $inv_st=''; + //print_r($inv_status); + +foreach($inv_status as $st) +{ + $inv_st= $st->invoice_status_id; +} + +//echo $inv_st; + +$primarystatecode=''; +foreach ($GetClientPrimaryStateCode as $primary) +{ + $primarystatecode=$primary->client_custom_fieldvalue; +} + +$secondarystatecode=''; + +foreach ($GetClientSecondaryStateCode as $secondary) +{ + $secondarystatecode=$secondary->client_custom_fieldvalue; +} + + + + +//print_r($fields); +// echo $secondarystatecode; +// echo $primarystatecode; +//print_r($quotes); + + // echo $CustomVal ; +?> + + + + + +config->item('disable_read_only') == true) { + $invoice->is_read_only = 0; +} +?> + +
+

+ + + + invoice_status_id == 1 && !$invoice->creditinvoice_parent_id) { ?> + + +

+ + +
+ + + + + + + + +
+ + +
+ + + + +
+ +
+ + + + +
+ +
+ invoice_is_recurring) { ?> + + + is_read_only == 1) { ?> + + + + +
+ +
+ +
+ + + layout->load_view('layout/alerts'); ?> + + +
+
+ +
+
+ +
+
+

Primary Address

+ layout->load_view('clients/partial_client_address', array('client' => $invoice)); ?> +
+
+ + + + + + + + + + client_phone || $invoice->client_email) : ?> +
+ + client_phone): ?> +
+ :  + client_phone); ?> +
+ + client_email): ?> +
+ :  + client_email; ?> +
+ + +
+ +

+ +
+
+
+ + invoice_sign == -1) { ?> +
+
+   + mdl_invoices->get_parent_invoice_number($invoice->creditinvoice_parent_id); + echo anchor('/invoices/view/' . $invoice->creditinvoice_parent_id, $parent_invoice_number); + ?> +
+
+ + +
+ +
+ + + invoice_number) : ?> + value="invoice_number; ?>" + + placeholder="" + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + +
+ + +
+ + +
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 0 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + + + +
+ + +
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 4 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 5 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 6 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + +
+
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 1){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 2 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> +
+ custom_field_order == 3 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> +
+
+ custom_field_order == 16 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> +
+ + + + +
+ + + + + + +
+
+
+
+ + +
+ + layout->load_view('invoices/partial_item_table',$invoice_id); ?> + + +
+ +
+
+ is_read_only != 1 || $invoice->invoice_status_id != 4) { ?> + + + + +
+
+ + + + + diff --git a/application/modules/invoices_1/views/archive.php b/application/modules/invoices_1/views/archive.php new file mode 100644 index 0000000..d34cbf5 --- /dev/null +++ b/application/modules/invoices_1/views/archive.php @@ -0,0 +1,24 @@ +
+ +

+ +
+
+
+ + + + +
+
+
+ +
+ +
+ layout->load_view('invoices/partial_invoice_archive', array('invoices_archive' => $invoices_archive)); ?> +
+ +
diff --git a/application/modules/invoices_1/views/index.php b/application/modules/invoices_1/views/index.php new file mode 100644 index 0000000..843a640 --- /dev/null +++ b/application/modules/invoices_1/views/index.php @@ -0,0 +1,93 @@ +
+ +

+ +
+ + + + +
+ +
+ uri->segment(3)), 'mdl_invoices'); ?> +
+ + + +
+ + + +
+
+ layout->load_view('invoices/partial_invoice_table', array('invoices' => $invoices)); ?> +
+
diff --git a/application/modules/invoices_1/views/index_client.php b/application/modules/invoices_1/views/index_client.php new file mode 100644 index 0000000..222cbea --- /dev/null +++ b/application/modules/invoices_1/views/index_client.php @@ -0,0 +1,38 @@ +
+ +

+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ + layout->load_view('invoices/partial_invoice_table', array('invoices' => $invoices)); ?> + +
diff --git a/application/modules/invoices_1/views/index_recurring.php b/application/modules/invoices_1/views/index_recurring.php new file mode 100644 index 0000000..054d947 --- /dev/null +++ b/application/modules/invoices_1/views/index_recurring.php @@ -0,0 +1,89 @@ +
+

+ +
+ +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + recur_status); ?> + + + + invoice_number; ?> + + + client_id, htmlsc($invoice->client_name)); ?> + + recur_start_date); ?> + + recur_end_date); ?> + + recur_frequency]); ?> + + recur_next_date); ?> +
+ + + + +
+
+
+
+ +
diff --git a/application/modules/invoices_1/views/modal_add_invoice_tax.php b/application/modules/invoices_1/views/modal_add_invoice_tax.php new file mode 100644 index 0000000..4c1d022 --- /dev/null +++ b/application/modules/invoices_1/views/modal_add_invoice_tax.php @@ -0,0 +1,66 @@ + + + diff --git a/application/modules/invoices_1/views/modal_change_client.php b/application/modules/invoices_1/views/modal_change_client.php new file mode 100644 index 0000000..c2a3897 --- /dev/null +++ b/application/modules/invoices_1/views/modal_change_client.php @@ -0,0 +1,65 @@ + + + diff --git a/application/modules/invoices_1/views/modal_copy_invoice.php b/application/modules/invoices_1/views/modal_copy_invoice.php new file mode 100644 index 0000000..2554fa1 --- /dev/null +++ b/application/modules/invoices_1/views/modal_copy_invoice.php @@ -0,0 +1,129 @@ + + + diff --git a/application/modules/invoices_1/views/modal_create_credit.php b/application/modules/invoices_1/views/modal_create_credit.php new file mode 100644 index 0000000..2ed7702 --- /dev/null +++ b/application/modules/invoices_1/views/modal_create_credit.php @@ -0,0 +1,110 @@ + + + diff --git a/application/modules/invoices_1/views/modal_create_invoice.php b/application/modules/invoices_1/views/modal_create_invoice.php new file mode 100644 index 0000000..f33ea8c --- /dev/null +++ b/application/modules/invoices_1/views/modal_create_invoice.php @@ -0,0 +1,120 @@ + + + diff --git a/application/modules/invoices_1/views/modal_create_recurring.php b/application/modules/invoices_1/views/modal_create_recurring.php new file mode 100644 index 0000000..42aa2be --- /dev/null +++ b/application/modules/invoices_1/views/modal_create_recurring.php @@ -0,0 +1,109 @@ + + + diff --git a/application/modules/invoices_1/views/modal_delete_invoice.php b/application/modules/invoices_1/views/modal_delete_invoice.php new file mode 100644 index 0000000..0125ac1 --- /dev/null +++ b/application/modules/invoices_1/views/modal_delete_invoice.php @@ -0,0 +1,36 @@ + + + diff --git a/application/modules/invoices_1/views/partial_invoice_archive.php b/application/modules/invoices_1/views/partial_invoice_archive.php new file mode 100644 index 0000000..2fb2c8a --- /dev/null +++ b/application/modules/invoices_1/views/partial_invoice_archive.php @@ -0,0 +1,31 @@ +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
diff --git a/application/modules/invoices_1/views/partial_invoice_table.php b/application/modules/invoices_1/views/partial_invoice_table.php new file mode 100644 index 0000000..d17fea7 --- /dev/null +++ b/application/modules/invoices_1/views/partial_invoice_table.php @@ -0,0 +1,136 @@ + + + + +
+ + + + + + + + + + + + + + + + + 3 ? $invoice_count / 2 : 9999; + foreach ($invoices as $invoice) { + // Disable read-only if not applicable + if ($this->config->item('disable_read_only') == true) { + $invoice->is_read_only = 0; + } + // Convert the dropdown menu to a dropup if invoice is after the invoice split + $dropup = $invoice_idx > $invoice_list_split ? true : false; + ?> + + + + + + + + + + + + + + + + + + + + +
+ + + invoice_status_id]['label']; + if ($invoice->invoice_sign == '-1') { ?> +   + is_read_only == 1) { ?> +   + + + + + + invoice_number ? $invoice->invoice_number : $invoice->invoice_id); ?> + + + invoice_date_created); ?> + + + invoice_date_due); ?> + + + + + + + invoice_total); ?> + + invoice_balance); ?> + +
+ + + + +
+
+
diff --git a/application/modules/invoices_1/views/partial_item_table.php b/application/modules/invoices_1/views/partial_item_table.php new file mode 100644 index 0000000..ed1934e --- /dev/null +++ b/application/modules/invoices_1/views/partial_item_table.php @@ -0,0 +1,868 @@ + +invoice_status_id; +} + +//echo $inv_st; + + +if(!empty($GetSecondary)) +{ + foreach ($GetSecondary as $GetSec) + { + $Secondary = $GetSec->Secondary; + } + + +} + +//echo $Secondary; + +if(!empty($GetState)) +{ + foreach ($GetState as $GetState) + { + $State = $GetState->client_state; + } + + +} + +// print_r($statecode); + +$primarystatecode=''; +foreach ($GetClientPrimaryStateCode as $primary) +{ + $primarystatecode=$primary->client_custom_fieldvalue; +} + +$secondarystatecode=''; + +foreach ($GetClientSecondaryStateCode as $secondary) +{ + $secondarystatecode=$secondary->client_custom_fieldvalue; +} + + +// echo $secondarystatecode; +//echo $primarystatecode; + +//echo $product; + + + + +?> + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + sumex_id == ""): ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sumex_id == ""): ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+ + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+
+
+ + + + + +
+
+
+ + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+
+
+ + + + +
+
+
+ + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+
+
+ + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+
+
+ + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+ is_read_only != 1): ?> + + + + +
+
+ +
+ +
+ + + + + +

+
+ layout->load_view('upload/dropzone-invoice-html'); ?> + layout->load_view('upload/dropzone-invoice-scripts'); ?> +
+
+ + + + + + + + + + + + + + + + + + + + + +
invoice_item_subtotal); ?>invoice_item_tax_total); ?> + +
+ + + invoice_tax_rate_name) . ' ' .($invoice_tax_rate->invoice_tax_rate_percent) . '%' ?> + + + invoice_tax_rate_amount); ?> + +
+ +
invoice_total); ?>
+
+
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+
+
+
+
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
%
+
+
+
+
+ +
+ + + + diff --git a/application/modules/invoices_1/views/view.php b/application/modules/invoices_1/views/view.php new file mode 100644 index 0000000..0e49f51 --- /dev/null +++ b/application/modules/invoices_1/views/view.php @@ -0,0 +1,1008 @@ +controller->view_data["custom_values"]; +$data=array(); +//print_r($cv); +$CustomVal = ''; +$Secondary = ''; + +//echo $quoteid; +//echo($qid); + +if($quoteid == '' && $qid != '') +{ + $quo = $qid; +} + +else if($qid == '' && $quoteid != '') +{ + $quo = $quoteid; +} + +else if($quoteid != '' || $qid != '') +{ + $quo = $qid; +} + +else +{ + $quo = ''; +} + + + + +if(!empty($Duedate)) +{ + foreach ($Duedate as $Due) + { + $CustomVal = $Due->client_custom_fieldvalue; + } +} + + +if(!empty($GetSecondary)) +{ + foreach ($GetSecondary as $GetSec) + { + $Secondary = $GetSec->Secondary; + } + + +} + + $inv_st=''; + //print_r($inv_status); + +foreach($inv_status as $st) +{ + $inv_st= $st->invoice_status_id; +} + +//echo $inv_st; + +$primarystatecode=''; +foreach ($GetClientPrimaryStateCode as $primary) +{ + $primarystatecode=$primary->client_custom_fieldvalue; +} + +$secondarystatecode=''; + +foreach ($GetClientSecondaryStateCode as $secondary) +{ + $secondarystatecode=$secondary->client_custom_fieldvalue; +} + + + + +//print_r($fields); +// echo $secondarystatecode; +// echo $primarystatecode; +//print_r($custom_fields); + + // echo $CustomVal ; +?> + + + + + +config->item('disable_read_only') == true) { + $invoice->is_read_only = 0; +} +?> + +
+

+ + + + invoice_status_id == 1 && !$invoice->creditinvoice_parent_id) { ?> + + +

+ + +
+ + + + + + + + +
+ + +
+ + + + +
+ +
+ + + + +
+ +
+ invoice_is_recurring) { ?> + + + is_read_only == 1) { ?> + + + + +
+ +
+ +
+ + + layout->load_view('layout/alerts'); ?> + + +
+
+ +
+
+ +
+
+

Primary Address

+ layout->load_view('clients/partial_client_address', array('client' => $invoice)); ?> +
+
+ + + + + + + + + + client_phone || $invoice->client_email) : ?> +
+ + client_phone): ?> +
+ :  + client_phone); ?> +
+ + client_email): ?> +
+ :  + client_email; ?> +
+ + +
+ +

+ +
+
+
+ + invoice_sign == -1) { ?> +
+
+   + mdl_invoices->get_parent_invoice_number($invoice->creditinvoice_parent_id); + echo anchor('/invoices/view/' . $invoice->creditinvoice_parent_id, $parent_invoice_number); + ?> +
+
+ + +
+ +
+ invoice_group_id == '6'){?> + + + + + + + invoice_number) : ?> + value="invoice_number; ?>" + + placeholder="" + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + +
+ + +
+ + +
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 0 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + + +
+ + +
+ + + + +
+ + +
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 4 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 5 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 6 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 17 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + +
+
+ + + custom_field_location != 1) { + continue; + } ?> + custom_field_order == 1){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 2 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + + custom_field_order == 3 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + custom_field_order == 16 ){ + print_field($this->mdl_invoices, $custom_field, $cv); } + ?> + + + + + + + +
+ + + + + + +
+
+
+
+ + +
+ + layout->load_view('invoices/partial_item_table',$inv_status); ?> + + +
+ +
+
+ is_read_only != 1 || $invoice->invoice_status_id != 4) { ?> + + + + +
+
+ + + + + diff --git a/application/modules/invoices_1/views/view_sumex.php b/application/modules/invoices_1/views/view_sumex.php new file mode 100644 index 0000000..95144e0 --- /dev/null +++ b/application/modules/invoices_1/views/view_sumex.php @@ -0,0 +1,752 @@ +controller->view_data["custom_values"]; +?> + + +config->item('disable_read_only') == true) { + $invoice->is_read_only = 0; +} +?> + +
+

+ invoice_number ? '#' . $invoice->invoice_number : $invoice->invoice_id); + ?> +

+ +
+ +
+ + + + +
+ + is_read_only != 1 || $invoice->invoice_status_id != 4) { ?> + + + + +
+ +
+ invoice_is_recurring) { ?> + + + is_read_only == 1) { ?> + + + + +
+ +
+ +
+ layout->load_view('layout/alerts'); ?> +
+
+
+
+
+

+ + invoice_status_id == 1) { ?> + + +


+ + client_address_1) ? $invoice->client_address_1 . '
' : ''; ?> + client_address_2) ? $invoice->client_address_2 . '
' : ''; ?> + client_city) ? $invoice->client_city : ''; ?> + client_state) ? $invoice->client_state : ''; ?> + client_zip) ? $invoice->client_zip : ''; ?> + client_country) ? '
' . $invoice->client_country : ''; ?> +
+

+ client_phone): ?> + + : + client_phone; ?> + +
+ + client_email): ?> + + : + client_email; ?> + + +

+ ' . trans('birthdate') . ': ' . format_date($invoice->client_birthdate); ?> +
+ ' . trans('gender') . ': ' . format_gender($invoice->client_gender); ?> +
+
+

+
+
+ + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+
+ +
+ +
+ +
+ + invoice_sign == -1) { ?> +
+ +   + creditinvoice_parent_id, + $invoice->creditinvoice_parent_id) ?> + +
+ + +
+ +
+ + +
+ +
+ + invoice_number) : ?> + value="invoice_number; ?>" + + placeholder="" + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
+ +
+ + +
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+
+ +
+ + +
+ is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> + + + +
+
+ + + + custom_field_location != 1) { + continue; + } ?> + mdl_invoices, $custom_field, $cv); ?> + +
+
+
+
+ +
+ + layout->load_view('invoices/partial_item_table'); ?> + +
+ +
+
+ + + + +
+ +
+ + +
+ + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ +
+
+ +
+ +
+
+

+ +
+
+

+ +
+
+
+
+
+ + is_read_only != 1) { ?> + + +
+
+
+
+ +
+
+
+ + + controller->view_data["custom_values"]; ?> +
+
+
+ +
+ + + custom_field_location != 0) { + continue; + } ?> + + + mdl_invoices, $custom_field, $cv); ?> + + +
+ +
+ + + custom_field_location != 0) { + continue; + } ?> + + + mdl_invoices, $custom_field, $cv); ?> + + +
+
+
+
+ + + + invoice_status_id != 1) { ?> +

+ : + invoice_url_key)); ?> +

+ + +
+ +
+ +
+ diff --git a/application/modules/layout/views/includes/navbar.php b/application/modules/layout/views/includes/navbar.php index eb4a8d9..5a60211 100644 --- a/application/modules/layout/views/includes/navbar.php +++ b/application/modules/layout/views/includes/navbar.php @@ -9,10 +9,11 @@ diff --git a/application/modules/products/models/Mdl_products.php b/application/modules/products/models/Mdl_products.php index e7ede37..999be79 100644 --- a/application/modules/products/models/Mdl_products.php +++ b/application/modules/products/models/Mdl_products.php @@ -17,6 +17,8 @@ class Mdl_Products extends Response_Model { public $table = 'ip_products'; public $primary_key = 'ip_products.product_id'; + + public function default_select() { @@ -44,6 +46,8 @@ class Mdl_Products extends Response_Model $this->db->group_end(); } + + public function by_family($match) { $this->db->where('ip_products.family_id', $match); @@ -63,7 +67,7 @@ class Mdl_Products extends Response_Model 'product_name' => array( 'field' => 'product_name', 'label' => trans('product_name'), - 'rules' => 'required' + 'rules' => '' ), 'product_description' => array( 'field' => 'product_description', @@ -100,6 +104,26 @@ class Mdl_Products extends Response_Model 'label' => trans('tax_rate'), 'rules' => 'numeric' ), + + + 'cgst' => array( + 'field' => 'cgst', + 'label' => trans('cgst'), + 'rules' => 'numeric' + ), + + 'sgst' => array( + 'field' => 'sgst', + 'label' => trans('sgst'), + 'rules' => 'numeric' + ), + + 'igst' => array( + 'field' => 'igst', + 'label' => trans('igst'), + 'rules' => 'numeric' + ), + // Sumex 'product_tariff' => array( 'field' => 'product_tariff', @@ -117,11 +141,14 @@ class Mdl_Products extends Response_Model $db_array = parent::db_array(); $db_array['product_price'] = (empty($db_array['product_price']) ? null : standardize_amount($db_array['product_price'])); + //$db_array['product_description'] = (empty($db_array['product_description']) ? null : standardize_amount($db_array['product_description'])); $db_array['purchase_price'] = (empty($db_array['purchase_price']) ? null : standardize_amount($db_array['purchase_price'])); $db_array['family_id'] = (empty($db_array['family_id']) ? null : $db_array['family_id']); $db_array['unit_id'] = (empty($db_array['unit_id']) ? null : $db_array['unit_id']); $db_array['tax_rate_id'] = (empty($db_array['tax_rate_id']) ? null : $db_array['tax_rate_id']); + + return $db_array; } diff --git a/application/modules/products/views/form.php b/application/modules/products/views/form.php index a7145ae..b052b0e 100644 --- a/application/modules/products/views/form.php +++ b/application/modules/products/views/form.php @@ -96,6 +96,94 @@
+ + + + + + + +
+ + +
+ + +
+
+ + + + + + + + +
+ + +
+ + +
+
+ + + + + + + +
+ + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + - - - + + + + + - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
- + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ +
+ + + + + + +
+ +
+ + +
+ +
+ + +
+ + + + +
+ + +
+ +
+ + +
+ +
+ + + + + - + - - - - - - - + + + + + + + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + + + +
+ + +
+ + +
+ -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - +
+ + +
+ + +
+ + + + + +
+ + + + + -
- - - - - - - - - -
- - -
- - -
- - + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> - - + + +
+ + + +
+ + + + -
- - -
- - item_subtotal); ?> - - - -
- - item_discount); ?> - - - -
- - item_tax_total); ?> - - - -
- - item_total); ?> - - - +
+ + + + + + + + + + @@ -219,7 +401,7 @@
-
+ +
+ layout->load_view('upload/dropzone-quote-html'); ?>
-

- -
+
+ + + + + + + + + + + + + + + + +
quote_item_subtotal); ?>quote_item_tax_total); ?>quote_total); ?>
+
+
+ \ No newline at end of file diff --git a/application/modules/quotes/views/partial_quote_table.php b/application/modules/quotes/views/partial_quote_table.php index 3667a6d..a03eb83 100644 --- a/application/modules/quotes/views/partial_quote_table.php +++ b/application/modules/quotes/views/partial_quote_table.php @@ -5,6 +5,7 @@ + @@ -35,6 +36,7 @@ quote_number ? $quote->quote_number : $quote->quote_id); ?> + quote_pono;?> quote_date_created); ?> @@ -79,6 +81,20 @@ + + +
  • + + + + +
  • + + +
    @@ -90,3 +106,36 @@
    + + diff --git a/application/modules/quotes/views/partialitemq.php b/application/modules/quotes/views/partialitemq.php new file mode 100644 index 0000000..757c162 --- /dev/null +++ b/application/modules/quotes/views/partialitemq.php @@ -0,0 +1,803 @@ + +invoice_status_id; +// } + +//echo $inv_st; + + +if(!empty($GetSecondary)) +{ + foreach ($GetSecondary as $GetSec) + { + $Secondary = $GetSec->Secondary; + } + + +} + +//echo $Secondary; + +if(!empty($GetState)) +{ + foreach ($GetState as $GetState) + { + $State = $GetState->client_state; + } + + +} + +// print_r($statecode); + +$primarystatecode=''; +// foreach ($GetClientPrimaryStateCode as $primary) +// { +// $primarystatecode=$primary->client_custom_fieldvalue; +// } + +// $secondarystatecode=''; + +// foreach ($GetClientSecondaryStateCode as $secondary) +// { +// $secondarystatecode=$secondary->client_custom_fieldvalue; +// } + + +// echo $secondarystatecode; +//echo $primarystatecode; + +//echo $product; + + + + +?> + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
    +
    +
    + + + + + +
    +
    +
    + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
    +
    +
    + + + + +
    +
    +
    + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
    +
    +
    + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
    +
    +
    + + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    + + +
    +
    + is_read_only != 1): ?> + + + + +
    +
    + +
    + +
    + + + + + +

    +
    + layout->load_view('upload/dropzone-invoice-html'); ?> + layout->load_view('upload/dropzone-invoice-scripts'); ?> +
    +
    + + + + + + + + + + + + + + + + + + + +
    invoice_item_subtotal); ?>invoice_item_tax_total); ?>invoice_total); ?>
    +
    +
    + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
    +
    +
    +
    +
    + is_read_only == 1) { + echo 'disabled="disabled"'; + } ?>> +
    %
    +
    +
    +
    +
    + +
    + + + + diff --git a/application/modules/quotes/views/quotes_to_polist.php b/application/modules/quotes/views/quotes_to_polist.php new file mode 100644 index 0000000..9167f3d --- /dev/null +++ b/application/modules/quotes/views/quotes_to_polist.php @@ -0,0 +1,59 @@ + +
    +

    +

    +
    +
    Sales Order - Invoice Details
    +

    +

    + +
    + + + + + + + + + + + + + + + + + + + + + item_status == 0){?> + + + + + + + + + + + + + + + + + + + + + + +
    quote_number;?>quote_pono?>item_date_added?>client_name?>item_name?>item_quantity?>item_balancequantity?>quote_total?>
    +
    \ No newline at end of file diff --git a/application/modules/quotes/views/view.php b/application/modules/quotes/views/view.php index 5c51b60..5e8c2c7 100644 --- a/application/modules/quotes/views/view.php +++ b/application/modules/quotes/views/view.php @@ -1,5 +1,16 @@ controller->view_data["custom_values"]; + +// print_r($itemstatus); +$itemstatusvalue=''; + +foreach($itemstatus as $item) +{ + $itemstatusvalue = $item->item_status; +} + +//echo $itemstatusvalue; + ?> diff --git a/application/modules/reports/.DS_Store b/application/modules/reports/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f7bc4d4b12c237c677afcce2ae0e6bed73787a14 GIT binary patch literal 6148 zcmeH~J&pn~427RrRzli_a?3OvfEz@JJpmU$yHFq@QJ{r3N9Wmb!$6Hj=vi`J?8Ni) z6_YUlTmA2rz#PDg?uvyE12e{-xZr?2t~l?`f5+d`>F8-pa<2z;UgLf}mn9+~0wN#+ zA|L`IA`pi-&;PFxJ(C_q1VmsQ1pNC@=&m)jb&XF4hiCz)Q>Mc>k6waWJVC9gtt&G$ z%kIIl)S?aXe3Vm5?yIS-YcGdo^I>^s^Dc&Fy&P5;(5!}N5CIVw5cufv+|U0X`m_Fj zP@+%-MBvQ`*mS*FulQ1Vwm!U`=eL>ld81QfJBPcU00w>(f78RbUVK8WsjVwBH2nw! K1`Q(cQUW)u`V*%B literal 0 HcmV?d00001 diff --git a/application/modules/reports/controllers/Reports.php b/application/modules/reports/controllers/Reports.php index 4d2f3b7..32a8df5 100644 --- a/application/modules/reports/controllers/Reports.php +++ b/application/modules/reports/controllers/Reports.php @@ -9,9 +9,9 @@ if (!defined('BASEPATH')) exit('No direct script access allowed'); * @license https://invoiceplane.com/license.txt * @link https://invoiceplane.com */ - + /** - * Class Reports + * Class Reports */ class Reports extends Admin_Controller { @@ -27,25 +27,36 @@ class Reports extends Admin_Controller public function sales_by_client() { - + $this->load->model('invoices/mdl_items'); + $this->load->model('invoices/mdl_invoices'); - if ($this->input->post('btn_submit')) { + if ($this->input->post('btn_subm')) { + + + $ab=$this->input->post('financialyear'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + $c=$this->input->post('month'); + $client=$this->input->post('client_name'); $data = array( - 'results' => $this->mdl_reports->sales_by_client($this->input->post('from_date'), $this->input->post('to_date')), - 'from_date' => $this->input->post('from_date'), + 'from_date' => $this->input->post('from_date'), 'to_date' => $this->input->post('to_date'), + 'results' => $this->mdl_reports->sales_by_client($this->input->post('from_date'), $this->input->post('to_date'),$a,$b,$c,$client), + ); $html = $this->load->view('reports/sales_by_client', $data, true); - - $this->load->helper('mpdf'); - - pdf_create($html, trans('sales_by_client'), true); - } - - $this->layout->buffer('content', 'reports/sales_by_client_index')->render(); } - + $data = array( + + 'result' => $this->mdl_items->fiscalYear(), + 'customer' => $this->mdl_items->customer(), + //'months' => $this->mdl_items->selectmonth() + ); + $html = $this->load->view('reports/sales_by_client', $data, true); + $this->layout->buffer('content', 'reports/sales_by_client_index')->render(); + } + public function payment_history() { if ($this->input->post('btn_submit')) { @@ -61,33 +72,60 @@ class Reports extends Admin_Controller pdf_create($html, trans('payment_history'), true); } + if ($this->input->post('btn_subm')) { + $data = array( + 'results' => $this->mdl_reports->payment_history($this->input->post('from_date'), $this->input->post('to_date')), + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + ); + $html = $this->load->view('reports/payment_history', $data, true); + + $this->load->helper('mpdf'); + + + } + + + $this->layout->buffer('content', 'reports/payment_history_index')->render(); } public function invoice_aging() { + //$this->load->model('invoices/mdl_items'); + if ($this->input->post('btn_submit')) { $data = array( 'results' => $this->mdl_reports->invoice_aging() ); - + $html = $this->load->view('reports/invoice_aging', $data, true); $this->load->helper('mpdf'); - pdf_create($html, trans('invoice_aging'), true); + + //echo $html;exit; + } - - $this->layout->buffer('content', 'reports/invoice_aging_index')->render(); + + $data = array( + 'results' => $this->mdl_reports->invoice_aging(), + //'result' => $this->mdl_items->fiscalYear() + ); + + $html = $this->load->view('reports/invoice_aging', $data, true); + + $this->layout->buffer('content', 'reports/invoice_aging_index')->render(); } - + + public function sales_by_year() { if ($this->input->post('btn_submit')) { $data = array( - 'results' => $this->mdl_reports->sales_by_year($this->input->post('from_date'), $this->input->post('to_date'), $this->input->post('minQuantity'), $this->input->post('maxQuantity'), $this->input->post('checkboxTax')), + 'results' => $this->mdl_reports->sales_by_year($this->input->post('from_date'), $this->input->post('to_date')), 'from_date' => $this->input->post('from_date'), 'to_date' => $this->input->post('to_date'), ); @@ -98,8 +136,484 @@ class Reports extends Admin_Controller pdf_create($html, trans('sales_by_date'), true); } + if ($this->input->post('btn_subm')) { + $data = array( + 'results' => $this->mdl_reports->sales_by_year($this->input->post('from_date'), $this->input->post('to_date')), + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + ); + $html = $this->load->view('reports/sales_by_year', $data, true); + + + + + } + $this->layout->buffer('content', 'reports/sales_by_year_index')->render(); } + public function sales() + { + $this->load->model('invoices/mdl_items'); + if ($this->input->post('btn_submit')) { + + $cust = $this->input->post('client_name'); + $prod = $this->input->post('item_name'); + $ab=$this->input->post('financialyear'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + $c=$this->input->post('month'); + $from = $this->input->post('from_date'); + $to = $this->input->post('to_date'); + $data = array( + + 'cname' => $this->input->get('client_name'), + 'fin' => $this->input->get('ab'), + 'm' => $this->input->get('month'), + 'frm' => $this->input->get('from_date'), + 't' => $this->input->get('to_date'), + 'datec' => $this->input->get('d'), + 'dmon' => $this->input->get('dmon'), + 'item_name' => $this->mdl_items->item_name(), + 'customer' => $this->mdl_items->customer(), + 'results' => $this->mdl_reports->sales($cust,$prod,$a,$b,$c,$from,$to), + + ); + + $html = $this->load->view('reports/sales', $data, true); + } + + $data = array( + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + 'customer' => $this->mdl_items->customer(), + 'result' => $this->mdl_items->fiscalYear(), + 'item_name' => $this->mdl_items->item_name(), + ); + $html = $this->load->view('reports/sales', $data, true); + $this->layout->buffer('content', 'reports/sales'); + $this->layout->render(); + } + public function year_wise() + { + $this->load->model('invoices/mdl_items'); + + if ($this->input->post('btn_submit')) { + + $ab=$this->input->post('financialyear'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + //echo $b;die(); + $data = array( + 'results' => $this->mdl_items->year_wise($a,$b) + ); + + $html = $this->load->view('reports/year_wise_pdf', $data, true); + + + // $this->layout->buffer('content', 'reports/year_wise')->render(); + + //echo $html;exit; + + } + $data = array( + // 'results' => $this->mdl_items->year_wise(), + 'result' => $this->mdl_items->fiscalYear() + ); + + $html = $this->load->view('reports/year_wise', $data, true); + + + $this->layout->buffer('content', 'reports/year_wise')->render(); + } + public function month_wise() + { + $this->load->model('invoices/mdl_items'); + + + //if ($this->input->post('btn_submit')) + $last = $this->input->get('date'); + //$last = $this->input->get('date'); + //$last = $this->uri->total_segments(); + // $month=$this->uri->segment($last); + // $new = date("m",strtotime($month)); + // echo $last;die(); + //echo $data; + $data = array( + 'results' => $this->mdl_items->month_wise($last) + + ); + + $html = $this->load->view('reports/month_wise', $data, true); + + + $this->layout->buffer('content', 'reports/month_wise')->render(); + } + public function year_wise_total() + { + $this->load->model('invoices/mdl_items'); + + + //if ($this->input->post('btn_submit')) + $last = $this->uri->total_segments(); + $month=$this->uri->segment($last); + + $a=substr($month,0,-5); + $b=substr($month,5,5); + + //echo $b;die(); + $data = array( + //'res' => $this->input->post('year'), + 'results' => $this->mdl_items->year_wise_total($a,$b) + + ); + + $html = $this->load->view('reports/year_wise_total', $data, true); + + + $this->layout->buffer('content', 'reports/year_wise_total')->render(); + } + public function selectmonth() + { + //echo 'hi'; + $this->load->model('invoices/mdl_items'); + + + $ab=$this->input->post('ab'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + //echo $a;die(); + + + + $results = $this->mdl_items->selectmonth($a,$b); + $d=json_encode($results); + echo $d; + + + } + public function cumulative_report() + { + $data['year'] = $this->mdl_reports->cumulative_report(); + + $html = $this->load->view('reports/cumulative_report', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report')->render(); + } + + public function cumulative_report_year() + { + + + $last = $this->uri->segment_array(); + + $clientid = $last[3]; + if(!empty($last[4])){ + $productid = $last[4]; + }else {$productid = null;} + + + $data['year'] = $this->mdl_reports->cumulative_report_year($clientid,$productid); + + $html = $this->load->view('reports/cumulative_report_year', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report_year')->render(); + } + + public function cumulative_report_month() + { + + $last = $this->uri->segment_array(); + + $clientid = $last[3]; + if(!empty($last[4])){ + $productid = $last[4]; + }else {$productid = null;} + $data['year'] = $this->mdl_reports->cumulative_report_month($clientid,$productid); + + $html = $this->load->view('reports/cumulative_report_month', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report_month')->render(); + } + + public function cumulative_report_day() + { + + $last = $this->uri->segment_array(); + + $clientid = $last[3]; + if(!empty($last[4])){ + $productid = $last[4]; + }else {$productid = null;} + $data['year'] = $this->mdl_reports->cumulative_report_day($clientid,$productid); + $html = $this->load->view('reports/cumulative_report_day', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report_day')->render(); + } + public function link_sales() + { + $this->load->model('invoices/mdl_items'); + if ($this->input->post('btn_submit')) { + + + $cname = $this->input->post('client_name'); + $prod = $this->input->post('item_name'); + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + $frm = $this->input->post('from_date'); + $t = $this->input->post('to_date'); + $datec = $this->input->get('d'); + $dmon = $this->input->get('dmon'); + + // echo $from; + // echo $to;die(); + $data = array( + 'cname' => $this->input->get('client_name'), + 'fin' => $this->input->get('ab'), + 'm' => $this->input->get('month'), + 'frm' => $this->input->get('from_date'), + 't' => $this->input->get('to_date'), + 'datec' => $this->input->get('d'), + 'dmon' => $this->input->get('dmon'), + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + 'customer' => $this->mdl_items->customer(), + 'result' => $this->mdl_items->fiscalYear(), + 'item_name' => $this->mdl_items->item_name(), + 'results' => $this->mdl_reports->sales_l($cname,$fa,$aa,$m,$frm,$t,$prod,$datec,$dmon), + + ); + + $html = $this->load->view('reports/sales', $data, true); + } + else{ + $cname = $this->input->get('client_name'); + $cid = $this->input->get('client_id'); + $fin = $this->input->get('ab'); + $fa=substr($fin,0,-5); + $aa=substr($fin,5,5); + $m = $this->input->get('month'); + $frm = $this->input->get('from_date'); + $t = $this->input->get('to_date'); + $datec = $this->input->get('d'); + $dmon = $this->input->get('dmon'); + $prod = $this->input->get('item_name'); + + $data = array( + 'cname' => $this->input->get('client_name'), + 'fin' => $this->input->get('ab'), + 'm' => $this->input->get('month'), + 'frm' => $this->input->get('from_date'), + 't' => $this->input->get('to_date'), + 'datec' => $this->input->get('d'), + 'dmon' => $this->input->get('dmon'), + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + 'customer' => $this->mdl_items->customer(), + 'result' => $this->mdl_items->fiscalYear(), + 'item_name' => $this->mdl_items->item_name(), + 'results' => $this->mdl_reports->sales_l($cname,$fa,$aa,$m,$frm,$t,$prod,$datec,$dmon,$cid), + ); + + $html = $this->load->view('reports/sales', $data, true); + } + $this->layout->buffer('content', 'reports/sales'); + $this->layout->render(); + } + public function consolidate_sales() + { + $this->load->model('invoices/mdl_items'); + if ($this->input->post('btn_submit')) { + $cname = $this->input->post('client_name'); + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $data['customer'] = $this->mdl_items->customer(); + $data['result'] = $this->mdl_items->fiscalYear(); + $data['results'] = $this->mdl_reports->consolidate_sales($fa,$aa,$cname); + $html = $this->load->view('reports/consolidate_sales', $data, true); + } + $data['customer'] = $this->mdl_items->customer(); + $data['result'] = $this->mdl_items->fiscalYear(); + $html = $this->load->view('reports/consolidate_sales', $data, true); + + $this->layout->buffer('content', 'reports/consolidate_sales')->render(); + } + + + + //this function used to all invoice controller---Rajasekar-- + public function all_invoice() +{ + +if ($this->input->post('btn_submit')) { + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + $data['fin'] = $this->mdl_reports->fincalYear(); + //echo $b;die(); + $data = array( +'results' => $this->mdl_reports->all_invoice($fa,$aa,$m) +); } +$data['fin'] = $this->mdl_reports->fincalYear(); + $html = $this->load->view('reports/all_invoice', $data, true); +$this->layout->buffer('content', 'reports/all_invoice')->render(); +} + + + + + public function gstin_wise() +{ +if ($this->input->post('btn_submit')) { + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + $data['fin'] = $this->mdl_reports->fincalYear(); + $data = array( +'results' => $this->mdl_reports->gstin_wise($fa,$aa,$m) +); + +} + //$data['gstin'] = $this->mdl_reports->gstin_wise($fa,$aa,$m); + $data['fin'] = $this->mdl_reports->fincalYear(); + +$html = $this->load->view('reports/gstin_wise', $data, true); + +$this->layout->buffer('content', 'reports/gstin_wise')->render(); +} + + public function hsn_wise() +{ + if ($this->input->post('btn_submit')) { + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + //echo $fa; + $aa=substr($ab,5,5); + //echo $aa; + $m=$this->input->post('month'); + + $data['fin'] = $this->mdl_reports->fincalYear(); + +$data = array( +'results' => $this->mdl_reports->hsn_wise($fa,$aa,$m) +); +} + + + $data['fin'] = $this->mdl_reports->fincalYear(); +$html = $this->load->view('reports/hsn_wise', $data, true); + +$this->layout->buffer('content', 'reports/hsn_wise')->render(); +} + + + + +public function customer_wise() +{ + + $ab=$this->input->post('financialyear'); + //echo $ab; + $fa=substr($ab,0,-5); + //echo $fa; + $aa=substr($ab,5,5); + //echo $aa; + $m=$this->input->post('month'); + + $fin= $this->input->get('ab'); + //echo $ab; + $by=substr($fin,0,-6); + //echo $by; + $ay=substr($fin,5,4); + //echo $ay; + $cname= $this->input->get('client_id'); + //echo $cname; + $month= $this->input->get('m'); + + $data['customerized'] = $this->mdl_reports->customer_wise($fa,$aa,$m,$by,$ay,$month,$cname); + + $data['fin'] = $this->mdl_reports->fincalYear(); + +$html = $this->load->view('reports/customer_wise',$data, true); + +$this->layout->buffer('content','reports/customer_wise')->render(); +} + +public function hsn_san() +{ + + + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + + $fin= $this->input->get('ab'); + $by=substr($fin,0,-6); + $ay=substr($fin,5,4); + $month= $this->input->get('m'); + $hsncode= $this->input->get('HSN_code'); + + + $data['hsnsan'] = $this->mdl_reports->hsn_san($fa,$aa,$m,$by,$ay,$month,$hsncode); + + $data['fin'] = $this->mdl_reports->fincalYear(); + +$html = $this->load->view('reports/hsn_san',$data, true); + +$this->layout->buffer('content','reports/hsn_san')->render(); + + +} + + + + +//this function used to deliver Performance --rajasekar + +public function deliver_perform() +{ + + +if ($this->input->post('btn_submit')) { + + + $ab=$this->input->post('financialyear'); + //echo $ab; + $fa=substr($ab,0,-5); + //echo $fa; + $aa=substr($ab,5,5); + //echo $aa; + $m=$this->input->post('month'); + +$data['fin'] = $this->mdl_reports->fincalYear(); + + + + $data = array( +'results' => $this->mdl_reports->deliver_perform($fa,$aa,$m) +); +} + + + + + $data['fin'] = $this->mdl_reports->fincalYear(); + +$html = $this->load->view('reports/deliver_perform',$data, true); + +$this->layout->buffer('content','reports/deliver_perform')->render(); + + +} + + + +} \ No newline at end of file diff --git a/application/modules/reports/models/Mdl_reports.php b/application/modules/reports/models/Mdl_reports.php index e132606..cdc7e69 100644 --- a/application/modules/reports/models/Mdl_reports.php +++ b/application/modules/reports/models/Mdl_reports.php @@ -20,11 +20,11 @@ class Mdl_Reports extends CI_Model * @param null $to_date * @return mixed */ - public function sales_by_client($from_date = null, $to_date = null) + public function sales_by_client($from_date = null, $to_date = null,$a = null, $b = null, $c = null, $client = null) { - $this->db->select('client_name, client_surname, CONCAT(client_name," ", client_surname) AS client_namesurname'); - - if ($from_date and $to_date) { + $this->db->select('client_id, client_name, client_surname, CONCAT(client_name," ", client_surname) AS client_namesurname'); + + if ($from_date and $to_date and $client) { $from_date = date_to_mysql($from_date); $to_date = date_to_mysql($to_date); @@ -32,10 +32,23 @@ class Mdl_Reports extends CI_Model $this->db->select(" ( SELECT COUNT(*) FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 AND invoice_date_created >= " . $this->db->escape($from_date) . " AND invoice_date_created <= " . $this->db->escape($to_date) . " ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + + ) AS quantity"); $this->db->select(" ( @@ -43,7 +56,7 @@ class Mdl_Reports extends CI_Model WHERE ip_invoice_amounts.invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 AND invoice_date_created >= " . $this->db->escape($from_date) . " AND invoice_date_created <= " . $this->db->escape($to_date) . " ) @@ -55,7 +68,7 @@ class Mdl_Reports extends CI_Model WHERE ip_invoice_amounts.invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 AND invoice_date_created >= " . $this->db->escape($from_date) . " AND invoice_date_created <= " . $this->db->escape($to_date) . " ) @@ -66,41 +79,562 @@ class Mdl_Reports extends CI_Model ( SELECT client_id FROM ip_invoices WHERE invoice_date_created >=' . $this->db->escape($from_date) . ' - AND invoice_date_created <= ' . $this->db->escape($to_date) . ' + AND invoice_date_created <= ' . $this->db->escape($to_date) . ' and client_name = '.$this->db->escape($client).' and invoice_status_id != 1 )'); - } else { + } - $this->db->select(' + else if ($from_date and $to_date) { + + $from_date = date_to_mysql($from_date); + $to_date = date_to_mysql($to_date); + + $this->db->select(" ( SELECT COUNT(*) FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id - ) AS invoice_count'); + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + + ) AS quantity"); - $this->db->select(' + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND invoice_date_created >= " . $this->db->escape($from_date) . " + AND invoice_date_created <= " . $this->db->escape($to_date) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_date_created >=' . $this->db->escape($from_date) . ' + AND invoice_date_created <= ' . $this->db->escape($to_date) . ' and invoice_status_id != 1 + )'); + + } else if ($a and $b and $c and $client){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + + ) AS quantity"); + + + $this->db->select(" ( SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts WHERE ip_invoice_amounts.invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + ) - ) AS sales'); + ) AS sales"); - $this->db->select(' + $this->db->select(" ( SELECT SUM(invoice_total) FROM ip_invoice_amounts WHERE ip_invoice_amounts.invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id - ) - ) AS sales_with_tax'); - - $this->db->where('client_id IN (SELECT client_id FROM ip_invoices)'); + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = ' . $this->db->escape($c) . ' and client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + + )'); + + } + else if ($client and $c){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + + ) + + ) AS quantity"); + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + )'); + + + + } + else if ($a and $b and $client){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and client_name = ".$this->db->escape($client)." and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE client_name = '.$this->db->escape($client).' and invoice_status_id != 1 + and case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + + + )'); + + + + } + else if ($a and $b and $c){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = " . $this->db->escape($c) . " + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + AND monthname(invoice_date_created) = ' . $this->db->escape($c) . ' and invoice_status_id != 1 + + )'); + + + + } + else if ($a and $b){ + + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND + case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = " . $this->db->escape($a) . " and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = " . $this->db->escape($b) . "+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = " . $this->db->escape($a) . "-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = " . $this->db->escape($b) . " and MONTH(invoice_date_created) <= 3 ) + end + + + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE invoice_status_id != 1 + and case + when (month(invoice_date_created) >=4) then + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . ' and MONTH(invoice_date_created) >= 4 ) or ( YEAR( invoice_date_created) = ' . $this->db->escape($b) . '+1 and MONTH(invoice_date_created) <= 3 ) + else + (YEAR(invoice_date_created) = ' . $this->db->escape($a) . '-1 and MONTH(invoice_date_created) >= 4 ) or ( YEAR(invoice_date_created) = ' . $this->db->escape($b) . ' and MONTH(invoice_date_created) <= 3 ) + end + + + )'); + + + + } + else if($client){ + // $a = date_to_mysql($a); + // $b = date_to_mysql($b); + // $c = date_to_mysql($c); + + $this->db->select(" + ( + SELECT COUNT(*) FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + + ) AS invoice_count"); + $this->db->select(" + ( + select sum(item_quantity) from ip_invoice_items it + + WHERE it.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + + ) + + ) AS quantity"); + + + $this->db->select(" + ( + SELECT SUM(invoice_item_subtotal) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + ) + ) AS sales"); + + $this->db->select(" + ( + SELECT SUM(invoice_total) FROM ip_invoice_amounts + WHERE ip_invoice_amounts.invoice_id IN + ( + SELECT invoice_id FROM ip_invoices + WHERE ip_invoices.client_id = ip_clients.client_id and invoice_status_id != 1 + AND client_name = " . $this->db->escape($client) . " + ) + ) AS sales_with_tax"); + + $this->db->where(' + client_id IN + ( + SELECT client_id FROM ip_invoices + WHERE client_name = ' . $this->db->escape($client) . ' and invoice_status_id != 1 + + )'); + + + + } + //$this->db->group_by('client_namesurname,quantity,invoice_count'); $this->db->order_by('client_namesurname'); return $this->db->get('ip_clients')->result(); @@ -129,6 +663,14 @@ class Mdl_Reports extends CI_Model /** * @return mixed */ + // public function invoice_a() + // { + + // $sql="SELECT invoice_amount_id,invoice_id,invoice_sign,invoice_item_subtotal,invoice_tax_total,invoice_total FROM kasiram9_InvoiceDEV.ip_invoice_amounts;"; + // $query = $this->db->query($sql); + // return $query->result(); + // print_r($query); + // } public function invoice_aging() { $this->db->select('client_name, client_surname'); @@ -139,7 +681,7 @@ class Mdl_Reports extends CI_Model WHERE invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 1 DAY) AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 30 DAY) ) @@ -151,20 +693,19 @@ class Mdl_Reports extends CI_Model WHERE invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id - AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 31 DAY) + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 30 DAY) AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 60 DAY) ) ) AS range_2', false); - - $this->db->select(' + $this->db->select(' ( SELECT SUM(invoice_balance) FROM ip_invoice_amounts WHERE invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id - AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 61 DAY) + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 60 DAY) AND invoice_date_due >= DATE_SUB(NOW(), INTERVAL 90 DAY) ) ) AS range_3', false); @@ -175,8 +716,8 @@ class Mdl_Reports extends CI_Model WHERE invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id - AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 91 DAY) + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 + AND invoice_date_due <= DATE_SUB(NOW(),INTERVAL 90 DAY) ) ) AS range_4', false); @@ -186,7 +727,7 @@ class Mdl_Reports extends CI_Model WHERE invoice_id IN ( SELECT invoice_id FROM ip_invoices - WHERE ip_invoices.client_id = ip_clients.client_id + WHERE ip_invoices.client_id = ip_clients.client_id and ip_invoices.invoice_status_id != 1 AND invoice_date_due <= DATE_SUB(NOW(), INTERVAL 1 DAY) ) ) AS total_balance', false); @@ -194,11 +735,12 @@ class Mdl_Reports extends CI_Model $this->db->having('range_1 >', 0); $this->db->or_having('range_2 >', 0); $this->db->or_having('range_3 >', 0); - $this->db->or_having('range_4 >', 0); + $this->db->or_having('range_4 >', 0); $this->db->or_having('total_balance >', 0); return $this->db->get('ip_clients')->result(); } + /** * @param null $from_date @@ -732,5 +1274,339 @@ class Mdl_Reports extends CI_Model $this->db->order_by('client_namesurname'); return $this->db->get('ip_clients')->result(); } + public function cumulative_report() + { + if (date('m') >= 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + //echo $aa; + $sql="select distinct Year.client_id,Year.client_name,Year.product_id,Year.product_description,Year.invoice_count,Year.Qty,Year.Value,Month.Qty as MQty,Month.Value as MValue,Today.Qty as TQty,Today.Value as TValue from + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_description,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where (invoice.invoice_date_created >= '".$fa."-04-01' and invoice.invoice_date_created <= '".$aa."-03-31') and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Year left join + + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_description,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where month(invoice.invoice_date_created)=month(CURRENT_DATE()) and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Month on Year.client_name = Month.client_name and Year.product_id = Month.product_id + + left join + (SELECT invoice.client_id as client_id,client.client_name as client_name,ifnull(count(invoice.invoice_id),0) as invoice_count,pro.product_id,pro.product_description,ifnull(sum(items.item_quantity),0) as Qty,ifnull(sum(amt.item_subtotal),0) as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where invoice.invoice_date_created=CURRENT_DATE and invoice.invoice_status_id != 1 + group by client_id,pro.product_id) as Today on Year.client_name = Today.client_name and Year.product_id = Today.product_id + + group by Year.client_id,Year.product_id;"; + //echo $sql; + $query = $this->db->query($sql); + return $query->result(); + + } + + + public function cumulative_report_year($clientid,$productid) + { + if (date('m') >= 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $sql = "SELECT invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_description,items.item_quantity as Qty,amt.item_subtotal as Value from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where (invoice.invoice_date_created >= '".$fa."-04-01' and invoice.invoice_date_created <= '".$aa."-03-31') + and invoice.invoice_status_id != 1 and invoice.client_id = ? and items.item_product_id = ?"; + + + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + + + } + + public function cumulative_report_month($clientid,$productid) + { + $sql = "SELECT invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_description,items.item_quantity as MQty,amt.item_subtotal as MValue from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where month(invoice.invoice_date_created)=month(CURRENT_DATE()) and invoice.invoice_status_id != 1 + and invoice.client_id = ? and items.item_product_id = ?"; + + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + } + + public function cumulative_report_day($clientid,$productid) + { + + $sql = "SELECT invoice.invoice_number as invoice_number,invoice.client_id as client_id,client.client_name as client_name,invoice.invoice_id as invoice_count,pro.product_id,pro.product_description,items.item_quantity as TQty,amt.item_subtotal as TValue from ip_invoices invoice + join ip_clients client on invoice.client_id =client.client_id + left join ip_invoice_items items on invoice.invoice_id = items.invoice_id + left join ip_products pro on items.item_product_id = pro.product_id + left join ip_invoice_item_amounts amt on items.item_id = amt.item_id + where invoice.invoice_date_created=CURRENT_DATE and invoice.invoice_status_id != 1 and + invoice.client_id = ? and items.item_product_id = ? + "; + $query = $this->db->query($sql,array($clientid,$productid)); + return $query->result(); + + } + public function sales($cust=null,$prod=null,$a=null,$b=null,$c=null,$from=null,$to=null) + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 "; + + + if ($prod!= ''){ + + $sql.="and ip.product_description = '".$prod."'"; + + } + + if ($cust!= '') + { + $sql.="and ic.client_name = '".$cust."'"; + } + if ($a and $b != ''){ + + $sql.=" and (ii.invoice_date_created >= '".$a."-04-01' and ii.invoice_date_created <= '".$b."-03-31')"; + + } + + if ($c!= ''){ + + $sql.="and monthname(ii.invoice_date_created) = '".$c."'"; + + } + + if ($from and $to != ''){ + $fromdate= date("Y-m-d",strtotime($from)); + $todate=date("Y-m-d",strtotime($to)); + + $sql.="and ii.invoice_date_created >= '".$fromdate."' + and ii.invoice_date_created <= '".$todate."'"; + + } + + + // echo $fromdate; + // echo $sql; + $sql.="group by invoice_number,product_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + public function sales_l($cname=null,$fa=null,$aa=null,$m=null,$frm=null,$t=null,$prod=null,$datec=null,$dmon=null) + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, + sum(ifnull(((sgst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100),0)) + as sgst, + sum(ifnull(((iit.item_quantity * iit.item_price) * cgst.tax_rate_percent)/100,0)) + as cgst, + sum(ifnull((igst.tax_rate_percent * (iit.item_quantity * iit.item_price))/100,0)) + as igst, + sum((iia.item_subtotal + ifnull(((sgst.tax_rate_percent * iia.item_subtotal)/100),0) + + + ifnull(((iia.item_subtotal * cgst.tax_rate_percent)/100),0) + + + ifnull(((igst.tax_rate_percent * iia.item_subtotal)/100),0))) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 "; + + + + if ($cname!= ''){ + + $sql.="and ic.client_name = '".$cname."'"; + + } + + + + if ($fa and $aa != ''){ + + $sql.=" and (ii.invoice_date_created >= '".$fa."-04-01' and ii.invoice_date_created <= '".$aa."-03-31')"; + + } + if ($m!= ''){ + + $sql.="and monthname(ii.invoice_date_created) = '".$m."'"; + + } + + if ($frm and $t != ''){ + $fromd= date("Y-m-d",strtotime($frm)); + $tod=date("Y-m-d",strtotime($t)); + + $sql.="and ii.invoice_date_created >= '".$fromd."' + and ii.invoice_date_created <= '".$tod."'"; + + } + if ($prod!= ''){ + + $sql.=" and ip.product_description = '".$prod."' "; + + } + if ($dmon!= ''){ + $mon=substr($dmon,0,-5); + $mony=substr($dmon,3,4); + + $sql.="and year(ii.invoice_date_created) = year(CURRENT_DATE()) and month(ii.invoice_date_created) = MONTH(CURRENT_DATE())"; + + } + if ($datec!= ''){ + + $sql.="and ii.invoice_date_created = '".$datec."'"; + + } + + + // echo $mon; + // echo $mony; + // echo $sql; + $sql.=" group by invoice_number,product_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + public function sales_dashboard() + { + + $sql = "select ii.invoice_id as invoice_id,ii.client_id as client_id,ii.invoice_number as invoice_number,ii.invoice_date_created as invoice_date_created,TIME_FORMAT(ii.invoice_time_created,'%l:%i %p') as invoice_time_created,icf.invoice_custom_fieldvalue as vehicle_no,ip.product_description as product_description,concat(ic.client_name,'-',ic.client_surname)as client_name,sum(iit.item_quantity) as item_quantity,sum(iit.item_price) as item_price,sum(iia.item_subtotal) as item_subtotal, sum(iia.item_sgst_amt) as sgst,sum(iia.item_cgst_amt) as cgst, sum(iia.item_igst_amt) as igst, + sum(ifnull(tcs.tax_rate_percent * iia.item_total/100,0)) + as tcs, + + + sum(ifnull(tcs.tax_rate_percent * iia.item_total/100,0)) ++sum(iia.item_total) + as total + from ip_invoices ii + join ip_invoice_custom icf on icf.invoice_id = ii.invoice_id + + join ip_invoice_tax_rates tc on tc.invoice_id = ii.invoice_id + + join ip_invoice_items iit on iit.invoice_id = ii.invoice_id + join ip_invoice_item_amounts iia on iia.item_id = iit.item_id + join ip_clients ic on ic.client_id = ii.client_id + join ip_products ip on ip.product_id = iit.item_product_id + left join ip_tax_rates sgst on sgst.tax_rate_id = iit.sgst_item_tax_rate_id + left join ip_tax_rates cgst on cgst.tax_rate_id = iit.cgst_item_tax_rate_id + left join ip_tax_rates igst on igst.tax_rate_id = iit.igst_item_tax_rate_id + left join ip_tax_rates tcs on tcs.tax_rate_id = tc.tax_rate_id + where icf.invoice_custom_fieldid = '8' and ii.invoice_status_id != 1 and ii.invoice_date_created = CURRENT_DATE"; + $sql.=" group by invoice_number,product_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } + public function consolidate_sales($fa,$aa,$cname=null) + { + + $sql = "select ic.client_name as client_name,ip.product_description as product_description, +SUM(IF(month(ii.invoice_date_created) = 4, iit.item_quantity, 0)) AS April, +SUM(IF(month(ii.invoice_date_created) = 5, iit.item_quantity, 0)) AS May, +SUM(IF(month(ii.invoice_date_created) = 6, iit.item_quantity, 0)) AS June, +SUM(IF(month(ii.invoice_date_created) = 7, iit.item_quantity, 0)) AS July, +SUM(IF(month(ii.invoice_date_created) = 8, iit.item_quantity, 0)) AS August, +SUM(IF(month(ii.invoice_date_created) = 9, iit.item_quantity, 0)) AS September, +SUM(IF(month(ii.invoice_date_created) = 10, iit.item_quantity, 0)) AS October, +SUM(IF(month(ii.invoice_date_created) = 11, iit.item_quantity, 0)) AS November, +SUM(IF(month(ii.invoice_date_created) = 12, iit.item_quantity, 0)) AS December, +SUM(IF(month(ii.invoice_date_created) = 1, iit.item_quantity, 0)) AS January, +SUM(IF(month(ii.invoice_date_created) = 2, iit.item_quantity, 0)) AS February, +SUM(IF(month(ii.invoice_date_created) = 3, iit.item_quantity, 0)) AS March, +sum(iit.item_quantity) as qtotal, +SUM(IF(month(ii.invoice_date_created) = 4, iit.item_quantity * iit.item_price, 0)) AS vApril, +SUM(IF(month(ii.invoice_date_created) = 5, iit.item_quantity * iit.item_price, 0)) AS vMay, +SUM(IF(month(ii.invoice_date_created) = 6, iit.item_quantity * iit.item_price, 0)) AS vJune, +SUM(IF(month(ii.invoice_date_created) = 7, iit.item_quantity * iit.item_price, 0)) AS vJuly, +SUM(IF(month(ii.invoice_date_created) = 8, iit.item_quantity * iit.item_price, 0)) AS vAugust, +SUM(IF(month(ii.invoice_date_created) = 9, iit.item_quantity * iit.item_price, 0)) AS vSeptember, +SUM(IF(month(ii.invoice_date_created) = 10, iit.item_quantity * iit.item_price, 0)) AS vOctober, +SUM(IF(month(ii.invoice_date_created) = 11, iit.item_quantity * iit.item_price, 0)) AS vNovember, +SUM(IF(month(ii.invoice_date_created) = 12, iit.item_quantity * iit.item_price, 0)) AS vDecember, +SUM(IF(month(ii.invoice_date_created) = 1, iit.item_quantity * iit.item_price, 0)) AS vJanuary, +SUM(IF(month(ii.invoice_date_created) = 2, iit.item_quantity * iit.item_price, 0)) AS vFebruary, +SUM(IF(month(ii.invoice_date_created) = 3, iit.item_quantity * iit.item_price, 0)) AS vMarch, +sum(iit.item_quantity * iit.item_price) as vtotal +from ip_invoices ii +join ip_invoice_items iit on iit.invoice_id = ii.invoice_id +join ip_clients ic on ic.client_id = ii.client_id +join ip_products ip on ip.product_id = iit.item_product_id +where ii.invoice_status_id != 1 "; + + if ($fa and $aa != ''){ + + $sql.=" and (ii.invoice_date_created >= '".$fa."-04-01' and ii.invoice_date_created <= '".$aa."-03-31')"; + + } + if ($cname!= ''){ + + $sql.="and ic.client_name = '".$cname."'"; + + } + $sql.=" group by client_name,product_description"; + $query = $this->db->query($sql); + return $query->result(); + + + } } diff --git a/application/modules/reports/views/Reports.php b/application/modules/reports/views/Reports.php new file mode 100644 index 0000000..4c76237 --- /dev/null +++ b/application/modules/reports/views/Reports.php @@ -0,0 +1,545 @@ +load->model('mdl_reports'); +} +public function sales_by_client() +{ + $this->load->model('invoices/mdl_items'); + $this->load->model('invoices/mdl_invoices'); + + if ($this->input->post('btn_subm')) { + + + $ab=$this->input->post('financialyear'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + $c=$this->input->post('month'); + $client=$this->input->post('client_name'); +$data = array( + 'from_date' => $this->input->post('from_date'), +'to_date' => $this->input->post('to_date'), + 'results' => $this->mdl_reports->sales_by_client($this->input->post('from_date'), $this->input->post('to_date'),$a,$b,$c,$client), +); +$html = $this->load->view('reports/sales_by_client', $data, true); +} + $data = array( + 'result' => $this->mdl_items->fiscalYear(), + 'customer' => $this->mdl_items->customer(), + //'months' => $this->mdl_items->selectmonth() +); + $html = $this->load->view('reports/sales_by_client', $data, true); +$this->layout->buffer('content', 'reports/sales_by_client_index')->render(); +} + +public function payment_history() +{ +if ($this->input->post('btn_submit')) { +$data = array( +'results' => $this->mdl_reports->payment_history($this->input->post('from_date'), $this->input->post('to_date')), +'from_date' => $this->input->post('from_date'), +'to_date' => $this->input->post('to_date'), +); +$html = $this->load->view('reports/payment_history', $data, true); +$this->load->helper('mpdf'); +pdf_create($html, trans('payment_history'), true); +} + if ($this->input->post('btn_subm')) { +$data = array( +'results' => $this->mdl_reports->payment_history($this->input->post('from_date'), $this->input->post('to_date')), +'from_date' => $this->input->post('from_date'), +'to_date' => $this->input->post('to_date'), +); +$html = $this->load->view('reports/payment_history', $data, true); +$this->load->helper('mpdf'); +} + + +$this->layout->buffer('content', 'reports/payment_history_index')->render(); +} +public function invoice_aging() +{ + //$this->load->model('invoices/mdl_items'); + +if ($this->input->post('btn_submit')) { +$data = array( +'results' => $this->mdl_reports->invoice_aging() +); + +$html = $this->load->view('reports/invoice_aging', $data, true); +$this->load->helper('mpdf'); +pdf_create($html, trans('invoice_aging'), true); + //echo $html;exit; + +} + + $data = array( +'results' => $this->mdl_reports->invoice_aging(), + //'result' => $this->mdl_items->fiscalYear() +); + +$html = $this->load->view('reports/invoice_aging', $data, true); + +$this->layout->buffer('content', 'reports/invoice_aging_index')->render(); +} + + +public function sales_by_year() +{ +if ($this->input->post('btn_submit')) { +$data = array( +'results' => $this->mdl_reports->sales_by_year($this->input->post('from_date'), $this->input->post('to_date')), +'from_date' => $this->input->post('from_date'), +'to_date' => $this->input->post('to_date'), +); +$html = $this->load->view('reports/sales_by_year', $data, true); +$this->load->helper('mpdf'); +pdf_create($html, trans('sales_by_date'), true); +} + if ($this->input->post('btn_subm')) { +$data = array( +'results' => $this->mdl_reports->sales_by_year($this->input->post('from_date'), $this->input->post('to_date')), +'from_date' => $this->input->post('from_date'), +'to_date' => $this->input->post('to_date'), +); +$html = $this->load->view('reports/sales_by_year', $data, true); +} +$this->layout->buffer('content', 'reports/sales_by_year_index')->render(); +} + public function sales() +{ + $this->load->model('invoices/mdl_items'); +if ($this->input->post('btn_submit')) { + + $cust = $this->input->post('client_name'); + $prod = $this->input->post('item_name'); + $ab=$this->input->post('financialyear'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + $c=$this->input->post('month'); + $from = $this->input->post('from_date'); +$to = $this->input->post('to_date'); +$data = array( + +'cname' => $this->input->get('client_id'), + 'fin' => $this->input->get('ab'), + 'm' => $this->input->get('month'), + 'frm' => $this->input->get('from_date'), + 't' => $this->input->get('to_date'), + 'datec' => $this->input->get('d'), + 'dmon' => $this->input->get('dmon'), + 'item_name' => $this->mdl_items->item_name(), + 'customer' => $this->mdl_items->customer(), + 'results' => $this->mdl_reports->sales($cust,$prod,$a,$b,$c,$from,$to), +); + +$html = $this->load->view('reports/sales', $data, true); +} + + $data = array( + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + 'customer' => $this->mdl_items->customer(), + 'result' => $this->mdl_items->fiscalYear(), + 'item_name' => $this->mdl_items->item_name(), + ); + $html = $this->load->view('reports/sales', $data, true); +$this->layout->buffer('content', 'reports/sales'); +$this->layout->render(); +} + + public function year_wise() +{ + $this->load->model('invoices/mdl_items'); + +if ($this->input->post('btn_submit')) +{ + $ab=$this->input->post('financialyear'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + //echo $b;die(); + $data = array( +'results' => $this->mdl_items->year_wise($a,$b) +); + +$html = $this->load->view('reports/year_wise_pdf', $data, true); +// $this->layout->buffer('content', 'reports/year_wise')->render(); + //echo $html;exit; + +} + $data = array( +// 'results' => $this->mdl_items->year_wise(), + 'result' => $this->mdl_items->fiscalYear() +); + +$html = $this->load->view('reports/year_wise', $data, true); + + +$this->layout->buffer('content', 'reports/year_wise')->render(); +} + + + public function month_wise() +{ + $this->load->model('invoices/mdl_items'); + + //if ($this->input->post('btn_submit')) + $last = $this->input->get('date'); + //$last = $this->input->get('date'); + //$last = $this->uri->total_segments(); + // $month=$this->uri->segment($last); + // $new = date("m",strtotime($month)); + // echo $last;die(); + //echo $data; + $data = array( +'results' => $this->mdl_items->month_wise($last) + +); + +$html = $this->load->view('reports/month_wise', $data, true); + + +$this->layout->buffer('content', 'reports/month_wise')->render(); +} + public function year_wise_total() +{ + $this->load->model('invoices/mdl_items'); + + //if ($this->input->post('btn_submit')) + $last = $this->uri->total_segments(); + $month=$this->uri->segment($last); + + $a=substr($month,0,-5); + $b=substr($month,5,5); + + //echo $b;die(); + $data = array( + //'res' => $this->input->post('year'), +'results' => $this->mdl_items->year_wise_total($a,$b) + +); + +$html = $this->load->view('reports/year_wise_total', $data, true); + + +$this->layout->buffer('content', 'reports/year_wise_total')->render(); +} + public function selectmonth() +{ + //echo 'hi'; + $this->load->model('invoices/mdl_items'); + + $ab=$this->input->post('ab'); + $a=substr($ab,0,-5); + $b=substr($ab,5,5); + //echo $a;die(); + + + +$results = $this->mdl_items->selectmonth($a,$b); + $d=json_encode($results); + echo $d; + +} + public function cumulative_report() + { + $data['year'] = $this->mdl_reports->cumulative_report(); + + $html = $this->load->view('reports/cumulative_report', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report')->render(); + } + public function cumulative_report_year() + { + + + $last = $this->uri->segment_array(); + + $clientid = $last[3]; + if(!empty($last[4])){ + $productid = $last[4]; + }else {$productid = null;} + + + $data['year'] = $this->mdl_reports->cumulative_report_year($clientid,$productid); + + $html = $this->load->view('reports/cumulative_report_year', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report_year')->render(); + } + + public function cumulative_report_month() + { + + $last = $this->uri->segment_array(); + + $clientid = $last[3]; + if(!empty($last[4])){ + $productid = $last[4]; + }else {$productid = null;} + $data['year'] = $this->mdl_reports->cumulative_report_month($clientid,$productid); + + $html = $this->load->view('reports/cumulative_report_month', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report_month')->render(); + } + public function cumulative_report_day() + { + + $last = $this->uri->segment_array(); + + $clientid = $last[3]; + if(!empty($last[4])){ + $productid = $last[4]; + }else {$productid = null;} + $data['year'] = $this->mdl_reports->cumulative_report_day($clientid,$productid); + $html = $this->load->view('reports/cumulative_report_day', $data, true); + + $this->layout->buffer('content', 'reports/cumulative_report_day')->render(); + } + public function link_sales() +{ + $this->load->model('invoices/mdl_items'); +if ($this->input->post('btn_submit')) { + + + $cname = $this->input->post('client_name'); + $prod = $this->input->post('item_name'); + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + $frm = $this->input->post('from_date'); + $t = $this->input->post('to_date'); + $datec = $this->input->get('d'); + $dmon = $this->input->get('dmon'); + + // echo $from; + // echo $to;die(); + $data = array( + 'cname' => $this->input->get('client_name'), + 'fin' => $this->input->get('ab'), + 'm' => $this->input->get('month'), + 'frm' => $this->input->get('from_date'), + 't' => $this->input->get('to_date'), + 'datec' => $this->input->get('d'), + 'dmon' => $this->input->get('dmon'), + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + 'customer' => $this->mdl_items->customer(), + 'result' => $this->mdl_items->fiscalYear(), + 'item_name' => $this->mdl_items->item_name(), + 'results' => $this->mdl_reports->sales_l($cname,$fa,$aa,$m,$frm,$t,$prod,$datec,$dmon), +); + +$html = $this->load->view('reports/sales', $data, true); +} + else{ + $cname = $this->input->get('client_name'); + $cid = $this->input->get('client_id'); + $fin = $this->input->get('ab'); + $fa=substr($fin,0,-5); + $aa=substr($fin,5,5); + $m = $this->input->get('month'); + $frm = $this->input->get('from_date'); + $t = $this->input->get('to_date'); + $datec = $this->input->get('d'); + $dmon = $this->input->get('dmon'); + $prod = $this->input->post('item_name'); + + $data = array( + 'cnametitle' => $this->input->get('client_name'), + 'fin' => $this->input->get('ab'), + 'm' => $this->input->get('month'), + 'frm' => $this->input->get('from_date'), + 't' => $this->input->get('to_date'), + 'datec' => $this->input->get('d'), + 'dmon' => $this->input->get('dmon'), + 'from_date' => $this->input->post('from_date'), + 'to_date' => $this->input->post('to_date'), + 'customer' => $this->mdl_items->customer(), + 'result' => $this->mdl_items->fiscalYear(), + 'item_name' => $this->mdl_items->item_name(), + 'results' => $this->mdl_reports->sales_l($cname,$fa,$aa,$m,$frm,$t,$prod,$datec,$dmon,$cid), + ); + $html = $this->load->view('reports/sales', $data, true); + } +$this->layout->buffer('content', 'reports/sales'); +$this->layout->render(); +} + public function consolidate_sales() + { + $this->load->model('invoices/mdl_items'); + if ($this->input->post('btn_submit')) { + $cname = $this->input->post('client_name'); + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $data['customer'] = $this->mdl_items->customer(); + $data['result'] = $this->mdl_items->fiscalYear(); + $data['results'] = $this->mdl_reports->consolidate_sales($fa,$aa,$cname); + $html = $this->load->view('reports/consolidate_sales', $data, true); + } + $data['customer'] = $this->mdl_items->customer(); + $data['result'] = $this->mdl_items->fiscalYear(); + $html = $this->load->view('reports/consolidate_sales', $data, true); + + $this->layout->buffer('content', 'reports/consolidate_sales')->render(); + } + + + + + + //this function used to all invoice controller + public function all_invoice() +{ + +if ($this->input->post('btn_submit')) { + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + $data['fin'] = $this->mdl_reports->fincalYear(); + //echo $b;die(); + $data = array( +'results' => $this->mdl_reports->all_invoice($fa,$aa,$m) +); + +} +$data['fin'] = $this->mdl_reports->fincalYear(); + $html = $this->load->view('reports/all_invoice', $data, true); +$this->layout->buffer('content', 'reports/all_invoice')->render(); +} + + + + + public function gstin_wise() +{ +if ($this->input->post('btn_submit')) { + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + $data['fin'] = $this->mdl_reports->fincalYear(); + $data = array( +'results' => $this->mdl_reports->gstin_wise($fa,$aa,$m) +); + +} + //$data['gstin'] = $this->mdl_reports->gstin_wise($fa,$aa,$m); + $data['fin'] = $this->mdl_reports->fincalYear(); + +$html = $this->load->view('reports/gstin_wise', $data, true); + +$this->layout->buffer('content', 'reports/gstin_wise')->render(); +} + + public function hsn_wise() +{ + if ($this->input->post('btn_submit')) { + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + //echo $fa; + $aa=substr($ab,5,5); + //echo $aa; + $m=$this->input->post('month'); + + $data['fin'] = $this->mdl_reports->fincalYear(); + +$data = array( +'results' => $this->mdl_reports->hsn_wise($fa,$aa,$m) +); +} + + + $data['fin'] = $this->mdl_reports->fincalYear(); +$html = $this->load->view('reports/hsn_wise', $data, true); + +$this->layout->buffer('content', 'reports/hsn_wise')->render(); +} + + + + +public function customer_wise() +{ + + $ab=$this->input->post('financialyear'); + //echo $ab; + $fa=substr($ab,0,-5); + //echo $fa; + $aa=substr($ab,5,5); + //echo $aa; + $m=$this->input->post('month'); + + $fin= $this->input->get('ab'); + //echo $ab; + $by=substr($fin,0,-6); + //echo $by; + $ay=substr($fin,5,4); + //echo $ay; + $cname= $this->input->get('client_id'); + //echo $cname; + $month= $this->input->get('m'); + + $data['customerized'] = $this->mdl_reports->customer_wise($fa,$aa,$m,$by,$ay,$month,$cname); + + $data['fin'] = $this->mdl_reports->fincalYear(); + +$html = $this->load->view('reports/customer_wise',$data, true); + +$this->layout->buffer('content','reports/customer_wise')->render(); +} + +public function hsn_san() +{ + + + $ab=$this->input->post('financialyear'); + $fa=substr($ab,0,-5); + $aa=substr($ab,5,5); + $m=$this->input->post('month'); + + $fin= $this->input->get('ab'); + $by=substr($fin,0,-6); + $ay=substr($fin,5,4); + $month= $this->input->get('m'); + $hsncode= $this->input->get('HSN_code'); + + + $data['hsnsan'] = $this->mdl_reports->hsn_san($fa,$aa,$m,$by,$ay,$month,$hsncode); + + $data['fin'] = $this->mdl_reports->fincalYear(); + +$html = $this->load->view('reports/hsn_san',$data, true); + +$this->layout->buffer('content','reports/hsn_san')->render(); + + +} + + + + + +} \ No newline at end of file diff --git a/application/modules/reports/views/all_invoice.php b/application/modules/reports/views/all_invoice.php new file mode 100644 index 0000000..82f385f --- /dev/null +++ b/application/modules/reports/views/all_invoice.php @@ -0,0 +1,364 @@ +
    + +

    + + + + + +
    + + +
    + + + + + + +
    + layout->load_view('layout/alerts'); ?> +
    + + + +
    + + +
    +
    +
    +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + +
    +
    + + + +
    +
    + +
    +
    +
    +
    +
    + + + +

    + +  input->post('client_name')){ + $cid=$this->input->post('client_name'); + echo '('.$cid.')'; + } + + if($this->input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + + } + if($this->input->post('month')){ + $month = $this->input->post('month'); + echo '('.$month.')'; + + } + ?> + +

    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    invoice_date_created)); + echo $d; + ?> + invoice_number); ?>client_tax_code); ?>product_sku); ?>percentage.'%');?>item_subtotal); + echo format_currency(round($result->item_subtotal)); + //echo ($result->item_subtotal); ?>cgst); + echo format_currency(round($result->cgst)); + //echo ($result->sgst); ?>sgst); + echo format_currency(round($result->sgst)); + //echo ($result->cgst); ?>igst); + echo format_currency(round($result->igst)); + //echo ($result->igst); ?>item_tax_total); + echo format_currency(round($result->item_tax_total)); + //echo ($result->item_tax_total); ?>total); + echo format_currency(round($result->total)); + //echo ($result->total); ?>
    Total + + + + + + + + + + + + + + + + + + + + + +
    +

    No Records Found

    "; + } + ?> + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/consolidate_sales.php b/application/modules/reports/views/consolidate_sales.php new file mode 100644 index 0000000..07119e1 --- /dev/null +++ b/application/modules/reports/views/consolidate_sales.php @@ -0,0 +1,726 @@ +
    +

    +
    +
    + + + +
    +
    + + layout->load_view('layout/alerts'); ?> + +
    + + + + + +
    + + +
    +
    +
    + +
    + + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + + +
    + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + + +

    Consolidated Sales + + + input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + } + ?> +
    + input->post('client_name'); + + echo $cid; ?> + + +

    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    client_name)) { echo $result->client_name; } else {echo "-";} + ?>product_description)) { echo $result->product_description ; } else {echo "-";} + ?>April); + if(!empty($result->April)) { echo round($result->April); } else {echo "-";} + ?>May); + if(!empty($result->May)) { echo round($result->May); } else {echo "-";} + ?>June); + if(!empty($result->June)) { echo round($result->June); } else {echo "-";} + ?>July); + if(!empty($result->July)) { echo round($result->July); } else {echo "-";} + ?>August); + if(!empty($result->August)) { echo round($result->August); } else {echo "-";} + + ?>September; + if(!empty($result->September)) { echo round($result->September); } else {echo "-";} + ?>October); + if(!empty($result->October)) { echo round($result->October); } else {echo "-";} + ?>November); + if(!empty($result->November)) { echo round($result->November); } else {echo "-";} + ?>December); + if(!empty($result->December)) { echo round($result->December); } else {echo "-";} + ?>January); + if(!empty($result->January)) { echo round($result->January); } else {echo "-";} + ?>February); + if(!empty($result->February)) { echo round($result->February); } else {echo "-";} + ?>March); + if(!empty($result->March)) { echo round($result->March); } else {echo "-";} + ?>qtotal); + if(!empty($result->qtotal)) { echo round($result->qtotal); } else {echo "-";} + ?>
    Total + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + +
    +
    + + + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/cumulative_report.php b/application/modules/reports/views/cumulative_report.php new file mode 100644 index 0000000..e1af519 --- /dev/null +++ b/application/modules/reports/views/cumulative_report.php @@ -0,0 +1,300 @@ + + + + + +
    + + + +

    + + ( + = 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + echo $yearl; + ?> + )
    + +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + = 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + foreach ($year as $result) { ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    = 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + echo $yearl;?>
    (kgs)(kgs)(kgs)
    + client_name;?> + product_description)) { echo $result->product_description ; } else {echo "-";}?>TQty)) { echo anchor('reports/cumulative_report_day/'.$result->client_id . '/' . $result->product_id,number_format(round($result->TQty),2,'.','')); $tqt += round($result->TQty); } else {echo "0.00";$tqt += 0.00; }?>TValue)) { echo anchor('reports/cumulative_report_day/'.$result->client_id . '/' . $result->product_id,format_currency(round($result->TValue),2,'.','')); $tvt += round($result->TValue); } else {echo "0.00"; $tvt += 0.00;}?>MQty)) { echo anchor('reports/cumulative_report_month/'.$result->client_id . '/' . $result->product_id,number_format(round($result->MQty),2,'.','')); $mqt += round($result->MQty); } else {echo "0.00"; $mqt += 0.00;} + + ?>MValue)) { echo anchor('reports/cumulative_report_month/'.$result->client_id . '/' . $result->product_id,format_currency(round($result->MValue),2,'.','')); $mvt += round($result->MValue); } else {echo "0.00"; $mvt += 0.00;}?>Qty)){echo anchor('reports/cumulative_report_year/'.$result->client_id . '/' . $result->product_id,number_format(round($result->Qty),2,'.',''));} else { echo "0.00";} + $yqt += round($result->Qty); + ?>Value)) {echo anchor('reports/cumulative_report_year/'.$result->client_id . '/' . $result->product_id,format_currency(round($result->Value),2,'.',''));} else {echo "0.00";} + $yvt += round($result->Value); + ?>
    Total  + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/reports/views/cumulative_report_day.php b/application/modules/reports/views/cumulative_report_day.php new file mode 100644 index 0000000..e4cc898 --- /dev/null +++ b/application/modules/reports/views/cumulative_report_day.php @@ -0,0 +1,197 @@ + + + + +
    + + + +

    + ()
    + +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    (kgs)
    invoice_count,$result->invoice_number);?> + client_name;?> + product_description)) { echo $result->product_description ; } else {echo "-";}?>TQty),2,'.',''); + $yqt += $result->TQty; + ?>TValue),2,'.',''); + $yvt += $result->TValue; + ?>
    Total   + + + + + +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/reports/views/cumulative_report_month.php b/application/modules/reports/views/cumulative_report_month.php new file mode 100644 index 0000000..0205a32 --- /dev/null +++ b/application/modules/reports/views/cumulative_report_month.php @@ -0,0 +1,200 @@ + + + + + + +
    + + + +

    + ()
    + +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    (kgs)
    + client_name;?> + product_description)) { echo $result->product_description ; } else {echo "-";}?>MQty; + $yqt += $result->MQty; + ?>MValue; + $yvt += $result->MValue; + ?>
    Total  + + + + + +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/reports/views/cumulative_report_year.php b/application/modules/reports/views/cumulative_report_year.php new file mode 100644 index 0000000..e248887 --- /dev/null +++ b/application/modules/reports/views/cumulative_report_year.php @@ -0,0 +1,237 @@ + + + + + +
    + + + +

    + ( + = 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + echo $yearl; + ?> + )
    + +

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + = 4) { + $yearl = date('Y').'-'.(date('Y')+1); + } else { + $yearl = (date('Y')-1).'-'.date('Y'); + } + $ab=$yearl; + + foreach ($year as $result) { ?> + + + + + + + + + + + + + + + + + + + +
    (kgs)
    + client_name;?> + + product_description)) { echo $result->product_description ; } else {echo "-";}?>Qty),2,'.',''); + $yqt += round($result->Qty); + ?>Value),2,'.',''); + $yvt += round($result->Value); + ?>
    Total  + + + + + +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/reports/views/customer_wise.php b/application/modules/reports/views/customer_wise.php new file mode 100644 index 0000000..b704bca --- /dev/null +++ b/application/modules/reports/views/customer_wise.php @@ -0,0 +1,338 @@ +
    +

    +

    input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + // echo ' '; + + } + if($this->input->post('month')){ + $m=$this->input->post('month'); + echo '('.$m.')'; + //echo ' '; + } + + ?>

    + + + + +
    +
    + + +
    + +
    +
    + layout->load_view('layout/alerts'); ?> + +
    +
    + + +
    +
    + + + + +

    input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + //echo ' '; + + } + if($this->input->post('month')){ + $m=$this->input->post('month'); + echo '('.$m.')'; + // echo ' '; + } + + ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    invoice_number)?>client_tax_code);?>percentage.'%');?>item_quantity); ?>item_price); ?>item_subtotal); + echo format_currency(round($result->item_subtotal)); + //echo ($result->item_subtotal); ?>cgst); + echo format_currency(round($result->cgst)); + //echo ($result->sgst); ?>sgst); + echo format_currency(round($result->sgst)); + //echo ($result->cgst); ?>igst); + echo format_currency(round($result->igst)); + // echo ($result->igst); ?>item_tax_total); + echo format_currency(round($result->item_tax_total)); + //echo ($result->tax_total); ?>total); + echo format_currency(round($result->total)); + //echo ($result->total); ?>
    Total + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/deliver_perform.php b/application/modules/reports/views/deliver_perform.php new file mode 100644 index 0000000..e2b2486 --- /dev/null +++ b/application/modules/reports/views/deliver_perform.php @@ -0,0 +1,324 @@ +
    + +

    + + + + + +
    + + +
    + + + + + + +
    + layout->load_view('layout/alerts'); ?> +
    + + + +
    + + +
    +
    +
    +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + +
    +
    + + + +
    +
    + +
    +
    +
    +
    +
    + + + +

    + +  input->post('client_name')){ + $cid=$this->input->post('client_name'); + echo '('.$cid.')'; + } + + if($this->input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + + } + if($this->input->post('month')){ + $month = $this->input->post('month'); + echo '('.$month.')'; + + } + ?> + +

    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    item_date_added)); + echo $itemdate; + ?> + invoice_date_modified)); + echo $invoicedate; + ?> + client_name);?>invoice_number); ?>item_quantity); + echo number_format(round($result->item_quantity)); + //echo ($result->item_subtotal); ?>item_suppliedquantity); + echo number_format(round($result->item_suppliedquantity)); + //echo ($result->sgst); ?>item_quantity); + $DispatchQuantity= round($result->item_suppliedquantity); + $Rating =$DispatchQuantity / $OrderedQuantity *100; + + + echo number_format($Rating, 2, '.', ' ') ; ?>
    Total + + + + + +
    +

    No Records Found

    "; + } + ?> + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/gstin_wise.php b/application/modules/reports/views/gstin_wise.php new file mode 100644 index 0000000..3bfbe74 --- /dev/null +++ b/application/modules/reports/views/gstin_wise.php @@ -0,0 +1,411 @@ +
    + +

    + + + + + +
    + + +
    +
    + layout->load_view('layout/alerts'); ?> +
    + + + +
    + + +
    +
    +
    +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + layout->load_view('layout/alerts'); ?> + +
    +
    + +
    + + + +

    + +  input->post('client_name')){ + $cid=$this->input->post('client_name'); + echo '('.$cid.')'; + } + + if($this->input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + + } + if($this->input->post('month')){ + $month = $this->input->post('month'); + echo '('.$month.')'; + + } + ?> + +

    + +
    +
    + + + + +

    input->post('financialyear')){ + // $ab=$this->input->post('financialyear'); + // echo '('.$ab.')'; + // echo ' '; + + // } + // if($this->input->post('month')){ + // $m=$this->input->post('month'); + // echo '('.$m.')'; + // echo ' '; + // } + if($this->input->post('client_name')){ + $client_name=$this->input->post('client_name'); + echo '('.$client_name.')'; + } + + + ?>

    + + + + + + + + + + + + + + + + + input->post('financialyear'); + $m=$this->input->post('month'); + + $client_name=$this->input->post('client_name'); + + $i = 0; + foreach ($results as $result) { ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    client_tax_code);?> + client_name;?> + countofinvoice); + // echo format_currency(round($result->countofinvoice)); + + echo ($result->countofinvoice); ?>item_subtotal); + echo format_currency(round($result->item_subtotal)); + //echo ($result->item_subtotal); ?>cgst); + echo format_currency(round($result->cgst)); + //echo ($result->sgst); ?>sgst); + echo format_currency(round($result->sgst)); + //echo ($result->cgst); ?>igst); + echo format_currency(round($result->igst)); + // echo ($result->igst); ?>tax_total); + echo format_currency(round($result->tax_total)); + //echo ($result->tax_total); ?>total); + echo format_currency(round($result->total)); + //echo ($result->total); ?>
    Total + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    No Records Found

    "; + } + ?> + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/hsn_san.php b/application/modules/reports/views/hsn_san.php new file mode 100644 index 0000000..10a09db --- /dev/null +++ b/application/modules/reports/views/hsn_san.php @@ -0,0 +1,338 @@ +
    +

    +

    input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + echo ' '; + + } + if($this->input->post('month')){ + $m=$this->input->post('month'); + echo '('.$m.')'; + echo ' '; + } + + ?>

    + + + + +
    +
    + + +
    + +
    +
    + layout->load_view('layout/alerts'); ?> + +
    +
    + + +
    +
    + + + + +

    input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + echo ' '; + + } + if($this->input->post('month')){ + $m=$this->input->post('month'); + echo '('.$m.')'; + echo ' '; + } + + ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    invoice_number)?>product_sku);?>percentage.'%');?>item_quantity); ?>item_price); ?>item_subtotal); + echo format_currency(round($result->item_subtotal)); + //echo ($result->item_subtotal); ?>cgst); + echo format_currency(round($result->cgst)); + //echo ($result->sgst); ?>sgst); + echo format_currency(round($result->sgst)); + //echo ($result->cgst); ?>igst); + echo format_currency(round($result->igst)); + // echo ($result->igst); ?>item_tax_total); + echo format_currency(round($result->item_tax_total)); + //echo ($result->tax_total); ?>total); + echo format_currency(round($result->total)); + //echo ($result->total); ?>
    Total + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/hsn_wise.php b/application/modules/reports/views/hsn_wise.php new file mode 100644 index 0000000..742b911 --- /dev/null +++ b/application/modules/reports/views/hsn_wise.php @@ -0,0 +1,364 @@ +
    + +

    + + + +
    + + +
    +
    + layout->load_view('layout/alerts'); ?> +
    + + + +
    + + +
    +
    +
    +
    + + +
    + + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + layout->load_view('layout/alerts'); ?> + +
    +
    +
    + + +

    + +  input->post('client_name')){ + $cid=$this->input->post('client_name'); + echo '('.$cid.')'; + } + + if($this->input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + + } + if($this->input->post('month')){ + $month = $this->input->post('month'); + echo '('.$month.')'; + + } + ?> + + +

    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + input->post('financialyear'); + $m=$this->input->post('month'); + + if($this->input->post('HSN_code')){ + $HSN_code=$this->input->post('HSN_code'); + echo '('.$HSN_code.')'; + echo ' '; + } + + foreach ($results as $result) { ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + HSN_code;?> + countofinvoice); + //echo format_currency(round($result->countofinvoice)); + echo ($result->countofinvoice); ?>item_subtotal); + echo format_currency(round($result->item_subtotal)); + // echo ($result->item_subtotal); ?>cgst); + echo format_currency(round($result->cgst)); + //echo ($result->sgst); ?>sgst); + echo format_currency(round($result->sgst)); + //echo ($result->cgst); ?>igst); + echo format_currency(round($result->igst)); + //echo ($result->igst); ?>tax_total); + echo format_currency(round($result->tax_total)); + //echo ($result->tax_total); ?>total); + echo format_currency(round($result->total)) + // echo ($result->total); ?>
    Total + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    No Records Found

    "; + } + ?> + +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/invoice_aging_index.php b/application/modules/reports/views/invoice_aging_index.php index 4749a1b..e42a1a1 100644 --- a/application/modules/reports/views/invoice_aging_index.php +++ b/application/modules/reports/views/invoice_aging_index.php @@ -1,7 +1,8 @@
    -

    +

    - + +
    @@ -9,28 +10,148 @@ layout->load_view('layout/alerts'); ?> -
    - -
    - - -
    - -
    -
    > - - - - - -
    -
    - -
    - +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    range_1); + echo format_currency(round($result->range_1)); ?>range_2); + echo format_currency(round($result->range_2)); ?>range_3); + echo format_currency(round($result->range_3)); ?>range_4); + echo format_currency(round($result->range_4)); ?>total_balance); + echo format_currency(round($result->total_balance)); ?>
    Total + + + + + + + + + + + + + + + + + +
    + + +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/month_wise.php b/application/modules/reports/views/month_wise.php new file mode 100644 index 0000000..dc3fd55 --- /dev/null +++ b/application/modules/reports/views/month_wise.php @@ -0,0 +1,154 @@ + +
    +

    +
    + + +
    + +
    +
    + + layout->load_view('layout/alerts'); ?> + + +
    +
    + +

    + + (uri->total_segments(); + // $month=$this->uri->segment($last); + $last = $this->input->get('date'); + $new = date("F",strtotime($last))."\n"; + echo $new; + ?>) +

    +
    +
    + + + + + + + + + + + + + + input->get('ab'); + $last = $this->input->get('date'); + $new = date("F",strtotime($last))."\n"; + foreach ($results as $result) { ?> + + + + + + + + + + + + + + + + + + + + + + + + +
    (kgs)
    + client_name;?> + product_name; ?>quantity; + echo round($result->quantity); ?>value; + echo format_currency(round($result->value)); ?>
    Total  + + + + + + + +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/reports/views/payment_history_index.php b/application/modules/reports/views/payment_history_index.php index 13d89b9..0a2f1d3 100644 --- a/application/modules/reports/views/payment_history_index.php +++ b/application/modules/reports/views/payment_history_index.php @@ -1,7 +1,8 @@

    - + +
    @@ -51,7 +52,9 @@
    + value=""> + @@ -61,5 +64,87 @@
    - + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    payment_date, true); ?>invoice_number; ?>payment_method_name); ?>payment_note)); ?>payment_amount); + $sum = $sum + $result->payment_amount; ?>
    + + +
    +
    + + + + + + + + diff --git a/application/modules/reports/views/sales.php b/application/modules/reports/views/sales.php new file mode 100644 index 0000000..3bb098d --- /dev/null +++ b/application/modules/reports/views/sales.php @@ -0,0 +1,488 @@ +
    +

    +
    +
    + + + +
    +
    + + layout->load_view('layout/alerts'); ?> + +
    + + + + + +
    + + +
    +
    +
    + +
    + + + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +



    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + + + +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + + +
    +
    + + + +
    +
    +
    +
    +
    +
    + +

    +
    +  input->post('client_name')){ + $cid=$this->input->post('client_name'); + echo '('.$cid.')'; + } + if($this->input->post('item_name')){ + $product=$this->input->post('item_name'); + echo '('.$product.')'; + + } + if($this->input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + + } + if($this->input->post('month')){ + $month = $this->input->post('month'); + echo '('.$month.')'; + + } + ?> + + client_name); + // } + // } + + echo $fin,' ', ' ' ,$m,' ',' ',' ',' ', ' ' ,$dmon;?> + + + + +

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    (kgs)
    invoice_number)) { + echo anchor('invoices/view/' . $result->invoice_id,$result->invoice_number); + } + else {echo "-";} + ?>parent_invoice_id)) { + echo $result->parent_invoice_id; + }else {echo "-";} + ?>invoice_date_created)); + if(!empty($result->invoice_date_created)) { + echo $d; + }else {echo "-";} + ?>invoice_time_created)) { + echo $result->invoice_time_created; + }else {echo "-";} + ?>vehicle_no)) { + echo $result->vehicle_no; + }else {echo "-";} + ?>product_description)) { echo $result->product_description ; } else {echo "-";} + ?>client_name)) { echo anchor('clients/view/' . $result->client_id,$result->client_name); } else {echo "-";} + ?>item_quantity; + if(!empty($result->item_quantity)) { echo $result->item_quantity; } else {echo "-";} + + ?>item_price; + if(!empty($result->item_price)) { echo format_currency($result->item_price); } else {echo "-";} + ?>item_subtotal; + if(!empty($result->item_subtotal)) { echo format_currency($result->item_subtotal); } else {echo "-";} + ?>cgst; + if(!empty($result->cgst)) { echo format_currency($result->cgst); } else {echo "-";} + ?>sgst; + if(!empty($result->sgst)) { echo format_currency($result->sgst); } else {echo "-";} + ?>igst; + if(!empty($result->igst)) { echo format_currency($result->igst); } else {echo "-";} + ?>total; + if(!empty($result->total)) { echo format_currency($result->total); } else {echo "-";} + ?>
    Total       + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    No Records Found

    "; + } + + ?> +
    +
    +
    +
    + + + + + + + + + + + \ No newline at end of file diff --git a/application/modules/reports/views/sales_by_client_index.php b/application/modules/reports/views/sales_by_client_index.php index 1238766..9c7da54 100644 --- a/application/modules/reports/views/sales_by_client_index.php +++ b/application/modules/reports/views/sales_by_client_index.php @@ -1,64 +1,335 @@ +

    - + +
    +
    -
    +
    layout->load_view('layout/alerts'); ?>
    - + -
    - +
    -
    > + - -
    - - + +
    + *
    - - - - + +
    -
    - +



    +
    -
    + - - +
    + + +
    - +
    +
    + +

    +
    +   input->post('client_name')){ + $client=$this->input->post('client_name'); + echo '('.$client.')'; + } + + if($this->input->post('financialyear')){ + $ab=$this->input->post('financialyear'); + echo '('.$ab.')'; + } + if($this->input->post('month')){ + $c=$this->input->post('month'); + echo '('.$c.')'; + } + + + ?> + +

    +
    +
    + + + + + + + + + + + + + + + input->post('client_name'); + $ab=$this->input->post('financialyear'); + $from_date=$this->input->post('from_date'); + $to_date=$this->input->post('to_date'); + $month=$this->input->post('month'); + //print_r($from_date); + foreach ($results as $result) { ?> + + + + + + + + + + + + + + + + + + + + + + + + + + +
    (kgs)
    client_name;?>invoice_count; + echo $result->invoice_count; ?>quantity; + echo $result->quantity; ?>sales; + echo format_currency($result->sales); ?>sales_with_tax - $result->sales); + echo format_currency($result->sales_with_tax - $result->sales); ?>sales_with_tax; + echo format_currency($result->sales_with_tax); ?>
    Total + + + + + + + + + + + + + + + + +
    +

    No Records Found

    "; + } + ?> + +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/reports/views/sales_by_year_index.php b/application/modules/reports/views/sales_by_year_index.php index aea8ee9..21eeb28 100644 --- a/application/modules/reports/views/sales_by_year_index.php +++ b/application/modules/reports/views/sales_by_year_index.php @@ -1,6 +1,8 @@

    + +
    @@ -50,10 +52,10 @@
    -
    + -
    + - + value=""> +
    +
    + +

    +
    + +

    +
    +
    + + + + + + + + + + + + + + + + $value) { + + if ($initial_year == 0) { + $initial_year = intval(substr($index, 11, 4)); + }; + + $aux = intval(substr($index, 11, 4)); + + if ($aux > $final_year) { + $final_year = $aux; + } + + } + } + + if ($contYears == 0 && ($final_year - $initial_year) > 0) { + $numYears = $final_year - $initial_year + 1; + $contYears = 1; + } + + if ($contRows == 0) { + $numRows = $numRows + ($numYears * 4); + $contRows = 1; + } + ?> + + + + + + + + + $value) { + + $quarter = substr($index, 8, 2); + $year = substr($index, 11, 4); + + if (preg_match($pattern, $index)) { + ?> + + + + + + + + + + + + + + + + + + + +
    +
    +
    VAT_ID; ?>Name); ?>total_payment; + echo format_currency($result->total_payment); ?>
      0) { + echo format_currency($value); + } ?>
    +
    +
    Total + + + + + +
    + +
    + +
    + + +
    +
    + + + + + + + + + diff --git a/application/modules/reports/views/year_wise.php b/application/modules/reports/views/year_wise.php new file mode 100644 index 0000000..9d67af8 --- /dev/null +++ b/application/modules/reports/views/year_wise.php @@ -0,0 +1,221 @@ + +
    +

    +
    + + +
    + +
    +
    + + layout->load_view('layout/alerts'); ?> + +
    + - +
    + + +
    +
    +
    + +
    + + + + + +

     

    + + + + +
    + +
    + + + +
    +
    +
    +
    +
    + +

    + (input->post('financialyear'); + ?>) + +

    +
    +
    + +

    + input->post('financialyear'); + //echo $ab; + ?>
    + +

    + + + + + + + + + + + + + input->post('financialyear'); + foreach ($results as $result) { ?> + + + + + + + + + + + + + + + + + + + + + + + +
    months); + $new_date = date('M-y', $date); + //echo anchor('reports/month_wise/' . $result->months,($new_date) ); + + ?> + quantity; + echo round($result->quantity); ?>value; + echo format_currency(round($result->value)); ?>
    input->post('financialyear'); + $Total="Total"; + echo anchor('reports/year_wise_total/' . $ab,$Total); ?> + + + + + + + + + +
    +

    No Records Found

    "; + } + ?> + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/reports/views/year_wise_total.php b/application/modules/reports/views/year_wise_total.php new file mode 100644 index 0000000..17fe09a --- /dev/null +++ b/application/modules/reports/views/year_wise_total.php @@ -0,0 +1,152 @@ + +
    +

    +
    + + +
    + +
    +
    + + layout->load_view('layout/alerts'); ?> + + +
    +
    + +

    + ( + uri->total_segments(); + $month=$this->uri->segment($last); + echo $month; + ?>) +
    + +

    +
    +
    + + + + + + + + + + + + + + uri->total_segments(); + $month=$this->uri->segment($last); + foreach ($results as $result) { ?> + + + + + + + + + + + + + + + + + + + + + + + +
    + client_name;?> + product_name; ?>quantity); + echo round($result->quantity); ?>value; + echo format_currency(round($result->value)); ?>
    Total  + + + + + + + +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + diff --git a/application/modules/sessions/models/Mdl_sessions.php b/application/modules/sessions/models/Mdl_sessions.php index 47362b7..d5140ac 100644 --- a/application/modules/sessions/models/Mdl_sessions.php +++ b/application/modules/sessions/models/Mdl_sessions.php @@ -22,15 +22,15 @@ class Mdl_Sessions extends CI_Model */ public function auth($email, $password) { - $this->db->where('user_email', $email); - - $query = $this->db->get('ip_users'); - + $this->db->join('ip_user_custom cus','cus.user_id = ip.user_id'); + $this->db->where('ip.user_email', $email); + $this->db->where('cus.user_custom_fieldid',63); + $this->db->from('ip_users ip'); + $query = $this->db->get(); + if ($query->num_rows()) { - $user = $query->row(); - - $this->load->library('crypt'); - + $user = $query->row(); + $this->load->library('crypt'); /** * Password hashing changed after 1.2.0 * Check to see if user has logged in since the password change @@ -52,7 +52,6 @@ class Mdl_Sessions extends CI_Model 'user_psalt' => $salt, 'user_password' => $hash ); - $this->db->where('user_id', $user->user_id); $this->db->update('ip_users', $db_array); @@ -66,7 +65,6 @@ class Mdl_Sessions extends CI_Model return false; } } - if ($this->crypt->check_password($user->user_password, $password)) { $session_data = array( 'user_type' => $user->user_type, @@ -74,16 +72,18 @@ class Mdl_Sessions extends CI_Model 'user_name' => $user->user_name, 'user_email' => $user->user_email, 'user_company' => $user->user_company, - 'user_language' => isset($user->user_language) ? $user->user_language : 'system', + 'user_language' => isset($user->user_language) ? $user->user_language : 'system', + 'user_fieldid' => $user->user_custom_fieldid, // field for getting Department Id + 'user_value' => $user->user_custom_fieldvalue, // field for getting Department Value ); - + $this->session->set_userdata($session_data); - + return true; } } return false; } - + } diff --git a/application/modules/tax_rates/views/index.php b/application/modules/tax_rates/views/index.php index a0adbf6..e303d2d 100644 --- a/application/modules/tax_rates/views/index.php +++ b/application/modules/tax_rates/views/index.php @@ -32,7 +32,7 @@ tax_rate_name); ?> - tax_rate_percent); ?>% + tax_rate_percent); ?>%
    diff --git a/application/modules/upload/controllers/Upload.php b/application/modules/upload/controllers/Upload.php index e34ba10..ff40a99 100644 --- a/application/modules/upload/controllers/Upload.php +++ b/application/modules/upload/controllers/Upload.php @@ -155,7 +155,7 @@ class Upload extends Admin_Controller /** * Returns the corresponding file as a download and prevents execution of files - * + * http://localhost/ip/index.php/upload/get_file/zjLcQNa40Evsw3h_venbalogo.png * @param string $filename * @return resource */ diff --git a/application/modules/upload/views/dropzone-invoice-html.php b/application/modules/upload/views/dropzone-invoice-html.php index 9b582b7..52cb09c 100644 --- a/application/modules/upload/views/dropzone-invoice-html.php +++ b/application/modules/upload/views/dropzone-invoice-html.php @@ -1,8 +1,8 @@
    -
    +
    @@ -12,9 +12,9 @@
    -
    -
    -
    +
    + +
    -
    +
    diff --git a/application/modules/upload/views/dropzone-quote-html.php b/application/modules/upload/views/dropzone-quote-html.php index 5b812e4..e1142ac 100644 --- a/application/modules/upload/views/dropzone-quote-html.php +++ b/application/modules/upload/views/dropzone-quote-html.php @@ -1,20 +1,24 @@
    -
    +
    - - + +
    +
    + +
    + +
    -
    -
    +
    -
    +
    @@ -64,6 +68,8 @@
    + +
    diff --git a/application/views/.DS_Store b/application/views/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e94483c4cbd7ca408668ad63965484795980803b GIT binary patch literal 6148 zcmeHKJ5B>Z41I=3L`su%lye1cFp9znI6w#qMWls|l8|~kuAS!(pVbN}6$RLm{boG2 zNArsH8i35-Hg~`jz?iCtcQr%NbJc-dg-21W#ujTlV~Hc}Wumz=Z1IW{TH;s!3wCI* zvRa4DVck5nZKFkRuxI%l!}mPw9bI;3MkNEuKr)aFBm@7M0rqT_@x(E0GLQ@;1D_1& z_n}Y~YhdSSpAH%u0f-~IO}MsMf>_i+tbv^)Jrwa&qNhrX7~<*lmx!x@ouj8i>}J-9 znQS-@2Nk`|NW%gB?HO8pJG5pi-*OWPm10;c%1gy uLVcuu2xBdr##%AaS}`};if_Ng6=pG;d literal 0 HcmV?d00001 diff --git a/application/views/invoice_templates/.DS_Store b/application/views/invoice_templates/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c025de41e319eb6dad6bb24d0484b91938464bfd GIT binary patch literal 6148 zcmeH~Jqp4=5QS%qgq+Xx>?Eih*ggixwm>tquk%Km|q$bdmRV{_o-6=KoO(Qz}3O{!9U# z?+&{yUMkPlkJq#MF{`$2aL_MDc>4)JVn^``?uPwh3$P|z5EU4I1Y8CND)3VUUSXLL AX8-^I literal 0 HcmV?d00001 diff --git a/application/views/invoice_templates/pdf.zip b/application/views/invoice_templates/pdf.zip new file mode 100644 index 0000000000000000000000000000000000000000..007467d131cf16674b3e3c4354f9c284c9dccc68 GIT binary patch literal 893824 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⩔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

    OE&J&)LN7VG~i=R7RQMW^p>votevZw8?m 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

    ;YKTNnD%E1%P8g%uAl{ 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

      <0|H?b-MDnz%x8uhk(w3j)il3O3^CRE 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

      Gti^HPl6P`iBTKA`GM_ZlCz?j+gkWRvlZgAPeAS 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%0A&ykG~)u1~)f$L=#8)a=u_G2M(rS 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

      I-MkG4wbjP6#`3T`EE^lcL^cpOmRH@5 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
    1. u&A_@Szc5z4qgKL$QuQR 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 gy%iA2h0f=1k7|`# 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�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 ZyNvnw!g8`K2mm`+9}Ct@B6~aQ>VK+Dywd;x literal 0 HcmV?d00001 diff --git a/application/views/reports/invoice_aging.php b/application/views/reports/invoice_aging.php index 360fc89..d1ff25f 100644 --- a/application/views/reports/invoice_aging.php +++ b/application/views/reports/invoice_aging.php @@ -8,27 +8,99 @@

      - - - - - - - - - - - - - - - - - - - - -
      total_balance); ?>range_1); ?>range_2); ?>range_3); ?>range_4); ?>
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      range_1; + echo format_currency($result->range_1); ?>range_2; + echo format_currency($result->range_2); ?>range_3; + echo format_currency($result->range_3); ?>range_4; + echo format_currency($result->range_4); ?>total_balance; + echo format_currency($result->total_balance); ?>
      Total + + + + + + + + + + + + + + + + + +
      diff --git a/application/views/reports/sales_by_client.php b/application/views/reports/sales_by_client.php index 42e7a89..7bc8276 100644 --- a/application/views/reports/sales_by_client.php +++ b/application/views/reports/sales_by_client.php @@ -11,24 +11,81 @@ - - - - - - - - - - - - - - - - - -
      invoice_count; ?>sales); ?>sales_with_tax - $result->sales); ?>sales_with_tax); ?>
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      invoice_count; + echo $result->invoice_count; ?>sales; + echo format_currency($result->sales); ?>sales_with_tax - $result->sales); + echo format_currency($result->sales_with_tax - $result->sales); ?>sales_with_tax; + echo format_currency($result->sales_with_tax); ?>
      Total + + + + + + + + + + + + + +
      diff --git a/application/views/reports/sales_by_year.php b/application/views/reports/sales_by_year.php index b04fa85..04cb593 100644 --- a/application/views/reports/sales_by_year.php +++ b/application/views/reports/sales_by_year.php @@ -15,107 +15,128 @@ - +
      - - - - - - + + + + + + - - - + + + - $value) { - foreach ($result as $index => $value) { + if ($initial_year == 0) { + $initial_year = intval(substr($index, 11, 4)); + }; - if ($initial_year == 0) { - $initial_year = intval(substr($index, 11, 4)); - }; + $aux = intval(substr($index, 11, 4)); - $aux = intval(substr($index, 11, 4)); + if ($aux > $final_year) { + $final_year = $aux; + } - if ($aux > $final_year) { - $final_year = $aux; - } + } + } - } - } + if ($contYears == 0 && ($final_year - $initial_year) > 0) { + $numYears = $final_year - $initial_year + 1; + $contYears = 1; + } - if ($contYears == 0 && ($final_year - $initial_year) > 0) { - $numYears = $final_year - $initial_year + 1; - $contYears = 1; - } + if ($contRows == 0) { + $numRows = $numRows + ($numYears * 4); + $contRows = 1; + } + ?> - if ($contRows == 0) { - $numRows = $numRows + ($numYears * 4); - $contRows = 1; - } - ?> + + + + + + - - - - - - + $value) { - foreach ($result as $index => $value) { + $quarter = substr($index, 8, 2); + $year = substr($index, 11, 4); - $quarter = substr($index, 8, 2); - $year = substr($index, 11, 4); + if (preg_match($pattern, $index)) { + ?> - if (preg_match($pattern, $index)) { - ?> + + + + + - - - - - + + + + - - - - - - - -
      -
      -
      +
      +
      VAT_ID; ?>Name); ?>total_payment; + echo format_currency($result->total_payment); ?>
      VAT_ID; ?>Name); ?>total_payment); ?>
        0) { + echo format_currency($value); + } ?>
        0) { - echo format_currency($value); - } ?>
      +
      +
      -
      -
      + + + Total + + + + + + + + +
      + +
      +
      + + diff --git a/application/views/reports/year_wise_pdf.php b/application/views/reports/year_wise_pdf.php new file mode 100644 index 0000000..7463613 --- /dev/null +++ b/application/views/reports/year_wise_pdf.php @@ -0,0 +1,76 @@ + + + + <?php echo trans('Year-Wise Report'); ?> + + + + +

      +
      + +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      months) ); ?>quantity; + echo $result->quantity; ?>value; + echo format_currency($result->value); ?>
      Total + + + + + + + +
      + + + diff --git a/assets/core/img/favicon.png b/assets/core/img/favicon.png index d825bd4e3b63c1d39e0c41ae4120aeb3525f6139..d793a46ccf5b2403b94221dd0b8dcbe4c317ef3d 100644 GIT binary patch literal 1150 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 diff --git a/assets/core/img/favicon_old.png b/assets/core/img/favicon_old.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3b1ac49acf381eb2f59a3ebf9a975f7c69f22a GIT binary patch literal 1408 zcmV-`1%LX9P)TaiyD}McfUdpsOG;+gXVVvm68!LGTZEK`OWwM69tJF{EQ#XxfBm zZSx~D&%Dh0yZ82cZ<1Eh%$pm{`-6UjFpE1gCtuDx=Y03whrfUFWM=ZWS3gcH6^qSN z(_2(EW0?wL3?cXt2oZ!hib{1JJ4P2~XE&?mrix}7CV)#5LWQ6RVT6>Gb^N{8;Z_Sm z^skwj&e^&2{M)o%A-07%Q-oNBPeBnXs?N`w3-ifxnJz5}(I4dWdO)!MqfioSD6Fp$_5{up&wp4f5Brf4?V> z6Hcx`flHf5Z98+u%R#vAB;ySfit&R7OOGBce|l?c^WME}M~-}U@+7>L`~>h9n#t6% z6{27t&CV{B0R80f@DDvbf8M$!|He=D?W;YRI!@xdv;p*APMw;+e_wKaQ*Uog#H>;Y zjG&Vea=VOp_wJgAMSxe!g)EFG-6)r}vM=g!5+L4H1Q z!kC$f2V&^%Pq~~oAC`H{bUpO(1Go!hsN3BYbu-NnZ!m(8filRn)<><7EZ_jx#JYCe zpoC?G#^cS053d(4s_wgOcy^nTv*N9}+^5HnM_-v;g8rV*OIiA!Jz42Mw~{t>-H$fUjgErKN)me8>C=&z^S~5j zxZx0bWJI3OJ|YGW`{U|W$;CTw-MUl$7c^t9ySukPIOCbVDbwo0CVJ$qJuPvgrQ zH^NW!kS8Ur8@V?YYT1f=7AvTdwC?4-n8Cp{Z=?#wf93z&&A;tW!=;vQ>>CT`l)(LpuMA+cp5 z)39wD+HAXzHdUJ)HN~clnM{HZ2Xv{#6AcUrPKfDpgS&|Bh#~%4fB^v2E^CZjGg|im O0000ipconfig.php
      file is missing! Please make a copy of the ipconfig.php.example file and rename it to ipconfig.php"); @@ -62,7 +65,7 @@ define('SUMEX_URL', env('SUMEX_URL')); * * NOTE: If you change these, also change the error_reporting() code below */ -define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development'); +define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'production'); /* *--------------------------------------------------------------- diff --git a/php_errorlog b/php_errorlog index 314dc05..50ea201 100644 --- a/php_errorlog +++ b/php_errorlog @@ -1,7 +1,36 @@ -[14-Sep-2017 11:32:58 CST6CDT] PHP Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in /home/resicoin/public_html/invoice/ip/vendor/mpdf/mpdf/src/Mpdf.php on line 3 -[14-Sep-2017 11:33:13 CST6CDT] PHP Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in /home/resicoin/public_html/invoice/ip/vendor/mpdf/mpdf/src/Mpdf.php on line 3 -[14-Sep-2017 11:33:27 CST6CDT] PHP Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in /home/resicoin/public_html/invoice/ip/vendor/mpdf/mpdf/src/Mpdf.php on line 3 -[18-Sep-2017 03:19:05 CST6CDT] PHP Fatal error: require_once(): Failed opening required '/home/resicoin/public_html/invoice/ip/application/helpers/mpdf/mpdf.php' (include_path='.:/usr/local/php70/pear') in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 102 -[18-Sep-2017 03:27:23 CST6CDT] PHP Fatal error: require_once(): Failed opening required '/home/resicoin/public_html/invoice/ip/application/helpers/mpdf/mpdf.php' (include_path='.:/usr/local/php70/pear') in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 102 -[18-Sep-2017 03:27:23 CST6CDT] PHP Fatal error: require_once(): Failed opening required '/home/resicoin/public_html/invoice/ip/application/helpers/mpdf/mpdf.php' (include_path='.:/usr/local/php70/pear') in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 102 -[18-Sep-2017 03:27:42 CST6CDT] PHP Fatal error: require_once(): Failed opening required '/home/resicoin/public_html/invoice/ip/application/helpers/mpdf/mpdf.php' (include_path='.:/usr/local/php70/pear') in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 102 +[21-Nov-2020 10:12:31 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/invoices/models/Mdl_items.php on line 374 +[21-Nov-2020 10:12:53 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/invoices/models/Mdl_items.php on line 374 +[21-Nov-2020 10:13:10 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/invoices/models/Mdl_items.php on line 374 +[21-Nov-2020 10:15:21 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/invoices/models/Mdl_items.php on line 374 +[21-Nov-2020 10:16:26 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/invoices/models/Mdl_items.php on line 374 +[21-Nov-2020 10:18:37 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/invoices/models/Mdl_items.php on line 374 +[21-Nov-2020 10:20:18 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/invoices/models/Mdl_items.php on line 374 +[05-Dec-2020 19:17:41 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[10-Dec-2020 17:17:07 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[10-Dec-2020 17:17:31 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[10-Dec-2020 17:17:39 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[10-Dec-2020 17:17:41 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[10-Dec-2020 17:17:50 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[10-Dec-2020 17:18:48 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 463 +[10-Dec-2020 17:19:03 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 485 +[02-Jan-2021 11:51:22 Asia/Kolkata] PHP Fatal error: Call to a member function result() on boolean in /home/resicoin/public_html/invoice/ip/application/modules/reports/models/Mdl_reports.php on line 1440 +[02-Jan-2021 12:47:50 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[11-Jan-2021 16:25:05 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 485 +[11-Jan-2021 22:16:47 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[11-Jan-2021 22:16:55 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/resicoin/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 12:12:19 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 12:12:33 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 485 +[16-Feb-2021 12:13:09 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 463 +[16-Feb-2021 12:13:53 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 12:13:57 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 12:49:30 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 12:50:05 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 485 +[16-Feb-2021 12:50:19 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 12:51:11 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 17:12:47 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[16-Feb-2021 17:13:23 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 485 +[16-Feb-2021 17:13:32 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 463 +[23-Feb-2021 15:04:10 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 485 +[23-Feb-2021 15:04:16 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 463 +[23-Feb-2021 15:04:28 Asia/Kolkata] PHP Fatal error: Call to undefined method Mdl_Reports::fincalYear() in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/modules/reports/controllers/Reports.php on line 510 +[14-Apr-2021 14:00:37 Asia/Kolkata] PHP Fatal error: Call to a member function row_array() on boolean in /home/customer/www/resicoindustries.com/public_html/invoice/ip/application/core/MY_Model.php on line 306 diff --git a/uploads/.gitignore b/uploads/.gitignore deleted file mode 100644 index fb01fab..0000000 --- a/uploads/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -* -!archive -!customer_files -!import -!temp -!.gitignore \ No newline at end of file diff --git a/uploads/archive/.gitignore b/uploads/archive/.gitignore deleted file mode 100644 index c96a04f..0000000 --- a/uploads/archive/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file diff --git a/uploads/customer_files/.gitignore b/uploads/customer_files/.gitignore deleted file mode 100644 index ddaf74c..0000000 --- a/uploads/customer_files/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!.htaccess -!.gitignore diff --git a/uploads/customer_files/.htaccess b/uploads/customer_files/.htaccess deleted file mode 100644 index 8656453..0000000 --- a/uploads/customer_files/.htaccess +++ /dev/null @@ -1,2 +0,0 @@ -# Deny access to any raw customer files -Deny from all diff --git a/uploads/import/.gitignore b/uploads/import/.gitignore deleted file mode 100644 index c96a04f..0000000 --- a/uploads/import/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file diff --git a/uploads/temp/.gitignore b/uploads/temp/.gitignore deleted file mode 100644 index 2662f5c..0000000 --- a/uploads/temp/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -* -!mpdf -!.gitignore -!.htaccess diff --git a/uploads/temp/.htaccess b/uploads/temp/.htaccess deleted file mode 100644 index 0598eba..0000000 --- a/uploads/temp/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ - -Order allow,deny -Deny from all - diff --git a/uploads/temp/mpdf/.gitignore b/uploads/temp/mpdf/.gitignore deleted file mode 100644 index c96a04f..0000000 --- a/uploads/temp/mpdf/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file diff --git a/vendor_old/autoload.php b/vendor_old/autoload.php deleted file mode 100644 index 1ad3921..0000000 --- a/vendor_old/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - Require all denied - - - Deny from all - \ No newline at end of file diff --git a/vendor_old/codeigniter/framework/system/core/Benchmark.php b/vendor_old/codeigniter/framework/system/core/Benchmark.php deleted file mode 100644 index b3ac79c..0000000 --- a/vendor_old/codeigniter/framework/system/core/Benchmark.php +++ /dev/null @@ -1,133 +0,0 @@ -marker[$name] = microtime(TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Elapsed time - * - * Calculates the time difference between two marked points. - * - * If the first parameter is empty this function instead returns the - * {elapsed_time} pseudo-variable. This permits the full system - * execution time to be shown in a template. The output class will - * swap the real value for this variable. - * - * @param string $point1 A particular marked point - * @param string $point2 A particular marked point - * @param int $decimals Number of decimal places - * - * @return string Calculated elapsed time on success, - * an '{elapsed_string}' if $point1 is empty - * or an empty string if $point1 is not found. - */ - public function elapsed_time($point1 = '', $point2 = '', $decimals = 4) - { - if ($point1 === '') - { - return '{elapsed_time}'; - } - - if ( ! isset($this->marker[$point1])) - { - return ''; - } - - if ( ! isset($this->marker[$point2])) - { - $this->marker[$point2] = microtime(TRUE); - } - - return number_format($this->marker[$point2] - $this->marker[$point1], $decimals); - } - - // -------------------------------------------------------------------- - - /** - * Memory Usage - * - * Simply returns the {memory_usage} marker. - * - * This permits it to be put it anywhere in a template - * without the memory being calculated until the end. - * The output class will swap the real value for this variable. - * - * @return string '{memory_usage}' - */ - public function memory_usage() - { - return '{memory_usage}'; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/CodeIgniter.php b/vendor_old/codeigniter/framework/system/core/CodeIgniter.php deleted file mode 100644 index 880abab..0000000 --- a/vendor_old/codeigniter/framework/system/core/CodeIgniter.php +++ /dev/null @@ -1,559 +0,0 @@ - '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal) - { - if (strpos($_registered, $key) === FALSE) - { - continue; - } - - foreach (array_keys($$superglobal) as $var) - { - if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE)) - { - $GLOBALS[$var] = NULL; - } - } - } - } -} - - -/* - * ------------------------------------------------------ - * Define a custom error handler so we can log PHP errors - * ------------------------------------------------------ - */ - set_error_handler('_error_handler'); - set_exception_handler('_exception_handler'); - register_shutdown_function('_shutdown_handler'); - -/* - * ------------------------------------------------------ - * Set the subclass_prefix - * ------------------------------------------------------ - * - * Normally the "subclass_prefix" is set in the config file. - * The subclass prefix allows CI to know if a core class is - * being extended via a library in the local application - * "libraries" folder. Since CI allows config items to be - * overridden via data set in the main index.php file, - * before proceeding we need to know if a subclass_prefix - * override exists. If so, we will set this value now, - * before any classes are loaded - * Note: Since the config file data is cached it doesn't - * hurt to load it here. - */ - if ( ! empty($assign_to_config['subclass_prefix'])) - { - get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); - } - -/* - * ------------------------------------------------------ - * Should we use a Composer autoloader? - * ------------------------------------------------------ - */ - if ($composer_autoload = config_item('composer_autoload')) - { - if ($composer_autoload === TRUE) - { - file_exists(APPPATH.'vendor/autoload.php') - ? require_once(APPPATH.'vendor/autoload.php') - : log_message('error', '$config[\'composer_autoload\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.'); - } - elseif (file_exists($composer_autoload)) - { - require_once($composer_autoload); - } - else - { - log_message('error', 'Could not find the specified $config[\'composer_autoload\'] path: '.$composer_autoload); - } - } - -/* - * ------------------------------------------------------ - * Start the timer... tick tock tick tock... - * ------------------------------------------------------ - */ - $BM =& load_class('Benchmark', 'core'); - $BM->mark('total_execution_time_start'); - $BM->mark('loading_time:_base_classes_start'); - -/* - * ------------------------------------------------------ - * Instantiate the hooks class - * ------------------------------------------------------ - */ - $EXT =& load_class('Hooks', 'core'); - -/* - * ------------------------------------------------------ - * Is there a "pre_system" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('pre_system'); - -/* - * ------------------------------------------------------ - * Instantiate the config class - * ------------------------------------------------------ - * - * Note: It is important that Config is loaded first as - * most other classes depend on it either directly or by - * depending on another class that uses it. - * - */ - $CFG =& load_class('Config', 'core'); - - // Do we have any manually set config items in the index.php file? - if (isset($assign_to_config) && is_array($assign_to_config)) - { - foreach ($assign_to_config as $key => $value) - { - $CFG->set_item($key, $value); - } - } - -/* - * ------------------------------------------------------ - * Important charset-related stuff - * ------------------------------------------------------ - * - * Configure mbstring and/or iconv if they are enabled - * and set MB_ENABLED and ICONV_ENABLED constants, so - * that we don't repeatedly do extension_loaded() or - * function_exists() calls. - * - * Note: UTF-8 class depends on this. It used to be done - * in it's constructor, but it's _not_ class-specific. - * - */ - $charset = strtoupper(config_item('charset')); - ini_set('default_charset', $charset); - - if (extension_loaded('mbstring')) - { - define('MB_ENABLED', TRUE); - // mbstring.internal_encoding is deprecated starting with PHP 5.6 - // and it's usage triggers E_DEPRECATED messages. - @ini_set('mbstring.internal_encoding', $charset); - // This is required for mb_convert_encoding() to strip invalid characters. - // That's utilized by CI_Utf8, but it's also done for consistency with iconv. - mb_substitute_character('none'); - } - else - { - define('MB_ENABLED', FALSE); - } - - // There's an ICONV_IMPL constant, but the PHP manual says that using - // iconv's predefined constants is "strongly discouraged". - if (extension_loaded('iconv')) - { - define('ICONV_ENABLED', TRUE); - // iconv.internal_encoding is deprecated starting with PHP 5.6 - // and it's usage triggers E_DEPRECATED messages. - @ini_set('iconv.internal_encoding', $charset); - } - else - { - define('ICONV_ENABLED', FALSE); - } - - if (is_php('5.6')) - { - ini_set('php.internal_encoding', $charset); - } - -/* - * ------------------------------------------------------ - * Load compatibility features - * ------------------------------------------------------ - */ - - require_once(BASEPATH.'core/compat/mbstring.php'); - require_once(BASEPATH.'core/compat/hash.php'); - require_once(BASEPATH.'core/compat/password.php'); - require_once(BASEPATH.'core/compat/standard.php'); - -/* - * ------------------------------------------------------ - * Instantiate the UTF-8 class - * ------------------------------------------------------ - */ - $UNI =& load_class('Utf8', 'core'); - -/* - * ------------------------------------------------------ - * Instantiate the URI class - * ------------------------------------------------------ - */ - $URI =& load_class('URI', 'core'); - -/* - * ------------------------------------------------------ - * Instantiate the routing class and set the routing - * ------------------------------------------------------ - */ - $RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL); - -/* - * ------------------------------------------------------ - * Instantiate the output class - * ------------------------------------------------------ - */ - $OUT =& load_class('Output', 'core'); - -/* - * ------------------------------------------------------ - * Is there a valid cache file? If so, we're done... - * ------------------------------------------------------ - */ - if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE) - { - exit; - } - -/* - * ----------------------------------------------------- - * Load the security class for xss and csrf support - * ----------------------------------------------------- - */ - $SEC =& load_class('Security', 'core'); - -/* - * ------------------------------------------------------ - * Load the Input class and sanitize globals - * ------------------------------------------------------ - */ - $IN =& load_class('Input', 'core'); - -/* - * ------------------------------------------------------ - * Load the Language class - * ------------------------------------------------------ - */ - $LANG =& load_class('Lang', 'core'); - -/* - * ------------------------------------------------------ - * Load the app controller and local controller - * ------------------------------------------------------ - * - */ - // Load the base controller class - require_once BASEPATH.'core/Controller.php'; - - /** - * Reference to the CI_Controller method. - * - * Returns current CI instance object - * - * @return CI_Controller - */ - function &get_instance() - { - return CI_Controller::get_instance(); - } - - if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) - { - require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; - } - - // Set a mark point for benchmarking - $BM->mark('loading_time:_base_classes_end'); - -/* - * ------------------------------------------------------ - * Sanity checks - * ------------------------------------------------------ - * - * The Router class has already validated the request, - * leaving us with 3 options here: - * - * 1) an empty class name, if we reached the default - * controller, but it didn't exist; - * 2) a query string which doesn't go through a - * file_exists() check - * 3) a regular request for a non-existing page - * - * We handle all of these as a 404 error. - * - * Furthermore, none of the methods in the app controller - * or the loader class can be called via the URI, nor can - * controller methods that begin with an underscore. - */ - - $e404 = FALSE; - $class = ucfirst($RTR->class); - $method = $RTR->method; - - if (empty($class) OR ! file_exists(APPPATH.'controllers/'.$RTR->directory.$class.'.php')) - { - $e404 = TRUE; - } - else - { - require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php'); - - if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) - { - $e404 = TRUE; - } - elseif (method_exists($class, '_remap')) - { - $params = array($method, array_slice($URI->rsegments, 2)); - $method = '_remap'; - } - elseif ( ! method_exists($class, $method)) - { - $e404 = TRUE; - } - /** - * DO NOT CHANGE THIS, NOTHING ELSE WORKS! - * - * - method_exists() returns true for non-public methods, which passes the previous elseif - * - is_callable() returns false for PHP 4-style constructors, even if there's a __construct() - * - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited - * - People will only complain if this doesn't work, even though it is documented that it shouldn't. - * - * ReflectionMethod::isConstructor() is the ONLY reliable check, - * knowing which method will be executed as a constructor. - */ - elseif ( ! is_callable(array($class, $method)) && strcasecmp($class, $method) === 0) - { - $reflection = new ReflectionMethod($class, $method); - if ( ! $reflection->isPublic() OR $reflection->isConstructor()) - { - $e404 = TRUE; - } - } - } - - if ($e404) - { - if ( ! empty($RTR->routes['404_override'])) - { - if (sscanf($RTR->routes['404_override'], '%[^/]/%s', $error_class, $error_method) !== 2) - { - $error_method = 'index'; - } - - $error_class = ucfirst($error_class); - - if ( ! class_exists($error_class, FALSE)) - { - if (file_exists(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php')) - { - require_once(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'); - $e404 = ! class_exists($error_class, FALSE); - } - // Were we in a directory? If so, check for a global override - elseif ( ! empty($RTR->directory) && file_exists(APPPATH.'controllers/'.$error_class.'.php')) - { - require_once(APPPATH.'controllers/'.$error_class.'.php'); - if (($e404 = ! class_exists($error_class, FALSE)) === FALSE) - { - $RTR->directory = ''; - } - } - } - else - { - $e404 = FALSE; - } - } - - // Did we reset the $e404 flag? If so, set the rsegments, starting from index 1 - if ( ! $e404) - { - $class = $error_class; - $method = $error_method; - - $URI->rsegments = array( - 1 => $class, - 2 => $method - ); - } - else - { - show_404($RTR->directory.$class.'/'.$method); - } - } - - if ($method !== '_remap') - { - $params = array_slice($URI->rsegments, 2); - } - -/* - * ------------------------------------------------------ - * Is there a "pre_controller" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('pre_controller'); - -/* - * ------------------------------------------------------ - * Instantiate the requested controller - * ------------------------------------------------------ - */ - // Mark a start point so we can benchmark the controller - $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); - - $CI = new $class(); - -/* - * ------------------------------------------------------ - * Is there a "post_controller_constructor" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('post_controller_constructor'); - -/* - * ------------------------------------------------------ - * Call the requested method - * ------------------------------------------------------ - */ - call_user_func_array(array(&$CI, $method), $params); - - // Mark a benchmark end point - $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); - -/* - * ------------------------------------------------------ - * Is there a "post_controller" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('post_controller'); - -/* - * ------------------------------------------------------ - * Send the final rendered output to the browser - * ------------------------------------------------------ - */ - if ($EXT->call_hook('display_override') === FALSE) - { - $OUT->_display(); - } - -/* - * ------------------------------------------------------ - * Is there a "post_system" hook? - * ------------------------------------------------------ - */ - $EXT->call_hook('post_system'); diff --git a/vendor_old/codeigniter/framework/system/core/Common.php b/vendor_old/codeigniter/framework/system/core/Common.php deleted file mode 100644 index 2fd5c58..0000000 --- a/vendor_old/codeigniter/framework/system/core/Common.php +++ /dev/null @@ -1,849 +0,0 @@ -='); - } - - return $_is_php[$version]; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('is_really_writable')) -{ - /** - * Tests for file writability - * - * is_writable() returns TRUE on Windows servers when you really can't write to - * the file, based on the read-only attribute. is_writable() is also unreliable - * on Unix servers if safe_mode is on. - * - * @link https://bugs.php.net/bug.php?id=54709 - * @param string - * @return bool - */ - function is_really_writable($file) - { - // If we're on a Unix server with safe_mode off we call is_writable - if (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode'))) - { - return is_writable($file); - } - - /* For Windows servers and safe_mode "on" installations we'll actually - * write a file then read it. Bah... - */ - if (is_dir($file)) - { - $file = rtrim($file, '/').'/'.md5(mt_rand()); - if (($fp = @fopen($file, 'ab')) === FALSE) - { - return FALSE; - } - - fclose($fp); - @chmod($file, 0777); - @unlink($file); - return TRUE; - } - elseif ( ! is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE) - { - return FALSE; - } - - fclose($fp); - return TRUE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('load_class')) -{ - /** - * Class registry - * - * This function acts as a singleton. If the requested class does not - * exist it is instantiated and set to a static variable. If it has - * previously been instantiated the variable is returned. - * - * @param string the class name being requested - * @param string the directory where the class should be found - * @param string an optional argument to pass to the class constructor - * @return object - */ - function &load_class($class, $directory = 'libraries', $param = NULL) - { - static $_classes = array(); - - // Does the class exist? If so, we're done... - if (isset($_classes[$class])) - { - return $_classes[$class]; - } - - $name = FALSE; - - // Look for the class first in the local application/libraries folder - // then in the native system/libraries folder - foreach (array(APPPATH, BASEPATH) as $path) - { - if (file_exists($path.$directory.'/'.$class.'.php')) - { - $name = 'CI_'.$class; - - if (class_exists($name, FALSE) === FALSE) - { - require_once($path.$directory.'/'.$class.'.php'); - } - - break; - } - } - - // Is the request a class extension? If so we load it too - if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) - { - $name = config_item('subclass_prefix').$class; - - if (class_exists($name, FALSE) === FALSE) - { - require_once(APPPATH.$directory.'/'.$name.'.php'); - } - } - - // Did we find the class? - if ($name === FALSE) - { - // Note: We use exit() rather than show_error() in order to avoid a - // self-referencing loop with the Exceptions class - set_status_header(503); - echo 'Unable to locate the specified class: '.$class.'.php'; - exit(5); // EXIT_UNK_CLASS - } - - // Keep track of what we just loaded - is_loaded($class); - - $_classes[$class] = isset($param) - ? new $name($param) - : new $name(); - return $_classes[$class]; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('is_loaded')) -{ - /** - * Keeps track of which libraries have been loaded. This function is - * called by the load_class() function above - * - * @param string - * @return array - */ - function &is_loaded($class = '') - { - static $_is_loaded = array(); - - if ($class !== '') - { - $_is_loaded[strtolower($class)] = $class; - } - - return $_is_loaded; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('get_config')) -{ - /** - * Loads the main config.php file - * - * This function lets us grab the config file even if the Config class - * hasn't been instantiated yet - * - * @param array - * @return array - */ - function &get_config(Array $replace = array()) - { - static $config; - - if (empty($config)) - { - $file_path = APPPATH.'config/config.php'; - $found = FALSE; - if (file_exists($file_path)) - { - $found = TRUE; - require($file_path); - } - - // Is the config file in the environment folder? - if (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) - { - require($file_path); - } - elseif ( ! $found) - { - set_status_header(503); - echo 'The configuration file does not exist.'; - exit(3); // EXIT_CONFIG - } - - // Does the $config array exist in the file? - if ( ! isset($config) OR ! is_array($config)) - { - set_status_header(503); - echo 'Your config file does not appear to be formatted correctly.'; - exit(3); // EXIT_CONFIG - } - } - - // Are any values being dynamically added or replaced? - foreach ($replace as $key => $val) - { - $config[$key] = $val; - } - - return $config; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('config_item')) -{ - /** - * Returns the specified config item - * - * @param string - * @return mixed - */ - function config_item($item) - { - static $_config; - - if (empty($_config)) - { - // references cannot be directly assigned to static variables, so we use an array - $_config[0] =& get_config(); - } - - return isset($_config[0][$item]) ? $_config[0][$item] : NULL; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('get_mimes')) -{ - /** - * Returns the MIME types array from config/mimes.php - * - * @return array - */ - function &get_mimes() - { - static $_mimes; - - if (empty($_mimes)) - { - $_mimes = file_exists(APPPATH.'config/mimes.php') - ? include(APPPATH.'config/mimes.php') - : array(); - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) - { - $_mimes = array_merge($_mimes, include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')); - } - } - - return $_mimes; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('is_https')) -{ - /** - * Is HTTPS? - * - * Determines if the application is accessed via an encrypted - * (HTTPS) connection. - * - * @return bool - */ - function is_https() - { - if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') - { - return TRUE; - } - elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') - { - return TRUE; - } - elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') - { - return TRUE; - } - - return FALSE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('is_cli')) -{ - - /** - * Is CLI? - * - * Test to see if a request was made from the command line. - * - * @return bool - */ - function is_cli() - { - return (PHP_SAPI === 'cli' OR defined('STDIN')); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('show_error')) -{ - /** - * Error Handler - * - * This function lets us invoke the exception class and - * display errors using the standard error template located - * in application/views/errors/error_general.php - * This function will send the error page directly to the - * browser and exit. - * - * @param string - * @param int - * @param string - * @return void - */ - function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') - { - $status_code = abs($status_code); - if ($status_code < 100) - { - $exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN - $status_code = 500; - } - else - { - $exit_status = 1; // EXIT_ERROR - } - - $_error =& load_class('Exceptions', 'core'); - echo $_error->show_error($heading, $message, 'error_general', $status_code); - exit($exit_status); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('show_404')) -{ - /** - * 404 Page Handler - * - * This function is similar to the show_error() function above - * However, instead of the standard error template it displays - * 404 errors. - * - * @param string - * @param bool - * @return void - */ - function show_404($page = '', $log_error = TRUE) - { - $_error =& load_class('Exceptions', 'core'); - $_error->show_404($page, $log_error); - exit(4); // EXIT_UNKNOWN_FILE - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('log_message')) -{ - /** - * Error Logging Interface - * - * We use this as a simple mechanism to access the logging - * class and send messages to be logged. - * - * @param string the error level: 'error', 'debug' or 'info' - * @param string the error message - * @return void - */ - function log_message($level, $message) - { - static $_log; - - if ($_log === NULL) - { - // references cannot be directly assigned to static variables, so we use an array - $_log[0] =& load_class('Log', 'core'); - } - - $_log[0]->write_log($level, $message); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('set_status_header')) -{ - /** - * Set HTTP Status Header - * - * @param int the status code - * @param string - * @return void - */ - function set_status_header($code = 200, $text = '') - { - if (is_cli()) - { - return; - } - - if (empty($code) OR ! is_numeric($code)) - { - show_error('Status codes must be numeric', 500); - } - - if (empty($text)) - { - is_int($code) OR $code = (int) $code; - $stati = array( - 100 => 'Continue', - 101 => 'Switching Protocols', - - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 422 => 'Unprocessable Entity', - 426 => 'Upgrade Required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 511 => 'Network Authentication Required', - ); - - if (isset($stati[$code])) - { - $text = $stati[$code]; - } - else - { - show_error('No status text available. Please check your status code number or supply your own message text.', 500); - } - } - - if (strpos(PHP_SAPI, 'cgi') === 0) - { - header('Status: '.$code.' '.$text, TRUE); - return; - } - - $server_protocol = (isset($_SERVER['SERVER_PROTOCOL']) && in_array($_SERVER['SERVER_PROTOCOL'], array('HTTP/1.0', 'HTTP/1.1', 'HTTP/2'), TRUE)) - ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; - header($server_protocol.' '.$code.' '.$text, TRUE, $code); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('_error_handler')) -{ - /** - * Error Handler - * - * This is the custom error handler that is declared at the (relative) - * top of CodeIgniter.php. The main reason we use this is to permit - * PHP errors to be logged in our own log files since the user may - * not have access to server logs. Since this function effectively - * intercepts PHP errors, however, we also need to display errors - * based on the current error_reporting level. - * We do that with the use of a PHP error template. - * - * @param int $severity - * @param string $message - * @param string $filepath - * @param int $line - * @return void - */ - function _error_handler($severity, $message, $filepath, $line) - { - $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); - - // When an error occurred, set the status header to '500 Internal Server Error' - // to indicate to the client something went wrong. - // This can't be done within the $_error->show_php_error method because - // it is only called when the display_errors flag is set (which isn't usually - // the case in a production environment) or when errors are ignored because - // they are above the error_reporting threshold. - if ($is_error) - { - set_status_header(500); - } - - // Should we ignore the error? We'll get the current error_reporting - // level and add its bits with the severity bits to find out. - if (($severity & error_reporting()) !== $severity) - { - return; - } - - $_error =& load_class('Exceptions', 'core'); - $_error->log_exception($severity, $message, $filepath, $line); - - // Should we display the error? - if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) - { - $_error->show_php_error($severity, $message, $filepath, $line); - } - - // If the error is fatal, the execution of the script should be stopped because - // errors can't be recovered from. Halting the script conforms with PHP's - // default error handling. See http://www.php.net/manual/en/errorfunc.constants.php - if ($is_error) - { - exit(1); // EXIT_ERROR - } - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('_exception_handler')) -{ - /** - * Exception Handler - * - * Sends uncaught exceptions to the logger and displays them - * only if display_errors is On so that they don't show up in - * production environments. - * - * @param Exception $exception - * @return void - */ - function _exception_handler($exception) - { - $_error =& load_class('Exceptions', 'core'); - $_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine()); - - is_cli() OR set_status_header(500); - // Should we display the error? - if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) - { - $_error->show_exception($exception); - } - - exit(1); // EXIT_ERROR - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('_shutdown_handler')) -{ - /** - * Shutdown Handler - * - * This is the shutdown handler that is declared at the top - * of CodeIgniter.php. The main reason we use this is to simulate - * a complete custom exception handler. - * - * E_STRICT is purposively neglected because such events may have - * been caught. Duplication or none? None is preferred for now. - * - * @link http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a - * @return void - */ - function _shutdown_handler() - { - $last_error = error_get_last(); - if (isset($last_error) && - ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) - { - _error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); - } - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('remove_invisible_characters')) -{ - /** - * Remove Invisible Characters - * - * This prevents sandwiching null characters - * between ascii characters, like Java\0script. - * - * @param string - * @param bool - * @return string - */ - function remove_invisible_characters($str, $url_encoded = TRUE) - { - $non_displayables = array(); - - // every control character except newline (dec 10), - // carriage return (dec 13) and horizontal tab (dec 09) - if ($url_encoded) - { - $non_displayables[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15 - $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31 - $non_displayables[] = '/%7f/i'; // url encoded 127 - } - - $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 - - do - { - $str = preg_replace($non_displayables, '', $str, -1, $count); - } - while ($count); - - return $str; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('html_escape')) -{ - /** - * Returns HTML escaped variable. - * - * @param mixed $var The input string or array of strings to be escaped. - * @param bool $double_encode $double_encode set to FALSE prevents escaping twice. - * @return mixed The escaped string or array of strings as a result. - */ - function html_escape($var, $double_encode = TRUE) - { - if (empty($var)) - { - return $var; - } - - if (is_array($var)) - { - foreach (array_keys($var) as $key) - { - $var[$key] = html_escape($var[$key], $double_encode); - } - - return $var; - } - - return htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('_stringify_attributes')) -{ - /** - * Stringify attributes for use in HTML tags. - * - * Helper function used to convert a string, array, or object - * of attributes to a string. - * - * @param mixed string, array, object - * @param bool - * @return string - */ - function _stringify_attributes($attributes, $js = FALSE) - { - $atts = NULL; - - if (empty($attributes)) - { - return $atts; - } - - if (is_string($attributes)) - { - return ' '.$attributes; - } - - $attributes = (array) $attributes; - - foreach ($attributes as $key => $val) - { - $atts .= ($js) ? $key.'='.$val.',' : ' '.$key.'="'.$val.'"'; - } - - return rtrim($atts, ','); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('function_usable')) -{ - /** - * Function usable - * - * Executes a function_exists() check, and if the Suhosin PHP - * extension is loaded - checks whether the function that is - * checked might be disabled in there as well. - * - * This is useful as function_exists() will return FALSE for - * functions disabled via the *disable_functions* php.ini - * setting, but not for *suhosin.executor.func.blacklist* and - * *suhosin.executor.disable_eval*. These settings will just - * terminate script execution if a disabled function is executed. - * - * The above described behavior turned out to be a bug in Suhosin, - * but even though a fix was committed for 0.9.34 on 2012-02-12, - * that version is yet to be released. This function will therefore - * be just temporary, but would probably be kept for a few years. - * - * @link http://www.hardened-php.net/suhosin/ - * @param string $function_name Function to check for - * @return bool TRUE if the function exists and is safe to call, - * FALSE otherwise. - */ - function function_usable($function_name) - { - static $_suhosin_func_blacklist; - - if (function_exists($function_name)) - { - if ( ! isset($_suhosin_func_blacklist)) - { - $_suhosin_func_blacklist = extension_loaded('suhosin') - ? explode(',', trim(ini_get('suhosin.executor.func.blacklist'))) - : array(); - } - - return ! in_array($function_name, $_suhosin_func_blacklist, TRUE); - } - - return FALSE; - } -} diff --git a/vendor_old/codeigniter/framework/system/core/Config.php b/vendor_old/codeigniter/framework/system/core/Config.php deleted file mode 100644 index cda6224..0000000 --- a/vendor_old/codeigniter/framework/system/core/Config.php +++ /dev/null @@ -1,379 +0,0 @@ -config =& get_config(); - - // Set the base_url automatically if none was provided - if (empty($this->config['base_url'])) - { - if (isset($_SERVER['SERVER_ADDR'])) - { - if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) - { - $server_addr = '['.$_SERVER['SERVER_ADDR'].']'; - } - else - { - $server_addr = $_SERVER['SERVER_ADDR']; - } - - $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr - .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); - } - else - { - $base_url = 'http://localhost/'; - } - - $this->set_item('base_url', $base_url); - } - - log_message('info', 'Config Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Load Config File - * - * @param string $file Configuration file name - * @param bool $use_sections Whether configuration values should be loaded into their own section - * @param bool $fail_gracefully Whether to just return FALSE or display an error message - * @return bool TRUE if the file was loaded correctly or FALSE on failure - */ - public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) - { - $file = ($file === '') ? 'config' : str_replace('.php', '', $file); - $loaded = FALSE; - - foreach ($this->_config_paths as $path) - { - foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location) - { - $file_path = $path.'config/'.$location.'.php'; - if (in_array($file_path, $this->is_loaded, TRUE)) - { - return TRUE; - } - - if ( ! file_exists($file_path)) - { - continue; - } - - include($file_path); - - if ( ! isset($config) OR ! is_array($config)) - { - if ($fail_gracefully === TRUE) - { - return FALSE; - } - - show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); - } - - if ($use_sections === TRUE) - { - $this->config[$file] = isset($this->config[$file]) - ? array_merge($this->config[$file], $config) - : $config; - } - else - { - $this->config = array_merge($this->config, $config); - } - - $this->is_loaded[] = $file_path; - $config = NULL; - $loaded = TRUE; - log_message('debug', 'Config file loaded: '.$file_path); - } - } - - if ($loaded === TRUE) - { - return TRUE; - } - elseif ($fail_gracefully === TRUE) - { - return FALSE; - } - - show_error('The configuration file '.$file.'.php does not exist.'); - } - - // -------------------------------------------------------------------- - - /** - * Fetch a config file item - * - * @param string $item Config item name - * @param string $index Index name - * @return string|null The configuration item or NULL if the item doesn't exist - */ - public function item($item, $index = '') - { - if ($index == '') - { - return isset($this->config[$item]) ? $this->config[$item] : NULL; - } - - return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL; - } - - // -------------------------------------------------------------------- - - /** - * Fetch a config file item with slash appended (if not empty) - * - * @param string $item Config item name - * @return string|null The configuration item or NULL if the item doesn't exist - */ - public function slash_item($item) - { - if ( ! isset($this->config[$item])) - { - return NULL; - } - elseif (trim($this->config[$item]) === '') - { - return ''; - } - - return rtrim($this->config[$item], '/').'/'; - } - - // -------------------------------------------------------------------- - - /** - * Site URL - * - * Returns base_url . index_page [. uri_string] - * - * @uses CI_Config::_uri_string() - * - * @param string|string[] $uri URI string or an array of segments - * @param string $protocol - * @return string - */ - public function site_url($uri = '', $protocol = NULL) - { - $base_url = $this->slash_item('base_url'); - - if (isset($protocol)) - { - // For protocol-relative links - if ($protocol === '') - { - $base_url = substr($base_url, strpos($base_url, '//')); - } - else - { - $base_url = $protocol.substr($base_url, strpos($base_url, '://')); - } - } - - if (empty($uri)) - { - return $base_url.$this->item('index_page'); - } - - $uri = $this->_uri_string($uri); - - if ($this->item('enable_query_strings') === FALSE) - { - $suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : ''; - - if ($suffix !== '') - { - if (($offset = strpos($uri, '?')) !== FALSE) - { - $uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset); - } - else - { - $uri .= $suffix; - } - } - - return $base_url.$this->slash_item('index_page').$uri; - } - elseif (strpos($uri, '?') === FALSE) - { - $uri = '?'.$uri; - } - - return $base_url.$this->item('index_page').$uri; - } - - // ------------------------------------------------------------- - - /** - * Base URL - * - * Returns base_url [. uri_string] - * - * @uses CI_Config::_uri_string() - * - * @param string|string[] $uri URI string or an array of segments - * @param string $protocol - * @return string - */ - public function base_url($uri = '', $protocol = NULL) - { - $base_url = $this->slash_item('base_url'); - - if (isset($protocol)) - { - // For protocol-relative links - if ($protocol === '') - { - $base_url = substr($base_url, strpos($base_url, '//')); - } - else - { - $base_url = $protocol.substr($base_url, strpos($base_url, '://')); - } - } - - return $base_url.$this->_uri_string($uri); - } - - // ------------------------------------------------------------- - - /** - * Build URI string - * - * @used-by CI_Config::site_url() - * @used-by CI_Config::base_url() - * - * @param string|string[] $uri URI string or an array of segments - * @return string - */ - protected function _uri_string($uri) - { - if ($this->item('enable_query_strings') === FALSE) - { - is_array($uri) && $uri = implode('/', $uri); - return ltrim($uri, '/'); - } - elseif (is_array($uri)) - { - return http_build_query($uri); - } - - return $uri; - } - - // -------------------------------------------------------------------- - - /** - * System URL - * - * @deprecated 3.0.0 Encourages insecure practices - * @return string - */ - public function system_url() - { - $x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH)); - return $this->slash_item('base_url').end($x).'/'; - } - - // -------------------------------------------------------------------- - - /** - * Set a config file item - * - * @param string $item Config item key - * @param string $value Config item value - * @return void - */ - public function set_item($item, $value) - { - $this->config[$item] = $value; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Controller.php b/vendor_old/codeigniter/framework/system/core/Controller.php deleted file mode 100644 index 59a9167..0000000 --- a/vendor_old/codeigniter/framework/system/core/Controller.php +++ /dev/null @@ -1,96 +0,0 @@ - $class) - { - $this->$var =& load_class($class); - } - - $this->load =& load_class('Loader', 'core'); - $this->load->initialize(); - log_message('info', 'Controller Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Get the CI singleton - * - * @static - * @return object - */ - public static function &get_instance() - { - return self::$instance; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Exceptions.php b/vendor_old/codeigniter/framework/system/core/Exceptions.php deleted file mode 100644 index 47d153f..0000000 --- a/vendor_old/codeigniter/framework/system/core/Exceptions.php +++ /dev/null @@ -1,274 +0,0 @@ - 'Error', - E_WARNING => 'Warning', - E_PARSE => 'Parsing Error', - E_NOTICE => 'Notice', - E_CORE_ERROR => 'Core Error', - E_CORE_WARNING => 'Core Warning', - E_COMPILE_ERROR => 'Compile Error', - E_COMPILE_WARNING => 'Compile Warning', - E_USER_ERROR => 'User Error', - E_USER_WARNING => 'User Warning', - E_USER_NOTICE => 'User Notice', - E_STRICT => 'Runtime Notice' - ); - - /** - * Class constructor - * - * @return void - */ - public function __construct() - { - $this->ob_level = ob_get_level(); - // Note: Do not log messages from this constructor. - } - - // -------------------------------------------------------------------- - - /** - * Exception Logger - * - * Logs PHP generated error messages - * - * @param int $severity Log level - * @param string $message Error message - * @param string $filepath File path - * @param int $line Line number - * @return void - */ - public function log_exception($severity, $message, $filepath, $line) - { - $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; - log_message('error', 'Severity: '.$severity.' --> '.$message.' '.$filepath.' '.$line); - } - - // -------------------------------------------------------------------- - - /** - * 404 Error Handler - * - * @uses CI_Exceptions::show_error() - * - * @param string $page Page URI - * @param bool $log_error Whether to log the error - * @return void - */ - public function show_404($page = '', $log_error = TRUE) - { - if (is_cli()) - { - $heading = 'Not Found'; - $message = 'The controller/method pair you requested was not found.'; - } - else - { - $heading = '404 Page Not Found'; - $message = 'The page you requested was not found.'; - } - - // By default we log this, but allow a dev to skip it - if ($log_error) - { - log_message('error', $heading.': '.$page); - } - - echo $this->show_error($heading, $message, 'error_404', 404); - exit(4); // EXIT_UNKNOWN_FILE - } - - // -------------------------------------------------------------------- - - /** - * General Error Page - * - * Takes an error message as input (either as a string or an array) - * and displays it using the specified template. - * - * @param string $heading Page heading - * @param string|string[] $message Error message - * @param string $template Template name - * @param int $status_code (default: 500) - * - * @return string Error page output - */ - public function show_error($heading, $message, $template = 'error_general', $status_code = 500) - { - $templates_path = config_item('error_views_path'); - if (empty($templates_path)) - { - $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; - } - - if (is_cli()) - { - $message = "\t".(is_array($message) ? implode("\n\t", $message) : $message); - $template = 'cli'.DIRECTORY_SEPARATOR.$template; - } - else - { - set_status_header($status_code); - $message = '

      '.(is_array($message) ? implode('

      ', $message) : $message).'

      '; - $template = 'html'.DIRECTORY_SEPARATOR.$template; - } - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - ob_start(); - include($templates_path.$template.'.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - return $buffer; - } - - // -------------------------------------------------------------------- - - public function show_exception($exception) - { - $templates_path = config_item('error_views_path'); - if (empty($templates_path)) - { - $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; - } - - $message = $exception->getMessage(); - if (empty($message)) - { - $message = '(null)'; - } - - if (is_cli()) - { - $templates_path .= 'cli'.DIRECTORY_SEPARATOR; - } - else - { - $templates_path .= 'html'.DIRECTORY_SEPARATOR; - } - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - - ob_start(); - include($templates_path.'error_exception.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - echo $buffer; - } - - // -------------------------------------------------------------------- - - /** - * Native PHP error handler - * - * @param int $severity Error level - * @param string $message Error message - * @param string $filepath File path - * @param int $line Line number - * @return string Error page output - */ - public function show_php_error($severity, $message, $filepath, $line) - { - $templates_path = config_item('error_views_path'); - if (empty($templates_path)) - { - $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; - } - - $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; - - // For safety reasons we don't show the full file path in non-CLI requests - if ( ! is_cli()) - { - $filepath = str_replace('\\', '/', $filepath); - if (FALSE !== strpos($filepath, '/')) - { - $x = explode('/', $filepath); - $filepath = $x[count($x)-2].'/'.end($x); - } - - $template = 'html'.DIRECTORY_SEPARATOR.'error_php'; - } - else - { - $template = 'cli'.DIRECTORY_SEPARATOR.'error_php'; - } - - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_flush(); - } - ob_start(); - include($templates_path.$template.'.php'); - $buffer = ob_get_contents(); - ob_end_clean(); - echo $buffer; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Hooks.php b/vendor_old/codeigniter/framework/system/core/Hooks.php deleted file mode 100644 index f2d6f21..0000000 --- a/vendor_old/codeigniter/framework/system/core/Hooks.php +++ /dev/null @@ -1,266 +0,0 @@ -item('enable_hooks') === FALSE) - { - return; - } - - // Grab the "hooks" definition file. - if (file_exists(APPPATH.'config/hooks.php')) - { - include(APPPATH.'config/hooks.php'); - } - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); - } - - // If there are no hooks, we're done. - if ( ! isset($hook) OR ! is_array($hook)) - { - return; - } - - $this->hooks =& $hook; - $this->enabled = TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Call Hook - * - * Calls a particular hook. Called by CodeIgniter.php. - * - * @uses CI_Hooks::_run_hook() - * - * @param string $which Hook name - * @return bool TRUE on success or FALSE on failure - */ - public function call_hook($which = '') - { - if ( ! $this->enabled OR ! isset($this->hooks[$which])) - { - return FALSE; - } - - if (is_array($this->hooks[$which]) && ! isset($this->hooks[$which]['function'])) - { - foreach ($this->hooks[$which] as $val) - { - $this->_run_hook($val); - } - } - else - { - $this->_run_hook($this->hooks[$which]); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Run Hook - * - * Runs a particular hook - * - * @param array $data Hook details - * @return bool TRUE on success or FALSE on failure - */ - protected function _run_hook($data) - { - // Closures/lambda functions and array($object, 'method') callables - if (is_callable($data)) - { - is_array($data) - ? $data[0]->{$data[1]}() - : $data(); - - return TRUE; - } - elseif ( ! is_array($data)) - { - return FALSE; - } - - // ----------------------------------- - // Safety - Prevents run-away loops - // ----------------------------------- - - // If the script being called happens to have the same - // hook call within it a loop can happen - if ($this->_in_progress === TRUE) - { - return; - } - - // ----------------------------------- - // Set file path - // ----------------------------------- - - if ( ! isset($data['filepath'], $data['filename'])) - { - return FALSE; - } - - $filepath = APPPATH.$data['filepath'].'/'.$data['filename']; - - if ( ! file_exists($filepath)) - { - return FALSE; - } - - // Determine and class and/or function names - $class = empty($data['class']) ? FALSE : $data['class']; - $function = empty($data['function']) ? FALSE : $data['function']; - $params = isset($data['params']) ? $data['params'] : ''; - - if (empty($function)) - { - return FALSE; - } - - // Set the _in_progress flag - $this->_in_progress = TRUE; - - // Call the requested class and/or function - if ($class !== FALSE) - { - // The object is stored? - if (isset($this->_objects[$class])) - { - if (method_exists($this->_objects[$class], $function)) - { - $this->_objects[$class]->$function($params); - } - else - { - return $this->_in_progress = FALSE; - } - } - else - { - class_exists($class, FALSE) OR require_once($filepath); - - if ( ! class_exists($class, FALSE) OR ! method_exists($class, $function)) - { - return $this->_in_progress = FALSE; - } - - // Store the object and execute the method - $this->_objects[$class] = new $class(); - $this->_objects[$class]->$function($params); - } - } - else - { - function_exists($function) OR require_once($filepath); - - if ( ! function_exists($function)) - { - return $this->_in_progress = FALSE; - } - - $function($params); - } - - $this->_in_progress = FALSE; - return TRUE; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Input.php b/vendor_old/codeigniter/framework/system/core/Input.php deleted file mode 100644 index af4f87c..0000000 --- a/vendor_old/codeigniter/framework/system/core/Input.php +++ /dev/null @@ -1,895 +0,0 @@ -_allow_get_array = (config_item('allow_get_array') === TRUE); - $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); - $this->_enable_csrf = (config_item('csrf_protection') === TRUE); - $this->_standardize_newlines = (bool) config_item('standardize_newlines'); - - $this->security =& load_class('Security', 'core'); - - // Do we need the UTF-8 class? - if (UTF8_ENABLED === TRUE) - { - $this->uni =& load_class('Utf8', 'core'); - } - - // Sanitize global arrays - $this->_sanitize_globals(); - - // CSRF Protection check - if ($this->_enable_csrf === TRUE && ! is_cli()) - { - $this->security->csrf_verify(); - } - - log_message('info', 'Input Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Fetch from array - * - * Internal method used to retrieve values from global arrays. - * - * @param array &$array $_GET, $_POST, $_COOKIE, $_SERVER, etc. - * @param mixed $index Index for item to be fetched from $array - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL) - { - is_bool($xss_clean) OR $xss_clean = $this->_enable_xss; - - // If $index is NULL, it means that the whole $array is requested - isset($index) OR $index = array_keys($array); - - // allow fetching multiple keys at once - if (is_array($index)) - { - $output = array(); - foreach ($index as $key) - { - $output[$key] = $this->_fetch_from_array($array, $key, $xss_clean); - } - - return $output; - } - - if (isset($array[$index])) - { - $value = $array[$index]; - } - elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation - { - $value = $array; - for ($i = 0; $i < $count; $i++) - { - $key = trim($matches[0][$i], '[]'); - if ($key === '') // Empty notation will return the value as array - { - break; - } - - if (isset($value[$key])) - { - $value = $value[$key]; - } - else - { - return NULL; - } - } - } - else - { - return NULL; - } - - return ($xss_clean === TRUE) - ? $this->security->xss_clean($value) - : $value; - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the GET array - * - * @param mixed $index Index for item to be fetched from $_GET - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function get($index = NULL, $xss_clean = NULL) - { - return $this->_fetch_from_array($_GET, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the POST array - * - * @param mixed $index Index for item to be fetched from $_POST - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function post($index = NULL, $xss_clean = NULL) - { - return $this->_fetch_from_array($_POST, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from POST data with fallback to GET - * - * @param string $index Index for item to be fetched from $_POST or $_GET - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function post_get($index, $xss_clean = NULL) - { - return isset($_POST[$index]) - ? $this->post($index, $xss_clean) - : $this->get($index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from GET data with fallback to POST - * - * @param string $index Index for item to be fetched from $_GET or $_POST - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function get_post($index, $xss_clean = NULL) - { - return isset($_GET[$index]) - ? $this->get($index, $xss_clean) - : $this->post($index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the COOKIE array - * - * @param mixed $index Index for item to be fetched from $_COOKIE - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function cookie($index = NULL, $xss_clean = NULL) - { - return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Fetch an item from the SERVER array - * - * @param mixed $index Index for item to be fetched from $_SERVER - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function server($index, $xss_clean = NULL) - { - return $this->_fetch_from_array($_SERVER, $index, $xss_clean); - } - - // ------------------------------------------------------------------------ - - /** - * Fetch an item from the php://input stream - * - * Useful when you need to access PUT, DELETE or PATCH request data. - * - * @param string $index Index for item to be fetched - * @param bool $xss_clean Whether to apply XSS filtering - * @return mixed - */ - public function input_stream($index = NULL, $xss_clean = NULL) - { - // Prior to PHP 5.6, the input stream can only be read once, - // so we'll need to check if we have already done that first. - if ( ! is_array($this->_input_stream)) - { - // $this->raw_input_stream will trigger __get(). - parse_str($this->raw_input_stream, $this->_input_stream); - is_array($this->_input_stream) OR $this->_input_stream = array(); - } - - return $this->_fetch_from_array($this->_input_stream, $index, $xss_clean); - } - - // ------------------------------------------------------------------------ - - /** - * Set cookie - * - * Accepts an arbitrary number of parameters (up to 7) or an associative - * array in the first parameter containing all the values. - * - * @param string|mixed[] $name Cookie name or an array containing parameters - * @param string $value Cookie value - * @param int $expire Cookie expiration time in seconds - * @param string $domain Cookie domain (e.g.: '.yourdomain.com') - * @param string $path Cookie path (default: '/') - * @param string $prefix Cookie name prefix - * @param bool $secure Whether to only transfer cookies via SSL - * @param bool $httponly Whether to only makes the cookie accessible via HTTP (no javascript) - * @return void - */ - public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL) - { - if (is_array($name)) - { - // always leave 'name' in last place, as the loop will break otherwise, due to $$item - foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item) - { - if (isset($name[$item])) - { - $$item = $name[$item]; - } - } - } - - if ($prefix === '' && config_item('cookie_prefix') !== '') - { - $prefix = config_item('cookie_prefix'); - } - - if ($domain == '' && config_item('cookie_domain') != '') - { - $domain = config_item('cookie_domain'); - } - - if ($path === '/' && config_item('cookie_path') !== '/') - { - $path = config_item('cookie_path'); - } - - $secure = ($secure === NULL && config_item('cookie_secure') !== NULL) - ? (bool) config_item('cookie_secure') - : (bool) $secure; - - $httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL) - ? (bool) config_item('cookie_httponly') - : (bool) $httponly; - - if ( ! is_numeric($expire)) - { - $expire = time() - 86500; - } - else - { - $expire = ($expire > 0) ? time() + $expire : 0; - } - - setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the IP Address - * - * Determines and validates the visitor's IP address. - * - * @return string IP address - */ - public function ip_address() - { - if ($this->ip_address !== FALSE) - { - return $this->ip_address; - } - - $proxy_ips = config_item('proxy_ips'); - if ( ! empty($proxy_ips) && ! is_array($proxy_ips)) - { - $proxy_ips = explode(',', str_replace(' ', '', $proxy_ips)); - } - - $this->ip_address = $this->server('REMOTE_ADDR'); - - if ($proxy_ips) - { - foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) - { - if (($spoof = $this->server($header)) !== NULL) - { - // Some proxies typically list the whole chain of IP - // addresses through which the client has reached us. - // e.g. client_ip, proxy_ip1, proxy_ip2, etc. - sscanf($spoof, '%[^,]', $spoof); - - if ( ! $this->valid_ip($spoof)) - { - $spoof = NULL; - } - else - { - break; - } - } - } - - if ($spoof) - { - for ($i = 0, $c = count($proxy_ips); $i < $c; $i++) - { - // Check if we have an IP address or a subnet - if (strpos($proxy_ips[$i], '/') === FALSE) - { - // An IP address (and not a subnet) is specified. - // We can compare right away. - if ($proxy_ips[$i] === $this->ip_address) - { - $this->ip_address = $spoof; - break; - } - - continue; - } - - // We have a subnet ... now the heavy lifting begins - isset($separator) OR $separator = $this->valid_ip($this->ip_address, 'ipv6') ? ':' : '.'; - - // If the proxy entry doesn't match the IP protocol - skip it - if (strpos($proxy_ips[$i], $separator) === FALSE) - { - continue; - } - - // Convert the REMOTE_ADDR IP address to binary, if needed - if ( ! isset($ip, $sprintf)) - { - if ($separator === ':') - { - // Make sure we're have the "full" IPv6 format - $ip = explode(':', - str_replace('::', - str_repeat(':', 9 - substr_count($this->ip_address, ':')), - $this->ip_address - ) - ); - - for ($j = 0; $j < 8; $j++) - { - $ip[$j] = intval($ip[$j], 16); - } - - $sprintf = '%016b%016b%016b%016b%016b%016b%016b%016b'; - } - else - { - $ip = explode('.', $this->ip_address); - $sprintf = '%08b%08b%08b%08b'; - } - - $ip = vsprintf($sprintf, $ip); - } - - // Split the netmask length off the network address - sscanf($proxy_ips[$i], '%[^/]/%d', $netaddr, $masklen); - - // Again, an IPv6 address is most likely in a compressed form - if ($separator === ':') - { - $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); - for ($j = 0; $j < 8; $j++) - { - $netaddr[$j] = intval($netaddr[$j], 16); - } - } - else - { - $netaddr = explode('.', $netaddr); - } - - // Convert to binary and finally compare - if (strncmp($ip, vsprintf($sprintf, $netaddr), $masklen) === 0) - { - $this->ip_address = $spoof; - break; - } - } - } - } - - if ( ! $this->valid_ip($this->ip_address)) - { - return $this->ip_address = '0.0.0.0'; - } - - return $this->ip_address; - } - - // -------------------------------------------------------------------- - - /** - * Validate IP Address - * - * @param string $ip IP address - * @param string $which IP protocol: 'ipv4' or 'ipv6' - * @return bool - */ - public function valid_ip($ip, $which = '') - { - switch (strtolower($which)) - { - case 'ipv4': - $which = FILTER_FLAG_IPV4; - break; - case 'ipv6': - $which = FILTER_FLAG_IPV6; - break; - default: - $which = NULL; - break; - } - - return (bool) filter_var($ip, FILTER_VALIDATE_IP, $which); - } - - // -------------------------------------------------------------------- - - /** - * Fetch User Agent string - * - * @return string|null User Agent string or NULL if it doesn't exist - */ - public function user_agent($xss_clean = NULL) - { - return $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Globals - * - * Internal method serving for the following purposes: - * - * - Unsets $_GET data, if query strings are not enabled - * - Cleans POST, COOKIE and SERVER data - * - Standardizes newline characters to PHP_EOL - * - * @return void - */ - protected function _sanitize_globals() - { - // Is $_GET data allowed? If not we'll set the $_GET to an empty array - if ($this->_allow_get_array === FALSE) - { - $_GET = array(); - } - elseif (is_array($_GET)) - { - foreach ($_GET as $key => $val) - { - $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Clean $_POST Data - if (is_array($_POST)) - { - foreach ($_POST as $key => $val) - { - $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); - } - } - - // Clean $_COOKIE Data - if (is_array($_COOKIE)) - { - // Also get rid of specially treated cookies that might be set by a server - // or silly application, that are of no use to a CI application anyway - // but that when present will trip our 'Disallowed Key Characters' alarm - // http://www.ietf.org/rfc/rfc2109.txt - // note that the key names below are single quoted strings, and are not PHP variables - unset( - $_COOKIE['$Version'], - $_COOKIE['$Path'], - $_COOKIE['$Domain'] - ); - - foreach ($_COOKIE as $key => $val) - { - if (($cookie_key = $this->_clean_input_keys($key)) !== FALSE) - { - $_COOKIE[$cookie_key] = $this->_clean_input_data($val); - } - else - { - unset($_COOKIE[$key]); - } - } - } - - // Sanitize PHP_SELF - $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); - - log_message('debug', 'Global POST, GET and COOKIE data sanitized'); - } - - // -------------------------------------------------------------------- - - /** - * Clean Input Data - * - * Internal method that aids in escaping data and - * standardizing newline characters to PHP_EOL. - * - * @param string|string[] $str Input string(s) - * @return string - */ - protected function _clean_input_data($str) - { - if (is_array($str)) - { - $new_array = array(); - foreach (array_keys($str) as $key) - { - $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]); - } - return $new_array; - } - - /* We strip slashes if magic quotes is on to keep things consistent - - NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and - it will probably not exist in future versions at all. - */ - if ( ! is_php('5.4') && get_magic_quotes_gpc()) - { - $str = stripslashes($str); - } - - // Clean UTF-8 if supported - if (UTF8_ENABLED === TRUE) - { - $str = $this->uni->clean_string($str); - } - - // Remove control characters - $str = remove_invisible_characters($str, FALSE); - - // Standardize newlines if needed - if ($this->_standardize_newlines === TRUE) - { - return preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Clean Keys - * - * Internal method that helps to prevent malicious users - * from trying to exploit keys we make sure that keys are - * only named with alpha-numeric text and a few other items. - * - * @param string $str Input string - * @param bool $fatal Whether to terminate script exection - * or to return FALSE if an invalid - * key is encountered - * @return string|bool - */ - protected function _clean_input_keys($str, $fatal = TRUE) - { - if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) - { - if ($fatal === TRUE) - { - return FALSE; - } - else - { - set_status_header(503); - echo 'Disallowed Key Characters.'; - exit(7); // EXIT_USER_INPUT - } - } - - // Clean UTF-8 if supported - if (UTF8_ENABLED === TRUE) - { - return $this->uni->clean_string($str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Request Headers - * - * @param bool $xss_clean Whether to apply XSS filtering - * @return array - */ - public function request_headers($xss_clean = FALSE) - { - // If header is already defined, return it immediately - if ( ! empty($this->headers)) - { - return $this->_fetch_from_array($this->headers, NULL, $xss_clean); - } - - // In Apache, you can simply call apache_request_headers() - if (function_exists('apache_request_headers')) - { - $this->headers = apache_request_headers(); - } - else - { - isset($_SERVER['CONTENT_TYPE']) && $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE']; - - foreach ($_SERVER as $key => $val) - { - if (sscanf($key, 'HTTP_%s', $header) === 1) - { - // take SOME_HEADER and turn it into Some-Header - $header = str_replace('_', ' ', strtolower($header)); - $header = str_replace(' ', '-', ucwords($header)); - - $this->headers[$header] = $_SERVER[$key]; - } - } - } - - return $this->_fetch_from_array($this->headers, NULL, $xss_clean); - } - - // -------------------------------------------------------------------- - - /** - * Get Request Header - * - * Returns the value of a single member of the headers class member - * - * @param string $index Header name - * @param bool $xss_clean Whether to apply XSS filtering - * @return string|null The requested header on success or NULL on failure - */ - public function get_request_header($index, $xss_clean = FALSE) - { - static $headers; - - if ( ! isset($headers)) - { - empty($this->headers) && $this->request_headers(); - foreach ($this->headers as $key => $value) - { - $headers[strtolower($key)] = $value; - } - } - - $index = strtolower($index); - - if ( ! isset($headers[$index])) - { - return NULL; - } - - return ($xss_clean === TRUE) - ? $this->security->xss_clean($headers[$index]) - : $headers[$index]; - } - - // -------------------------------------------------------------------- - - /** - * Is AJAX request? - * - * Test to see if a request contains the HTTP_X_REQUESTED_WITH header. - * - * @return bool - */ - public function is_ajax_request() - { - return ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); - } - - // -------------------------------------------------------------------- - - /** - * Is CLI request? - * - * Test to see if a request was made from the command line. - * - * @deprecated 3.0.0 Use is_cli() instead - * @return bool - */ - public function is_cli_request() - { - return is_cli(); - } - - // -------------------------------------------------------------------- - - /** - * Get Request Method - * - * Return the request method - * - * @param bool $upper Whether to return in upper or lower case - * (default: FALSE) - * @return string - */ - public function method($upper = FALSE) - { - return ($upper) - ? strtoupper($this->server('REQUEST_METHOD')) - : strtolower($this->server('REQUEST_METHOD')); - } - - // ------------------------------------------------------------------------ - - /** - * Magic __get() - * - * Allows read access to protected properties - * - * @param string $name - * @return mixed - */ - public function __get($name) - { - if ($name === 'raw_input_stream') - { - isset($this->_raw_input_stream) OR $this->_raw_input_stream = file_get_contents('php://input'); - return $this->_raw_input_stream; - } - elseif ($name === 'ip_address') - { - return $this->ip_address; - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Lang.php b/vendor_old/codeigniter/framework/system/core/Lang.php deleted file mode 100644 index 569b023..0000000 --- a/vendor_old/codeigniter/framework/system/core/Lang.php +++ /dev/null @@ -1,203 +0,0 @@ -load($value, $idiom, $return, $add_suffix, $alt_path); - } - - return; - } - - $langfile = str_replace('.php', '', $langfile); - - if ($add_suffix === TRUE) - { - $langfile = preg_replace('/_lang$/', '', $langfile).'_lang'; - } - - $langfile .= '.php'; - - if (empty($idiom) OR ! preg_match('/^[a-z_-]+$/i', $idiom)) - { - $config =& get_config(); - $idiom = empty($config['language']) ? 'english' : $config['language']; - } - - if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) - { - return; - } - - // Load the base file, so any others found can override it - $basepath = BASEPATH.'language/'.$idiom.'/'.$langfile; - if (($found = file_exists($basepath)) === TRUE) - { - include($basepath); - } - - // Do we have an alternative path to look in? - if ($alt_path !== '') - { - $alt_path .= 'language/'.$idiom.'/'.$langfile; - if (file_exists($alt_path)) - { - include($alt_path); - $found = TRUE; - } - } - else - { - foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) - { - $package_path .= 'language/'.$idiom.'/'.$langfile; - if ($basepath !== $package_path && file_exists($package_path)) - { - include($package_path); - $found = TRUE; - break; - } - } - } - - if ($found !== TRUE) - { - show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); - } - - if ( ! isset($lang) OR ! is_array($lang)) - { - log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); - - if ($return === TRUE) - { - return array(); - } - return; - } - - if ($return === TRUE) - { - return $lang; - } - - $this->is_loaded[$langfile] = $idiom; - $this->language = array_merge($this->language, $lang); - - log_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Language line - * - * Fetches a single line of text from the language array - * - * @param string $line Language line key - * @param bool $log_errors Whether to log an error message if the line is not found - * @return string Translation - */ - public function line($line, $log_errors = TRUE) - { - $value = isset($this->language[$line]) ? $this->language[$line] : FALSE; - - // Because killer robots like unicorns! - if ($value === FALSE && $log_errors === TRUE) - { - log_message('error', 'Could not find the language line "'.$line.'"'); - } - - return $value; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Loader.php b/vendor_old/codeigniter/framework/system/core/Loader.php deleted file mode 100644 index 5ed6adb..0000000 --- a/vendor_old/codeigniter/framework/system/core/Loader.php +++ /dev/null @@ -1,1411 +0,0 @@ - TRUE); - - /** - * List of paths to load libraries from - * - * @var array - */ - protected $_ci_library_paths = array(APPPATH, BASEPATH); - - /** - * List of paths to load models from - * - * @var array - */ - protected $_ci_model_paths = array(APPPATH); - - /** - * List of paths to load helpers from - * - * @var array - */ - protected $_ci_helper_paths = array(APPPATH, BASEPATH); - - /** - * List of cached variables - * - * @var array - */ - protected $_ci_cached_vars = array(); - - /** - * List of loaded classes - * - * @var array - */ - protected $_ci_classes = array(); - - /** - * List of loaded models - * - * @var array - */ - protected $_ci_models = array(); - - /** - * List of loaded helpers - * - * @var array - */ - protected $_ci_helpers = array(); - - /** - * List of class name mappings - * - * @var array - */ - protected $_ci_varmap = array( - 'unit_test' => 'unit', - 'user_agent' => 'agent' - ); - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * Sets component load paths, gets the initial output buffering level. - * - * @return void - */ - public function __construct() - { - $this->_ci_ob_level = ob_get_level(); - $this->_ci_classes =& is_loaded(); - - log_message('info', 'Loader Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Initializer - * - * @todo Figure out a way to move this to the constructor - * without breaking *package_path*() methods. - * @uses CI_Loader::_ci_autoloader() - * @used-by CI_Controller::__construct() - * @return void - */ - public function initialize() - { - $this->_ci_autoloader(); - } - - // -------------------------------------------------------------------- - - /** - * Is Loaded - * - * A utility method to test if a class is in the self::$_ci_classes array. - * - * @used-by Mainly used by Form Helper function _get_validation_object(). - * - * @param string $class Class name to check for - * @return string|bool Class object name if loaded or FALSE - */ - public function is_loaded($class) - { - return array_search(ucfirst($class), $this->_ci_classes, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Library Loader - * - * Loads and instantiates libraries. - * Designed to be called from application controllers. - * - * @param string $library Library name - * @param array $params Optional parameters to pass to the library class constructor - * @param string $object_name An optional object name to assign to - * @return object - */ - public function library($library, $params = NULL, $object_name = NULL) - { - if (empty($library)) - { - return $this; - } - elseif (is_array($library)) - { - foreach ($library as $key => $value) - { - if (is_int($key)) - { - $this->library($value, $params); - } - else - { - $this->library($key, $params, $value); - } - } - - return $this; - } - - if ($params !== NULL && ! is_array($params)) - { - $params = NULL; - } - - $this->_ci_load_library($library, $params, $object_name); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Model Loader - * - * Loads and instantiates models. - * - * @param string $model Model name - * @param string $name An optional object name to assign to - * @param bool $db_conn An optional database connection configuration to initialize - * @return object - */ - public function model($model, $name = '', $db_conn = FALSE) - { - if (empty($model)) - { - return $this; - } - elseif (is_array($model)) - { - foreach ($model as $key => $value) - { - is_int($key) ? $this->model($value, '', $db_conn) : $this->model($key, $value, $db_conn); - } - - return $this; - } - - $path = ''; - - // Is the model in a sub-folder? If so, parse out the filename and path. - if (($last_slash = strrpos($model, '/')) !== FALSE) - { - // The path is in front of the last slash - $path = substr($model, 0, ++$last_slash); - - // And the model name behind it - $model = substr($model, $last_slash); - } - - if (empty($name)) - { - $name = $model; - } - - if (in_array($name, $this->_ci_models, TRUE)) - { - return $this; - } - - $CI =& get_instance(); - if (isset($CI->$name)) - { - throw new RuntimeException('The model name you are loading is the name of a resource that is already being used: '.$name); - } - - if ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE)) - { - if ($db_conn === TRUE) - { - $db_conn = ''; - } - - $this->database($db_conn, FALSE, TRUE); - } - - // Note: All of the code under this condition used to be just: - // - // load_class('Model', 'core'); - // - // However, load_class() instantiates classes - // to cache them for later use and that prevents - // MY_Model from being an abstract class and is - // sub-optimal otherwise anyway. - if ( ! class_exists('CI_Model', FALSE)) - { - $app_path = APPPATH.'core'.DIRECTORY_SEPARATOR; - if (file_exists($app_path.'Model.php')) - { - require_once($app_path.'Model.php'); - if ( ! class_exists('CI_Model', FALSE)) - { - throw new RuntimeException($app_path."Model.php exists, but doesn't declare class CI_Model"); - } - } - elseif ( ! class_exists('CI_Model', FALSE)) - { - require_once(BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php'); - } - - $class = config_item('subclass_prefix').'Model'; - if (file_exists($app_path.$class.'.php')) - { - require_once($app_path.$class.'.php'); - if ( ! class_exists($class, FALSE)) - { - throw new RuntimeException($app_path.$class.".php exists, but doesn't declare class ".$class); - } - } - } - - $model = ucfirst($model); - if ( ! class_exists($model, FALSE)) - { - foreach ($this->_ci_model_paths as $mod_path) - { - if ( ! file_exists($mod_path.'models/'.$path.$model.'.php')) - { - continue; - } - - require_once($mod_path.'models/'.$path.$model.'.php'); - if ( ! class_exists($model, FALSE)) - { - throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn't declare class ".$model); - } - - break; - } - - if ( ! class_exists($model, FALSE)) - { - throw new RuntimeException('Unable to locate the model you have specified: '.$model); - } - } - elseif ( ! is_subclass_of($model, 'CI_Model')) - { - throw new RuntimeException("Class ".$model." already exists and doesn't extend CI_Model"); - } - - $this->_ci_models[] = $name; - $CI->$name = new $model(); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Database Loader - * - * @param mixed $params Database configuration options - * @param bool $return Whether to return the database object - * @param bool $query_builder Whether to enable Query Builder - * (overrides the configuration setting) - * - * @return object|bool Database object if $return is set to TRUE, - * FALSE on failure, CI_Loader instance in any other case - */ - public function database($params = '', $return = FALSE, $query_builder = NULL) - { - // Grab the super object - $CI =& get_instance(); - - // Do we even need to load the database class? - if ($return === FALSE && $query_builder === NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id)) - { - return FALSE; - } - - require_once(BASEPATH.'database/DB.php'); - - if ($return === TRUE) - { - return DB($params, $query_builder); - } - - // Initialize the db variable. Needed to prevent - // reference errors with some configurations - $CI->db = ''; - - // Load the DB class - $CI->db =& DB($params, $query_builder); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Load the Database Utilities Class - * - * @param object $db Database object - * @param bool $return Whether to return the DB Utilities class object or not - * @return object - */ - public function dbutil($db = NULL, $return = FALSE) - { - $CI =& get_instance(); - - if ( ! is_object($db) OR ! ($db instanceof CI_DB)) - { - class_exists('CI_DB', FALSE) OR $this->database(); - $db =& $CI->db; - } - - require_once(BASEPATH.'database/DB_utility.php'); - require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_utility.php'); - $class = 'CI_DB_'.$db->dbdriver.'_utility'; - - if ($return === TRUE) - { - return new $class($db); - } - - $CI->dbutil = new $class($db); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Load the Database Forge Class - * - * @param object $db Database object - * @param bool $return Whether to return the DB Forge class object or not - * @return object - */ - public function dbforge($db = NULL, $return = FALSE) - { - $CI =& get_instance(); - if ( ! is_object($db) OR ! ($db instanceof CI_DB)) - { - class_exists('CI_DB', FALSE) OR $this->database(); - $db =& $CI->db; - } - - require_once(BASEPATH.'database/DB_forge.php'); - require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_forge.php'); - - if ( ! empty($db->subdriver)) - { - $driver_path = BASEPATH.'database/drivers/'.$db->dbdriver.'/subdrivers/'.$db->dbdriver.'_'.$db->subdriver.'_forge.php'; - if (file_exists($driver_path)) - { - require_once($driver_path); - $class = 'CI_DB_'.$db->dbdriver.'_'.$db->subdriver.'_forge'; - } - } - else - { - $class = 'CI_DB_'.$db->dbdriver.'_forge'; - } - - if ($return === TRUE) - { - return new $class($db); - } - - $CI->dbforge = new $class($db); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * View Loader - * - * Loads "view" files. - * - * @param string $view View name - * @param array $vars An associative array of data - * to be extracted for use in the view - * @param bool $return Whether to return the view output - * or leave it to the Output class - * @return object|string - */ - public function view($view, $vars = array(), $return = FALSE) - { - return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return)); - } - - // -------------------------------------------------------------------- - - /** - * Generic File Loader - * - * @param string $path File path - * @param bool $return Whether to return the file output - * @return object|string - */ - public function file($path, $return = FALSE) - { - return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return)); - } - - // -------------------------------------------------------------------- - - /** - * Set Variables - * - * Once variables are set they become available within - * the controller class and its "view" files. - * - * @param array|object|string $vars - * An associative array or object containing values - * to be set, or a value's name if string - * @param string $val Value to set, only used if $vars is a string - * @return object - */ - public function vars($vars, $val = '') - { - $vars = is_string($vars) - ? array($vars => $val) - : $this->_ci_prepare_view_vars($vars); - - foreach ($vars as $key => $val) - { - $this->_ci_cached_vars[$key] = $val; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Clear Cached Variables - * - * Clears the cached variables. - * - * @return CI_Loader - */ - public function clear_vars() - { - $this->_ci_cached_vars = array(); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get Variable - * - * Check if a variable is set and retrieve it. - * - * @param string $key Variable name - * @return mixed The variable or NULL if not found - */ - public function get_var($key) - { - return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL; - } - - // -------------------------------------------------------------------- - - /** - * Get Variables - * - * Retrieves all loaded variables. - * - * @return array - */ - public function get_vars() - { - return $this->_ci_cached_vars; - } - - // -------------------------------------------------------------------- - - /** - * Helper Loader - * - * @param string|string[] $helpers Helper name(s) - * @return object - */ - public function helper($helpers = array()) - { - is_array($helpers) OR $helpers = array($helpers); - foreach ($helpers as &$helper) - { - $filename = basename($helper); - $filepath = ($filename === $helper) ? '' : substr($helper, 0, strlen($helper) - strlen($filename)); - $filename = strtolower(preg_replace('#(_helper)?(\.php)?$#i', '', $filename)).'_helper'; - $helper = $filepath.$filename; - - if (isset($this->_ci_helpers[$helper])) - { - continue; - } - - // Is this a helper extension request? - $ext_helper = config_item('subclass_prefix').$filename; - $ext_loaded = FALSE; - foreach ($this->_ci_helper_paths as $path) - { - if (file_exists($path.'helpers/'.$ext_helper.'.php')) - { - include_once($path.'helpers/'.$ext_helper.'.php'); - $ext_loaded = TRUE; - } - } - - // If we have loaded extensions - check if the base one is here - if ($ext_loaded === TRUE) - { - $base_helper = BASEPATH.'helpers/'.$helper.'.php'; - if ( ! file_exists($base_helper)) - { - show_error('Unable to load the requested file: helpers/'.$helper.'.php'); - } - - include_once($base_helper); - $this->_ci_helpers[$helper] = TRUE; - log_message('info', 'Helper loaded: '.$helper); - continue; - } - - // No extensions found ... try loading regular helpers and/or overrides - foreach ($this->_ci_helper_paths as $path) - { - if (file_exists($path.'helpers/'.$helper.'.php')) - { - include_once($path.'helpers/'.$helper.'.php'); - - $this->_ci_helpers[$helper] = TRUE; - log_message('info', 'Helper loaded: '.$helper); - break; - } - } - - // unable to load the helper - if ( ! isset($this->_ci_helpers[$helper])) - { - show_error('Unable to load the requested file: helpers/'.$helper.'.php'); - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Load Helpers - * - * An alias for the helper() method in case the developer has - * written the plural form of it. - * - * @uses CI_Loader::helper() - * @param string|string[] $helpers Helper name(s) - * @return object - */ - public function helpers($helpers = array()) - { - return $this->helper($helpers); - } - - // -------------------------------------------------------------------- - - /** - * Language Loader - * - * Loads language files. - * - * @param string|string[] $files List of language file names to load - * @param string Language name - * @return object - */ - public function language($files, $lang = '') - { - get_instance()->lang->load($files, $lang); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Config Loader - * - * Loads a config file (an alias for CI_Config::load()). - * - * @uses CI_Config::load() - * @param string $file Configuration file name - * @param bool $use_sections Whether configuration values should be loaded into their own section - * @param bool $fail_gracefully Whether to just return FALSE or display an error message - * @return bool TRUE if the file was loaded correctly or FALSE on failure - */ - public function config($file, $use_sections = FALSE, $fail_gracefully = FALSE) - { - return get_instance()->config->load($file, $use_sections, $fail_gracefully); - } - - // -------------------------------------------------------------------- - - /** - * Driver Loader - * - * Loads a driver library. - * - * @param string|string[] $library Driver name(s) - * @param array $params Optional parameters to pass to the driver - * @param string $object_name An optional object name to assign to - * - * @return object|bool Object or FALSE on failure if $library is a string - * and $object_name is set. CI_Loader instance otherwise. - */ - public function driver($library, $params = NULL, $object_name = NULL) - { - if (is_array($library)) - { - foreach ($library as $key => $value) - { - if (is_int($key)) - { - $this->driver($value, $params); - } - else - { - $this->driver($key, $params, $value); - } - } - - return $this; - } - elseif (empty($library)) - { - return FALSE; - } - - if ( ! class_exists('CI_Driver_Library', FALSE)) - { - // We aren't instantiating an object here, just making the base class available - require BASEPATH.'libraries/Driver.php'; - } - - // We can save the loader some time since Drivers will *always* be in a subfolder, - // and typically identically named to the library - if ( ! strpos($library, '/')) - { - $library = ucfirst($library).'/'.$library; - } - - return $this->library($library, $params, $object_name); - } - - // -------------------------------------------------------------------- - - /** - * Add Package Path - * - * Prepends a parent path to the library, model, helper and config - * path arrays. - * - * @see CI_Loader::$_ci_library_paths - * @see CI_Loader::$_ci_model_paths - * @see CI_Loader::$_ci_helper_paths - * @see CI_Config::$_config_paths - * - * @param string $path Path to add - * @param bool $view_cascade (default: TRUE) - * @return object - */ - public function add_package_path($path, $view_cascade = TRUE) - { - $path = rtrim($path, '/').'/'; - - array_unshift($this->_ci_library_paths, $path); - array_unshift($this->_ci_model_paths, $path); - array_unshift($this->_ci_helper_paths, $path); - - $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths; - - // Add config file path - $config =& $this->_ci_get_component('config'); - $config->_config_paths[] = $path; - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get Package Paths - * - * Return a list of all package paths. - * - * @param bool $include_base Whether to include BASEPATH (default: FALSE) - * @return array - */ - public function get_package_paths($include_base = FALSE) - { - return ($include_base === TRUE) ? $this->_ci_library_paths : $this->_ci_model_paths; - } - - // -------------------------------------------------------------------- - - /** - * Remove Package Path - * - * Remove a path from the library, model, helper and/or config - * path arrays if it exists. If no path is provided, the most recently - * added path will be removed removed. - * - * @param string $path Path to remove - * @return object - */ - public function remove_package_path($path = '') - { - $config =& $this->_ci_get_component('config'); - - if ($path === '') - { - array_shift($this->_ci_library_paths); - array_shift($this->_ci_model_paths); - array_shift($this->_ci_helper_paths); - array_shift($this->_ci_view_paths); - array_pop($config->_config_paths); - } - else - { - $path = rtrim($path, '/').'/'; - foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var) - { - if (($key = array_search($path, $this->{$var})) !== FALSE) - { - unset($this->{$var}[$key]); - } - } - - if (isset($this->_ci_view_paths[$path.'views/'])) - { - unset($this->_ci_view_paths[$path.'views/']); - } - - if (($key = array_search($path, $config->_config_paths)) !== FALSE) - { - unset($config->_config_paths[$key]); - } - } - - // make sure the application default paths are still in the array - $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH))); - $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH))); - $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH))); - $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE)); - $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH))); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Data Loader - * - * Used to load views and files. - * - * Variables are prefixed with _ci_ to avoid symbol collision with - * variables made available to view files. - * - * @used-by CI_Loader::view() - * @used-by CI_Loader::file() - * @param array $_ci_data Data to load - * @return object - */ - protected function _ci_load($_ci_data) - { - // Set the default data variables - foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val) - { - $$_ci_val = isset($_ci_data[$_ci_val]) ? $_ci_data[$_ci_val] : FALSE; - } - - $file_exists = FALSE; - - // Set the path to the requested file - if (is_string($_ci_path) && $_ci_path !== '') - { - $_ci_x = explode('/', $_ci_path); - $_ci_file = end($_ci_x); - } - else - { - $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION); - $_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view; - - foreach ($this->_ci_view_paths as $_ci_view_file => $cascade) - { - if (file_exists($_ci_view_file.$_ci_file)) - { - $_ci_path = $_ci_view_file.$_ci_file; - $file_exists = TRUE; - break; - } - - if ( ! $cascade) - { - break; - } - } - } - - if ( ! $file_exists && ! file_exists($_ci_path)) - { - show_error('Unable to load the requested file: '.$_ci_file); - } - - // This allows anything loaded using $this->load (views, files, etc.) - // to become accessible from within the Controller and Model functions. - $_ci_CI =& get_instance(); - foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var) - { - if ( ! isset($this->$_ci_key)) - { - $this->$_ci_key =& $_ci_CI->$_ci_key; - } - } - - /* - * Extract and cache variables - * - * You can either set variables using the dedicated $this->load->vars() - * function or via the second parameter of this function. We'll merge - * the two types and cache them so that views that are embedded within - * other views can have access to these variables. - */ - empty($_ci_vars) OR $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars); - extract($this->_ci_cached_vars); - - /* - * Buffer the output - * - * We buffer the output for two reasons: - * 1. Speed. You get a significant speed boost. - * 2. So that the final rendered template can be post-processed by - * the output class. Why do we need post processing? For one thing, - * in order to show the elapsed page load time. Unless we can - * intercept the content right before it's sent to the browser and - * then stop the timer it won't be accurate. - */ - ob_start(); - - // If the PHP installation does not support short tags we'll - // do a little string replacement, changing the short tags - // to standard PHP echo statements. - if ( ! is_php('5.4') && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE) - { - echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace(' $this->_ci_ob_level + 1) - { - ob_end_flush(); - } - else - { - $_ci_CI->output->append_output(ob_get_contents()); - @ob_end_clean(); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Library Loader - * - * @used-by CI_Loader::library() - * @uses CI_Loader::_ci_init_library() - * - * @param string $class Class name to load - * @param mixed $params Optional parameters to pass to the class constructor - * @param string $object_name Optional object name to assign to - * @return void - */ - protected function _ci_load_library($class, $params = NULL, $object_name = NULL) - { - // Get the class name, and while we're at it trim any slashes. - // The directory path can be included as part of the class name, - // but we don't want a leading slash - $class = str_replace('.php', '', trim($class, '/')); - - // Was the path included with the class name? - // We look for a slash to determine this - if (($last_slash = strrpos($class, '/')) !== FALSE) - { - // Extract the path - $subdir = substr($class, 0, ++$last_slash); - - // Get the filename from the path - $class = substr($class, $last_slash); - } - else - { - $subdir = ''; - } - - $class = ucfirst($class); - - // Is this a stock library? There are a few special conditions if so ... - if (file_exists(BASEPATH.'libraries/'.$subdir.$class.'.php')) - { - return $this->_ci_load_stock_library($class, $subdir, $params, $object_name); - } - - // Let's search for the requested library file and load it. - foreach ($this->_ci_library_paths as $path) - { - // BASEPATH has already been checked for - if ($path === BASEPATH) - { - continue; - } - - $filepath = $path.'libraries/'.$subdir.$class.'.php'; - - // Safety: Was the class already loaded by a previous call? - if (class_exists($class, FALSE)) - { - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ($object_name !== NULL) - { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_library($class, '', $params, $object_name); - } - } - - log_message('debug', $class.' class already loaded. Second attempt ignored.'); - return; - } - // Does the file exist? No? Bummer... - elseif ( ! file_exists($filepath)) - { - continue; - } - - include_once($filepath); - return $this->_ci_init_library($class, '', $params, $object_name); - } - - // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? - if ($subdir === '') - { - return $this->_ci_load_library($class.'/'.$class, $params, $object_name); - } - - // If we got this far we were unable to find the requested class. - log_message('error', 'Unable to load the requested class: '.$class); - show_error('Unable to load the requested class: '.$class); - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Stock Library Loader - * - * @used-by CI_Loader::_ci_load_library() - * @uses CI_Loader::_ci_init_library() - * - * @param string $library_name Library name to load - * @param string $file_path Path to the library filename, relative to libraries/ - * @param mixed $params Optional parameters to pass to the class constructor - * @param string $object_name Optional object name to assign to - * @return void - */ - protected function _ci_load_stock_library($library_name, $file_path, $params, $object_name) - { - $prefix = 'CI_'; - - if (class_exists($prefix.$library_name, FALSE)) - { - if (class_exists(config_item('subclass_prefix').$library_name, FALSE)) - { - $prefix = config_item('subclass_prefix'); - } - - // Before we deem this to be a duplicate request, let's see - // if a custom object name is being supplied. If so, we'll - // return a new instance of the object - if ($object_name !== NULL) - { - $CI =& get_instance(); - if ( ! isset($CI->$object_name)) - { - return $this->_ci_init_library($library_name, $prefix, $params, $object_name); - } - } - - log_message('debug', $library_name.' class already loaded. Second attempt ignored.'); - return; - } - - $paths = $this->_ci_library_paths; - array_pop($paths); // BASEPATH - array_pop($paths); // APPPATH (needs to be the first path checked) - array_unshift($paths, APPPATH); - - foreach ($paths as $path) - { - if (file_exists($path = $path.'libraries/'.$file_path.$library_name.'.php')) - { - // Override - include_once($path); - if (class_exists($prefix.$library_name, FALSE)) - { - return $this->_ci_init_library($library_name, $prefix, $params, $object_name); - } - else - { - log_message('debug', $path.' exists, but does not declare '.$prefix.$library_name); - } - } - } - - include_once(BASEPATH.'libraries/'.$file_path.$library_name.'.php'); - - // Check for extensions - $subclass = config_item('subclass_prefix').$library_name; - foreach ($paths as $path) - { - if (file_exists($path = $path.'libraries/'.$file_path.$subclass.'.php')) - { - include_once($path); - if (class_exists($subclass, FALSE)) - { - $prefix = config_item('subclass_prefix'); - break; - } - else - { - log_message('debug', $path.' exists, but does not declare '.$subclass); - } - } - } - - return $this->_ci_init_library($library_name, $prefix, $params, $object_name); - } - - // -------------------------------------------------------------------- - - /** - * Internal CI Library Instantiator - * - * @used-by CI_Loader::_ci_load_stock_library() - * @used-by CI_Loader::_ci_load_library() - * - * @param string $class Class name - * @param string $prefix Class name prefix - * @param array|null|bool $config Optional configuration to pass to the class constructor: - * FALSE to skip; - * NULL to search in config paths; - * array containing configuration data - * @param string $object_name Optional object name to assign to - * @return void - */ - protected function _ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL) - { - // Is there an associated config file for this class? Note: these should always be lowercase - if ($config === NULL) - { - // Fetch the config paths containing any package paths - $config_component = $this->_ci_get_component('config'); - - if (is_array($config_component->_config_paths)) - { - $found = FALSE; - foreach ($config_component->_config_paths as $path) - { - // We test for both uppercase and lowercase, for servers that - // are case-sensitive with regard to file names. Load global first, - // override with environment next - if (file_exists($path.'config/'.strtolower($class).'.php')) - { - include($path.'config/'.strtolower($class).'.php'); - $found = TRUE; - } - elseif (file_exists($path.'config/'.ucfirst(strtolower($class)).'.php')) - { - include($path.'config/'.ucfirst(strtolower($class)).'.php'); - $found = TRUE; - } - - if (file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php')) - { - include($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'); - $found = TRUE; - } - elseif (file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php')) - { - include($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'); - $found = TRUE; - } - - // Break on the first found configuration, thus package - // files are not overridden by default paths - if ($found === TRUE) - { - break; - } - } - } - } - - $class_name = $prefix.$class; - - // Is the class name valid? - if ( ! class_exists($class_name, FALSE)) - { - log_message('error', 'Non-existent class: '.$class_name); - show_error('Non-existent class: '.$class_name); - } - - // Set the variable name we will assign the class to - // Was a custom class name supplied? If so we'll use it - if (empty($object_name)) - { - $object_name = strtolower($class); - if (isset($this->_ci_varmap[$object_name])) - { - $object_name = $this->_ci_varmap[$object_name]; - } - } - - // Don't overwrite existing properties - $CI =& get_instance(); - if (isset($CI->$object_name)) - { - if ($CI->$object_name instanceof $class_name) - { - log_message('debug', $class_name." has already been instantiated as '".$object_name."'. Second attempt aborted."); - return; - } - - show_error("Resource '".$object_name."' already exists and is not a ".$class_name." instance."); - } - - // Save the class name and object name - $this->_ci_classes[$object_name] = $class; - - // Instantiate the class - $CI->$object_name = isset($config) - ? new $class_name($config) - : new $class_name(); - } - - // -------------------------------------------------------------------- - - /** - * CI Autoloader - * - * Loads component listed in the config/autoload.php file. - * - * @used-by CI_Loader::initialize() - * @return void - */ - protected function _ci_autoloader() - { - if (file_exists(APPPATH.'config/autoload.php')) - { - include(APPPATH.'config/autoload.php'); - } - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'); - } - - if ( ! isset($autoload)) - { - return; - } - - // Autoload packages - if (isset($autoload['packages'])) - { - foreach ($autoload['packages'] as $package_path) - { - $this->add_package_path($package_path); - } - } - - // Load any custom config file - if (count($autoload['config']) > 0) - { - foreach ($autoload['config'] as $val) - { - $this->config($val); - } - } - - // Autoload helpers and languages - foreach (array('helper', 'language') as $type) - { - if (isset($autoload[$type]) && count($autoload[$type]) > 0) - { - $this->$type($autoload[$type]); - } - } - - // Autoload drivers - if (isset($autoload['drivers'])) - { - $this->driver($autoload['drivers']); - } - - // Load libraries - if (isset($autoload['libraries']) && count($autoload['libraries']) > 0) - { - // Load the database driver. - if (in_array('database', $autoload['libraries'])) - { - $this->database(); - $autoload['libraries'] = array_diff($autoload['libraries'], array('database')); - } - - // Load all other libraries - $this->library($autoload['libraries']); - } - - // Autoload models - if (isset($autoload['model'])) - { - $this->model($autoload['model']); - } - } - - // -------------------------------------------------------------------- - - /** - * Prepare variables for _ci_vars, to be later extract()-ed inside views - * - * Converts objects to associative arrays and filters-out internal - * variable names (i.e. keys prefixed with '_ci_'). - * - * @param mixed $vars - * @return array - */ - protected function _ci_prepare_view_vars($vars) - { - if ( ! is_array($vars)) - { - $vars = is_object($vars) - ? get_object_vars($vars) - : array(); - } - - foreach (array_keys($vars) as $key) - { - if (strncmp($key, '_ci_', 4) === 0) - { - unset($vars[$key]); - } - } - - return $vars; - } - - // -------------------------------------------------------------------- - - /** - * CI Component getter - * - * Get a reference to a specific library or model. - * - * @param string $component Component name - * @return bool - */ - protected function &_ci_get_component($component) - { - $CI =& get_instance(); - return $CI->$component; - } -} diff --git a/vendor_old/codeigniter/framework/system/core/Log.php b/vendor_old/codeigniter/framework/system/core/Log.php deleted file mode 100644 index d443aed..0000000 --- a/vendor_old/codeigniter/framework/system/core/Log.php +++ /dev/null @@ -1,296 +0,0 @@ - 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); - - /** - * mbstring.func_overload flag - * - * @var bool - */ - protected static $func_overload; - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * @return void - */ - public function __construct() - { - $config =& get_config(); - - isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); - - $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; - $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '') - ? ltrim($config['log_file_extension'], '.') : 'php'; - - file_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE); - - if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path)) - { - $this->_enabled = FALSE; - } - - if (is_numeric($config['log_threshold'])) - { - $this->_threshold = (int) $config['log_threshold']; - } - elseif (is_array($config['log_threshold'])) - { - $this->_threshold = 0; - $this->_threshold_array = array_flip($config['log_threshold']); - } - - if ( ! empty($config['log_date_format'])) - { - $this->_date_fmt = $config['log_date_format']; - } - - if ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions'])) - { - $this->_file_permissions = $config['log_file_permissions']; - } - } - - // -------------------------------------------------------------------- - - /** - * Write Log File - * - * Generally this function will be called using the global log_message() function - * - * @param string $level The error level: 'error', 'debug' or 'info' - * @param string $msg The error message - * @return bool - */ - public function write_log($level, $msg) - { - if ($this->_enabled === FALSE) - { - return FALSE; - } - - $level = strtoupper($level); - - if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold)) - && ! isset($this->_threshold_array[$this->_levels[$level]])) - { - return FALSE; - } - - $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext; - $message = ''; - - if ( ! file_exists($filepath)) - { - $newfile = TRUE; - // Only add protection to php files - if ($this->_file_ext === 'php') - { - $message .= "\n\n"; - } - } - - if ( ! $fp = @fopen($filepath, 'ab')) - { - return FALSE; - } - - flock($fp, LOCK_EX); - - // Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format - if (strpos($this->_date_fmt, 'u') !== FALSE) - { - $microtime_full = microtime(TRUE); - $microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000); - $date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full)); - $date = $date->format($this->_date_fmt); - } - else - { - $date = date($this->_date_fmt); - } - - $message .= $this->_format_line($level, $date, $msg); - - for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result) - { - if (($result = fwrite($fp, self::substr($message, $written))) === FALSE) - { - break; - } - } - - flock($fp, LOCK_UN); - fclose($fp); - - if (isset($newfile) && $newfile === TRUE) - { - chmod($filepath, $this->_file_permissions); - } - - return is_int($result); - } - - // -------------------------------------------------------------------- - - /** - * Format the log line. - * - * This is for extensibility of log formatting - * If you want to change the log format, extend the CI_Log class and override this method - * - * @param string $level The error level - * @param string $date Formatted date string - * @param string $message The log message - * @return string Formatted log line with a new line character '\n' at the end - */ - protected function _format_line($level, $date, $message) - { - return $level.' - '.$date.' --> '.$message."\n"; - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe strlen() - * - * @param string $str - * @return int - */ - protected static function strlen($str) - { - return (self::$func_overload) - ? mb_strlen($str, '8bit') - : strlen($str); - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe substr() - * - * @param string $str - * @param int $start - * @param int $length - * @return string - */ - protected static function substr($str, $start, $length = NULL) - { - if (self::$func_overload) - { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); - return mb_substr($str, $start, $length, '8bit'); - } - - return isset($length) - ? substr($str, $start, $length) - : substr($str, $start); - } -} diff --git a/vendor_old/codeigniter/framework/system/core/Model.php b/vendor_old/codeigniter/framework/system/core/Model.php deleted file mode 100644 index c809e7b..0000000 --- a/vendor_old/codeigniter/framework/system/core/Model.php +++ /dev/null @@ -1,80 +0,0 @@ -$key; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Output.php b/vendor_old/codeigniter/framework/system/core/Output.php deleted file mode 100644 index 6ddded2..0000000 --- a/vendor_old/codeigniter/framework/system/core/Output.php +++ /dev/null @@ -1,849 +0,0 @@ -_zlib_oc = (bool) ini_get('zlib.output_compression'); - $this->_compress_output = ( - $this->_zlib_oc === FALSE - && config_item('compress_output') === TRUE - && extension_loaded('zlib') - ); - - isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); - - // Get mime types for later - $this->mimes =& get_mimes(); - - log_message('info', 'Output Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Get Output - * - * Returns the current output string. - * - * @return string - */ - public function get_output() - { - return $this->final_output; - } - - // -------------------------------------------------------------------- - - /** - * Set Output - * - * Sets the output string. - * - * @param string $output Output data - * @return CI_Output - */ - public function set_output($output) - { - $this->final_output = $output; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Append Output - * - * Appends data onto the output string. - * - * @param string $output Data to append - * @return CI_Output - */ - public function append_output($output) - { - $this->final_output .= $output; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Header - * - * Lets you set a server header which will be sent with the final output. - * - * Note: If a file is cached, headers will not be sent. - * @todo We need to figure out how to permit headers to be cached. - * - * @param string $header Header - * @param bool $replace Whether to replace the old header value, if already set - * @return CI_Output - */ - public function set_header($header, $replace = TRUE) - { - // If zlib.output_compression is enabled it will compress the output, - // but it will not modify the content-length header to compensate for - // the reduction, causing the browser to hang waiting for more data. - // We'll just skip content-length in those cases. - if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0) - { - return $this; - } - - $this->headers[] = array($header, $replace); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Content-Type Header - * - * @param string $mime_type Extension of the file we're outputting - * @param string $charset Character set (default: NULL) - * @return CI_Output - */ - public function set_content_type($mime_type, $charset = NULL) - { - if (strpos($mime_type, '/') === FALSE) - { - $extension = ltrim($mime_type, '.'); - - // Is this extension supported? - if (isset($this->mimes[$extension])) - { - $mime_type =& $this->mimes[$extension]; - - if (is_array($mime_type)) - { - $mime_type = current($mime_type); - } - } - } - - $this->mime_type = $mime_type; - - if (empty($charset)) - { - $charset = config_item('charset'); - } - - $header = 'Content-Type: '.$mime_type - .(empty($charset) ? '' : '; charset='.$charset); - - $this->headers[] = array($header, TRUE); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get Current Content-Type Header - * - * @return string 'text/html', if not already set - */ - public function get_content_type() - { - for ($i = 0, $c = count($this->headers); $i < $c; $i++) - { - if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1) - { - return $content_type; - } - } - - return 'text/html'; - } - - // -------------------------------------------------------------------- - - /** - * Get Header - * - * @param string $header - * @return string - */ - public function get_header($header) - { - // Combine headers already sent with our batched headers - $headers = array_merge( - // We only need [x][0] from our multi-dimensional array - array_map('array_shift', $this->headers), - headers_list() - ); - - if (empty($headers) OR empty($header)) - { - return NULL; - } - - // Count backwards, in order to get the last matching header - for ($c = count($headers) - 1; $c > -1; $c--) - { - if (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0) - { - return trim(self::substr($headers[$c], $l+1)); - } - } - - return NULL; - } - - // -------------------------------------------------------------------- - - /** - * Set HTTP Status Header - * - * As of version 1.7.2, this is an alias for common function - * set_status_header(). - * - * @param int $code Status code (default: 200) - * @param string $text Optional message - * @return CI_Output - */ - public function set_status_header($code = 200, $text = '') - { - set_status_header($code, $text); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Enable/disable Profiler - * - * @param bool $val TRUE to enable or FALSE to disable - * @return CI_Output - */ - public function enable_profiler($val = TRUE) - { - $this->enable_profiler = is_bool($val) ? $val : TRUE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Profiler Sections - * - * Allows override of default/config settings for - * Profiler section display. - * - * @param array $sections Profiler sections - * @return CI_Output - */ - public function set_profiler_sections($sections) - { - if (isset($sections['query_toggle_count'])) - { - $this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count']; - unset($sections['query_toggle_count']); - } - - foreach ($sections as $section => $enable) - { - $this->_profiler_sections[$section] = ($enable !== FALSE); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Set Cache - * - * @param int $time Cache expiration time in minutes - * @return CI_Output - */ - public function cache($time) - { - $this->cache_expiration = is_numeric($time) ? $time : 0; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Display Output - * - * Processes and sends finalized output data to the browser along - * with any server headers and profile data. It also stops benchmark - * timers so the page rendering speed and memory usage can be shown. - * - * Note: All "view" data is automatically put into $this->final_output - * by controller class. - * - * @uses CI_Output::$final_output - * @param string $output Output data override - * @return void - */ - public function _display($output = '') - { - // Note: We use load_class() because we can't use $CI =& get_instance() - // since this function is sometimes called by the caching mechanism, - // which happens before the CI super object is available. - $BM =& load_class('Benchmark', 'core'); - $CFG =& load_class('Config', 'core'); - - // Grab the super object if we can. - if (class_exists('CI_Controller', FALSE)) - { - $CI =& get_instance(); - } - - // -------------------------------------------------------------------- - - // Set the output data - if ($output === '') - { - $output =& $this->final_output; - } - - // -------------------------------------------------------------------- - - // Do we need to write a cache file? Only if the controller does not have its - // own _output() method and we are not dealing with a cache file, which we - // can determine by the existence of the $CI object above - if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) - { - $this->_write_cache($output); - } - - // -------------------------------------------------------------------- - - // Parse out the elapsed time and memory usage, - // then swap the pseudo-variables with the data - - $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); - - if ($this->parse_exec_vars === TRUE) - { - $memory = round(memory_get_usage() / 1024 / 1024, 2).'MB'; - $output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output); - } - - // -------------------------------------------------------------------- - - // Is compression requested? - if (isset($CI) // This means that we're not serving a cache file, if we were, it would already be compressed - && $this->_compress_output === TRUE - && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) - { - ob_start('ob_gzhandler'); - } - - // -------------------------------------------------------------------- - - // Are there any server headers to send? - if (count($this->headers) > 0) - { - foreach ($this->headers as $header) - { - @header($header[0], $header[1]); - } - } - - // -------------------------------------------------------------------- - - // Does the $CI object exist? - // If not we know we are dealing with a cache file so we'll - // simply echo out the data and exit. - if ( ! isset($CI)) - { - if ($this->_compress_output === TRUE) - { - if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) - { - header('Content-Encoding: gzip'); - header('Content-Length: '.self::strlen($output)); - } - else - { - // User agent doesn't support gzip compression, - // so we'll have to decompress our cache - $output = gzinflate(self::substr($output, 10, -8)); - } - } - - echo $output; - log_message('info', 'Final output sent to browser'); - log_message('debug', 'Total execution time: '.$elapsed); - return; - } - - // -------------------------------------------------------------------- - - // Do we need to generate profile data? - // If so, load the Profile class and run it. - if ($this->enable_profiler === TRUE) - { - $CI->load->library('profiler'); - if ( ! empty($this->_profiler_sections)) - { - $CI->profiler->set_sections($this->_profiler_sections); - } - - // If the output data contains closing and tags - // we will remove them and add them back after we insert the profile data - $output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run(); - if ($count > 0) - { - $output .= ''; - } - } - - // Does the controller contain a function named _output()? - // If so send the output there. Otherwise, echo it. - if (method_exists($CI, '_output')) - { - $CI->_output($output); - } - else - { - echo $output; // Send it to the browser! - } - - log_message('info', 'Final output sent to browser'); - log_message('debug', 'Total execution time: '.$elapsed); - } - - // -------------------------------------------------------------------- - - /** - * Write Cache - * - * @param string $output Output data to cache - * @return void - */ - public function _write_cache($output) - { - $CI =& get_instance(); - $path = $CI->config->item('cache_path'); - $cache_path = ($path === '') ? APPPATH.'cache/' : $path; - - if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) - { - log_message('error', 'Unable to write cache file: '.$cache_path); - return; - } - - $uri = $CI->config->item('base_url') - .$CI->config->item('index_page') - .$CI->uri->uri_string(); - - if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) - { - if (is_array($cache_query_string)) - { - $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); - } - else - { - $uri .= '?'.$_SERVER['QUERY_STRING']; - } - } - - $cache_path .= md5($uri); - - if ( ! $fp = @fopen($cache_path, 'w+b')) - { - log_message('error', 'Unable to write cache file: '.$cache_path); - return; - } - - if (flock($fp, LOCK_EX)) - { - // If output compression is enabled, compress the cache - // itself, so that we don't have to do that each time - // we're serving it - if ($this->_compress_output === TRUE) - { - $output = gzencode($output); - - if ($this->get_header('content-type') === NULL) - { - $this->set_content_type($this->mime_type); - } - } - - $expire = time() + ($this->cache_expiration * 60); - - // Put together our serialized info. - $cache_info = serialize(array( - 'expire' => $expire, - 'headers' => $this->headers - )); - - $output = $cache_info.'ENDCI--->'.$output; - - for ($written = 0, $length = self::strlen($output); $written < $length; $written += $result) - { - if (($result = fwrite($fp, self::substr($output, $written))) === FALSE) - { - break; - } - } - - flock($fp, LOCK_UN); - } - else - { - log_message('error', 'Unable to secure a file lock for file at: '.$cache_path); - return; - } - - fclose($fp); - - if (is_int($result)) - { - chmod($cache_path, 0640); - log_message('debug', 'Cache file written: '.$cache_path); - - // Send HTTP cache-control headers to browser to match file cache settings. - $this->set_cache_header($_SERVER['REQUEST_TIME'], $expire); - } - else - { - @unlink($cache_path); - log_message('error', 'Unable to write the complete cache content at: '.$cache_path); - } - } - - // -------------------------------------------------------------------- - - /** - * Update/serve cached output - * - * @uses CI_Config - * @uses CI_URI - * - * @param object &$CFG CI_Config class instance - * @param object &$URI CI_URI class instance - * @return bool TRUE on success or FALSE on failure - */ - public function _display_cache(&$CFG, &$URI) - { - $cache_path = ($CFG->item('cache_path') === '') ? APPPATH.'cache/' : $CFG->item('cache_path'); - - // Build the file path. The file name is an MD5 hash of the full URI - $uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string; - - if (($cache_query_string = $CFG->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) - { - if (is_array($cache_query_string)) - { - $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); - } - else - { - $uri .= '?'.$_SERVER['QUERY_STRING']; - } - } - - $filepath = $cache_path.md5($uri); - - if ( ! file_exists($filepath) OR ! $fp = @fopen($filepath, 'rb')) - { - return FALSE; - } - - flock($fp, LOCK_SH); - - $cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : ''; - - flock($fp, LOCK_UN); - fclose($fp); - - // Look for embedded serialized file info. - if ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match)) - { - return FALSE; - } - - $cache_info = unserialize($match[1]); - $expire = $cache_info['expire']; - - $last_modified = filemtime($filepath); - - // Has the file expired? - if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path)) - { - // If so we'll delete it. - @unlink($filepath); - log_message('debug', 'Cache file has expired. File deleted.'); - return FALSE; - } - else - { - // Or else send the HTTP cache control headers. - $this->set_cache_header($last_modified, $expire); - } - - // Add headers from cache file. - foreach ($cache_info['headers'] as $header) - { - $this->set_header($header[0], $header[1]); - } - - // Display the cache - $this->_display(self::substr($cache, self::strlen($match[0]))); - log_message('debug', 'Cache file is current. Sending it to browser.'); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Delete cache - * - * @param string $uri URI string - * @return bool - */ - public function delete_cache($uri = '') - { - $CI =& get_instance(); - $cache_path = $CI->config->item('cache_path'); - if ($cache_path === '') - { - $cache_path = APPPATH.'cache/'; - } - - if ( ! is_dir($cache_path)) - { - log_message('error', 'Unable to find cache path: '.$cache_path); - return FALSE; - } - - if (empty($uri)) - { - $uri = $CI->uri->uri_string(); - - if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) - { - if (is_array($cache_query_string)) - { - $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); - } - else - { - $uri .= '?'.$_SERVER['QUERY_STRING']; - } - } - } - - $cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').ltrim($uri, '/')); - - if ( ! @unlink($cache_path)) - { - log_message('error', 'Unable to delete cache file for '.$uri); - return FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Header - * - * Set the HTTP headers to match the server-side file cache settings - * in order to reduce bandwidth. - * - * @param int $last_modified Timestamp of when the page was last modified - * @param int $expiration Timestamp of when should the requested page expire from cache - * @return void - */ - public function set_cache_header($last_modified, $expiration) - { - $max_age = $expiration - $_SERVER['REQUEST_TIME']; - - if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) - { - $this->set_status_header(304); - exit; - } - else - { - header('Pragma: public'); - header('Cache-Control: max-age='.$max_age.', public'); - header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT'); - header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT'); - } - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe strlen() - * - * @param string $str - * @return int - */ - protected static function strlen($str) - { - return (self::$func_overload) - ? mb_strlen($str, '8bit') - : strlen($str); - } - - // -------------------------------------------------------------------- - - /** - * Byte-safe substr() - * - * @param string $str - * @param int $start - * @param int $length - * @return string - */ - protected static function substr($str, $start, $length = NULL) - { - if (self::$func_overload) - { - // mb_substr($str, $start, null, '8bit') returns an empty - // string on PHP 5.3 - isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); - return mb_substr($str, $start, $length, '8bit'); - } - - return isset($length) - ? substr($str, $start, $length) - : substr($str, $start); - } -} diff --git a/vendor_old/codeigniter/framework/system/core/Router.php b/vendor_old/codeigniter/framework/system/core/Router.php deleted file mode 100644 index 1abe4c4..0000000 --- a/vendor_old/codeigniter/framework/system/core/Router.php +++ /dev/null @@ -1,515 +0,0 @@ -config =& load_class('Config', 'core'); - $this->uri =& load_class('URI', 'core'); - - $this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE); - - // If a directory override is configured, it has to be set before any dynamic routing logic - is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']); - $this->_set_routing(); - - // Set any routing overrides that may exist in the main index file - if (is_array($routing)) - { - empty($routing['controller']) OR $this->set_class($routing['controller']); - empty($routing['function']) OR $this->set_method($routing['function']); - } - - log_message('info', 'Router Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Set route mapping - * - * Determines what should be served based on the URI request, - * as well as any "routes" that have been set in the routing config file. - * - * @return void - */ - protected function _set_routing() - { - // Load the routes.php file. It would be great if we could - // skip this for enable_query_strings = TRUE, but then - // default_controller would be empty ... - if (file_exists(APPPATH.'config/routes.php')) - { - include(APPPATH.'config/routes.php'); - } - - if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) - { - include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); - } - - // Validate & get reserved routes - if (isset($route) && is_array($route)) - { - isset($route['default_controller']) && $this->default_controller = $route['default_controller']; - isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes']; - unset($route['default_controller'], $route['translate_uri_dashes']); - $this->routes = $route; - } - - // Are query strings enabled in the config file? Normally CI doesn't utilize query strings - // since URI segments are more search-engine friendly, but they can optionally be used. - // If this feature is enabled, we will gather the directory/class/method a little differently - if ($this->enable_query_strings) - { - // If the directory is set at this time, it means an override exists, so skip the checks - if ( ! isset($this->directory)) - { - $_d = $this->config->item('directory_trigger'); - $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; - - if ($_d !== '') - { - $this->uri->filter_uri($_d); - $this->set_directory($_d); - } - } - - $_c = trim($this->config->item('controller_trigger')); - if ( ! empty($_GET[$_c])) - { - $this->uri->filter_uri($_GET[$_c]); - $this->set_class($_GET[$_c]); - - $_f = trim($this->config->item('function_trigger')); - if ( ! empty($_GET[$_f])) - { - $this->uri->filter_uri($_GET[$_f]); - $this->set_method($_GET[$_f]); - } - - $this->uri->rsegments = array( - 1 => $this->class, - 2 => $this->method - ); - } - else - { - $this->_set_default_controller(); - } - - // Routing rules don't apply to query strings and we don't need to detect - // directories, so we're done here - return; - } - - // Is there anything to parse? - if ($this->uri->uri_string !== '') - { - $this->_parse_routes(); - } - else - { - $this->_set_default_controller(); - } - } - - // -------------------------------------------------------------------- - - /** - * Set request route - * - * Takes an array of URI segments as input and sets the class/method - * to be called. - * - * @used-by CI_Router::_parse_routes() - * @param array $segments URI segments - * @return void - */ - protected function _set_request($segments = array()) - { - $segments = $this->_validate_request($segments); - // If we don't have any segments left - try the default controller; - // WARNING: Directories get shifted out of the segments array! - if (empty($segments)) - { - $this->_set_default_controller(); - return; - } - - if ($this->translate_uri_dashes === TRUE) - { - $segments[0] = str_replace('-', '_', $segments[0]); - if (isset($segments[1])) - { - $segments[1] = str_replace('-', '_', $segments[1]); - } - } - - $this->set_class($segments[0]); - if (isset($segments[1])) - { - $this->set_method($segments[1]); - } - else - { - $segments[1] = 'index'; - } - - array_unshift($segments, NULL); - unset($segments[0]); - $this->uri->rsegments = $segments; - } - - // -------------------------------------------------------------------- - - /** - * Set default controller - * - * @return void - */ - protected function _set_default_controller() - { - if (empty($this->default_controller)) - { - show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.'); - } - - // Is the method being specified? - if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) - { - $method = 'index'; - } - - if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php')) - { - // This will trigger 404 later - return; - } - - $this->set_class($class); - $this->set_method($method); - - // Assign routed segments, index starting from 1 - $this->uri->rsegments = array( - 1 => $class, - 2 => $method - ); - - log_message('debug', 'No URI present. Default controller set.'); - } - - // -------------------------------------------------------------------- - - /** - * Validate request - * - * Attempts validate the URI request and determine the controller path. - * - * @used-by CI_Router::_set_request() - * @param array $segments URI segments - * @return mixed URI segments - */ - protected function _validate_request($segments) - { - $c = count($segments); - $directory_override = isset($this->directory); - - // Loop through our segments and return as soon as a controller - // is found or when such a directory doesn't exist - while ($c-- > 0) - { - $test = $this->directory - .ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]); - - if ( ! file_exists(APPPATH.'controllers/'.$test.'.php') - && $directory_override === FALSE - && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) - ) - { - $this->set_directory(array_shift($segments), TRUE); - continue; - } - - return $segments; - } - - // This means that all segments were actually directories - return $segments; - } - - // -------------------------------------------------------------------- - - /** - * Parse Routes - * - * Matches any routes that may exist in the config/routes.php file - * against the URI to determine if the class/method need to be remapped. - * - * @return void - */ - protected function _parse_routes() - { - // Turn the segment array into a URI string - $uri = implode('/', $this->uri->segments); - - // Get HTTP verb - $http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli'; - - // Loop through the route array looking for wildcards - foreach ($this->routes as $key => $val) - { - // Check if route format is using HTTP verbs - if (is_array($val)) - { - $val = array_change_key_case($val, CASE_LOWER); - if (isset($val[$http_verb])) - { - $val = $val[$http_verb]; - } - else - { - continue; - } - } - - // Convert wildcards to RegEx - $key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key); - - // Does the RegEx match? - if (preg_match('#^'.$key.'$#', $uri, $matches)) - { - // Are we using callbacks to process back-references? - if ( ! is_string($val) && is_callable($val)) - { - // Remove the original string from the matches array. - array_shift($matches); - - // Execute the callback using the values in matches as its parameters. - $val = call_user_func_array($val, $matches); - } - // Are we using the default routing method for back-references? - elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE) - { - $val = preg_replace('#^'.$key.'$#', $val, $uri); - } - - $this->_set_request(explode('/', $val)); - return; - } - } - - // If we got this far it means we didn't encounter a - // matching route so we'll set the site default route - $this->_set_request(array_values($this->uri->segments)); - } - - // -------------------------------------------------------------------- - - /** - * Set class name - * - * @param string $class Class name - * @return void - */ - public function set_class($class) - { - $this->class = str_replace(array('/', '.'), '', $class); - } - - // -------------------------------------------------------------------- - - /** - * Fetch the current class - * - * @deprecated 3.0.0 Read the 'class' property instead - * @return string - */ - public function fetch_class() - { - return $this->class; - } - - // -------------------------------------------------------------------- - - /** - * Set method name - * - * @param string $method Method name - * @return void - */ - public function set_method($method) - { - $this->method = $method; - } - - // -------------------------------------------------------------------- - - /** - * Fetch the current method - * - * @deprecated 3.0.0 Read the 'method' property instead - * @return string - */ - public function fetch_method() - { - return $this->method; - } - - // -------------------------------------------------------------------- - - /** - * Set directory name - * - * @param string $dir Directory name - * @param bool $append Whether we're appending rather than setting the full value - * @return void - */ - public function set_directory($dir, $append = FALSE) - { - if ($append !== TRUE OR empty($this->directory)) - { - $this->directory = str_replace('.', '', trim($dir, '/')).'/'; - } - else - { - $this->directory .= str_replace('.', '', trim($dir, '/')).'/'; - } - } - - // -------------------------------------------------------------------- - - /** - * Fetch directory - * - * Feches the sub-directory (if any) that contains the requested - * controller class. - * - * @deprecated 3.0.0 Read the 'directory' property instead - * @return string - */ - public function fetch_directory() - { - return $this->directory; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Security.php b/vendor_old/codeigniter/framework/system/core/Security.php deleted file mode 100644 index 082ffa9..0000000 --- a/vendor_old/codeigniter/framework/system/core/Security.php +++ /dev/null @@ -1,1080 +0,0 @@ -', '<', '>', - "'", '"', '&', '$', '#', - '{', '}', '[', ']', '=', - ';', '?', '%20', '%22', - '%3c', // < - '%253c', // < - '%3e', // > - '%0e', // > - '%28', // ( - '%29', // ) - '%2528', // ( - '%26', // & - '%24', // $ - '%3f', // ? - '%3b', // ; - '%3d' // = - ); - - /** - * Character set - * - * Will be overridden by the constructor. - * - * @var string - */ - public $charset = 'UTF-8'; - - /** - * XSS Hash - * - * Random Hash for protecting URLs. - * - * @var string - */ - protected $_xss_hash; - - /** - * CSRF Hash - * - * Random hash for Cross Site Request Forgery protection cookie - * - * @var string - */ - protected $_csrf_hash; - - /** - * CSRF Expire time - * - * Expiration time for Cross Site Request Forgery protection cookie. - * Defaults to two hours (in seconds). - * - * @var int - */ - protected $_csrf_expire = 7200; - - /** - * CSRF Token name - * - * Token name for Cross Site Request Forgery protection cookie. - * - * @var string - */ - protected $_csrf_token_name = 'ci_csrf_token'; - - /** - * CSRF Cookie name - * - * Cookie name for Cross Site Request Forgery protection cookie. - * - * @var string - */ - protected $_csrf_cookie_name = 'ci_csrf_token'; - - /** - * List of never allowed strings - * - * @var array - */ - protected $_never_allowed_str = array( - 'document.cookie' => '[removed]', - 'document.write' => '[removed]', - '.parentNode' => '[removed]', - '.innerHTML' => '[removed]', - '-moz-binding' => '[removed]', - '' => '-->', - ' '<![CDATA[', - '' => '<comment>', - '<%' => '<%' - ); - - /** - * List of never allowed regex replacements - * - * @var array - */ - protected $_never_allowed_regex = array( - 'javascript\s*:', - '(document|(document\.)?window)\.(location|on\w*)', - 'expression\s*(\(|&\#40;)', // CSS and IE - 'vbscript\s*:', // IE, surprise! - 'wscript\s*:', // IE - 'jscript\s*:', // IE - 'vbs\s*:', // IE - 'Redirect\s+30\d', - "([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" - ); - - /** - * Class constructor - * - * @return void - */ - public function __construct() - { - // Is CSRF protection enabled? - if (config_item('csrf_protection')) - { - // CSRF config - foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) - { - if (NULL !== ($val = config_item($key))) - { - $this->{'_'.$key} = $val; - } - } - - // Append application specific cookie prefix - if ($cookie_prefix = config_item('cookie_prefix')) - { - $this->_csrf_cookie_name = $cookie_prefix.$this->_csrf_cookie_name; - } - - // Set the CSRF hash - $this->_csrf_set_hash(); - } - - $this->charset = strtoupper(config_item('charset')); - - log_message('info', 'Security Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * CSRF Verify - * - * @return CI_Security - */ - public function csrf_verify() - { - // If it's not a POST request we will set the CSRF cookie - if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') - { - return $this->csrf_set_cookie(); - } - - // Check if URI has been whitelisted from CSRF checks - if ($exclude_uris = config_item('csrf_exclude_uris')) - { - $uri = load_class('URI', 'core'); - foreach ($exclude_uris as $excluded) - { - if (preg_match('#^'.$excluded.'$#i'.(UTF8_ENABLED ? 'u' : ''), $uri->uri_string())) - { - return $this; - } - } - } - - // Check CSRF token validity, but don't error on mismatch just yet - we'll want to regenerate - $valid = isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) - && hash_equals($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]); - - // We kill this since we're done and we don't want to pollute the _POST array - unset($_POST[$this->_csrf_token_name]); - - // Regenerate on every submission? - if (config_item('csrf_regenerate')) - { - // Nothing should last forever - unset($_COOKIE[$this->_csrf_cookie_name]); - $this->_csrf_hash = NULL; - } - - $this->_csrf_set_hash(); - $this->csrf_set_cookie(); - - if ($valid !== TRUE) - { - $this->csrf_show_error(); - } - - log_message('info', 'CSRF token verified'); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * CSRF Set Cookie - * - * @codeCoverageIgnore - * @return CI_Security - */ - public function csrf_set_cookie() - { - $expire = time() + $this->_csrf_expire; - $secure_cookie = (bool) config_item('cookie_secure'); - - if ($secure_cookie && ! is_https()) - { - return FALSE; - } - - setcookie( - $this->_csrf_cookie_name, - $this->_csrf_hash, - $expire, - config_item('cookie_path'), - config_item('cookie_domain'), - $secure_cookie, - config_item('cookie_httponly') - ); - log_message('info', 'CSRF cookie sent'); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Show CSRF Error - * - * @return void - */ - public function csrf_show_error() - { - show_error('The action you have requested is not allowed.', 403); - } - - // -------------------------------------------------------------------- - - /** - * Get CSRF Hash - * - * @see CI_Security::$_csrf_hash - * @return string CSRF hash - */ - public function get_csrf_hash() - { - return $this->_csrf_hash; - } - - // -------------------------------------------------------------------- - - /** - * Get CSRF Token Name - * - * @see CI_Security::$_csrf_token_name - * @return string CSRF token name - */ - public function get_csrf_token_name() - { - return $this->_csrf_token_name; - } - - // -------------------------------------------------------------------- - - /** - * XSS Clean - * - * Sanitizes data so that Cross Site Scripting Hacks can be - * prevented. This method does a fair amount of work but - * it is extremely thorough, designed to prevent even the - * most obscure XSS attempts. Nothing is ever 100% foolproof, - * of course, but I haven't been able to get anything passed - * the filter. - * - * Note: Should only be used to deal with data upon submission. - * It's not something that should be used for general - * runtime processing. - * - * @link http://channel.bitflux.ch/wiki/XSS_Prevention - * Based in part on some code and ideas from Bitflux. - * - * @link http://ha.ckers.org/xss.html - * To help develop this script I used this great list of - * vulnerabilities along with a few other hacks I've - * harvested from examining vulnerabilities in other programs. - * - * @param string|string[] $str Input data - * @param bool $is_image Whether the input is an image - * @return string - */ - public function xss_clean($str, $is_image = FALSE) - { - // Is the string an array? - if (is_array($str)) - { - foreach ($str as $key => &$value) - { - $str[$key] = $this->xss_clean($value); - } - - return $str; - } - - // Remove Invisible Characters - $str = remove_invisible_characters($str); - - /* - * URL Decode - * - * Just in case stuff like this is submitted: - * - *
      Google - * - * Note: Use rawurldecode() so it does not remove plus signs - */ - if (stripos($str, '%') !== false) - { - do - { - $oldstr = $str; - $str = rawurldecode($str); - $str = preg_replace_callback('#%(?:\s*[0-9a-f]){2,}#i', array($this, '_urldecodespaces'), $str); - } - while ($oldstr !== $str); - unset($oldstr); - } - - /* - * Convert character entities to ASCII - * - * This permits our tests below to work reliably. - * We only convert entities that are within tags since - * these are the ones that will pose security problems. - */ - $str = preg_replace_callback("/[^a-z0-9>]+[a-z0-9]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); - $str = preg_replace_callback('/<\w+.*/si', array($this, '_decode_entity'), $str); - - // Remove Invisible Characters Again! - $str = remove_invisible_characters($str); - - /* - * Convert all tabs to spaces - * - * This prevents strings like this: ja vascript - * NOTE: we deal with spaces between characters later. - * NOTE: preg_replace was found to be amazingly slow here on - * large blocks of data, so we use str_replace. - */ - $str = str_replace("\t", ' ', $str); - - // Capture converted string for later comparison - $converted_string = $str; - - // Remove Strings that are never allowed - $str = $this->_do_never_allowed($str); - - /* - * Makes PHP tags safe - * - * Note: XML tags are inadvertently replaced too: - * - * '), array('<?', '?>'), $str); - } - - /* - * Compact any exploded words - * - * This corrects words like: j a v a s c r i p t - * These words are compacted back to their correct state. - */ - $words = array( - 'javascript', 'expression', 'vbscript', 'jscript', 'wscript', - 'vbs', 'script', 'base64', 'applet', 'alert', 'document', - 'write', 'cookie', 'window', 'confirm', 'prompt', 'eval' - ); - - foreach ($words as $word) - { - $word = implode('\s*', str_split($word)).'\s*'; - - // We only want to do this when it is followed by a non-word character - // That way valid stuff like "dealer to" does not become "dealerto" - $str = preg_replace_callback('#('.substr($word, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); - } - - /* - * Remove disallowed Javascript in links or img tags - * We used to do some version comparisons and use of stripos(), - * but it is dog slow compared to these simplified non-capturing - * preg_match(), especially if the pattern exists in the string - * - * Note: It was reported that not only space characters, but all in - * the following pattern can be parsed as separators between a tag name - * and its attributes: [\d\s"\'`;,\/\=\(\x00\x0B\x09\x0C] - * ... however, remove_invisible_characters() above already strips the - * hex-encoded ones, so we'll skip them below. - */ - do - { - $original = $str; - - if (preg_match('/
      ]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); - } - - if (preg_match('/]*?)(?:\s?/?>|$)#si', array($this, '_js_img_removal'), $str); - } - - if (preg_match('/script|xss/i', $str)) - { - $str = preg_replace('##si', '[removed]', $str); - } - } - while ($original !== $str); - unset($original); - - /* - * Sanitize naughty HTML elements - * - * If a tag containing any of the words in the list - * below is found, the tag gets converted to entities. - * - * So this: - * Becomes: <blink> - */ - $pattern = '#' - .'<((?/*\s*)((?[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character - .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator - // optional attributes - .'(?(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons - .'[^\s\042\047>/=]+' // attribute characters - // optional attribute-value - .'(?:\s*=' // attribute-value separator - .'(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value - .')?' // end optional attribute-value group - .')*)' // end optional attributes group - .'[^>]*)(?\>)?#isS'; - - // Note: It would be nice to optimize this for speed, BUT - // only matching the naughty elements here results in - // false positives and in turn - vulnerabilities! - do - { - $old_str = $str; - $str = preg_replace_callback($pattern, array($this, '_sanitize_naughty_html'), $str); - } - while ($old_str !== $str); - unset($old_str); - - /* - * Sanitize naughty scripting elements - * - * Similar to above, only instead of looking for - * tags it looks for PHP and JavaScript commands - * that are disallowed. Rather than removing the - * code, it simply converts the parenthesis to entities - * rendering the code un-executable. - * - * For example: eval('some code') - * Becomes: eval('some code') - */ - $str = preg_replace( - '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', - '\\1\\2(\\3)', - $str - ); - - // Final clean up - // This adds a bit of extra precaution in case - // something got through the above filters - $str = $this->_do_never_allowed($str); - - /* - * Images are Handled in a Special Way - * - Essentially, we want to know that after all of the character - * conversion is done whether any unwanted, likely XSS, code was found. - * If not, we return TRUE, as the image is clean. - * However, if the string post-conversion does not matched the - * string post-removal of XSS, then it fails, as there was unwanted XSS - * code found and removed/changed during processing. - */ - if ($is_image === TRUE) - { - return ($str === $converted_string); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * XSS Hash - * - * Generates the XSS hash if needed and returns it. - * - * @see CI_Security::$_xss_hash - * @return string XSS hash - */ - public function xss_hash() - { - if ($this->_xss_hash === NULL) - { - $rand = $this->get_random_bytes(16); - $this->_xss_hash = ($rand === FALSE) - ? md5(uniqid(mt_rand(), TRUE)) - : bin2hex($rand); - } - - return $this->_xss_hash; - } - - // -------------------------------------------------------------------- - - /** - * Get random bytes - * - * @param int $length Output length - * @return string - */ - public function get_random_bytes($length) - { - if (empty($length) OR ! ctype_digit((string) $length)) - { - return FALSE; - } - - if (function_exists('random_bytes')) - { - try - { - // The cast is required to avoid TypeError - return random_bytes((int) $length); - } - catch (Exception $e) - { - // If random_bytes() can't do the job, we can't either ... - // There's no point in using fallbacks. - log_message('error', $e->getMessage()); - return FALSE; - } - } - - // Unfortunately, none of the following PRNGs is guaranteed to exist ... - if (defined('MCRYPT_DEV_URANDOM') && ($output = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) !== FALSE) - { - return $output; - } - - - if (is_readable('/dev/urandom') && ($fp = fopen('/dev/urandom', 'rb')) !== FALSE) - { - // Try not to waste entropy ... - is_php('5.4') && stream_set_chunk_size($fp, $length); - $output = fread($fp, $length); - fclose($fp); - if ($output !== FALSE) - { - return $output; - } - } - - if (function_exists('openssl_random_pseudo_bytes')) - { - return openssl_random_pseudo_bytes($length); - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * HTML Entities Decode - * - * A replacement for html_entity_decode() - * - * The reason we are not using html_entity_decode() by itself is because - * while it is not technically correct to leave out the semicolon - * at the end of an entity most browsers will still interpret the entity - * correctly. html_entity_decode() does not convert entities without - * semicolons, so we are left with our own little solution here. Bummer. - * - * @link http://php.net/html-entity-decode - * - * @param string $str Input - * @param string $charset Character set - * @return string - */ - public function entity_decode($str, $charset = NULL) - { - if (strpos($str, '&') === FALSE) - { - return $str; - } - - static $_entities; - - isset($charset) OR $charset = $this->charset; - $flag = is_php('5.4') - ? ENT_COMPAT | ENT_HTML5 - : ENT_COMPAT; - - if ( ! isset($_entities)) - { - $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); - - // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 - // entities to the array manually - if ($flag === ENT_COMPAT) - { - $_entities[':'] = ':'; - $_entities['('] = '('; - $_entities[')'] = ')'; - $_entities["\n"] = ' '; - $_entities["\t"] = ' '; - } - } - - do - { - $str_compare = $str; - - // Decode standard entities, avoiding false positives - if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches)) - { - $replace = array(); - $matches = array_unique(array_map('strtolower', $matches[0])); - foreach ($matches as &$match) - { - if (($char = array_search($match.';', $_entities, TRUE)) !== FALSE) - { - $replace[$match] = $char; - } - } - - $str = str_replace(array_keys($replace), array_values($replace), $str); - } - - // Decode numeric & UTF16 two byte entities - $str = html_entity_decode( - preg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\d{2,4}(?![0-9;]))))/iS', '$1;', $str), - $flag, - $charset - ); - - if ($flag === ENT_COMPAT) - { - $str = str_replace(array_values($_entities), array_keys($_entities), $str); - } - } - while ($str_compare !== $str); - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Filename - * - * @param string $str Input file name - * @param bool $relative_path Whether to preserve paths - * @return string - */ - public function sanitize_filename($str, $relative_path = FALSE) - { - $bad = $this->filename_bad_chars; - - if ( ! $relative_path) - { - $bad[] = './'; - $bad[] = '/'; - } - - $str = remove_invisible_characters($str, FALSE); - - do - { - $old = $str; - $str = str_replace($bad, '', $str); - } - while ($old !== $str); - - return stripslashes($str); - } - - // ---------------------------------------------------------------- - - /** - * Strip Image Tags - * - * @param string $str - * @return string - */ - public function strip_image_tags($str) - { - return preg_replace( - array( - '##i', - '#`]+)).*?\>#i' - ), - '\\2', - $str - ); - } - - // ---------------------------------------------------------------- - - /** - * URL-decode taking spaces into account - * - * @see https://github.com/bcit-ci/CodeIgniter/issues/4877 - * @param array $matches - * @return string - */ - protected function _urldecodespaces($matches) - { - $input = $matches[0]; - $nospaces = preg_replace('#\s+#', '', $input); - return ($nospaces === $input) - ? $input - : rawurldecode($nospaces); - } - - // ---------------------------------------------------------------- - - /** - * Compact Exploded Words - * - * Callback method for xss_clean() to remove whitespace from - * things like 'j a v a s c r i p t'. - * - * @used-by CI_Security::xss_clean() - * @param array $matches - * @return string - */ - protected function _compact_exploded_words($matches) - { - return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; - } - - // -------------------------------------------------------------------- - - /** - * Sanitize Naughty HTML - * - * Callback method for xss_clean() to remove naughty HTML elements. - * - * @used-by CI_Security::xss_clean() - * @param array $matches - * @return string - */ - protected function _sanitize_naughty_html($matches) - { - static $naughty_tags = array( - 'alert', 'area', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound', - 'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer', - 'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object', - 'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss' - ); - - static $evil_attributes = array( - 'on\w+', 'style', 'xmlns', 'formaction', 'form', 'xlink:href', 'FSCommand', 'seekSegmentTime' - ); - - // First, escape unclosed tags - if (empty($matches['closeTag'])) - { - return '<'.$matches[1]; - } - // Is the element that we caught naughty? If so, escape it - elseif (in_array(strtolower($matches['tagName']), $naughty_tags, TRUE)) - { - return '<'.$matches[1].'>'; - } - // For other tags, see if their attributes are "evil" and strip those - elseif (isset($matches['attributes'])) - { - // We'll store the already fitlered attributes here - $attributes = array(); - - // Attribute-catching pattern - $attributes_pattern = '#' - .'(?[^\s\042\047>/=]+)' // attribute characters - // optional attribute-value - .'(?:\s*=(?[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator - .'#i'; - - // Blacklist pattern for evil attribute names - $is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i'; - - // Each iteration filters a single attribute - do - { - // Strip any non-alpha characters that may precede an attribute. - // Browsers often parse these incorrectly and that has been a - // of numerous XSS issues we've had. - $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); - - if ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE)) - { - // No (valid) attribute found? Discard everything else inside the tag - break; - } - - if ( - // Is it indeed an "evil" attribute? - preg_match($is_evil_pattern, $attribute['name'][0]) - // Or does it have an equals sign, but no value and not quoted? Strip that too! - OR (trim($attribute['value'][0]) === '') - ) - { - $attributes[] = 'xss=removed'; - } - else - { - $attributes[] = $attribute[0][0]; - } - - $matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0])); - } - while ($matches['attributes'] !== ''); - - $attributes = empty($attributes) - ? '' - : ' '.implode(' ', $attributes); - return '<'.$matches['slash'].$matches['tagName'].$attributes.'>'; - } - - return $matches[0]; - } - - // -------------------------------------------------------------------- - - /** - * JS Link Removal - * - * Callback method for xss_clean() to sanitize links. - * - * This limits the PCRE backtracks, making it more performance friendly - * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in - * PHP 5.2+ on link-heavy strings. - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _js_link_removal($match) - { - return str_replace( - $match[1], - preg_replace( - '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|_filter_attributes($match[1]) - ), - $match[0] - ); - } - - // -------------------------------------------------------------------- - - /** - * JS Image Removal - * - * Callback method for xss_clean() to sanitize image tags. - * - * This limits the PCRE backtracks, making it more performance friendly - * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in - * PHP 5.2+ on image tag heavy strings. - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _js_img_removal($match) - { - return str_replace( - $match[1], - preg_replace( - '#src=.*?(?:(?:alert|prompt|confirm|eval)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|_filter_attributes($match[1]) - ), - $match[0] - ); - } - - // -------------------------------------------------------------------- - - /** - * Attribute Conversion - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _convert_attribute($match) - { - return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]); - } - - // -------------------------------------------------------------------- - - /** - * Filter Attributes - * - * Filters tag attributes for consistency and safety. - * - * @used-by CI_Security::_js_img_removal() - * @used-by CI_Security::_js_link_removal() - * @param string $str - * @return string - */ - protected function _filter_attributes($str) - { - $out = ''; - if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) - { - foreach ($matches[0] as $match) - { - $out .= preg_replace('#/\*.*?\*/#s', '', $match); - } - } - - return $out; - } - - // -------------------------------------------------------------------- - - /** - * HTML Entity Decode Callback - * - * @used-by CI_Security::xss_clean() - * @param array $match - * @return string - */ - protected function _decode_entity($match) - { - // Protect GET variables in URLs - // 901119URL5918AMP18930PROTECT8198 - $match = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-/]+)|i', $this->xss_hash().'\\1=\\2', $match[0]); - - // Decode, then un-protect URL GET vars - return str_replace( - $this->xss_hash(), - '&', - $this->entity_decode($match, $this->charset) - ); - } - - // -------------------------------------------------------------------- - - /** - * Do Never Allowed - * - * @used-by CI_Security::xss_clean() - * @param string - * @return string - */ - protected function _do_never_allowed($str) - { - $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); - - foreach ($this->_never_allowed_regex as $regex) - { - $str = preg_replace('#'.$regex.'#is', '[removed]', $str); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Set CSRF Hash and Cookie - * - * @return string - */ - protected function _csrf_set_hash() - { - if ($this->_csrf_hash === NULL) - { - // If the cookie exists we will use its value. - // We don't necessarily want to regenerate it with - // each page load since a page could contain embedded - // sub-pages causing this feature to fail - if (isset($_COOKIE[$this->_csrf_cookie_name]) && is_string($_COOKIE[$this->_csrf_cookie_name]) - && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) - { - return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; - } - - $rand = $this->get_random_bytes(16); - $this->_csrf_hash = ($rand === FALSE) - ? md5(uniqid(mt_rand(), TRUE)) - : bin2hex($rand); - } - - return $this->_csrf_hash; - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/URI.php b/vendor_old/codeigniter/framework/system/core/URI.php deleted file mode 100644 index 3ccdfa7..0000000 --- a/vendor_old/codeigniter/framework/system/core/URI.php +++ /dev/null @@ -1,643 +0,0 @@ -config =& load_class('Config', 'core'); - - // If query strings are enabled, we don't need to parse any segments. - // However, they don't make sense under CLI. - if (is_cli() OR $this->config->item('enable_query_strings') !== TRUE) - { - $this->_permitted_uri_chars = $this->config->item('permitted_uri_chars'); - - // If it's a CLI request, ignore the configuration - if (is_cli()) - { - $uri = $this->_parse_argv(); - } - else - { - $protocol = $this->config->item('uri_protocol'); - empty($protocol) && $protocol = 'REQUEST_URI'; - - switch ($protocol) - { - case 'AUTO': // For BC purposes only - case 'REQUEST_URI': - $uri = $this->_parse_request_uri(); - break; - case 'QUERY_STRING': - $uri = $this->_parse_query_string(); - break; - case 'PATH_INFO': - default: - $uri = isset($_SERVER[$protocol]) - ? $_SERVER[$protocol] - : $this->_parse_request_uri(); - break; - } - } - - $this->_set_uri_string($uri); - } - - log_message('info', 'URI Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Set URI String - * - * @param string $str - * @return void - */ - protected function _set_uri_string($str) - { - // Filter out control characters and trim slashes - $this->uri_string = trim(remove_invisible_characters($str, FALSE), '/'); - - if ($this->uri_string !== '') - { - // Remove the URL suffix, if present - if (($suffix = (string) $this->config->item('url_suffix')) !== '') - { - $slen = strlen($suffix); - - if (substr($this->uri_string, -$slen) === $suffix) - { - $this->uri_string = substr($this->uri_string, 0, -$slen); - } - } - - $this->segments[0] = NULL; - // Populate the segments array - foreach (explode('/', trim($this->uri_string, '/')) as $val) - { - $val = trim($val); - // Filter segments for security - $this->filter_uri($val); - - if ($val !== '') - { - $this->segments[] = $val; - } - } - - unset($this->segments[0]); - } - } - - // -------------------------------------------------------------------- - - /** - * Parse REQUEST_URI - * - * Will parse REQUEST_URI and automatically detect the URI from it, - * while fixing the query string if necessary. - * - * @return string - */ - protected function _parse_request_uri() - { - if ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'])) - { - return ''; - } - - // parse_url() returns false if no host is present, but the path or query string - // contains a colon followed by a number - $uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); - $query = isset($uri['query']) ? $uri['query'] : ''; - $uri = isset($uri['path']) ? $uri['path'] : ''; - - if (isset($_SERVER['SCRIPT_NAME'][0])) - { - if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) - { - $uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME'])); - } - elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) - { - $uri = (string) substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); - } - } - - // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct - // URI is found, and also fixes the QUERY_STRING server var and $_GET array. - if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0) - { - $query = explode('?', $query, 2); - $uri = $query[0]; - $_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : ''; - } - else - { - $_SERVER['QUERY_STRING'] = $query; - } - - parse_str($_SERVER['QUERY_STRING'], $_GET); - - if ($uri === '/' OR $uri === '') - { - return '/'; - } - - // Do some final cleaning of the URI and return it - return $this->_remove_relative_directory($uri); - } - - // -------------------------------------------------------------------- - - /** - * Parse QUERY_STRING - * - * Will parse QUERY_STRING and automatically detect the URI from it. - * - * @return string - */ - protected function _parse_query_string() - { - $uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); - - if (trim($uri, '/') === '') - { - return ''; - } - elseif (strncmp($uri, '/', 1) === 0) - { - $uri = explode('?', $uri, 2); - $_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : ''; - $uri = $uri[0]; - } - - parse_str($_SERVER['QUERY_STRING'], $_GET); - - return $this->_remove_relative_directory($uri); - } - - // -------------------------------------------------------------------- - - /** - * Parse CLI arguments - * - * Take each command line argument and assume it is a URI segment. - * - * @return string - */ - protected function _parse_argv() - { - $args = array_slice($_SERVER['argv'], 1); - return $args ? implode('/', $args) : ''; - } - - // -------------------------------------------------------------------- - - /** - * Remove relative directory (../) and multi slashes (///) - * - * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri() - * - * @param string $uri - * @return string - */ - protected function _remove_relative_directory($uri) - { - $uris = array(); - $tok = strtok($uri, '/'); - while ($tok !== FALSE) - { - if (( ! empty($tok) OR $tok === '0') && $tok !== '..') - { - $uris[] = $tok; - } - $tok = strtok('/'); - } - - return implode('/', $uris); - } - - // -------------------------------------------------------------------- - - /** - * Filter URI - * - * Filters segments for malicious characters. - * - * @param string $str - * @return void - */ - public function filter_uri(&$str) - { - if ( ! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str)) - { - show_error('The URI you submitted has disallowed characters.', 400); - } - } - - // -------------------------------------------------------------------- - - /** - * Fetch URI Segment - * - * @see CI_URI::$segments - * @param int $n Index - * @param mixed $no_result What to return if the segment index is not found - * @return mixed - */ - public function segment($n, $no_result = NULL) - { - return isset($this->segments[$n]) ? $this->segments[$n] : $no_result; - } - - // -------------------------------------------------------------------- - - /** - * Fetch URI "routed" Segment - * - * Returns the re-routed URI segment (assuming routing rules are used) - * based on the index provided. If there is no routing, will return - * the same result as CI_URI::segment(). - * - * @see CI_URI::$rsegments - * @see CI_URI::segment() - * @param int $n Index - * @param mixed $no_result What to return if the segment index is not found - * @return mixed - */ - public function rsegment($n, $no_result = NULL) - { - return isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result; - } - - // -------------------------------------------------------------------- - - /** - * URI to assoc - * - * Generates an associative array of URI data starting at the supplied - * segment index. For example, if this is your URI: - * - * example.com/user/search/name/joe/location/UK/gender/male - * - * You can use this method to generate an array with this prototype: - * - * array ( - * name => joe - * location => UK - * gender => male - * ) - * - * @param int $n Index (default: 3) - * @param array $default Default values - * @return array - */ - public function uri_to_assoc($n = 3, $default = array()) - { - return $this->_uri_to_assoc($n, $default, 'segment'); - } - - // -------------------------------------------------------------------- - - /** - * Routed URI to assoc - * - * Identical to CI_URI::uri_to_assoc(), only it uses the re-routed - * segment array. - * - * @see CI_URI::uri_to_assoc() - * @param int $n Index (default: 3) - * @param array $default Default values - * @return array - */ - public function ruri_to_assoc($n = 3, $default = array()) - { - return $this->_uri_to_assoc($n, $default, 'rsegment'); - } - - // -------------------------------------------------------------------- - - /** - * Internal URI-to-assoc - * - * Generates a key/value pair from the URI string or re-routed URI string. - * - * @used-by CI_URI::uri_to_assoc() - * @used-by CI_URI::ruri_to_assoc() - * @param int $n Index (default: 3) - * @param array $default Default values - * @param string $which Array name ('segment' or 'rsegment') - * @return array - */ - protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') - { - if ( ! is_numeric($n)) - { - return $default; - } - - if (isset($this->keyval[$which], $this->keyval[$which][$n])) - { - return $this->keyval[$which][$n]; - } - - $total_segments = "total_{$which}s"; - $segment_array = "{$which}_array"; - - if ($this->$total_segments() < $n) - { - return (count($default) === 0) - ? array() - : array_fill_keys($default, NULL); - } - - $segments = array_slice($this->$segment_array(), ($n - 1)); - $i = 0; - $lastval = ''; - $retval = array(); - foreach ($segments as $seg) - { - if ($i % 2) - { - $retval[$lastval] = $seg; - } - else - { - $retval[$seg] = NULL; - $lastval = $seg; - } - - $i++; - } - - if (count($default) > 0) - { - foreach ($default as $val) - { - if ( ! array_key_exists($val, $retval)) - { - $retval[$val] = NULL; - } - } - } - - // Cache the array for reuse - isset($this->keyval[$which]) OR $this->keyval[$which] = array(); - $this->keyval[$which][$n] = $retval; - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Assoc to URI - * - * Generates a URI string from an associative array. - * - * @param array $array Input array of key/value pairs - * @return string URI string - */ - public function assoc_to_uri($array) - { - $temp = array(); - foreach ((array) $array as $key => $val) - { - $temp[] = $key; - $temp[] = $val; - } - - return implode('/', $temp); - } - - // -------------------------------------------------------------------- - - /** - * Slash segment - * - * Fetches an URI segment with a slash. - * - * @param int $n Index - * @param string $where Where to add the slash ('trailing' or 'leading') - * @return string - */ - public function slash_segment($n, $where = 'trailing') - { - return $this->_slash_segment($n, $where, 'segment'); - } - - // -------------------------------------------------------------------- - - /** - * Slash routed segment - * - * Fetches an URI routed segment with a slash. - * - * @param int $n Index - * @param string $where Where to add the slash ('trailing' or 'leading') - * @return string - */ - public function slash_rsegment($n, $where = 'trailing') - { - return $this->_slash_segment($n, $where, 'rsegment'); - } - - // -------------------------------------------------------------------- - - /** - * Internal Slash segment - * - * Fetches an URI Segment and adds a slash to it. - * - * @used-by CI_URI::slash_segment() - * @used-by CI_URI::slash_rsegment() - * - * @param int $n Index - * @param string $where Where to add the slash ('trailing' or 'leading') - * @param string $which Array name ('segment' or 'rsegment') - * @return string - */ - protected function _slash_segment($n, $where = 'trailing', $which = 'segment') - { - $leading = $trailing = '/'; - - if ($where === 'trailing') - { - $leading = ''; - } - elseif ($where === 'leading') - { - $trailing = ''; - } - - return $leading.$this->$which($n).$trailing; - } - - // -------------------------------------------------------------------- - - /** - * Segment Array - * - * @return array CI_URI::$segments - */ - public function segment_array() - { - return $this->segments; - } - - // -------------------------------------------------------------------- - - /** - * Routed Segment Array - * - * @return array CI_URI::$rsegments - */ - public function rsegment_array() - { - return $this->rsegments; - } - - // -------------------------------------------------------------------- - - /** - * Total number of segments - * - * @return int - */ - public function total_segments() - { - return count($this->segments); - } - - // -------------------------------------------------------------------- - - /** - * Total number of routed segments - * - * @return int - */ - public function total_rsegments() - { - return count($this->rsegments); - } - - // -------------------------------------------------------------------- - - /** - * Fetch URI string - * - * @return string CI_URI::$uri_string - */ - public function uri_string() - { - return $this->uri_string; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Re-routed URI string - * - * @return string - */ - public function ruri_string() - { - return ltrim(load_class('Router', 'core')->directory, '/').implode('/', $this->rsegments); - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/Utf8.php b/vendor_old/codeigniter/framework/system/core/Utf8.php deleted file mode 100644 index dfbbfff..0000000 --- a/vendor_old/codeigniter/framework/system/core/Utf8.php +++ /dev/null @@ -1,164 +0,0 @@ -is_ascii($str) === FALSE) - { - if (MB_ENABLED) - { - $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); - } - elseif (ICONV_ENABLED) - { - $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); - } - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Remove ASCII control characters - * - * Removes all ASCII control characters except horizontal tabs, - * line feeds, and carriage returns, as all others can cause - * problems in XML. - * - * @param string $str String to clean - * @return string - */ - public function safe_ascii_for_xml($str) - { - return remove_invisible_characters($str, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Convert to UTF-8 - * - * Attempts to convert a string to UTF-8. - * - * @param string $str Input string - * @param string $encoding Input encoding - * @return string $str encoded in UTF-8 or FALSE on failure - */ - public function convert_to_utf8($str, $encoding) - { - if (MB_ENABLED) - { - return mb_convert_encoding($str, 'UTF-8', $encoding); - } - elseif (ICONV_ENABLED) - { - return @iconv($encoding, 'UTF-8', $str); - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Is ASCII? - * - * Tests if a string is standard 7-bit ASCII or not. - * - * @param string $str String to check - * @return bool - */ - public function is_ascii($str) - { - return (preg_match('/[^\x00-\x7F]/S', $str) === 0); - } - -} diff --git a/vendor_old/codeigniter/framework/system/core/compat/hash.php b/vendor_old/codeigniter/framework/system/core/compat/hash.php deleted file mode 100644 index c65203a..0000000 --- a/vendor_old/codeigniter/framework/system/core/compat/hash.php +++ /dev/null @@ -1,254 +0,0 @@ - 32, - 'haval128,3' => 128, - 'haval160,3' => 128, - 'haval192,3' => 128, - 'haval224,3' => 128, - 'haval256,3' => 128, - 'haval128,4' => 128, - 'haval160,4' => 128, - 'haval192,4' => 128, - 'haval224,4' => 128, - 'haval256,4' => 128, - 'haval128,5' => 128, - 'haval160,5' => 128, - 'haval192,5' => 128, - 'haval224,5' => 128, - 'haval256,5' => 128, - 'md2' => 16, - 'md4' => 64, - 'md5' => 64, - 'ripemd128' => 64, - 'ripemd160' => 64, - 'ripemd256' => 64, - 'ripemd320' => 64, - 'salsa10' => 64, - 'salsa20' => 64, - 'sha1' => 64, - 'sha224' => 64, - 'sha256' => 64, - 'sha384' => 128, - 'sha512' => 128, - 'snefru' => 32, - 'snefru256' => 32, - 'tiger128,3' => 64, - 'tiger160,3' => 64, - 'tiger192,3' => 64, - 'tiger128,4' => 64, - 'tiger160,4' => 64, - 'tiger192,4' => 64, - 'whirlpool' => 64 - ); - - if (isset($block_sizes[$algo], $password[$block_sizes[$algo]])) - { - $password = hash($algo, $password, TRUE); - } - - $hash = ''; - // Note: Blocks are NOT 0-indexed - for ($bc = (int) ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++) - { - $key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE); - for ($i = 1; $i < $iterations; $i++) - { - $derived_key ^= $key = hash_hmac($algo, $key, $password, TRUE); - } - - $hash .= $derived_key; - } - - // This is not RFC-compatible, but we're aiming for natural PHP compatibility - if ( ! $raw_output) - { - $hash = bin2hex($hash); - } - - return defined('MB_OVERLOAD_STRING') - ? mb_substr($hash, 0, $length, '8bit') - : substr($hash, 0, $length); - } -} diff --git a/vendor_old/codeigniter/framework/system/core/compat/index.html b/vendor_old/codeigniter/framework/system/core/compat/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/core/compat/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/core/compat/mbstring.php b/vendor_old/codeigniter/framework/system/core/compat/mbstring.php deleted file mode 100644 index f466e1c..0000000 --- a/vendor_old/codeigniter/framework/system/core/compat/mbstring.php +++ /dev/null @@ -1,149 +0,0 @@ - 0, 'algoName' => 'unknown', 'options' => array()) - : array('algo' => 1, 'algoName' => 'bcrypt', 'options' => array('cost' => $hash)); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('password_hash')) -{ - /** - * password_hash() - * - * @link http://php.net/password_hash - * @param string $password - * @param int $algo - * @param array $options - * @return mixed - */ - function password_hash($password, $algo, array $options = array()) - { - static $func_overload; - isset($func_overload) OR $func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); - - if ($algo !== 1) - { - trigger_error('password_hash(): Unknown hashing algorithm: '.(int) $algo, E_USER_WARNING); - return NULL; - } - - if (isset($options['cost']) && ($options['cost'] < 4 OR $options['cost'] > 31)) - { - trigger_error('password_hash(): Invalid bcrypt cost parameter specified: '.(int) $options['cost'], E_USER_WARNING); - return NULL; - } - - if (isset($options['salt']) && ($saltlen = ($func_overload ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22) - { - trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING); - return NULL; - } - elseif ( ! isset($options['salt'])) - { - if (function_exists('random_bytes')) - { - try - { - $options['salt'] = random_bytes(16); - } - catch (Exception $e) - { - log_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage()); - return FALSE; - } - } - elseif (defined('MCRYPT_DEV_URANDOM')) - { - $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); - } - elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom'))) - { - if (($fp = fopen($dev, 'rb')) === FALSE) - { - log_message('error', 'compat/password: Unable to open '.$dev.' for reading.'); - return FALSE; - } - - // Try not to waste entropy ... - is_php('5.4') && stream_set_chunk_size($fp, 16); - - $options['salt'] = ''; - for ($read = 0; $read < 16; $read = ($func_overload) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt'])) - { - if (($read = fread($fp, 16 - $read)) === FALSE) - { - log_message('error', 'compat/password: Error while reading from '.$dev.'.'); - return FALSE; - } - $options['salt'] .= $read; - } - - fclose($fp); - } - elseif (function_exists('openssl_random_pseudo_bytes')) - { - $is_secure = NULL; - $options['salt'] = openssl_random_pseudo_bytes(16, $is_secure); - if ($is_secure !== TRUE) - { - log_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE'); - return FALSE; - } - } - else - { - log_message('error', 'compat/password: No CSPRNG available.'); - return FALSE; - } - - $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); - } - elseif ( ! preg_match('#^[a-zA-Z0-9./]+$#D', $options['salt'])) - { - $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); - } - - isset($options['cost']) OR $options['cost'] = 10; - - return (strlen($password = crypt($password, sprintf('$2y$%02d$%s', $options['cost'], $options['salt']))) === 60) - ? $password - : FALSE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('password_needs_rehash')) -{ - /** - * password_needs_rehash() - * - * @link http://php.net/password_needs_rehash - * @param string $hash - * @param int $algo - * @param array $options - * @return bool - */ - function password_needs_rehash($hash, $algo, array $options = array()) - { - $info = password_get_info($hash); - - if ($algo !== $info['algo']) - { - return TRUE; - } - elseif ($algo === 1) - { - $options['cost'] = isset($options['cost']) ? (int) $options['cost'] : 10; - return ($info['options']['cost'] !== $options['cost']); - } - - // Odd at first glance, but according to a comment in PHP's own unit tests, - // because it is an unknown algorithm - it's valid and therefore doesn't - // need rehashing. - return FALSE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('password_verify')) -{ - /** - * password_verify() - * - * @link http://php.net/password_verify - * @param string $password - * @param string $hash - * @return bool - */ - function password_verify($password, $hash) - { - if (strlen($hash) !== 60 OR strlen($password = crypt($password, $hash)) !== 60) - { - return FALSE; - } - - $compare = 0; - for ($i = 0; $i < 60; $i++) - { - $compare |= (ord($password[$i]) ^ ord($hash[$i])); - } - - return ($compare === 0); - } -} diff --git a/vendor_old/codeigniter/framework/system/core/compat/standard.php b/vendor_old/codeigniter/framework/system/core/compat/standard.php deleted file mode 100644 index 7db2efb..0000000 --- a/vendor_old/codeigniter/framework/system/core/compat/standard.php +++ /dev/null @@ -1,182 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/DB.php b/vendor_old/codeigniter/framework/system/database/DB.php deleted file mode 100644 index c19eef7..0000000 --- a/vendor_old/codeigniter/framework/system/database/DB.php +++ /dev/null @@ -1,218 +0,0 @@ -load->get_package_paths() as $path) - { - if ($path !== APPPATH) - { - if (file_exists($file_path = $path.'config/'.ENVIRONMENT.'/database.php')) - { - include($file_path); - } - elseif (file_exists($file_path = $path.'config/database.php')) - { - include($file_path); - } - } - } - } - - if ( ! isset($db) OR count($db) === 0) - { - show_error('No database connection settings were found in the database config file.'); - } - - if ($params !== '') - { - $active_group = $params; - } - - if ( ! isset($active_group)) - { - show_error('You have not specified a database connection group via $active_group in your config/database.php file.'); - } - elseif ( ! isset($db[$active_group])) - { - show_error('You have specified an invalid database connection group ('.$active_group.') in your config/database.php file.'); - } - - $params = $db[$active_group]; - } - elseif (is_string($params)) - { - /** - * Parse the URL from the DSN string - * Database settings can be passed as discreet - * parameters or as a data source name in the first - * parameter. DSNs must have this prototype: - * $dsn = 'driver://username:password@hostname/database'; - */ - if (($dsn = @parse_url($params)) === FALSE) - { - show_error('Invalid DB Connection String'); - } - - $params = array( - 'dbdriver' => $dsn['scheme'], - 'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '', - 'port' => isset($dsn['port']) ? rawurldecode($dsn['port']) : '', - 'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '', - 'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '', - 'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : '' - ); - - // Were additional config items set? - if (isset($dsn['query'])) - { - parse_str($dsn['query'], $extra); - - foreach ($extra as $key => $val) - { - if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL'))) - { - $val = var_export($val, TRUE); - } - - $params[$key] = $val; - } - } - } - - // No DB specified yet? Beat them senseless... - if (empty($params['dbdriver'])) - { - show_error('You have not selected a database type to connect to.'); - } - - // Load the DB classes. Note: Since the query builder class is optional - // we need to dynamically create a class that extends proper parent class - // based on whether we're using the query builder class or not. - if ($query_builder_override !== NULL) - { - $query_builder = $query_builder_override; - } - // Backwards compatibility work-around for keeping the - // $active_record config variable working. Should be - // removed in v3.1 - elseif ( ! isset($query_builder) && isset($active_record)) - { - $query_builder = $active_record; - } - - require_once(BASEPATH.'database/DB_driver.php'); - - if ( ! isset($query_builder) OR $query_builder === TRUE) - { - require_once(BASEPATH.'database/DB_query_builder.php'); - if ( ! class_exists('CI_DB', FALSE)) - { - /** - * CI_DB - * - * Acts as an alias for both CI_DB_driver and CI_DB_query_builder. - * - * @see CI_DB_query_builder - * @see CI_DB_driver - */ - class CI_DB extends CI_DB_query_builder { } - } - } - elseif ( ! class_exists('CI_DB', FALSE)) - { - /** - * @ignore - */ - class CI_DB extends CI_DB_driver { } - } - - // Load the DB driver - $driver_file = BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'; - - file_exists($driver_file) OR show_error('Invalid DB driver'); - require_once($driver_file); - - // Instantiate the DB adapter - $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; - $DB = new $driver($params); - - // Check for a subdriver - if ( ! empty($DB->subdriver)) - { - $driver_file = BASEPATH.'database/drivers/'.$DB->dbdriver.'/subdrivers/'.$DB->dbdriver.'_'.$DB->subdriver.'_driver.php'; - - if (file_exists($driver_file)) - { - require_once($driver_file); - $driver = 'CI_DB_'.$DB->dbdriver.'_'.$DB->subdriver.'_driver'; - $DB = new $driver($params); - } - } - - $DB->initialize(); - return $DB; -} diff --git a/vendor_old/codeigniter/framework/system/database/DB_cache.php b/vendor_old/codeigniter/framework/system/database/DB_cache.php deleted file mode 100644 index b74c319..0000000 --- a/vendor_old/codeigniter/framework/system/database/DB_cache.php +++ /dev/null @@ -1,221 +0,0 @@ -CI and load the file helper since we use it a lot - $this->CI =& get_instance(); - $this->db =& $db; - $this->CI->load->helper('file'); - - $this->check_path(); - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Directory Path - * - * @param string $path Path to the cache directory - * @return bool - */ - public function check_path($path = '') - { - if ($path === '') - { - if ($this->db->cachedir === '') - { - return $this->db->cache_off(); - } - - $path = $this->db->cachedir; - } - - // Add a trailing slash to the path if needed - $path = realpath($path) - ? rtrim(realpath($path), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR - : rtrim($path, '/').'/'; - - if ( ! is_dir($path)) - { - log_message('debug', 'DB cache path error: '.$path); - - // If the path is wrong we'll turn off caching - return $this->db->cache_off(); - } - - if ( ! is_really_writable($path)) - { - log_message('debug', 'DB cache dir not writable: '.$path); - - // If the path is not really writable we'll turn off caching - return $this->db->cache_off(); - } - - $this->db->cachedir = $path; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Retrieve a cached query - * - * The URI being requested will become the name of the cache sub-folder. - * An MD5 hash of the SQL statement will become the cache file name. - * - * @param string $sql - * @return string - */ - public function read($sql) - { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); - - if (FALSE === ($cachedata = @file_get_contents($filepath))) - { - return FALSE; - } - - return unserialize($cachedata); - } - - // -------------------------------------------------------------------- - - /** - * Write a query to a cache file - * - * @param string $sql - * @param object $object - * @return bool - */ - public function write($sql, $object) - { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; - $filename = md5($sql); - - if ( ! is_dir($dir_path) && ! @mkdir($dir_path, 0750)) - { - return FALSE; - } - - if (write_file($dir_path.$filename, serialize($object)) === FALSE) - { - return FALSE; - } - - chmod($dir_path.$filename, 0640); - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Delete cache files within a particular directory - * - * @param string $segment_one - * @param string $segment_two - * @return void - */ - public function delete($segment_one = '', $segment_two = '') - { - if ($segment_one === '') - { - $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); - } - - if ($segment_two === '') - { - $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); - } - - $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; - delete_files($dir_path, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Delete all existing cache files - * - * @return void - */ - public function delete_all() - { - delete_files($this->db->cachedir, TRUE, TRUE); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/DB_driver.php b/vendor_old/codeigniter/framework/system/database/DB_driver.php deleted file mode 100644 index 3eb51f7..0000000 --- a/vendor_old/codeigniter/framework/system/database/DB_driver.php +++ /dev/null @@ -1,1986 +0,0 @@ - $val) - { - $this->$key = $val; - } - } - - log_message('info', 'Database Driver Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Initialize Database Settings - * - * @return bool - */ - public function initialize() - { - /* If an established connection is available, then there's - * no need to connect and select the database. - * - * Depending on the database driver, conn_id can be either - * boolean TRUE, a resource or an object. - */ - if ($this->conn_id) - { - return TRUE; - } - - // ---------------------------------------------------------------- - - // Connect to the database and set the connection ID - $this->conn_id = $this->db_connect($this->pconnect); - - // No connection resource? Check if there is a failover else throw an error - if ( ! $this->conn_id) - { - // Check if there is a failover set - if ( ! empty($this->failover) && is_array($this->failover)) - { - // Go over all the failovers - foreach ($this->failover as $failover) - { - // Replace the current settings with those of the failover - foreach ($failover as $key => $val) - { - $this->$key = $val; - } - - // Try to connect - $this->conn_id = $this->db_connect($this->pconnect); - - // If a connection is made break the foreach loop - if ($this->conn_id) - { - break; - } - } - } - - // We still don't have a connection? - if ( ! $this->conn_id) - { - log_message('error', 'Unable to connect to the database'); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_connect'); - } - - return FALSE; - } - } - - // Now we set the character set and that's all - return $this->db_set_charset($this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * DB connect - * - * This is just a dummy method that all drivers will override. - * - * @return mixed - */ - public function db_connect() - { - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Persistent database connection - * - * @return mixed - */ - public function db_pconnect() - { - return $this->db_connect(TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout. - * - * This is just a dummy method to allow drivers without such - * functionality to not declare it, while others will override it. - * - * @return void - */ - public function reconnect() - { - } - - // -------------------------------------------------------------------- - - /** - * Select database - * - * This is just a dummy method to allow drivers without such - * functionality to not declare it, while others will override it. - * - * @return bool - */ - public function db_select() - { - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Last error - * - * @return array - */ - public function error() - { - return array('code' => NULL, 'message' => NULL); - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string - * @return bool - */ - public function db_set_charset($charset) - { - if (method_exists($this, '_db_set_charset') && ! $this->_db_set_charset($charset)) - { - log_message('error', 'Unable to set database connection charset: '.$charset); - - if ($this->db_debug) - { - $this->display_error('db_unable_to_set_charset', $charset); - } - - return FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * The name of the platform in use (mysql, mssql, etc...) - * - * @return string - */ - public function platform() - { - return $this->dbdriver; - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * Returns a string containing the version of the database being used. - * Most drivers will override this method. - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if (FALSE === ($sql = $this->_version())) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - $query = $this->query($sql)->row(); - return $this->data_cache['version'] = $query->ver; - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @return string - */ - protected function _version() - { - return 'SELECT VERSION() AS ver'; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * Accepts an SQL string as input and returns a result object upon - * successful execution of a "read" type query. Returns boolean TRUE - * upon successful execution of a "write" type query. Returns boolean - * FALSE upon failure, and if the $db_debug variable is set to TRUE - * will raise an error. - * - * @param string $sql - * @param array $binds = FALSE An array of binding data - * @param bool $return_object = NULL - * @return mixed - */ - public function query($sql, $binds = FALSE, $return_object = NULL) - { - if ($sql === '') - { - log_message('error', 'Invalid query: '.$sql); - return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; - } - elseif ( ! is_bool($return_object)) - { - $return_object = ! $this->is_write_type($sql); - } - - // Verify table prefix and replace if necessary - if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre) - { - $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql); - } - - // Compile binds if needed - if ($binds !== FALSE) - { - $sql = $this->compile_binds($sql, $binds); - } - - // Is query caching enabled? If the query is a "read type" - // we will load the caching class and return the previously - // cached query if it exists - if ($this->cache_on === TRUE && $return_object === TRUE && $this->_cache_init()) - { - $this->load_rdriver(); - if (FALSE !== ($cache = $this->CACHE->read($sql))) - { - return $cache; - } - } - - // Save the query for debugging - if ($this->save_queries === TRUE) - { - $this->queries[] = $sql; - } - - // Start the Query Timer - $time_start = microtime(TRUE); - - // Run the Query - if (FALSE === ($this->result_id = $this->simple_query($sql))) - { - if ($this->save_queries === TRUE) - { - $this->query_times[] = 0; - } - - // This will trigger a rollback if transactions are being used - if ($this->_trans_depth !== 0) - { - $this->_trans_status = FALSE; - } - - // Grab the error now, as we might run some additional queries before displaying the error - $error = $this->error(); - - // Log errors - log_message('error', 'Query error: '.$error['message'].' - Invalid query: '.$sql); - - if ($this->db_debug) - { - // We call this function in order to roll-back queries - // if transactions are enabled. If we don't call this here - // the error message will trigger an exit, causing the - // transactions to remain in limbo. - while ($this->_trans_depth !== 0) - { - $trans_depth = $this->_trans_depth; - $this->trans_complete(); - if ($trans_depth === $this->_trans_depth) - { - log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); - break; - } - } - - // Display errors - return $this->display_error(array('Error Number: '.$error['code'], $error['message'], $sql)); - } - - return FALSE; - } - - // Stop and aggregate the query time results - $time_end = microtime(TRUE); - $this->benchmark += $time_end - $time_start; - - if ($this->save_queries === TRUE) - { - $this->query_times[] = $time_end - $time_start; - } - - // Increment the query counter - $this->query_count++; - - // Will we have a result object instantiated? If not - we'll simply return TRUE - if ($return_object !== TRUE) - { - // If caching is enabled we'll auto-cleanup any existing files related to this particular URI - if ($this->cache_on === TRUE && $this->cache_autodel === TRUE && $this->_cache_init()) - { - $this->CACHE->delete(); - } - - return TRUE; - } - - // Load and instantiate the result driver - $driver = $this->load_rdriver(); - $RES = new $driver($this); - - // Is query caching enabled? If so, we'll serialize the - // result object and save it to a cache file. - if ($this->cache_on === TRUE && $this->_cache_init()) - { - // We'll create a new instance of the result object - // only without the platform specific driver since - // we can't use it with cached data (the query result - // resource ID won't be any good once we've cached the - // result object, so we'll have to compile the data - // and save it) - $CR = new CI_DB_result($this); - $CR->result_object = $RES->result_object(); - $CR->result_array = $RES->result_array(); - $CR->num_rows = $RES->num_rows(); - - // Reset these since cached objects can not utilize resource IDs. - $CR->conn_id = NULL; - $CR->result_id = NULL; - - $this->CACHE->write($sql, $CR); - } - - return $RES; - } - - // -------------------------------------------------------------------- - - /** - * Load the result drivers - * - * @return string the name of the result class - */ - public function load_rdriver() - { - $driver = 'CI_DB_'.$this->dbdriver.'_result'; - - if ( ! class_exists($driver, FALSE)) - { - require_once(BASEPATH.'database/DB_result.php'); - require_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); - } - - return $driver; - } - - // -------------------------------------------------------------------- - - /** - * Simple Query - * This is a simplified version of the query() function. Internally - * we only use it when running transaction commands since they do - * not require all the features of the main query() function. - * - * @param string the sql query - * @return mixed - */ - public function simple_query($sql) - { - if ( ! $this->conn_id) - { - if ( ! $this->initialize()) - { - return FALSE; - } - } - - return $this->_execute($sql); - } - - // -------------------------------------------------------------------- - - /** - * Disable Transactions - * This permits transactions to be disabled at run-time. - * - * @return void - */ - public function trans_off() - { - $this->trans_enabled = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Enable/disable Transaction Strict Mode - * - * When strict mode is enabled, if you are running multiple groups of - * transactions, if one group fails all subsequent groups will be - * rolled back. - * - * If strict mode is disabled, each group is treated autonomously, - * meaning a failure of one group will not affect any others - * - * @param bool $mode = TRUE - * @return void - */ - public function trans_strict($mode = TRUE) - { - $this->trans_strict = is_bool($mode) ? $mode : TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Start Transaction - * - * @param bool $test_mode = FALSE - * @return bool - */ - public function trans_start($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - - return $this->trans_begin($test_mode); - } - - // -------------------------------------------------------------------- - - /** - * Complete Transaction - * - * @return bool - */ - public function trans_complete() - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - - // The query() function will set this flag to FALSE in the event that a query failed - if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE) - { - $this->trans_rollback(); - - // If we are NOT running in strict mode, we will reset - // the _trans_status flag so that subsequent groups of - // transactions will be permitted. - if ($this->trans_strict === FALSE) - { - $this->_trans_status = TRUE; - } - - log_message('debug', 'DB Transaction Failure'); - return FALSE; - } - - return $this->trans_commit(); - } - - // -------------------------------------------------------------------- - - /** - * Lets you retrieve the transaction flag to determine if it has failed - * - * @return bool - */ - public function trans_status() - { - return $this->_trans_status; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @param bool $test_mode - * @return bool - */ - public function trans_begin($test_mode = FALSE) - { - if ( ! $this->trans_enabled) - { - return FALSE; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->_trans_depth > 0) - { - $this->_trans_depth++; - return TRUE; - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->_trans_failure = ($test_mode === TRUE); - - if ($this->_trans_begin()) - { - $this->_trans_depth++; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - public function trans_commit() - { - if ( ! $this->trans_enabled OR $this->_trans_depth === 0) - { - return FALSE; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->_trans_depth > 1 OR $this->_trans_commit()) - { - $this->_trans_depth--; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - public function trans_rollback() - { - if ( ! $this->trans_enabled OR $this->_trans_depth === 0) - { - return FALSE; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->_trans_depth > 1 OR $this->_trans_rollback()) - { - $this->_trans_depth--; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Compile Bindings - * - * @param string the sql statement - * @param array an array of bind data - * @return string - */ - public function compile_binds($sql, $binds) - { - if (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) - { - return $sql; - } - elseif ( ! is_array($binds)) - { - $binds = array($binds); - $bind_count = 1; - } - else - { - // Make sure we're using numeric keys - $binds = array_values($binds); - $bind_count = count($binds); - } - - // We'll need the marker length later - $ml = strlen($this->bind_marker); - - // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) - { - $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', - str_replace($matches[0], - str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), - $sql, $c), - $matches, PREG_OFFSET_CAPTURE); - - // Bind values' count must match the count of markers in the query - if ($bind_count !== $c) - { - return $sql; - } - } - elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) - { - return $sql; - } - - do - { - $c--; - $escaped_value = $this->escape($binds[$c]); - if (is_array($escaped_value)) - { - $escaped_value = '('.implode(',', $escaped_value).')'; - } - $sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml); - } - while ($c !== 0); - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Calculate the aggregate query elapsed time - * - * @param int The number of decimal places - * @return string - */ - public function elapsed_time($decimals = 6) - { - return number_format($this->benchmark, $decimals); - } - - // -------------------------------------------------------------------- - - /** - * Returns the total number of queries - * - * @return int - */ - public function total_queries() - { - return $this->query_count; - } - - // -------------------------------------------------------------------- - - /** - * Returns the last query that was executed - * - * @return string - */ - public function last_query() - { - return end($this->queries); - } - - // -------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * Sets boolean and null types - * - * @param string - * @return mixed - */ - public function escape($str) - { - if (is_array($str)) - { - $str = array_map(array(&$this, 'escape'), $str); - return $str; - } - elseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString'))) - { - return "'".$this->escape_str($str)."'"; - } - elseif (is_bool($str)) - { - return ($str === FALSE) ? 0 : 1; - } - elseif ($str === NULL) - { - return 'NULL'; - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Escape String - * - * @param string|string[] $str Input string - * @param bool $like Whether or not the string will be used in a LIKE condition - * @return string - */ - public function escape_str($str, $like = FALSE) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escape_str($val, $like); - } - - return $str; - } - - $str = $this->_escape_str($str); - - // escape LIKE condition wildcards - if ($like === TRUE) - { - return str_replace( - array($this->_like_escape_chr, '%', '_'), - array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), - $str - ); - } - - return $str; - } - - // -------------------------------------------------------------------- - - /** - * Escape LIKE String - * - * Calls the individual driver for platform - * specific escaping for LIKE conditions - * - * @param string|string[] - * @return mixed - */ - public function escape_like_str($str) - { - return $this->escape_str($str, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return str_replace("'", "''", remove_invisible_characters($str, FALSE)); - } - - // -------------------------------------------------------------------- - - /** - * Primary - * - * Retrieves the primary key. It assumes that the row in the first - * position is the primary key - * - * @param string $table Table name - * @return string - */ - public function primary($table) - { - $fields = $this->list_fields($table); - return is_array($fields) ? current($fields) : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @param string - * @return int - */ - public function count_all($table = '') - { - if ($table === '') - { - return 0; - } - - $query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); - if ($query->num_rows() === 0) - { - return 0; - } - - $query = $query->row(); - $this->_reset_select(); - return (int) $query->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Returns an array of table names - * - * @param string $constrain_by_prefix = FALSE - * @return array - */ - public function list_tables($constrain_by_prefix = FALSE) - { - // Is there a cached result? - if (isset($this->data_cache['table_names'])) - { - return $this->data_cache['table_names']; - } - - if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix))) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - $this->data_cache['table_names'] = array(); - $query = $this->query($sql); - - foreach ($query->result_array() as $row) - { - // Do we know from which column to get the table name? - if ( ! isset($key)) - { - if (isset($row['table_name'])) - { - $key = 'table_name'; - } - elseif (isset($row['TABLE_NAME'])) - { - $key = 'TABLE_NAME'; - } - else - { - /* We have no other choice but to just get the first element's key. - * Due to array_shift() accepting its argument by reference, if - * E_STRICT is on, this would trigger a warning. So we'll have to - * assign it first. - */ - $key = array_keys($row); - $key = array_shift($key); - } - } - - $this->data_cache['table_names'][] = $row[$key]; - } - - return $this->data_cache['table_names']; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular table exists - * - * @param string $table_name - * @return bool - */ - public function table_exists($table_name) - { - return in_array($this->protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables()); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * @param string $table Table name - * @return array - */ - public function list_fields($table) - { - // Is there a cached result? - if (isset($this->data_cache['field_names'][$table])) - { - return $this->data_cache['field_names'][$table]; - } - - if (FALSE === ($sql = $this->_list_columns($table))) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - $query = $this->query($sql); - $this->data_cache['field_names'][$table] = array(); - - foreach ($query->result_array() as $row) - { - // Do we know from where to get the column's name? - if ( ! isset($key)) - { - if (isset($row['column_name'])) - { - $key = 'column_name'; - } - elseif (isset($row['COLUMN_NAME'])) - { - $key = 'COLUMN_NAME'; - } - else - { - // We have no other choice but to just get the first element's key. - $key = key($row); - } - } - - $this->data_cache['field_names'][$table][] = $row[$key]; - } - - return $this->data_cache['field_names'][$table]; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular field exists - * - * @param string - * @param string - * @return bool - */ - public function field_exists($field_name, $table_name) - { - return in_array($field_name, $this->list_fields($table_name)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table the table name - * @return array - */ - public function field_data($table) - { - $query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE))); - return ($query) ? $query->field_data() : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @param mixed - * @return mixed - */ - public function escape_identifiers($item) - { - if ($this->_escape_char === '' OR empty($item) OR in_array($item, $this->_reserved_identifiers)) - { - return $item; - } - elseif (is_array($item)) - { - foreach ($item as $key => $value) - { - $item[$key] = $this->escape_identifiers($value); - } - - return $item; - } - // Avoid breaking functions and literal values inside queries - elseif (ctype_digit($item) OR $item[0] === "'" OR ($this->_escape_char !== '"' && $item[0] === '"') OR strpos($item, '(') !== FALSE) - { - return $item; - } - - static $preg_ec = array(); - - if (empty($preg_ec)) - { - if (is_array($this->_escape_char)) - { - $preg_ec = array( - preg_quote($this->_escape_char[0], '/'), - preg_quote($this->_escape_char[1], '/'), - $this->_escape_char[0], - $this->_escape_char[1] - ); - } - else - { - $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char, '/'); - $preg_ec[2] = $preg_ec[3] = $this->_escape_char; - } - } - - foreach ($this->_reserved_identifiers as $id) - { - if (strpos($item, '.'.$id) !== FALSE) - { - return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?\./i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item); - } - } - - return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?(\.)?/i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item); - } - - // -------------------------------------------------------------------- - - /** - * Generate an insert string - * - * @param string the table upon which the query will be performed - * @param array an associative array data of key/values - * @return string - */ - public function insert_string($table, $data) - { - $fields = $values = array(); - - foreach ($data as $key => $val) - { - $fields[] = $this->escape_identifiers($key); - $values[] = $this->escape($val); - } - - return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); - } - - // -------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - protected function _insert($table, $keys, $values) - { - return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; - } - - // -------------------------------------------------------------------- - - /** - * Generate an update string - * - * @param string the table upon which the query will be performed - * @param array an associative array data of key/values - * @param mixed the "where" statement - * @return string - */ - public function update_string($table, $data, $where) - { - if (empty($where)) - { - return FALSE; - } - - $this->where($where); - - $fields = array(); - foreach ($data as $key => $val) - { - $fields[$this->protect_identifiers($key)] = $this->escape($val); - } - - $sql = $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields); - $this->_reset_write(); - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string the table name - * @param array the update data - * @return string - */ - protected function _update($table, $values) - { - foreach ($values as $key => $val) - { - $valstr[] = $key.' = '.$val; - } - - return 'UPDATE '.$table.' SET '.implode(', ', $valstr) - .$this->_compile_wh('qb_where') - .$this->_compile_order_by() - .($this->qb_limit ? ' LIMIT '.$this->qb_limit : ''); - } - - // -------------------------------------------------------------------- - - /** - * Tests whether the string has an SQL operator - * - * @param string - * @return bool - */ - protected function _has_operator($str) - { - return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str)); - } - - // -------------------------------------------------------------------- - - /** - * Returns the SQL string operator - * - * @param string - * @return string - */ - protected function _get_operator($str) - { - static $_operators; - - if (empty($_operators)) - { - $_les = ($this->_like_escape_str !== '') - ? '\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/') - : ''; - $_operators = array( - '\s*(?:<|>|!)?=\s*', // =, <=, >=, != - '\s*<>?\s*', // <, <> - '\s*>\s*', // > - '\s+IS NULL', // IS NULL - '\s+IS NOT NULL', // IS NOT NULL - '\s+EXISTS\s*\(.*\)', // EXISTS(sql) - '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) - '\s+BETWEEN\s+', // BETWEEN value AND value - '\s+IN\s*\(.*\)', // IN(list) - '\s+NOT IN\s*\(.*\)', // NOT IN (list) - '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] - '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] - ); - - } - - return preg_match('/'.implode('|', $_operators).'/i', $str, $match) - ? $match[0] : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Enables a native PHP function to be run, using a platform agnostic wrapper. - * - * @param string $function Function name - * @return mixed - */ - public function call_function($function) - { - $driver = ($this->dbdriver === 'postgre') ? 'pg_' : $this->dbdriver.'_'; - - if (FALSE === strpos($driver, $function)) - { - $function = $driver.$function; - } - - if ( ! function_exists($function)) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; - } - - return (func_num_args() > 1) - ? call_user_func_array($function, array_slice(func_get_args(), 1)) - : call_user_func($function); - } - - // -------------------------------------------------------------------- - - /** - * Set Cache Directory Path - * - * @param string the path to the cache directory - * @return void - */ - public function cache_set_path($path = '') - { - $this->cachedir = $path; - } - - // -------------------------------------------------------------------- - - /** - * Enable Query Caching - * - * @return bool cache_on value - */ - public function cache_on() - { - return $this->cache_on = TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Disable Query Caching - * - * @return bool cache_on value - */ - public function cache_off() - { - return $this->cache_on = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Delete the cache files associated with a particular URI - * - * @param string $segment_one = '' - * @param string $segment_two = '' - * @return bool - */ - public function cache_delete($segment_one = '', $segment_two = '') - { - return $this->_cache_init() - ? $this->CACHE->delete($segment_one, $segment_two) - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Delete All cache files - * - * @return bool - */ - public function cache_delete_all() - { - return $this->_cache_init() - ? $this->CACHE->delete_all() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Initialize the Cache Class - * - * @return bool - */ - protected function _cache_init() - { - if ( ! class_exists('CI_DB_Cache', FALSE)) - { - require_once(BASEPATH.'database/DB_cache.php'); - } - elseif (is_object($this->CACHE)) - { - return TRUE; - } - - $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - public function close() - { - if ($this->conn_id) - { - $this->_close(); - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * This method would be overridden by most of the drivers. - * - * @return void - */ - protected function _close() - { - $this->conn_id = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Display an error message - * - * @param string the error message - * @param string any "swap" values - * @param bool whether to localize the message - * @return string sends the application/views/errors/error_db.php template - */ - public function display_error($error = '', $swap = '', $native = FALSE) - { - $LANG =& load_class('Lang', 'core'); - $LANG->load('db'); - - $heading = $LANG->line('db_error_heading'); - - if ($native === TRUE) - { - $message = (array) $error; - } - else - { - $message = is_array($error) ? $error : array(str_replace('%s', $swap, $LANG->line($error))); - } - - // Find the most likely culprit of the error by going through - // the backtrace until the source file is no longer in the - // database folder. - $trace = debug_backtrace(); - foreach ($trace as $call) - { - if (isset($call['file'], $call['class'])) - { - // We'll need this on Windows, as APPPATH and BASEPATH will always use forward slashes - if (DIRECTORY_SEPARATOR !== '/') - { - $call['file'] = str_replace('\\', '/', $call['file']); - } - - if (strpos($call['file'], BASEPATH.'database') === FALSE && strpos($call['class'], 'Loader') === FALSE) - { - // Found it - use a relative path for safety - $message[] = 'Filename: '.str_replace(array(APPPATH, BASEPATH), '', $call['file']); - $message[] = 'Line Number: '.$call['line']; - break; - } - } - } - - $error =& load_class('Exceptions', 'core'); - echo $error->show_error($heading, $message, 'error_db'); - exit(8); // EXIT_DATABASE - } - - // -------------------------------------------------------------------- - - /** - * Protect Identifiers - * - * This function is used extensively by the Query Builder class, and by - * a couple functions in this class. - * It takes a column or table name (optionally with an alias) and inserts - * the table prefix onto it. Some logic is necessary in order to deal with - * column names that include the path. Consider a query like this: - * - * SELECT hostname.database.table.column AS c FROM hostname.database.table - * - * Or a query with aliasing: - * - * SELECT m.member_id, m.member_name FROM members AS m - * - * Since the column name can include up to four segments (host, DB, table, column) - * or also have an alias prefix, we need to do a bit of work to figure this out and - * insert the table prefix (if it exists) in the proper position, and escape only - * the correct identifiers. - * - * @param string - * @param bool - * @param mixed - * @param bool - * @return string - */ - public function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) - { - if ( ! is_bool($protect_identifiers)) - { - $protect_identifiers = $this->_protect_identifiers; - } - - if (is_array($item)) - { - $escaped_array = array(); - foreach ($item as $k => $v) - { - $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v, $prefix_single, $protect_identifiers, $field_exists); - } - - return $escaped_array; - } - - // This is basically a bug fix for queries that use MAX, MIN, etc. - // If a parenthesis is found we know that we do not need to - // escape the data or add a prefix. There's probably a more graceful - // way to deal with this, but I'm not thinking of it -- Rick - // - // Added exception for single quotes as well, we don't want to alter - // literal strings. -- Narf - if (strcspn($item, "()'") !== strlen($item)) - { - return $item; - } - - // Convert tabs or multiple spaces into single spaces - $item = preg_replace('/\s+/', ' ', trim($item)); - - // If the item has an alias declaration we remove it and set it aside. - // Note: strripos() is used in order to support spaces in table names - if ($offset = strripos($item, ' AS ')) - { - $alias = ($protect_identifiers) - ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4)) - : substr($item, $offset); - $item = substr($item, 0, $offset); - } - elseif ($offset = strrpos($item, ' ')) - { - $alias = ($protect_identifiers) - ? ' '.$this->escape_identifiers(substr($item, $offset + 1)) - : substr($item, $offset); - $item = substr($item, 0, $offset); - } - else - { - $alias = ''; - } - - // Break the string apart if it contains periods, then insert the table prefix - // in the correct location, assuming the period doesn't indicate that we're dealing - // with an alias. While we're at it, we will escape the components - if (strpos($item, '.') !== FALSE) - { - $parts = explode('.', $item); - - // Does the first segment of the exploded item match - // one of the aliases previously identified? If so, - // we have nothing more to do other than escape the item - // - // NOTE: The ! empty() condition prevents this method - // from breaking when QB isn't enabled. - if ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables)) - { - if ($protect_identifiers === TRUE) - { - foreach ($parts as $key => $val) - { - if ( ! in_array($val, $this->_reserved_identifiers)) - { - $parts[$key] = $this->escape_identifiers($val); - } - } - - $item = implode('.', $parts); - } - - return $item.$alias; - } - - // Is there a table prefix defined in the config file? If not, no need to do anything - if ($this->dbprefix !== '') - { - // We now add the table prefix based on some logic. - // Do we have 4 segments (hostname.database.table.column)? - // If so, we add the table prefix to the column name in the 3rd segment. - if (isset($parts[3])) - { - $i = 2; - } - // Do we have 3 segments (database.table.column)? - // If so, we add the table prefix to the column name in 2nd position - elseif (isset($parts[2])) - { - $i = 1; - } - // Do we have 2 segments (table.column)? - // If so, we add the table prefix to the column name in 1st segment - else - { - $i = 0; - } - - // This flag is set when the supplied $item does not contain a field name. - // This can happen when this function is being called from a JOIN. - if ($field_exists === FALSE) - { - $i++; - } - - // Verify table prefix and replace if necessary - if ($this->swap_pre !== '' && strpos($parts[$i], $this->swap_pre) === 0) - { - $parts[$i] = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $parts[$i]); - } - // We only add the table prefix if it does not already exist - elseif (strpos($parts[$i], $this->dbprefix) !== 0) - { - $parts[$i] = $this->dbprefix.$parts[$i]; - } - - // Put the parts back together - $item = implode('.', $parts); - } - - if ($protect_identifiers === TRUE) - { - $item = $this->escape_identifiers($item); - } - - return $item.$alias; - } - - // Is there a table prefix? If not, no need to insert it - if ($this->dbprefix !== '') - { - // Verify table prefix and replace if necessary - if ($this->swap_pre !== '' && strpos($item, $this->swap_pre) === 0) - { - $item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item); - } - // Do we prefix an item with no segments? - elseif ($prefix_single === TRUE && strpos($item, $this->dbprefix) !== 0) - { - $item = $this->dbprefix.$item; - } - } - - if ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers)) - { - $item = $this->escape_identifiers($item); - } - - return $item.$alias; - } - - // -------------------------------------------------------------------- - - /** - * Dummy method that allows Query Builder class to be disabled - * and keep count_all() working. - * - * @return void - */ - protected function _reset_select() - { - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/DB_forge.php b/vendor_old/codeigniter/framework/system/database/DB_forge.php deleted file mode 100644 index 7289235..0000000 --- a/vendor_old/codeigniter/framework/system/database/DB_forge.php +++ /dev/null @@ -1,1032 +0,0 @@ -db =& $db; - log_message('info', 'Database Forge Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return bool - */ - public function create_database($db_name) - { - if ($this->_create_database === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - elseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat))) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - if ( ! empty($this->db->data_cache['db_names'])) - { - $this->db->data_cache['db_names'][] = $db_name; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name - * @return bool - */ - public function drop_database($db_name) - { - if ($this->_drop_database === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - elseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name)))) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - if ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($db_name), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Add Key - * - * @param string $key - * @param bool $primary - * @return CI_DB_forge - */ - public function add_key($key, $primary = FALSE) - { - // DO NOT change this! This condition is only applicable - // for PRIMARY keys because you can only have one such, - // and therefore all fields you add to it will be included - // in the same, composite PRIMARY KEY. - // - // It's not the same for regular indexes. - if ($primary === TRUE && is_array($key)) - { - foreach ($key as $one) - { - $this->add_key($one, $primary); - } - - return $this; - } - - if ($primary === TRUE) - { - $this->primary_keys[] = $key; - } - else - { - $this->keys[] = $key; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Add Field - * - * @param array $field - * @return CI_DB_forge - */ - public function add_field($field) - { - if (is_string($field)) - { - if ($field === 'id') - { - $this->add_field(array( - 'id' => array( - 'type' => 'INT', - 'constraint' => 9, - 'auto_increment' => TRUE - ) - )); - $this->add_key('id', TRUE); - } - else - { - if (strpos($field, ' ') === FALSE) - { - show_error('Field information is required for that operation.'); - } - - $this->fields[] = $field; - } - } - - if (is_array($field)) - { - $this->fields = array_merge($this->fields, $field); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @param string $table Table name - * @param bool $if_not_exists Whether to add IF NOT EXISTS condition - * @param array $attributes Associative array of table attributes - * @return bool - */ - public function create_table($table, $if_not_exists = FALSE, array $attributes = array()) - { - if ($table === '') - { - show_error('A table name is required for that operation.'); - } - else - { - $table = $this->db->dbprefix.$table; - } - - if (count($this->fields) === 0) - { - show_error('Field information is required.'); - } - - $sql = $this->_create_table($table, $if_not_exists, $attributes); - - if (is_bool($sql)) - { - $this->_reset(); - if ($sql === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - } - - if (($result = $this->db->query($sql)) !== FALSE) - { - isset($this->db->data_cache['table_names']) && $this->db->data_cache['table_names'][] = $table; - - // Most databases don't support creating indexes from within the CREATE TABLE statement - if ( ! empty($this->keys)) - { - for ($i = 0, $sqls = $this->_process_indexes($table), $c = count($sqls); $i < $c; $i++) - { - $this->db->query($sqls[$i]); - } - } - } - - $this->_reset(); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Create Table - * - * @param string $table Table name - * @param bool $if_not_exists Whether to add 'IF NOT EXISTS' condition - * @param array $attributes Associative array of table attributes - * @return mixed - */ - protected function _create_table($table, $if_not_exists, $attributes) - { - if ($if_not_exists === TRUE && $this->_create_table_if === FALSE) - { - if ($this->db->table_exists($table)) - { - return TRUE; - } - else - { - $if_not_exists = FALSE; - } - } - - $sql = ($if_not_exists) - ? sprintf($this->_create_table_if, $this->db->escape_identifiers($table)) - : 'CREATE TABLE'; - - $columns = $this->_process_fields(TRUE); - for ($i = 0, $c = count($columns); $i < $c; $i++) - { - $columns[$i] = ($columns[$i]['_literal'] !== FALSE) - ? "\n\t".$columns[$i]['_literal'] - : "\n\t".$this->_process_column($columns[$i]); - } - - $columns = implode(',', $columns) - .$this->_process_primary_keys($table); - - // Are indexes created from within the CREATE TABLE statement? (e.g. in MySQL) - if ($this->_create_table_keys === TRUE) - { - $columns .= $this->_process_indexes($table); - } - - // _create_table will usually have the following format: "%s %s (%s\n)" - $sql = sprintf($this->_create_table.'%s', - $sql, - $this->db->escape_identifiers($table), - $columns, - $this->_create_table_attr($attributes) - ); - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * CREATE TABLE attributes - * - * @param array $attributes Associative array of table attributes - * @return string - */ - protected function _create_table_attr($attributes) - { - $sql = ''; - - foreach (array_keys($attributes) as $key) - { - if (is_string($key)) - { - $sql .= ' '.strtoupper($key).' '.$attributes[$key]; - } - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * @param string $table_name Table name - * @param bool $if_exists Whether to add an IF EXISTS condition - * @return bool - */ - public function drop_table($table_name, $if_exists = FALSE) - { - if ($table_name === '') - { - return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE; - } - - if (($query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists)) === TRUE) - { - return TRUE; - } - - $query = $this->db->query($query); - - // Update table list cache - if ($query && ! empty($this->db->data_cache['table_names'])) - { - $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['table_names'][$key]); - } - } - - return $query; - } - - // -------------------------------------------------------------------- - - /** - * Drop Table - * - * Generates a platform-specific DROP TABLE string - * - * @param string $table Table name - * @param bool $if_exists Whether to add an IF EXISTS condition - * @return string - */ - protected function _drop_table($table, $if_exists) - { - $sql = 'DROP TABLE'; - - if ($if_exists) - { - if ($this->_drop_table_if === FALSE) - { - if ( ! $this->db->table_exists($table)) - { - return TRUE; - } - } - else - { - $sql = sprintf($this->_drop_table_if, $this->db->escape_identifiers($table)); - } - } - - return $sql.' '.$this->db->escape_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Rename Table - * - * @param string $table_name Old table name - * @param string $new_table_name New table name - * @return bool - */ - public function rename_table($table_name, $new_table_name) - { - if ($table_name === '' OR $new_table_name === '') - { - show_error('A table name is required for that operation.'); - return FALSE; - } - elseif ($this->_rename_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $result = $this->db->query(sprintf($this->_rename_table, - $this->db->escape_identifiers($this->db->dbprefix.$table_name), - $this->db->escape_identifiers($this->db->dbprefix.$new_table_name)) - ); - - if ($result && ! empty($this->db->data_cache['table_names'])) - { - $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); - if ($key !== FALSE) - { - $this->db->data_cache['table_names'][$key] = $this->db->dbprefix.$new_table_name; - } - } - - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Column Add - * - * @todo Remove deprecated $_after option in 3.1+ - * @param string $table Table name - * @param array $field Column definition - * @param string $_after Column for AFTER clause (deprecated) - * @return bool - */ - public function add_column($table, $field, $_after = NULL) - { - // Work-around for literal column definitions - is_array($field) OR $field = array($field); - - foreach (array_keys($field) as $k) - { - // Backwards-compatibility work-around for MySQL/CUBRID AFTER clause (remove in 3.1+) - if ($_after !== NULL && is_array($field[$k]) && ! isset($field[$k]['after'])) - { - $field[$k]['after'] = $_after; - } - - $this->add_field(array($k => $field[$k])); - } - - $sqls = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->_process_fields()); - $this->_reset(); - if ($sqls === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - for ($i = 0, $c = count($sqls); $i < $c; $i++) - { - if ($this->db->query($sqls[$i]) === FALSE) - { - return FALSE; - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Column Drop - * - * @param string $table Table name - * @param string $column_name Column name - * @return bool - */ - public function drop_column($table, $column_name) - { - $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); - if ($sql === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - return $this->db->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Column Modify - * - * @param string $table Table name - * @param string $field Column definition - * @return bool - */ - public function modify_column($table, $field) - { - // Work-around for literal column definitions - is_array($field) OR $field = array($field); - - foreach (array_keys($field) as $k) - { - $this->add_field(array($k => $field[$k])); - } - - if (count($this->fields) === 0) - { - show_error('Field information is required.'); - } - - $sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->_process_fields()); - $this->_reset(); - if ($sqls === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - for ($i = 0, $c = count($sqls); $i < $c; $i++) - { - if ($this->db->query($sqls[$i]) === FALSE) - { - return FALSE; - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' '; - - // DROP has everything it needs now. - if ($alter_type === 'DROP') - { - return $sql.'DROP COLUMN '.$this->db->escape_identifiers($field); - } - - $sql .= ($alter_type === 'ADD') - ? 'ADD ' - : $alter_type.' COLUMN '; - - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql - .($field[$i]['_literal'] !== FALSE ? $field[$i]['_literal'] : $this->_process_column($field[$i])); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process fields - * - * @param bool $create_table - * @return array - */ - protected function _process_fields($create_table = FALSE) - { - $fields = array(); - - foreach ($this->fields as $key => $attributes) - { - if (is_int($key) && ! is_array($attributes)) - { - $fields[] = array('_literal' => $attributes); - continue; - } - - $attributes = array_change_key_case($attributes, CASE_UPPER); - - if ($create_table === TRUE && empty($attributes['TYPE'])) - { - continue; - } - - isset($attributes['TYPE']) && $this->_attr_type($attributes); - - $field = array( - 'name' => $key, - 'new_name' => isset($attributes['NAME']) ? $attributes['NAME'] : NULL, - 'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL, - 'length' => '', - 'unsigned' => '', - 'null' => '', - 'unique' => '', - 'default' => '', - 'auto_increment' => '', - '_literal' => FALSE - ); - - isset($attributes['TYPE']) && $this->_attr_unsigned($attributes, $field); - - if ($create_table === FALSE) - { - if (isset($attributes['AFTER'])) - { - $field['after'] = $attributes['AFTER']; - } - elseif (isset($attributes['FIRST'])) - { - $field['first'] = (bool) $attributes['FIRST']; - } - } - - $this->_attr_default($attributes, $field); - - if (isset($attributes['NULL'])) - { - if ($attributes['NULL'] === TRUE) - { - $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; - } - else - { - $field['null'] = ' NOT NULL'; - } - } - elseif ($create_table === TRUE) - { - $field['null'] = ' NOT NULL'; - } - - $this->_attr_auto_increment($attributes, $field); - $this->_attr_unique($attributes, $field); - - if (isset($attributes['COMMENT'])) - { - $field['comment'] = $this->db->escape($attributes['COMMENT']); - } - - if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT'])) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); - default: - $field['length'] = is_array($attributes['CONSTRAINT']) - ? '('.implode(',', $attributes['CONSTRAINT']).')' - : '('.$attributes['CONSTRAINT'].')'; - break; - } - } - - $fields[] = $field; - } - - return $fields; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['default'] - .$field['null'] - .$field['auto_increment'] - .$field['unique']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - // Usually overridden by drivers - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNSIGNED - * - * Depending on the _unsigned property value: - * - * - TRUE will always set $field['unsigned'] to 'UNSIGNED' - * - FALSE will always set $field['unsigned'] to '' - * - array(TYPE) will set $field['unsigned'] to 'UNSIGNED', - * if $attributes['TYPE'] is found in the array - * - array(TYPE => UTYPE) will change $field['type'], - * from TYPE to UTYPE in case of a match - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unsigned(&$attributes, &$field) - { - if (empty($attributes['UNSIGNED']) OR $attributes['UNSIGNED'] !== TRUE) - { - return; - } - - // Reset the attribute in order to avoid issues if we do type conversion - $attributes['UNSIGNED'] = FALSE; - - if (is_array($this->_unsigned)) - { - foreach (array_keys($this->_unsigned) as $key) - { - if (is_int($key) && strcasecmp($attributes['TYPE'], $this->_unsigned[$key]) === 0) - { - $field['unsigned'] = ' UNSIGNED'; - return; - } - elseif (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0) - { - $field['type'] = $key; - return; - } - } - - return; - } - - $field['unsigned'] = ($this->_unsigned === TRUE) ? ' UNSIGNED' : ''; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute DEFAULT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_default(&$attributes, &$field) - { - if ($this->_default === FALSE) - { - return; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - if ($attributes['DEFAULT'] === NULL) - { - $field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null; - - // Override the NULL attribute if that's our default - $attributes['NULL'] = TRUE; - $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; - } - else - { - $field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']); - } - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE'; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' AUTO_INCREMENT'; - } - } - - // -------------------------------------------------------------------- - - /** - * Process primary keys - * - * @param string $table Table name - * @return string - */ - protected function _process_primary_keys($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->primary_keys); $i < $c; $i++) - { - if ( ! isset($this->fields[$this->primary_keys[$i]])) - { - unset($this->primary_keys[$i]); - } - } - - if (count($this->primary_keys) > 0) - { - $sql .= ",\n\tCONSTRAINT ".$this->db->escape_identifiers('pk_'.$table) - .' PRIMARY KEY('.implode(', ', $this->db->escape_identifiers($this->primary_keys)).')'; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table - * @return string - */ - protected function _process_indexes($table) - { - $sqls = array(); - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sqls[] = 'CREATE INDEX '.$this->db->escape_identifiers($table.'_'.implode('_', $this->keys[$i])) - .' ON '.$this->db->escape_identifiers($table) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).');'; - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Reset - * - * Resets table creation vars - * - * @return void - */ - protected function _reset() - { - $this->fields = $this->keys = $this->primary_keys = array(); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/DB_query_builder.php b/vendor_old/codeigniter/framework/system/database/DB_query_builder.php deleted file mode 100644 index 0abf2a2..0000000 --- a/vendor_old/codeigniter/framework/system/database/DB_query_builder.php +++ /dev/null @@ -1,2805 +0,0 @@ -_protect_identifiers; - - foreach ($select as $val) - { - $val = trim($val); - - if ($val !== '') - { - $this->qb_select[] = $val; - $this->qb_no_escape[] = $escape; - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_select[] = $val; - $this->qb_cache_exists[] = 'select'; - $this->qb_cache_no_escape[] = $escape; - } - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Select Max - * - * Generates a SELECT MAX(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_max($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'MAX'); - } - - // -------------------------------------------------------------------- - - /** - * Select Min - * - * Generates a SELECT MIN(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_min($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'MIN'); - } - - // -------------------------------------------------------------------- - - /** - * Select Average - * - * Generates a SELECT AVG(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_avg($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'AVG'); - } - - // -------------------------------------------------------------------- - - /** - * Select Sum - * - * Generates a SELECT SUM(field) portion of a query - * - * @param string the field - * @param string an alias - * @return CI_DB_query_builder - */ - public function select_sum($select = '', $alias = '') - { - return $this->_max_min_avg_sum($select, $alias, 'SUM'); - } - - // -------------------------------------------------------------------- - - /** - * SELECT [MAX|MIN|AVG|SUM]() - * - * @used-by select_max() - * @used-by select_min() - * @used-by select_avg() - * @used-by select_sum() - * - * @param string $select Field name - * @param string $alias - * @param string $type - * @return CI_DB_query_builder - */ - protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') - { - if ( ! is_string($select) OR $select === '') - { - $this->display_error('db_invalid_query'); - } - - $type = strtoupper($type); - - if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM'))) - { - show_error('Invalid function type: '.$type); - } - - if ($alias === '') - { - $alias = $this->_create_alias_from_table(trim($select)); - } - - $sql = $type.'('.$this->protect_identifiers(trim($select)).') AS '.$this->escape_identifiers(trim($alias)); - - $this->qb_select[] = $sql; - $this->qb_no_escape[] = NULL; - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_select[] = $sql; - $this->qb_cache_exists[] = 'select'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Determines the alias name based on the table - * - * @param string $item - * @return string - */ - protected function _create_alias_from_table($item) - { - if (strpos($item, '.') !== FALSE) - { - $item = explode('.', $item); - return end($item); - } - - return $item; - } - - // -------------------------------------------------------------------- - - /** - * DISTINCT - * - * Sets a flag which tells the query string compiler to add DISTINCT - * - * @param bool $val - * @return CI_DB_query_builder - */ - public function distinct($val = TRUE) - { - $this->qb_distinct = is_bool($val) ? $val : TRUE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * From - * - * Generates the FROM portion of the query - * - * @param mixed $from can be a string or array - * @return CI_DB_query_builder - */ - public function from($from) - { - foreach ((array) $from as $val) - { - if (strpos($val, ',') !== FALSE) - { - foreach (explode(',', $val) as $v) - { - $v = trim($v); - $this->_track_aliases($v); - - $this->qb_from[] = $v = $this->protect_identifiers($v, TRUE, NULL, FALSE); - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_from[] = $v; - $this->qb_cache_exists[] = 'from'; - } - } - } - else - { - $val = trim($val); - - // Extract any aliases that might exist. We use this information - // in the protect_identifiers to know whether to add a table prefix - $this->_track_aliases($val); - - $this->qb_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE); - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_from[] = $val; - $this->qb_cache_exists[] = 'from'; - } - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * JOIN - * - * Generates the JOIN portion of the query - * - * @param string - * @param string the join condition - * @param string the type of join - * @param string whether not to try to escape identifiers - * @return CI_DB_query_builder - */ - public function join($table, $cond, $type = '', $escape = NULL) - { - if ($type !== '') - { - $type = strtoupper(trim($type)); - - if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'), TRUE)) - { - $type = ''; - } - else - { - $type .= ' '; - } - } - - // Extract any aliases that might exist. We use this information - // in the protect_identifiers to know whether to add a table prefix - $this->_track_aliases($table); - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - if ( ! $this->_has_operator($cond)) - { - $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; - } - elseif ($escape === FALSE) - { - $cond = ' ON '.$cond; - } - else - { - // Split multiple conditions - if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) - { - $conditions = array(); - $joints = $joints[0]; - array_unshift($joints, array('', 0)); - - for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) - { - $joints[$i][1] += strlen($joints[$i][0]); // offset - $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); - $pos = $joints[$i][1] - strlen($joints[$i][0]); - $joints[$i] = $joints[$i][0]; - } - } - else - { - $conditions = array($cond); - $joints = array(''); - } - - $cond = ' ON '; - for ($i = 0, $c = count($conditions); $i < $c; $i++) - { - $operator = $this->_get_operator($conditions[$i]); - $cond .= $joints[$i]; - $cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)".preg_quote($operator)."(.*)/i", $conditions[$i], $match) - ? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3]) - : $conditions[$i]; - } - } - - // Do we want to escape the table name? - if ($escape === TRUE) - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // Assemble the JOIN statement - $this->qb_join[] = $join = $type.'JOIN '.$table.$cond; - - if ($this->qb_caching === TRUE) - { - $this->qb_cache_join[] = $join; - $this->qb_cache_exists[] = 'join'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * WHERE - * - * Generates the WHERE portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed - * @param mixed - * @param bool - * @return CI_DB_query_builder - */ - public function where($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_where', $key, $value, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR WHERE - * - * Generates the WHERE portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed - * @param mixed - * @param bool - * @return CI_DB_query_builder - */ - public function or_where($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_where', $key, $value, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * WHERE, HAVING - * - * @used-by where() - * @used-by or_where() - * @used-by having() - * @used-by or_having() - * - * @param string $qb_key 'qb_where' or 'qb_having' - * @param mixed $key - * @param mixed $value - * @param string $type - * @param bool $escape - * @return CI_DB_query_builder - */ - protected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = NULL) - { - $qb_cache_key = ($qb_key === 'qb_having') ? 'qb_cache_having' : 'qb_cache_where'; - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - // If the escape value was not set will base it on the global setting - is_bool($escape) OR $escape = $this->_protect_identifiers; - - foreach ($key as $k => $v) - { - $prefix = (count($this->$qb_key) === 0 && count($this->$qb_cache_key) === 0) - ? $this->_group_get_type('') - : $this->_group_get_type($type); - - if ($v !== NULL) - { - if ($escape === TRUE) - { - $v = ' '.$this->escape($v); - } - - if ( ! $this->_has_operator($k)) - { - $k .= ' = '; - } - } - elseif ( ! $this->_has_operator($k)) - { - // value appears not to have been set, assign the test to IS NULL - $k .= ' IS NULL'; - } - elseif (preg_match('/\s*(!?=|<>|\sIS(?:\s+NOT)?\s)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) - { - $k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); - } - - $this->{$qb_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); - if ($this->qb_caching === TRUE) - { - $this->{$qb_cache_key}[] = array('condition' => $prefix.$k.$v, 'escape' => $escape); - $this->qb_cache_exists[] = substr($qb_key, 3); - } - - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * WHERE IN - * - * Generates a WHERE field IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function where_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, FALSE, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR WHERE IN - * - * Generates a WHERE field IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_where_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, FALSE, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * WHERE NOT IN - * - * Generates a WHERE field NOT IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function where_not_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, TRUE, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR WHERE NOT IN - * - * Generates a WHERE field NOT IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_where_not_in($key = NULL, $values = NULL, $escape = NULL) - { - return $this->_where_in($key, $values, TRUE, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * Internal WHERE IN - * - * @used-by where_in() - * @used-by or_where_in() - * @used-by where_not_in() - * @used-by or_where_not_in() - * - * @param string $key The field to search - * @param array $values The values searched on - * @param bool $not If the statement would be IN or NOT IN - * @param string $type - * @param bool $escape - * @return CI_DB_query_builder - */ - protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ', $escape = NULL) - { - if ($key === NULL OR $values === NULL) - { - return $this; - } - - if ( ! is_array($values)) - { - $values = array($values); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - $not = ($not) ? ' NOT' : ''; - - if ($escape === TRUE) - { - $where_in = array(); - foreach ($values as $value) - { - $where_in[] = $this->escape($value); - } - } - else - { - $where_in = array_values($values); - } - - $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) - ? $this->_group_get_type('') - : $this->_group_get_type($type); - - $where_in = array( - 'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')', - 'escape' => $escape - ); - - $this->qb_where[] = $where_in; - if ($this->qb_caching === TRUE) - { - $this->qb_cache_where[] = $where_in; - $this->qb_cache_exists[] = 'where'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * LIKE - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'AND ', $side, '', $escape); - } - - // -------------------------------------------------------------------- - - /** - * NOT LIKE - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function not_like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR LIKE - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'OR ', $side, '', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR NOT LIKE - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_not_like($field, $match = '', $side = 'both', $escape = NULL) - { - return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape); - } - - // -------------------------------------------------------------------- - - /** - * Internal LIKE - * - * @used-by like() - * @used-by or_like() - * @used-by not_like() - * @used-by or_not_like() - * - * @param mixed $field - * @param string $match - * @param string $type - * @param string $side - * @param string $not - * @param bool $escape - * @return CI_DB_query_builder - */ - protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '', $escape = NULL) - { - if ( ! is_array($field)) - { - $field = array($field => $match); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - // lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh) - $side = strtolower($side); - - foreach ($field as $k => $v) - { - $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) - ? $this->_group_get_type('') : $this->_group_get_type($type); - - if ($escape === TRUE) - { - $v = $this->escape_like_str($v); - } - - if ($side === 'none') - { - $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}'"; - } - elseif ($side === 'before') - { - $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}'"; - } - elseif ($side === 'after') - { - $like_statement = "{$prefix} {$k} {$not} LIKE '{$v}%'"; - } - else - { - $like_statement = "{$prefix} {$k} {$not} LIKE '%{$v}%'"; - } - - // some platforms require an escape sequence definition for LIKE wildcards - if ($escape === TRUE && $this->_like_escape_str !== '') - { - $like_statement .= sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - $this->qb_where[] = array('condition' => $like_statement, 'escape' => $escape); - if ($this->qb_caching === TRUE) - { - $this->qb_cache_where[] = array('condition' => $like_statement, 'escape' => $escape); - $this->qb_cache_exists[] = 'where'; - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group. - * - * @param string $not (Internal use only) - * @param string $type (Internal use only) - * @return CI_DB_query_builder - */ - public function group_start($not = '', $type = 'AND ') - { - $type = $this->_group_get_type($type); - - $this->qb_where_group_started = TRUE; - $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; - $where = array( - 'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (', - 'escape' => FALSE - ); - - $this->qb_where[] = $where; - if ($this->qb_caching) - { - $this->qb_cache_where[] = $where; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group, but ORs the group - * - * @return CI_DB_query_builder - */ - public function or_group_start() - { - return $this->group_start('', 'OR '); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group, but NOTs the group - * - * @return CI_DB_query_builder - */ - public function not_group_start() - { - return $this->group_start('NOT ', 'AND '); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group, but OR NOTs the group - * - * @return CI_DB_query_builder - */ - public function or_not_group_start() - { - return $this->group_start('NOT ', 'OR '); - } - - // -------------------------------------------------------------------- - - /** - * Ends a query group - * - * @return CI_DB_query_builder - */ - public function group_end() - { - $this->qb_where_group_started = FALSE; - $where = array( - 'condition' => str_repeat(' ', $this->qb_where_group_count--).')', - 'escape' => FALSE - ); - - $this->qb_where[] = $where; - if ($this->qb_caching) - { - $this->qb_cache_where[] = $where; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Group_get_type - * - * @used-by group_start() - * @used-by _like() - * @used-by _wh() - * @used-by _where_in() - * - * @param string $type - * @return string - */ - protected function _group_get_type($type) - { - if ($this->qb_where_group_started) - { - $type = ''; - $this->qb_where_group_started = FALSE; - } - - return $type; - } - - // -------------------------------------------------------------------- - - /** - * GROUP BY - * - * @param string $by - * @param bool $escape - * @return CI_DB_query_builder - */ - public function group_by($by, $escape = NULL) - { - is_bool($escape) OR $escape = $this->_protect_identifiers; - - if (is_string($by)) - { - $by = ($escape === TRUE) - ? explode(',', $by) - : array($by); - } - - foreach ($by as $val) - { - $val = trim($val); - - if ($val !== '') - { - $val = array('field' => $val, 'escape' => $escape); - - $this->qb_groupby[] = $val; - if ($this->qb_caching === TRUE) - { - $this->qb_cache_groupby[] = $val; - $this->qb_cache_exists[] = 'groupby'; - } - } - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * HAVING - * - * Separates multiple calls with 'AND'. - * - * @param string $key - * @param string $value - * @param bool $escape - * @return CI_DB_query_builder - */ - public function having($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_having', $key, $value, 'AND ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * OR HAVING - * - * Separates multiple calls with 'OR'. - * - * @param string $key - * @param string $value - * @param bool $escape - * @return CI_DB_query_builder - */ - public function or_having($key, $value = NULL, $escape = NULL) - { - return $this->_wh('qb_having', $key, $value, 'OR ', $escape); - } - - // -------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderby - * @param string $direction ASC, DESC or RANDOM - * @param bool $escape - * @return CI_DB_query_builder - */ - public function order_by($orderby, $direction = '', $escape = NULL) - { - $direction = strtoupper(trim($direction)); - - if ($direction === 'RANDOM') - { - $direction = ''; - - // Do we have a seed value? - $orderby = ctype_digit((string) $orderby) - ? sprintf($this->_random_keyword[1], $orderby) - : $this->_random_keyword[0]; - } - elseif (empty($orderby)) - { - return $this; - } - elseif ($direction !== '') - { - $direction = in_array($direction, array('ASC', 'DESC'), TRUE) ? ' '.$direction : ''; - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - if ($escape === FALSE) - { - $qb_orderby[] = array('field' => $orderby, 'direction' => $direction, 'escape' => FALSE); - } - else - { - $qb_orderby = array(); - foreach (explode(',', $orderby) as $field) - { - $qb_orderby[] = ($direction === '' && preg_match('/\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE)) - ? array('field' => ltrim(substr($field, 0, $match[0][1])), 'direction' => ' '.$match[1][0], 'escape' => TRUE) - : array('field' => trim($field), 'direction' => $direction, 'escape' => TRUE); - } - } - - $this->qb_orderby = array_merge($this->qb_orderby, $qb_orderby); - if ($this->qb_caching === TRUE) - { - $this->qb_cache_orderby = array_merge($this->qb_cache_orderby, $qb_orderby); - $this->qb_cache_exists[] = 'orderby'; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * @param int $value LIMIT value - * @param int $offset OFFSET value - * @return CI_DB_query_builder - */ - public function limit($value, $offset = 0) - { - is_null($value) OR $this->qb_limit = (int) $value; - empty($offset) OR $this->qb_offset = (int) $offset; - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Sets the OFFSET value - * - * @param int $offset OFFSET value - * @return CI_DB_query_builder - */ - public function offset($offset) - { - empty($offset) OR $this->qb_offset = (int) $offset; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * LIMIT string - * - * Generates a platform-specific LIMIT clause. - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit; - } - - // -------------------------------------------------------------------- - - /** - * The "set" function. - * - * Allows key/value pairs to be set for inserting or updating - * - * @param mixed - * @param string - * @param bool - * @return CI_DB_query_builder - */ - public function set($key, $value = '', $escape = NULL) - { - $key = $this->_object_to_array($key); - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - foreach ($key as $k => $v) - { - $this->qb_set[$this->protect_identifiers($k, FALSE, $escape)] = ($escape) - ? $this->escape($v) : $v; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get SELECT query string - * - * Compiles a SELECT query string and returns the sql. - * - * @param string the table name to select from (optional) - * @param bool TRUE: resets QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_select($table = '', $reset = TRUE) - { - if ($table !== '') - { - $this->_track_aliases($table); - $this->from($table); - } - - $select = $this->_compile_select(); - - if ($reset === TRUE) - { - $this->_reset_select(); - } - - return $select; - } - - // -------------------------------------------------------------------- - - /** - * Get - * - * Compiles the select statement based on the other functions called - * and runs the query - * - * @param string the table - * @param string the limit clause - * @param string the offset clause - * @return CI_DB_result - */ - public function get($table = '', $limit = NULL, $offset = NULL) - { - if ($table !== '') - { - $this->_track_aliases($table); - $this->from($table); - } - - if ( ! empty($limit)) - { - $this->limit($limit, $offset); - } - - $result = $this->query($this->_compile_select()); - $this->_reset_select(); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * "Count All Results" query - * - * Generates a platform-specific query string that counts all records - * returned by an Query Builder query. - * - * @param string - * @param bool the reset clause - * @return int - */ - public function count_all_results($table = '', $reset = TRUE) - { - if ($table !== '') - { - $this->_track_aliases($table); - $this->from($table); - } - - // ORDER BY usage is often problematic here (most notably - // on Microsoft SQL Server) and ultimately unnecessary - // for selecting COUNT(*) ... - if ( ! empty($this->qb_orderby)) - { - $orderby = $this->qb_orderby; - $this->qb_orderby = NULL; - } - - $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby)) - ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") - : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); - - if ($reset === TRUE) - { - $this->_reset_select(); - } - // If we've previously reset the qb_orderby values, get them back - elseif ( ! isset($this->qb_orderby)) - { - $this->qb_orderby = $orderby; - } - - if ($result->num_rows() === 0) - { - return 0; - } - - $row = $result->row(); - return (int) $row->numrows; - } - - // -------------------------------------------------------------------- - - /** - * Get_Where - * - * Allows the where clause, limit and offset to be added directly - * - * @param string $table - * @param string $where - * @param int $limit - * @param int $offset - * @return CI_DB_result - */ - public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL) - { - if ($table !== '') - { - $this->from($table); - } - - if ($where !== NULL) - { - $this->where($where); - } - - if ( ! empty($limit)) - { - $this->limit($limit, $offset); - } - - $result = $this->query($this->_compile_select()); - $this->_reset_select(); - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Insert_Batch - * - * Compiles batch insert strings and runs the queries - * - * @param string $table Table to insert into - * @param array $set An associative array of insert values - * @param bool $escape Whether to escape values and identifiers - * @return int Number of rows inserted or FALSE on failure - */ - public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100) - { - if ($set === NULL) - { - if (empty($this->qb_set)) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - } - else - { - if (empty($set)) - { - return ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE; - } - - $this->set_insert_batch($set, '', $escape); - } - - if (strlen($table) === 0) - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - - // Batch this baby - $affected_rows = 0; - for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) - { - if ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size)))) - { - $affected_rows += $this->affected_rows(); - } - } - - $this->_reset_write(); - return $affected_rows; - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _insert_batch($table, $keys, $values) - { - return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values); - } - - // -------------------------------------------------------------------- - - /** - * The "set_insert_batch" function. Allows key/value pairs to be set for batch inserts - * - * @param mixed - * @param string - * @param bool - * @return CI_DB_query_builder - */ - public function set_insert_batch($key, $value = '', $escape = NULL) - { - $key = $this->_object_to_array_batch($key); - - if ( ! is_array($key)) - { - $key = array($key => $value); - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - $keys = array_keys($this->_object_to_array(reset($key))); - sort($keys); - - foreach ($key as $row) - { - $row = $this->_object_to_array($row); - if (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0) - { - // batch function above returns an error on an empty array - $this->qb_set[] = array(); - return; - } - - ksort($row); // puts $row in the same order as our keys - - if ($escape !== FALSE) - { - $clean = array(); - foreach ($row as $value) - { - $clean[] = $this->escape($value); - } - - $row = $clean; - } - - $this->qb_set[] = '('.implode(',', $row).')'; - } - - foreach ($keys as $k) - { - $this->qb_keys[] = $this->protect_identifiers($k, FALSE, $escape); - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Get INSERT query string - * - * Compiles an insert query and returns the sql - * - * @param string the table to insert into - * @param bool TRUE: reset QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_insert($table = '', $reset = TRUE) - { - if ($this->_validate_insert($table) === FALSE) - { - return FALSE; - } - - $sql = $this->_insert( - $this->protect_identifiers( - $this->qb_from[0], TRUE, NULL, FALSE - ), - array_keys($this->qb_set), - array_values($this->qb_set) - ); - - if ($reset === TRUE) - { - $this->_reset_write(); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Insert - * - * Compiles an insert string and runs the query - * - * @param string the table to insert data into - * @param array an associative array of insert values - * @param bool $escape Whether to escape values and identifiers - * @return bool TRUE on success, FALSE on failure - */ - public function insert($table = '', $set = NULL, $escape = NULL) - { - if ($set !== NULL) - { - $this->set($set, '', $escape); - } - - if ($this->_validate_insert($table) === FALSE) - { - return FALSE; - } - - $sql = $this->_insert( - $this->protect_identifiers( - $this->qb_from[0], TRUE, $escape, FALSE - ), - array_keys($this->qb_set), - array_values($this->qb_set) - ); - - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Validate Insert - * - * This method is used by both insert() and get_compiled_insert() to - * validate that the there data is actually being set and that table - * has been chosen to be inserted into. - * - * @param string the table to insert data into - * @return string - */ - protected function _validate_insert($table = '') - { - if (count($this->qb_set) === 0) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - - if ($table !== '') - { - $this->qb_from[0] = $table; - } - elseif ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Replace - * - * Compiles an replace into string and runs the query - * - * @param string the table to replace data into - * @param array an associative array of insert values - * @return bool TRUE on success, FALSE on failure - */ - public function replace($table = '', $set = NULL) - { - if ($set !== NULL) - { - $this->set($set); - } - - if (count($this->qb_set) === 0) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - - $sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set)); - - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string the table name - * @param array the insert keys - * @param array the insert values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * Note: This is only used (and overridden) by MySQL and CUBRID. - * - * @return string - */ - protected function _from_tables() - { - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Get UPDATE query string - * - * Compiles an update query and returns the sql - * - * @param string the table to update - * @param bool TRUE: reset QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_update($table = '', $reset = TRUE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($this->_validate_update($table) === FALSE) - { - return FALSE; - } - - $sql = $this->_update($this->qb_from[0], $this->qb_set); - - if ($reset === TRUE) - { - $this->_reset_write(); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * UPDATE - * - * Compiles an update string and runs the query. - * - * @param string $table - * @param array $set An associative array of update values - * @param mixed $where - * @param int $limit - * @return bool TRUE on success, FALSE on failure - */ - public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($set !== NULL) - { - $this->set($set); - } - - if ($this->_validate_update($table) === FALSE) - { - return FALSE; - } - - if ($where !== NULL) - { - $this->where($where); - } - - if ( ! empty($limit)) - { - $this->limit($limit); - } - - $sql = $this->_update($this->qb_from[0], $this->qb_set); - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Validate Update - * - * This method is used by both update() and get_compiled_update() to - * validate that data is actually being set and that a table has been - * chosen to be update. - * - * @param string the table to update data on - * @return bool - */ - protected function _validate_update($table) - { - if (count($this->qb_set) === 0) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - - if ($table !== '') - { - $this->qb_from = array($this->protect_identifiers($table, TRUE, NULL, FALSE)); - } - elseif ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch - * - * Compiles an update string and runs the query - * - * @param string the table to retrieve the results from - * @param array an associative array of update values - * @param string the where key - * @return int number of rows affected or FALSE on failure - */ - public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($index === NULL) - { - return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE; - } - - if ($set === NULL) - { - if (empty($this->qb_set_ub)) - { - return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; - } - } - else - { - if (empty($set)) - { - return ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE; - } - - $this->set_update_batch($set, $index); - } - - if (strlen($table) === 0) - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - - // Batch this baby - $affected_rows = 0; - for ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size) - { - if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index))) - { - $affected_rows += $this->affected_rows(); - } - - $this->qb_where = array(); - } - - $this->_reset_write(); - return $affected_rows; - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]['value']; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value']; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k." = CASE \n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END, '; - } - - $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - - /** - * The "set_update_batch" function. Allows key/value pairs to be set for batch updating - * - * @param array - * @param string - * @param bool - * @return CI_DB_query_builder - */ - public function set_update_batch($key, $index = '', $escape = NULL) - { - $key = $this->_object_to_array_batch($key); - - if ( ! is_array($key)) - { - // @todo error - } - - is_bool($escape) OR $escape = $this->_protect_identifiers; - - foreach ($key as $k => $v) - { - $index_set = FALSE; - $clean = array(); - foreach ($v as $k2 => $v2) - { - if ($k2 === $index) - { - $index_set = TRUE; - } - - $clean[$k2] = array( - 'field' => $this->protect_identifiers($k2, FALSE, $escape), - 'value' => ($escape === FALSE ? $v2 : $this->escape($v2)) - ); - } - - if ($index_set === FALSE) - { - return $this->display_error('db_batch_missing_index'); - } - - $this->qb_set_ub[] = $clean; - } - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Empty Table - * - * Compiles a delete string and runs "DELETE FROM table" - * - * @param string the table to empty - * @return bool TRUE on success, FALSE on failure - */ - public function empty_table($table = '') - { - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - else - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - $sql = $this->_delete($table); - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Truncate - * - * Compiles a truncate string and runs the query - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @param string the table to truncate - * @return bool TRUE on success, FALSE on failure - */ - public function truncate($table = '') - { - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - else - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - $sql = $this->_truncate($table); - $this->_reset_write(); - return $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the truncate() command, - * then this method maps to 'DELETE FROM table' - * - * @param string the table name - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Get DELETE query string - * - * Compiles a delete query string and returns the sql - * - * @param string the table to delete from - * @param bool TRUE: reset QB values; FALSE: leave QB values alone - * @return string - */ - public function get_compiled_delete($table = '', $reset = TRUE) - { - $this->return_delete_sql = TRUE; - $sql = $this->delete($table, '', NULL, $reset); - $this->return_delete_sql = FALSE; - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Delete - * - * Compiles a delete string and runs the query - * - * @param mixed the table(s) to delete from. String or array - * @param mixed the where clause - * @param mixed the limit clause - * @param bool - * @return mixed - */ - public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - if ($table === '') - { - if ( ! isset($this->qb_from[0])) - { - return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; - } - - $table = $this->qb_from[0]; - } - elseif (is_array($table)) - { - empty($where) && $reset_data = FALSE; - - foreach ($table as $single_table) - { - $this->delete($single_table, $where, $limit, $reset_data); - } - - return; - } - else - { - $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - if ($where !== '') - { - $this->where($where); - } - - if ( ! empty($limit)) - { - $this->limit($limit); - } - - if (count($this->qb_where) === 0) - { - return ($this->db_debug) ? $this->display_error('db_del_must_use_where') : FALSE; - } - - $sql = $this->_delete($table); - if ($reset_data) - { - $this->_reset_write(); - } - - return ($this->return_delete_sql === TRUE) ? $sql : $this->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string the table name - * @return string - */ - protected function _delete($table) - { - return 'DELETE FROM '.$table.$this->_compile_wh('qb_where') - .($this->qb_limit ? ' LIMIT '.$this->qb_limit : ''); - } - - // -------------------------------------------------------------------- - - /** - * DB Prefix - * - * Prepends a database prefix if one exists in configuration - * - * @param string the table - * @return string - */ - public function dbprefix($table = '') - { - if ($table === '') - { - $this->display_error('db_table_name_required'); - } - - return $this->dbprefix.$table; - } - - // -------------------------------------------------------------------- - - /** - * Set DB Prefix - * - * Set's the DB Prefix to something new without needing to reconnect - * - * @param string the prefix - * @return string - */ - public function set_dbprefix($prefix = '') - { - return $this->dbprefix = $prefix; - } - - // -------------------------------------------------------------------- - - /** - * Track Aliases - * - * Used to track SQL statements written with aliased tables. - * - * @param string The table to inspect - * @return string - */ - protected function _track_aliases($table) - { - if (is_array($table)) - { - foreach ($table as $t) - { - $this->_track_aliases($t); - } - return; - } - - // Does the string contain a comma? If so, we need to separate - // the string into discreet statements - if (strpos($table, ',') !== FALSE) - { - return $this->_track_aliases(explode(',', $table)); - } - - // if a table alias is used we can recognize it by a space - if (strpos($table, ' ') !== FALSE) - { - // if the alias is written with the AS keyword, remove it - $table = preg_replace('/\s+AS\s+/i', ' ', $table); - - // Grab the alias - $table = trim(strrchr($table, ' ')); - - // Store the alias, if it doesn't already exist - if ( ! in_array($table, $this->qb_aliased_tables, TRUE)) - { - $this->qb_aliased_tables[] = $table; - if ($this->qb_caching === TRUE && ! in_array($table, $this->qb_cache_aliased_tables, TRUE)) - { - $this->qb_cache_aliased_tables[] = $table; - $this->qb_cache_exists[] = 'aliased_tables'; - } - } - } - } - - // -------------------------------------------------------------------- - - /** - * Compile the SELECT statement - * - * Generates a query string based on which functions were used. - * Should not be called directly. - * - * @param bool $select_override - * @return string - */ - protected function _compile_select($select_override = FALSE) - { - // Combine any cached components with the current statements - $this->_merge_cache(); - - // Write the "select" portion of the query - if ($select_override !== FALSE) - { - $sql = $select_override; - } - else - { - $sql = ( ! $this->qb_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; - - if (count($this->qb_select) === 0) - { - $sql .= '*'; - } - else - { - // Cycle through the "select" portion of the query and prep each column name. - // The reason we protect identifiers here rather than in the select() function - // is because until the user calls the from() function we don't know if there are aliases - foreach ($this->qb_select as $key => $val) - { - $no_escape = isset($this->qb_no_escape[$key]) ? $this->qb_no_escape[$key] : NULL; - $this->qb_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape); - } - - $sql .= implode(', ', $this->qb_select); - } - } - - // Write the "FROM" portion of the query - if (count($this->qb_from) > 0) - { - $sql .= "\nFROM ".$this->_from_tables(); - } - - // Write the "JOIN" portion of the query - if (count($this->qb_join) > 0) - { - $sql .= "\n".implode("\n", $this->qb_join); - } - - $sql .= $this->_compile_wh('qb_where') - .$this->_compile_group_by() - .$this->_compile_wh('qb_having') - .$this->_compile_order_by(); // ORDER BY - - // LIMIT - if ($this->qb_limit OR $this->qb_offset) - { - return $this->_limit($sql."\n"); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Compile WHERE, HAVING statements - * - * Escapes identifiers in WHERE and HAVING statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * where(), or_where(), having(), or_having are called prior to from(), - * join() and dbprefix is added only if needed. - * - * @param string $qb_key 'qb_where' or 'qb_having' - * @return string SQL statement - */ - protected function _compile_wh($qb_key) - { - if (count($this->$qb_key) > 0) - { - for ($i = 0, $c = count($this->$qb_key); $i < $c; $i++) - { - // Is this condition already compiled? - if (is_string($this->{$qb_key}[$i])) - { - continue; - } - elseif ($this->{$qb_key}[$i]['escape'] === FALSE) - { - $this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition']; - continue; - } - - // Split multiple conditions - $conditions = preg_split( - '/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i', - $this->{$qb_key}[$i]['condition'], - -1, - PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY - ); - - for ($ci = 0, $cc = count($conditions); $ci < $cc; $ci++) - { - if (($op = $this->_get_operator($conditions[$ci])) === FALSE - OR ! preg_match('/^(\(?)(.*)('.preg_quote($op, '/').')\s*(.*(? '(test <= foo)', /* the whole thing */ - // 1 => '(', /* optional */ - // 2 => 'test', /* the field name */ - // 3 => ' <= ', /* $op */ - // 4 => 'foo', /* optional, if $op is e.g. 'IS NULL' */ - // 5 => ')' /* optional */ - // ); - - if ( ! empty($matches[4])) - { - $this->_is_literal($matches[4]) OR $matches[4] = $this->protect_identifiers(trim($matches[4])); - $matches[4] = ' '.$matches[4]; - } - - $conditions[$ci] = $matches[1].$this->protect_identifiers(trim($matches[2])) - .' '.trim($matches[3]).$matches[4].$matches[5]; - } - - $this->{$qb_key}[$i] = implode('', $conditions); - } - - return ($qb_key === 'qb_having' ? "\nHAVING " : "\nWHERE ") - .implode("\n", $this->$qb_key); - } - - return ''; - } - - // -------------------------------------------------------------------- - - /** - * Compile GROUP BY - * - * Escapes identifiers in GROUP BY statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * group_by() is called prior to from(), join() and dbprefix is added - * only if needed. - * - * @return string SQL statement - */ - protected function _compile_group_by() - { - if (count($this->qb_groupby) > 0) - { - for ($i = 0, $c = count($this->qb_groupby); $i < $c; $i++) - { - // Is it already compiled? - if (is_string($this->qb_groupby[$i])) - { - continue; - } - - $this->qb_groupby[$i] = ($this->qb_groupby[$i]['escape'] === FALSE OR $this->_is_literal($this->qb_groupby[$i]['field'])) - ? $this->qb_groupby[$i]['field'] - : $this->protect_identifiers($this->qb_groupby[$i]['field']); - } - - return "\nGROUP BY ".implode(', ', $this->qb_groupby); - } - - return ''; - } - - // -------------------------------------------------------------------- - - /** - * Compile ORDER BY - * - * Escapes identifiers in ORDER BY statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * order_by() is called prior to from(), join() and dbprefix is added - * only if needed. - * - * @return string SQL statement - */ - protected function _compile_order_by() - { - if (empty($this->qb_orderby)) - { - return ''; - } - - for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++) - { - if (is_string($this->qb_orderby[$i])) - { - continue; - } - - if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field'])) - { - $this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']); - } - - $this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction']; - } - - return "\nORDER BY ".implode(', ', $this->qb_orderby); - } - - // -------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param object - * @return array - */ - protected function _object_to_array($object) - { - if ( ! is_object($object)) - { - return $object; - } - - $array = array(); - foreach (get_object_vars($object) as $key => $val) - { - // There are some built in keys we need to ignore for this conversion - if ( ! is_object($val) && ! is_array($val) && $key !== '_parent_name') - { - $array[$key] = $val; - } - } - - return $array; - } - - // -------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param object - * @return array - */ - protected function _object_to_array_batch($object) - { - if ( ! is_object($object)) - { - return $object; - } - - $array = array(); - $out = get_object_vars($object); - $fields = array_keys($out); - - foreach ($fields as $val) - { - // There are some built in keys we need to ignore for this conversion - if ($val !== '_parent_name') - { - $i = 0; - foreach ($out[$val] as $data) - { - $array[$i++][$val] = $data; - } - } - } - - return $array; - } - - // -------------------------------------------------------------------- - - /** - * Start Cache - * - * Starts QB caching - * - * @return CI_DB_query_builder - */ - public function start_cache() - { - $this->qb_caching = TRUE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Stop Cache - * - * Stops QB caching - * - * @return CI_DB_query_builder - */ - public function stop_cache() - { - $this->qb_caching = FALSE; - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Flush Cache - * - * Empties the QB cache - * - * @return CI_DB_query_builder - */ - public function flush_cache() - { - $this->_reset_run(array( - 'qb_cache_select' => array(), - 'qb_cache_from' => array(), - 'qb_cache_join' => array(), - 'qb_cache_where' => array(), - 'qb_cache_groupby' => array(), - 'qb_cache_having' => array(), - 'qb_cache_orderby' => array(), - 'qb_cache_set' => array(), - 'qb_cache_exists' => array(), - 'qb_cache_no_escape' => array(), - 'qb_cache_aliased_tables' => array() - )); - - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Merge Cache - * - * When called, this function merges any cached QB arrays with - * locally called ones. - * - * @return void - */ - protected function _merge_cache() - { - if (count($this->qb_cache_exists) === 0) - { - return; - } - elseif (in_array('select', $this->qb_cache_exists, TRUE)) - { - $qb_no_escape = $this->qb_cache_no_escape; - } - - foreach (array_unique($this->qb_cache_exists) as $val) // select, from, etc. - { - $qb_variable = 'qb_'.$val; - $qb_cache_var = 'qb_cache_'.$val; - $qb_new = $this->$qb_cache_var; - - for ($i = 0, $c = count($this->$qb_variable); $i < $c; $i++) - { - if ( ! in_array($this->{$qb_variable}[$i], $qb_new, TRUE)) - { - $qb_new[] = $this->{$qb_variable}[$i]; - if ($val === 'select') - { - $qb_no_escape[] = $this->qb_no_escape[$i]; - } - } - } - - $this->$qb_variable = $qb_new; - if ($val === 'select') - { - $this->qb_no_escape = $qb_no_escape; - } - } - } - - // -------------------------------------------------------------------- - - /** - * Is literal - * - * Determines if a string represents a literal value or a field name - * - * @param string $str - * @return bool - */ - protected function _is_literal($str) - { - $str = trim($str); - - if (empty($str) OR ctype_digit($str) OR (string) (float) $str === $str OR in_array(strtoupper($str), array('TRUE', 'FALSE'), TRUE)) - { - return TRUE; - } - - static $_str; - - if (empty($_str)) - { - $_str = ($this->_escape_char !== '"') - ? array('"', "'") : array("'"); - } - - return in_array($str[0], $_str, TRUE); - } - - // -------------------------------------------------------------------- - - /** - * Reset Query Builder values. - * - * Publicly-visible method to reset the QB values. - * - * @return CI_DB_query_builder - */ - public function reset_query() - { - $this->_reset_select(); - $this->_reset_write(); - return $this; - } - - // -------------------------------------------------------------------- - - /** - * Resets the query builder values. Called by the get() function - * - * @param array An array of fields to reset - * @return void - */ - protected function _reset_run($qb_reset_items) - { - foreach ($qb_reset_items as $item => $default_value) - { - $this->$item = $default_value; - } - } - - // -------------------------------------------------------------------- - - /** - * Resets the query builder values. Called by the get() function - * - * @return void - */ - protected function _reset_select() - { - $this->_reset_run(array( - 'qb_select' => array(), - 'qb_from' => array(), - 'qb_join' => array(), - 'qb_where' => array(), - 'qb_groupby' => array(), - 'qb_having' => array(), - 'qb_orderby' => array(), - 'qb_aliased_tables' => array(), - 'qb_no_escape' => array(), - 'qb_distinct' => FALSE, - 'qb_limit' => FALSE, - 'qb_offset' => FALSE - )); - } - - // -------------------------------------------------------------------- - - /** - * Resets the query builder "write" values. - * - * Called by the insert() update() insert_batch() update_batch() and delete() functions - * - * @return void - */ - protected function _reset_write() - { - $this->_reset_run(array( - 'qb_set' => array(), - 'qb_set_ub' => array(), - 'qb_from' => array(), - 'qb_join' => array(), - 'qb_where' => array(), - 'qb_orderby' => array(), - 'qb_keys' => array(), - 'qb_limit' => FALSE - )); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/DB_result.php b/vendor_old/codeigniter/framework/system/database/DB_result.php deleted file mode 100644 index 98d8876..0000000 --- a/vendor_old/codeigniter/framework/system/database/DB_result.php +++ /dev/null @@ -1,666 +0,0 @@ -conn_id = $driver_object->conn_id; - $this->result_id = $driver_object->result_id; - } - - // -------------------------------------------------------------------- - - /** - * Number of rows in the result set - * - * @return int - */ - public function num_rows() - { - if (is_int($this->num_rows)) - { - return $this->num_rows; - } - elseif (count($this->result_array) > 0) - { - return $this->num_rows = count($this->result_array); - } - elseif (count($this->result_object) > 0) - { - return $this->num_rows = count($this->result_object); - } - - return $this->num_rows = count($this->result_array()); - } - - // -------------------------------------------------------------------- - - /** - * Query result. Acts as a wrapper function for the following functions. - * - * @param string $type 'object', 'array' or a custom class name - * @return array - */ - public function result($type = 'object') - { - if ($type === 'array') - { - return $this->result_array(); - } - elseif ($type === 'object') - { - return $this->result_object(); - } - else - { - return $this->custom_result_object($type); - } - } - - // -------------------------------------------------------------------- - - /** - * Custom query result. - * - * @param string $class_name - * @return array - */ - public function custom_result_object($class_name) - { - if (isset($this->custom_result_object[$class_name])) - { - return $this->custom_result_object[$class_name]; - } - elseif ( ! $this->result_id OR $this->num_rows === 0) - { - return array(); - } - - // Don't fetch the result set again if we already have it - $_data = NULL; - if (($c = count($this->result_array)) > 0) - { - $_data = 'result_array'; - } - elseif (($c = count($this->result_object)) > 0) - { - $_data = 'result_object'; - } - - if ($_data !== NULL) - { - for ($i = 0; $i < $c; $i++) - { - $this->custom_result_object[$class_name][$i] = new $class_name(); - - foreach ($this->{$_data}[$i] as $key => $value) - { - $this->custom_result_object[$class_name][$i]->$key = $value; - } - } - - return $this->custom_result_object[$class_name]; - } - - is_null($this->row_data) OR $this->data_seek(0); - $this->custom_result_object[$class_name] = array(); - - while ($row = $this->_fetch_object($class_name)) - { - $this->custom_result_object[$class_name][] = $row; - } - - return $this->custom_result_object[$class_name]; - } - - // -------------------------------------------------------------------- - - /** - * Query result. "object" version. - * - * @return array - */ - public function result_object() - { - if (count($this->result_object) > 0) - { - return $this->result_object; - } - - // In the event that query caching is on, the result_id variable - // will not be a valid resource so we'll simply return an empty - // array. - if ( ! $this->result_id OR $this->num_rows === 0) - { - return array(); - } - - if (($c = count($this->result_array)) > 0) - { - for ($i = 0; $i < $c; $i++) - { - $this->result_object[$i] = (object) $this->result_array[$i]; - } - - return $this->result_object; - } - - is_null($this->row_data) OR $this->data_seek(0); - while ($row = $this->_fetch_object()) - { - $this->result_object[] = $row; - } - - return $this->result_object; - } - - // -------------------------------------------------------------------- - - /** - * Query result. "array" version. - * - * @return array - */ - public function result_array() - { - if (count($this->result_array) > 0) - { - return $this->result_array; - } - - // In the event that query caching is on, the result_id variable - // will not be a valid resource so we'll simply return an empty - // array. - if ( ! $this->result_id OR $this->num_rows === 0) - { - return array(); - } - - if (($c = count($this->result_object)) > 0) - { - for ($i = 0; $i < $c; $i++) - { - $this->result_array[$i] = (array) $this->result_object[$i]; - } - - return $this->result_array; - } - - is_null($this->row_data) OR $this->data_seek(0); - while ($row = $this->_fetch_assoc()) - { - $this->result_array[] = $row; - } - - return $this->result_array; - } - - // -------------------------------------------------------------------- - - /** - * Row - * - * A wrapper method. - * - * @param mixed $n - * @param string $type 'object' or 'array' - * @return mixed - */ - public function row($n = 0, $type = 'object') - { - if ( ! is_numeric($n)) - { - // We cache the row data for subsequent uses - is_array($this->row_data) OR $this->row_data = $this->row_array(0); - - // array_key_exists() instead of isset() to allow for NULL values - if (empty($this->row_data) OR ! array_key_exists($n, $this->row_data)) - { - return NULL; - } - - return $this->row_data[$n]; - } - - if ($type === 'object') return $this->row_object($n); - elseif ($type === 'array') return $this->row_array($n); - else return $this->custom_row_object($n, $type); - } - - // -------------------------------------------------------------------- - - /** - * Assigns an item into a particular column slot - * - * @param mixed $key - * @param mixed $value - * @return void - */ - public function set_row($key, $value = NULL) - { - // We cache the row data for subsequent uses - if ( ! is_array($this->row_data)) - { - $this->row_data = $this->row_array(0); - } - - if (is_array($key)) - { - foreach ($key as $k => $v) - { - $this->row_data[$k] = $v; - } - return; - } - - if ($key !== '' && $value !== NULL) - { - $this->row_data[$key] = $value; - } - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - custom object version - * - * @param int $n - * @param string $type - * @return object - */ - public function custom_row_object($n, $type) - { - isset($this->custom_result_object[$type]) OR $this->custom_result_object($type); - - if (count($this->custom_result_object[$type]) === 0) - { - return NULL; - } - - if ($n !== $this->current_row && isset($this->custom_result_object[$type][$n])) - { - $this->current_row = $n; - } - - return $this->custom_result_object[$type][$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - object version - * - * @param int $n - * @return object - */ - public function row_object($n = 0) - { - $result = $this->result_object(); - if (count($result) === 0) - { - return NULL; - } - - if ($n !== $this->current_row && isset($result[$n])) - { - $this->current_row = $n; - } - - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns a single result row - array version - * - * @param int $n - * @return array - */ - public function row_array($n = 0) - { - $result = $this->result_array(); - if (count($result) === 0) - { - return NULL; - } - - if ($n !== $this->current_row && isset($result[$n])) - { - $this->current_row = $n; - } - - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "first" row - * - * @param string $type - * @return mixed - */ - public function first_row($type = 'object') - { - $result = $this->result($type); - return (count($result) === 0) ? NULL : $result[0]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "last" row - * - * @param string $type - * @return mixed - */ - public function last_row($type = 'object') - { - $result = $this->result($type); - return (count($result) === 0) ? NULL : $result[count($result) - 1]; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "next" row - * - * @param string $type - * @return mixed - */ - public function next_row($type = 'object') - { - $result = $this->result($type); - if (count($result) === 0) - { - return NULL; - } - - return isset($result[$this->current_row + 1]) - ? $result[++$this->current_row] - : NULL; - } - - // -------------------------------------------------------------------- - - /** - * Returns the "previous" row - * - * @param string $type - * @return mixed - */ - public function previous_row($type = 'object') - { - $result = $this->result($type); - if (count($result) === 0) - { - return NULL; - } - - if (isset($result[$this->current_row - 1])) - { - --$this->current_row; - } - return $result[$this->current_row]; - } - - // -------------------------------------------------------------------- - - /** - * Returns an unbuffered row and move pointer to next row - * - * @param string $type 'array', 'object' or a custom class name - * @return mixed - */ - public function unbuffered_row($type = 'object') - { - if ($type === 'array') - { - return $this->_fetch_assoc(); - } - elseif ($type === 'object') - { - return $this->_fetch_object(); - } - - return $this->_fetch_object($type); - } - - // -------------------------------------------------------------------- - - /** - * The following methods are normally overloaded by the identically named - * methods in the platform-specific driver -- except when query caching - * is used. When caching is enabled we do not load the other driver. - * These functions are primarily here to prevent undefined function errors - * when a cached result object is in use. They are not otherwise fully - * operational due to the unavailability of the database resource IDs with - * cached results. - */ - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * Overridden by driver result classes. - * - * @return int - */ - public function num_fields() - { - return 0; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names. - * - * Overridden by driver result classes. - * - * @return array - */ - public function list_fields() - { - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data. - * - * Overridden by driver result classes. - * - * @return array - */ - public function field_data() - { - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * Overridden by driver result classes. - * - * @return void - */ - public function free_result() - { - $this->result_id = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * Overridden by driver result classes. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array. - * - * Overridden by driver result classes. - * - * @return array - */ - protected function _fetch_assoc() - { - return array(); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object. - * - * Overridden by driver result classes. - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return new $class_name(); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/DB_utility.php b/vendor_old/codeigniter/framework/system/database/DB_utility.php deleted file mode 100644 index 25d842c..0000000 --- a/vendor_old/codeigniter/framework/system/database/DB_utility.php +++ /dev/null @@ -1,424 +0,0 @@ -db =& $db; - log_message('info', 'Database Utility Class Initialized'); - } - - // -------------------------------------------------------------------- - - /** - * List databases - * - * @return array - */ - public function list_databases() - { - // Is there a cached result? - if (isset($this->db->data_cache['db_names'])) - { - return $this->db->data_cache['db_names']; - } - elseif ($this->_list_databases === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $this->db->data_cache['db_names'] = array(); - - $query = $this->db->query($this->_list_databases); - if ($query === FALSE) - { - return $this->db->data_cache['db_names']; - } - - for ($i = 0, $query = $query->result_array(), $c = count($query); $i < $c; $i++) - { - $this->db->data_cache['db_names'][] = current($query[$i]); - } - - return $this->db->data_cache['db_names']; - } - - // -------------------------------------------------------------------- - - /** - * Determine if a particular database exists - * - * @param string $database_name - * @return bool - */ - public function database_exists($database_name) - { - return in_array($database_name, $this->list_databases()); - } - - // -------------------------------------------------------------------- - - /** - * Optimize Table - * - * @param string $table_name - * @return mixed - */ - public function optimize_table($table_name) - { - if ($this->_optimize_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $query = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); - if ($query !== FALSE) - { - $query = $query->result_array(); - return current($query); - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Optimize Database - * - * @return mixed - */ - public function optimize_database() - { - if ($this->_optimize_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $result = array(); - foreach ($this->db->list_tables() as $table_name) - { - $res = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); - if (is_bool($res)) - { - return $res; - } - - // Build the result array... - $res = $res->result_array(); - $res = current($res); - $key = str_replace($this->db->database.'.', '', current($res)); - $keys = array_keys($res); - unset($res[$keys[0]]); - - $result[$key] = $res; - } - - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Repair Table - * - * @param string $table_name - * @return mixed - */ - public function repair_table($table_name) - { - if ($this->_repair_table === FALSE) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; - } - - $query = $this->db->query(sprintf($this->_repair_table, $this->db->escape_identifiers($table_name))); - if (is_bool($query)) - { - return $query; - } - - $query = $query->result_array(); - return current($query); - } - - // -------------------------------------------------------------------- - - /** - * Generate CSV from a query result object - * - * @param object $query Query result object - * @param string $delim Delimiter (default: ,) - * @param string $newline Newline character (default: \n) - * @param string $enclosure Enclosure (default: ") - * @return string - */ - public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosure = '"') - { - if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) - { - show_error('You must submit a valid result object'); - } - - $out = ''; - // First generate the headings from the table column names - foreach ($query->list_fields() as $name) - { - $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; - } - - $out = substr($out, 0, -strlen($delim)).$newline; - - // Next blast through the result array and build out the rows - while ($row = $query->unbuffered_row('array')) - { - $line = array(); - foreach ($row as $item) - { - $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure; - } - $out .= implode($delim, $line).$newline; - } - - return $out; - } - - // -------------------------------------------------------------------- - - /** - * Generate XML data from a query result object - * - * @param object $query Query result object - * @param array $params Any preferences - * @return string - */ - public function xml_from_result($query, $params = array()) - { - if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) - { - show_error('You must submit a valid result object'); - } - - // Set our default values - foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) - { - if ( ! isset($params[$key])) - { - $params[$key] = $val; - } - } - - // Create variables for convenience - extract($params); - - // Load the xml helper - get_instance()->load->helper('xml'); - - // Generate the result - $xml = '<'.$root.'>'.$newline; - while ($row = $query->unbuffered_row()) - { - $xml .= $tab.'<'.$element.'>'.$newline; - foreach ($row as $key => $val) - { - $xml .= $tab.$tab.'<'.$key.'>'.xml_convert($val).''.$newline; - } - $xml .= $tab.''.$newline; - } - - return $xml.''.$newline; - } - - // -------------------------------------------------------------------- - - /** - * Database Backup - * - * @param array $params - * @return string - */ - public function backup($params = array()) - { - // If the parameters have not been submitted as an - // array then we know that it is simply the table - // name, which is a valid short cut. - if (is_string($params)) - { - $params = array('tables' => $params); - } - - // Set up our default preferences - $prefs = array( - 'tables' => array(), - 'ignore' => array(), - 'filename' => '', - 'format' => 'gzip', // gzip, zip, txt - 'add_drop' => TRUE, - 'add_insert' => TRUE, - 'newline' => "\n", - 'foreign_key_checks' => TRUE - ); - - // Did the user submit any preferences? If so set them.... - if (count($params) > 0) - { - foreach ($prefs as $key => $val) - { - if (isset($params[$key])) - { - $prefs[$key] = $params[$key]; - } - } - } - - // Are we backing up a complete database or individual tables? - // If no table names were submitted we'll fetch the entire table list - if (count($prefs['tables']) === 0) - { - $prefs['tables'] = $this->db->list_tables(); - } - - // Validate the format - if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) - { - $prefs['format'] = 'txt'; - } - - // Is the encoder supported? If not, we'll either issue an - // error or use plain text depending on the debug settings - if (($prefs['format'] === 'gzip' && ! function_exists('gzencode')) - OR ($prefs['format'] === 'zip' && ! function_exists('gzcompress'))) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsupported_compression'); - } - - $prefs['format'] = 'txt'; - } - - // Was a Zip file requested? - if ($prefs['format'] === 'zip') - { - // Set the filename if not provided (only needed with Zip files) - if ($prefs['filename'] === '') - { - $prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database) - .date('Y-m-d_H-i', time()).'.sql'; - } - else - { - // If they included the .zip file extension we'll remove it - if (preg_match('|.+?\.zip$|', $prefs['filename'])) - { - $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); - } - - // Tack on the ".sql" file extension if needed - if ( ! preg_match('|.+?\.sql$|', $prefs['filename'])) - { - $prefs['filename'] .= '.sql'; - } - } - - // Load the Zip class and output it - $CI =& get_instance(); - $CI->load->library('zip'); - $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); - return $CI->zip->get_zip(); - } - elseif ($prefs['format'] === 'txt') // Was a text file requested? - { - return $this->_backup($prefs); - } - elseif ($prefs['format'] === 'gzip') // Was a Gzip file requested? - { - return gzencode($this->_backup($prefs)); - } - - return; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_driver.php deleted file mode 100644 index 6e8aff7..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_driver.php +++ /dev/null @@ -1,405 +0,0 @@ -dsn, $matches)) - { - if (stripos($matches[2], 'autocommit=off') !== FALSE) - { - $this->auto_commit = FALSE; - } - } - else - { - // If no port is defined by the user, use the default value - empty($this->port) OR $this->port = 33000; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\?.+)?$/', $this->dsn, $matches)) - { - $func = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url'; - return ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '') - ? $func($this->dsn, $this->username, $this->password) - : $func($this->dsn); - } - - $func = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect'; - return ($this->username !== '') - ? $func($this->hostname, $this->port, $this->database, $this->username, $this->password) - : $func($this->hostname, $this->port, $this->database); - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if (cubrid_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - return ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE) - ? FALSE - : $this->data_cache['version'] = $version; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return cubrid_query($sql, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - if (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL) - { - return FALSE; - } - elseif ($autocommit === TRUE) - { - return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ( ! cubrid_commit($this->conn_id)) - { - return FALSE; - } - - if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) - { - return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ( ! cubrid_rollback($this->conn_id)) - { - return FALSE; - } - - if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) - { - cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return cubrid_real_escape_string($str, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return cubrid_affected_rows(); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return cubrid_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES'; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - cubrid_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_forge.php deleted file mode 100644 index 27bfc14..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_forge.php +++ /dev/null @@ -1,230 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'BIGINT' => 'NUMERIC', - 'FLOAT' => 'DOUBLE', - 'REAL' => 'DOUBLE' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; - } - else - { - $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; - $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'LONGTEXT': - $attributes['TYPE'] = 'STRING'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_result.php b/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_result.php deleted file mode 100644 index 251b70a..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_result.php +++ /dev/null @@ -1,177 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = cubrid_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return cubrid_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - return cubrid_column_names($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = cubrid_field_name($this->result_id, $i); - $retval[$i]->type = cubrid_field_type($this->result_id, $i); - $retval[$i]->max_length = cubrid_field_len($this->result_id, $i); - $retval[$i]->primary_key = (int) (strpos(cubrid_field_flags($this->result_id, $i), 'primary_key') !== FALSE); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id) OR - (get_resource_type($this->result_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->result_id)))) - { - cubrid_close_request($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return cubrid_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return cubrid_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return cubrid_fetch_object($this->result_id, $class_name); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_utility.php deleted file mode 100644 index 555ae7a..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/cubrid_utility.php +++ /dev/null @@ -1,79 +0,0 @@ -db->data_cache['db_names'])) - { - return $this->db->data_cache['db_names']; - } - - return $this->db->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * CUBRID Export - * - * @param array Preferences - * @return mixed - */ - protected function _backup($params = array()) - { - // No SQL based support in CUBRID as of version 8.4.0. Database or - // table backup can be performed using CUBRID Manager - // database administration tool. - return $this->db->display_error('db_unsupported_feature'); - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/index.html b/vendor_old/codeigniter/framework/system/database/drivers/cubrid/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/cubrid/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_driver.php deleted file mode 100644 index 3069d66..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_driver.php +++ /dev/null @@ -1,413 +0,0 @@ -hostname.':'.$this->database, $this->username, $this->password, $this->char_set) - : ibase_connect($this->hostname.':'.$this->database, $this->username, $this->password, $this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if (($service = ibase_service_attach($this->hostname, $this->username, $this->password))) - { - $this->data_cache['version'] = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); - - // Don't keep the service open - ibase_service_detach($service); - return $this->data_cache['version']; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - if (($trans_handle = ibase_trans($this->conn_id)) === FALSE) - { - return FALSE; - } - - $this->_ibase_trans = $trans_handle; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if (ibase_commit($this->_ibase_trans)) - { - $this->_ibase_trans = NULL; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if (ibase_rollback($this->_ibase_trans)) - { - $this->_ibase_trans = NULL; - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return ibase_affected_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @param string $generator_name - * @param int $inc_by - * @return int - */ - public function insert_id($generator_name, $inc_by = 0) - { - //If a generator hasn't been used before it will return 0 - return ibase_gen_id('"'.$generator_name.'"', $inc_by); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT TRIM("RDB$RELATION_NAME") AS TABLE_NAME FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql.' AND TRIM("RDB$RELATION_NAME") AS TABLE_NAME LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT TRIM("RDB$FIELD_NAME") AS COLUMN_NAME FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", - CASE "fields"."RDB$FIELD_TYPE" - WHEN 7 THEN \'SMALLINT\' - WHEN 8 THEN \'INTEGER\' - WHEN 9 THEN \'QUAD\' - WHEN 10 THEN \'FLOAT\' - WHEN 11 THEN \'DFLOAT\' - WHEN 12 THEN \'DATE\' - WHEN 13 THEN \'TIME\' - WHEN 14 THEN \'CHAR\' - WHEN 16 THEN \'INT64\' - WHEN 27 THEN \'DOUBLE\' - WHEN 35 THEN \'TIMESTAMP\' - WHEN 37 THEN \'VARCHAR\' - WHEN 40 THEN \'CSTRING\' - WHEN 261 THEN \'BLOB\' - ELSE NULL - END AS "type", - "fields"."RDB$FIELD_LENGTH" AS "max_length", - "rfields"."RDB$DEFAULT_VALUE" AS "default" - FROM "RDB$RELATION_FIELDS" "rfields" - JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" - WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' - ORDER BY "rfields"."RDB$FIELD_POSITION"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => ibase_errcode(), 'message' => ibase_errmsg()); - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // Limit clause depends on if Interbase or Firebird - if (stripos($this->version(), 'firebird') !== FALSE) - { - $select = 'FIRST '.$this->qb_limit - .($this->qb_offset ? ' SKIP '.$this->qb_offset : ''); - } - else - { - $select = 'ROWS ' - .($this->qb_offset ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); - } - - return preg_replace('`SELECT`i', 'SELECT '.$select, $sql, 1); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - ibase_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_forge.php deleted file mode 100644 index 44bb24e..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_forge.php +++ /dev/null @@ -1,251 +0,0 @@ - 'INTEGER', - 'INTEGER' => 'INT64', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return string - */ - public function create_database($db_name) - { - // Firebird databases are flat files, so a path is required - - // Hostname is needed for remote access - empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; - - return parent::create_database('"'.$db_name.'"'); - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - if ( ! ibase_drop_db($this->conn_id)) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identififers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' - .($field[$i]['null'] === TRUE ? 'NULL' : '1') - .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) - .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INT': - $attributes['TYPE'] = 'INTEGER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'INT64'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_result.php b/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_result.php deleted file mode 100644 index 7d7dd79..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_result.php +++ /dev/null @@ -1,161 +0,0 @@ -result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $num_fields = $this->num_fields(); $i < $num_fields; $i++) - { - $info = ibase_field_info($this->result_id, $i); - $field_names[] = $info['name']; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $info = ibase_field_info($this->result_id, $i); - - $retval[$i] = new stdClass(); - $retval[$i]->name = $info['name']; - $retval[$i]->type = $info['type']; - $retval[$i]->max_length = $info['length']; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - ibase_free_result($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return ibase_fetch_assoc($this->result_id, IBASE_FETCH_BLOBS); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = ibase_fetch_object($this->result_id, IBASE_FETCH_BLOBS); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_utility.php deleted file mode 100644 index 3c15210..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/ibase/ibase_utility.php +++ /dev/null @@ -1,69 +0,0 @@ -db->hostname, $this->db->username, $this->db->password)) - { - $res = ibase_backup($service, $this->db->database, $filename.'.fbk'); - - // Close the service connection - ibase_service_detach($service); - return $res; - } - - return FALSE; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/ibase/index.html b/vendor_old/codeigniter/framework/system/database/drivers/ibase/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/ibase/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/index.html b/vendor_old/codeigniter/framework/system/database/drivers/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mssql/index.html b/vendor_old/codeigniter/framework/system/database/drivers/mssql/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mssql/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_driver.php deleted file mode 100644 index a2ccd1c..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_driver.php +++ /dev/null @@ -1,518 +0,0 @@ -port)) - { - $this->hostname .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $this->conn_id = ($persistent) - ? mssql_pconnect($this->hostname, $this->username, $this->password) - : mssql_connect($this->hostname, $this->username, $this->password); - - if ( ! $this->conn_id) - { - return FALSE; - } - - // ---------------------------------------------------------------- - - // Select the DB... assuming a database name is specified in the config file - if ($this->database !== '' && ! $this->db_select()) - { - log_message('error', 'Unable to select database: '.$this->database); - - return ($this->db_debug === TRUE) - ? $this->display_error('db_unable_to_select', $this->database) - : FALSE; - } - - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - // Note: Escaping is required in the event that the DB name - // contains reserved characters. - if (mssql_select_db('['.$database.']', $this->conn_id)) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return mixed resource if rows are returned, bool otherwise - */ - protected function _execute($sql) - { - return mssql_query($sql, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->simple_query('BEGIN TRAN'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->simple_query('COMMIT TRAN'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->simple_query('ROLLBACK TRAN'); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return mssql_rows_affected($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * Returns the last id created in the Identity column. - * - * @return string - */ - public function insert_id() - { - $query = version_compare($this->version(), '8', '>=') - ? 'SELECT SCOPE_IDENTITY() AS last_id' - : 'SELECT @@IDENTITY AS last_id'; - - $query = $this->query($query); - $query = $query->row(); - return $query->last_id; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return (ini_set('mssql.charset', $charset) !== FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Version number query string - * - * @return string - */ - protected function _version() - { - return "SELECT SERVERPROPERTY('ProductVersion') AS ver"; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - // We need this because the error info is discarded by the - // server the first time you request it, and query() already - // calls error() once for logging purposes when a query fails. - static $error = array('code' => 0, 'message' => NULL); - - $message = mssql_get_last_message(); - if ( ! empty($message)) - { - $error['code'] = $this->query('SELECT @@ERROR AS code')->row()->code; - $error['message'] = $message; - } - - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - $limit = $this->qb_offset + $this->qb_limit; - - // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, - // however an ORDER BY clause is required for it to work - if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - mssql_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_forge.php deleted file mode 100644 index 6b61098..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_forge.php +++ /dev/null @@ -1,151 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_result.php b/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_result.php deleted file mode 100644 index 38a0a05..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_result.php +++ /dev/null @@ -1,198 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = mssql_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return mssql_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - mssql_field_seek($this->result_id, 0); - while ($field = mssql_fetch_field($this->result_id)) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field = mssql_fetch_field($this->result_id, $i); - - $retval[$i] = new stdClass(); - $retval[$i]->name = $field->name; - $retval[$i]->type = $field->type; - $retval[$i]->max_length = $field->max_length; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - mssql_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return mssql_data_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return mssql_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = mssql_fetch_object($this->result_id); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_utility.php deleted file mode 100644 index 95ce88f..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mssql/mssql_utility.php +++ /dev/null @@ -1,77 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysql/index.html b/vendor_old/codeigniter/framework/system/database/drivers/mysql/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysql/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_driver.php deleted file mode 100644 index 71dad67..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_driver.php +++ /dev/null @@ -1,494 +0,0 @@ -port)) - { - $this->hostname .= ':'.$this->port; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $client_flags = ($this->compress === FALSE) ? 0 : MYSQL_CLIENT_COMPRESS; - - if ($this->encrypt === TRUE) - { - $client_flags = $client_flags | MYSQL_CLIENT_SSL; - } - - // Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages - $this->conn_id = ($persistent === TRUE) - ? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags) - : mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags); - - // ---------------------------------------------------------------- - - // Select the DB... assuming a database name is specified in the config file - if ($this->database !== '' && ! $this->db_select()) - { - log_message('error', 'Unable to select database: '.$this->database); - - return ($this->db_debug === TRUE) - ? $this->display_error('db_unable_to_select', $this->database) - : FALSE; - } - - if (isset($this->stricton) && is_resource($this->conn_id)) - { - if ($this->stricton) - { - $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); - } - else - { - $this->simple_query( - 'SET SESSION sql_mode = - REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( - @@sql_mode, - "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", ""), - "STRICT_ALL_TABLES", ""), - "STRICT_TRANS_TABLES,", ""), - ",STRICT_TRANS_TABLES", ""), - "STRICT_TRANS_TABLES", "")' - ); - } - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if (mysql_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if (mysql_select_db($database, $this->conn_id)) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return mysql_set_charset($charset, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE) - { - return FALSE; - } - - return $this->data_cache['version'] = $version; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return mixed - */ - protected function _execute($sql) - { - return mysql_query($this->_prep_query($sql), $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @param string $sql an SQL query - * @return string - */ - protected function _prep_query($sql) - { - // mysql_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack - // modifies the query so that it a proper number of affected rows is returned. - if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) - { - return trim($sql).' WHERE 1=1'; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->simple_query('SET AUTOCOMMIT=0'); - return $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ($this->simple_query('COMMIT')) - { - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ($this->simple_query('ROLLBACK')) - { - $this->simple_query('SET AUTOCOMMIT=1'); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return mysql_real_escape_string($str, $this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return mysql_affected_rows($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return mysql_insert_id($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => mysql_errno($this->conn_id), 'message' => mysql_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - // Error suppression to avoid annoying E_WARNINGs in cases - // where the connection has already been closed for some reason. - @mysql_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_forge.php deleted file mode 100644 index 7ed8f8d..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_forge.php +++ /dev/null @@ -1,243 +0,0 @@ -db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) - { - $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; - } - - if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) - { - $sql .= ' COLLATE = '.$this->db->dbcollat; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP') - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = ($alter_type === 'ADD') - ? "\n\tADD ".$field[$i]['_literal'] - : "\n\tMODIFY ".$field[$i]['_literal']; - } - else - { - if ($alter_type === 'ADD') - { - $field[$i]['_literal'] = "\n\tADD "; - } - else - { - $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; - } - - $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); - } - } - - return array($sql.implode(',', $field)); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_result.php b/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_result.php deleted file mode 100644 index 7aa265e..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_result.php +++ /dev/null @@ -1,199 +0,0 @@ -num_rows = mysql_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of rows in the result set - * - * @return int - */ - public function num_rows() - { - return $this->num_rows; - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return mysql_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - mysql_field_seek($this->result_id, 0); - while ($field = mysql_fetch_field($this->result_id)) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = mysql_field_name($this->result_id, $i); - $retval[$i]->type = mysql_field_type($this->result_id, $i); - $retval[$i]->max_length = mysql_field_len($this->result_id, $i); - $retval[$i]->primary_key = (int) (strpos(mysql_field_flags($this->result_id, $i), 'primary_key') !== FALSE); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - mysql_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return $this->num_rows - ? mysql_data_seek($this->result_id, $n) - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return mysql_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return mysql_fetch_object($this->result_id, $class_name); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_utility.php deleted file mode 100644 index bc01fc5..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysql/mysql_utility.php +++ /dev/null @@ -1,211 +0,0 @@ -db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); - - // No result means the table name was invalid - if ($query === FALSE) - { - continue; - } - - // Write out the table schema - $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; - - if ($add_drop === TRUE) - { - $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; - } - - $i = 0; - $result = $query->result_array(); - foreach ($result[0] as $val) - { - if ($i++ % 2) - { - $output .= $val.';'.$newline.$newline; - } - } - - // If inserts are not needed we're done... - if ($add_insert === FALSE) - { - continue; - } - - // Grab all the data from the current table - $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); - - if ($query->num_rows() === 0) - { - continue; - } - - // Fetch the field names and determine if the field is an - // integer type. We use this info to decide whether to - // surround the data with quotes or not - - $i = 0; - $field_str = ''; - $is_int = array(); - while ($field = mysql_fetch_field($query->result_id)) - { - // Most versions of MySQL store timestamp as a string - $is_int[$i] = in_array(strtolower(mysql_field_type($query->result_id, $i)), - array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), - TRUE); - - // Create a string of field names - $field_str .= $this->db->escape_identifiers($field->name).', '; - $i++; - } - - // Trim off the end comma - $field_str = preg_replace('/, $/' , '', $field_str); - - // Build the insert string - foreach ($query->result_array() as $row) - { - $val_str = ''; - - $i = 0; - foreach ($row as $v) - { - // Is the value NULL? - if ($v === NULL) - { - $val_str .= 'NULL'; - } - else - { - // Escape the data if it's not an integer - $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; - } - - // Append a comma - $val_str .= ', '; - $i++; - } - - // Remove the comma at the end of the string - $val_str = preg_replace('/, $/' , '', $val_str); - - // Build the INSERT string - $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; - } - - $output .= $newline.$newline; - } - - // Do we need to include a statement to re-enable foreign key checks? - if ($foreign_key_checks === FALSE) - { - $output .= 'SET foreign_key_checks = 1;'.$newline; - } - - return $output; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/index.html b/vendor_old/codeigniter/framework/system/database/drivers/mysqli/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_driver.php deleted file mode 100644 index b59e894..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_driver.php +++ /dev/null @@ -1,544 +0,0 @@ -hostname[0] === '/') - { - $hostname = NULL; - $port = NULL; - $socket = $this->hostname; - } - else - { - $hostname = ($persistent === TRUE) - ? 'p:'.$this->hostname : $this->hostname; - $port = empty($this->port) ? NULL : $this->port; - $socket = NULL; - } - - $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0; - $this->_mysqli = mysqli_init(); - - $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); - - if (isset($this->stricton)) - { - if ($this->stricton) - { - $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); - } - else - { - $this->_mysqli->options(MYSQLI_INIT_COMMAND, - 'SET SESSION sql_mode = - REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( - @@sql_mode, - "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", ""), - "STRICT_ALL_TABLES", ""), - "STRICT_TRANS_TABLES,", ""), - ",STRICT_TRANS_TABLES", ""), - "STRICT_TRANS_TABLES", "")' - ); - } - } - - if (is_array($this->encrypt)) - { - $ssl = array(); - empty($this->encrypt['ssl_key']) OR $ssl['key'] = $this->encrypt['ssl_key']; - empty($this->encrypt['ssl_cert']) OR $ssl['cert'] = $this->encrypt['ssl_cert']; - empty($this->encrypt['ssl_ca']) OR $ssl['ca'] = $this->encrypt['ssl_ca']; - empty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath']; - empty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher']; - - if ( ! empty($ssl)) - { - if (isset($this->encrypt['ssl_verify'])) - { - if ($this->encrypt['ssl_verify']) - { - defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); - } - // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT - // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another - // constant ... - // - // https://secure.php.net/ChangeLog-5.php#5.6.16 - // https://bugs.php.net/bug.php?id=68344 - elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) - { - $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; - } - } - - $client_flags |= MYSQLI_CLIENT_SSL; - $this->_mysqli->ssl_set( - isset($ssl['key']) ? $ssl['key'] : NULL, - isset($ssl['cert']) ? $ssl['cert'] : NULL, - isset($ssl['ca']) ? $ssl['ca'] : NULL, - isset($ssl['capath']) ? $ssl['capath'] : NULL, - isset($ssl['cipher']) ? $ssl['cipher'] : NULL - ); - } - } - - if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)) - { - // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails - if ( - ($client_flags & MYSQLI_CLIENT_SSL) - && version_compare($this->_mysqli->client_info, '5.7.3', '<=') - && empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) - ) - { - $this->_mysqli->close(); - $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; - log_message('error', $message); - return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; - } - - return $this->_mysqli; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if ($this->conn_id->select_db($database)) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return $this->conn_id->set_charset($charset); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - return $this->data_cache['version'] = $this->conn_id->server_info; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return mixed - */ - protected function _execute($sql) - { - return $this->conn_id->query($this->_prep_query($sql)); - } - - // -------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @param string $sql an SQL query - * @return string - */ - protected function _prep_query($sql) - { - // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack - // modifies the query so that it a proper number of affected rows is returned. - if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) - { - return trim($sql).' WHERE 1=1'; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->conn_id->autocommit(FALSE); - return is_php('5.5') - ? $this->conn_id->begin_transaction() - : $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ($this->conn_id->commit()) - { - $this->conn_id->autocommit(TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ($this->conn_id->rollback()) - { - $this->conn_id->autocommit(TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return $this->conn_id->real_escape_string($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return $this->conn_id->affected_rows; - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return $this->conn_id->insert_id; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - if ( ! empty($this->_mysqli->connect_errno)) - { - return array( - 'code' => $this->_mysqli->connect_errno, - 'message' => $this->_mysqli->connect_error - ); - } - - return array('code' => $this->conn_id->errno, 'message' => $this->conn_id->error); - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - $this->conn_id->close(); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_forge.php deleted file mode 100644 index c5b23b6..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_forge.php +++ /dev/null @@ -1,244 +0,0 @@ -db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) - { - $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; - } - - if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) - { - $sql .= ' COLLATE = '.$this->db->dbcollat; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP') - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = ($alter_type === 'ADD') - ? "\n\tADD ".$field[$i]['_literal'] - : "\n\tMODIFY ".$field[$i]['_literal']; - } - else - { - if ($alter_type === 'ADD') - { - $field[$i]['_literal'] = "\n\tADD "; - } - else - { - $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; - } - - $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); - } - } - - return array($sql.implode(',', $field)); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_result.php b/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_result.php deleted file mode 100644 index 929c2b4..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_result.php +++ /dev/null @@ -1,186 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = $this->result_id->num_rows; - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return $this->result_id->field_count; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - $this->result_id->field_seek(0); - while ($field = $this->result_id->fetch_field()) - { - $field_names[] = $field->name; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - $field_data = $this->result_id->fetch_fields(); - for ($i = 0, $c = count($field_data); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $field_data[$i]->name; - $retval[$i]->type = $field_data[$i]->type; - $retval[$i]->max_length = $field_data[$i]->max_length; - $retval[$i]->primary_key = (int) ($field_data[$i]->flags & 2); - $retval[$i]->default = $field_data[$i]->def; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_object($this->result_id)) - { - $this->result_id->free(); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return $this->result_id->data_seek($n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return $this->result_id->fetch_assoc(); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return $this->result_id->fetch_object($class_name); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_utility.php deleted file mode 100644 index 4a3dad4..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/mysqli/mysqli_utility.php +++ /dev/null @@ -1,213 +0,0 @@ -db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); - - // No result means the table name was invalid - if ($query === FALSE) - { - continue; - } - - // Write out the table schema - $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; - - if ($add_drop === TRUE) - { - $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; - } - - $i = 0; - $result = $query->result_array(); - foreach ($result[0] as $val) - { - if ($i++ % 2) - { - $output .= $val.';'.$newline.$newline; - } - } - - // If inserts are not needed we're done... - if ($add_insert === FALSE) - { - continue; - } - - // Grab all the data from the current table - $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); - - if ($query->num_rows() === 0) - { - continue; - } - - // Fetch the field names and determine if the field is an - // integer type. We use this info to decide whether to - // surround the data with quotes or not - - $i = 0; - $field_str = ''; - $is_int = array(); - while ($field = $query->result_id->fetch_field()) - { - // Most versions of MySQL store timestamp as a string - $is_int[$i] = in_array(strtolower($field->type), - array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), - TRUE); - - // Create a string of field names - $field_str .= $this->db->escape_identifiers($field->name).', '; - $i++; - } - - // Trim off the end comma - $field_str = preg_replace('/, $/' , '', $field_str); - - // Build the insert string - foreach ($query->result_array() as $row) - { - $val_str = ''; - - $i = 0; - foreach ($row as $v) - { - // Is the value NULL? - if ($v === NULL) - { - $val_str .= 'NULL'; - } - else - { - // Escape the data if it's not an integer - $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; - } - - // Append a comma - $val_str .= ', '; - $i++; - } - - // Remove the comma at the end of the string - $val_str = preg_replace('/, $/' , '', $val_str); - - // Build the INSERT string - $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; - } - - $output .= $newline.$newline; - } - - // Do we need to include a statement to re-enable foreign key checks? - if ($foreign_key_checks === FALSE) - { - $output .= 'SET foreign_key_checks = 1;'.$newline; - } - - return $output; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/oci8/index.html b/vendor_old/codeigniter/framework/system/database/drivers/oci8/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/oci8/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_driver.php deleted file mode 100644 index fb2f6b3..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_driver.php +++ /dev/null @@ -1,688 +0,0 @@ - '/^\(DESCRIPTION=(\(.+\)){2,}\)$/', // TNS - // Easy Connect string (Oracle 10g+) - 'ec' => '/^(\/\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\/[a-z0-9$_]+)?(:[^\/])?(\/[a-z0-9$_]+)?$/i', - 'in' => '/^[a-z0-9$_]+$/i' // Instance name (defined in tnsnames.ora) - ); - - /* Space characters don't have any effect when actually - * connecting, but can be a hassle while validating the DSN. - */ - $this->dsn = str_replace(array("\n", "\r", "\t", ' '), '', $this->dsn); - - if ($this->dsn !== '') - { - foreach ($valid_dsns as $regexp) - { - if (preg_match($regexp, $this->dsn)) - { - return; - } - } - } - - // Legacy support for TNS in the hostname configuration field - $this->hostname = str_replace(array("\n", "\r", "\t", ' '), '', $this->hostname); - if (preg_match($valid_dsns['tns'], $this->hostname)) - { - $this->dsn = $this->hostname; - return; - } - elseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE - && (( ! empty($this->port) && ctype_digit($this->port)) OR $this->database !== '')) - { - /* If the hostname field isn't empty, doesn't contain - * ':' and/or '/' and if port and/or database aren't - * empty, then the hostname field is most likely indeed - * just a hostname. Therefore we'll try and build an - * Easy Connect string from these 3 settings, assuming - * that the database field is a service name. - */ - $this->dsn = $this->hostname - .(( ! empty($this->port) && ctype_digit($this->port)) ? ':'.$this->port : '') - .($this->database !== '' ? '/'.ltrim($this->database, '/') : ''); - - if (preg_match($valid_dsns['ec'], $this->dsn)) - { - return; - } - } - - /* At this point, we can only try and validate the hostname and - * database fields separately as DSNs. - */ - if (preg_match($valid_dsns['ec'], $this->hostname) OR preg_match($valid_dsns['in'], $this->hostname)) - { - $this->dsn = $this->hostname; - return; - } - - $this->database = str_replace(array("\n", "\r", "\t", ' '), '', $this->database); - foreach ($valid_dsns as $regexp) - { - if (preg_match($regexp, $this->database)) - { - return; - } - } - - /* Well - OK, an empty string should work as well. - * PHP will try to use environment variables to - * determine which Oracle instance to connect to. - */ - $this->dsn = ''; - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $func = ($persistent === TRUE) ? 'oci_pconnect' : 'oci_connect'; - return empty($this->char_set) - ? $func($this->username, $this->password, $this->dsn) - : $func($this->username, $this->password, $this->dsn, $this->char_set); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE) - { - return FALSE; - } - elseif (preg_match('#Release\s(\d+(?:\.\d+)+)#', $version_string, $match)) - { - return $this->data_cache['version'] = $match[1]; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - /* Oracle must parse the query before it is run. All of the actions with - * the query are based on the statement id returned by oci_parse(). - */ - if ($this->_reset_stmt_id === TRUE) - { - $this->stmt_id = oci_parse($this->conn_id, $sql); - } - - oci_set_prefetch($this->stmt_id, 1000); - return oci_execute($this->stmt_id, $this->commit_mode); - } - - // -------------------------------------------------------------------- - - /** - * Get cursor. Returns a cursor from the database - * - * @return resource - */ - public function get_cursor() - { - return $this->curs_id = oci_new_cursor($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Stored Procedure. Executes a stored procedure - * - * @param string package name in which the stored procedure is in - * @param string stored procedure name to execute - * @param array parameters - * @return mixed - * - * params array keys - * - * KEY OPTIONAL NOTES - * name no the name of the parameter should be in : format - * value no the value of the parameter. If this is an OUT or IN OUT parameter, - * this should be a reference to a variable - * type yes the type of the parameter - * length yes the max size of the parameter - */ - public function stored_procedure($package, $procedure, array $params) - { - if ($package === '' OR $procedure === '') - { - log_message('error', 'Invalid query: '.$package.'.'.$procedure); - return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; - } - - // Build the query string - $sql = 'BEGIN '.$package.'.'.$procedure.'('; - - $have_cursor = FALSE; - foreach ($params as $param) - { - $sql .= $param['name'].','; - - if (isset($param['type']) && $param['type'] === OCI_B_CURSOR) - { - $have_cursor = TRUE; - } - } - $sql = trim($sql, ',').'); END;'; - - $this->_reset_stmt_id = FALSE; - $this->stmt_id = oci_parse($this->conn_id, $sql); - $this->_bind_params($params); - $result = $this->query($sql, FALSE, $have_cursor); - $this->_reset_stmt_id = TRUE; - return $result; - } - - // -------------------------------------------------------------------- - - /** - * Bind parameters - * - * @param array $params - * @return void - */ - protected function _bind_params($params) - { - if ( ! is_array($params) OR ! is_resource($this->stmt_id)) - { - return; - } - - foreach ($params as $param) - { - foreach (array('name', 'value', 'type', 'length') as $val) - { - if ( ! isset($param[$val])) - { - $param[$val] = ''; - } - } - - oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); - } - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->commit_mode = OCI_NO_AUTO_COMMIT; - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - $this->commit_mode = OCI_COMMIT_ON_SUCCESS; - - return oci_commit($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - $this->commit_mode = OCI_COMMIT_ON_SUCCESS; - return oci_rollback($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return oci_num_rows($this->stmt_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - // not supported in oracle - return $this->display_error('db_unsupported_function'); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE - FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - - $length = ($query[$i]->CHAR_LENGTH > 0) - ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; - if ($length === NULL) - { - $length = $query[$i]->DATA_LENGTH; - } - $retval[$i]->max_length = $length; - - $default = $query[$i]->DATA_DEFAULT; - if ($default === NULL && $query[$i]->NULLABLE === 'N') - { - $default = ''; - } - $retval[$i]->default = $default; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - // oci_error() returns an array that already contains - // 'code' and 'message' keys, but it can return false - // if there was no error .... - if (is_resource($this->curs_id)) - { - $error = oci_error($this->curs_id); - } - elseif (is_resource($this->stmt_id)) - { - $error = oci_error($this->stmt_id); - } - elseif (is_resource($this->conn_id)) - { - $error = oci_error($this->conn_id); - } - else - { - $error = oci_error(); - } - - return is_array($error) - ? $error - : array('code' => '', 'message' => ''); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _insert_batch($table, $keys, $values) - { - $keys = implode(', ', $keys); - $sql = "INSERT ALL\n"; - - for ($i = 0, $c = count($values); $i < $c; $i++) - { - $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; - } - - return $sql.'SELECT * FROM dual'; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - $this->where('rownum <= ',$this->qb_limit, FALSE); - $this->qb_limit = FALSE; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - if (version_compare($this->version(), '12.1', '>=')) - { - // OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - $this->limit_used = TRUE; - return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' - .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : ''); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - oci_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_forge.php deleted file mode 100644 index 867a943..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_forge.php +++ /dev/null @@ -1,187 +0,0 @@ -db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = "\n\t".$field[$i]['_literal']; - } - else - { - $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - - if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' '.$this->db->escape_identifiers($field[$i]['new_name']); - } - - $field[$i] = "\n\t".$field[$i]['_literal']; - } - } - - $sql .= ' '.$alter_type.' '; - $sql .= (count($field) === 1) - ? $field[0] - : '('.implode(',', $field).')'; - - // RENAME COLUMN must be executed after MODIFY - array_unshift($sqls, $sql); - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - sequences and triggers must be used instead - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'INT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'NUMBER'; - return; - default: return; - } - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_result.php b/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_result.php deleted file mode 100644 index 0c35433..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_result.php +++ /dev/null @@ -1,229 +0,0 @@ -stmt_id = $driver_object->stmt_id; - $this->curs_id = $driver_object->curs_id; - $this->limit_used = $driver_object->limit_used; - $this->commit_mode =& $driver_object->commit_mode; - $driver_object->stmt_id = FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - $count = oci_num_fields($this->stmt_id); - - // if we used a limit we subtract it - return ($this->limit_used) ? $count - 1 : $count; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) - { - $field_names[] = oci_field_name($this->stmt_id, $c); - } - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) - { - $F = new stdClass(); - $F->name = oci_field_name($this->stmt_id, $c); - $F->type = oci_field_type($this->stmt_id, $c); - $F->max_length = oci_field_size($this->stmt_id, $c); - - $retval[] = $F; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - oci_free_statement($this->result_id); - $this->result_id = FALSE; - } - - if (is_resource($this->stmt_id)) - { - oci_free_statement($this->stmt_id); - } - - if (is_resource($this->curs_id)) - { - oci_cancel($this->curs_id); - $this->curs_id = NULL; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; - return oci_fetch_assoc($id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = ($this->curs_id) - ? oci_fetch_object($this->curs_id) - : oci_fetch_object($this->stmt_id); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_utility.php deleted file mode 100644 index ce0dfc5..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/oci8/oci8_utility.php +++ /dev/null @@ -1,68 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/odbc/index.html b/vendor_old/codeigniter/framework/system/database/drivers/odbc/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/odbc/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_driver.php deleted file mode 100644 index ef982fc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_driver.php +++ /dev/null @@ -1,425 +0,0 @@ -dsn)) - { - $this->dsn = $this->hostname; - } - } - - // -------------------------------------------------------------------- - - /** - * Non-persistent database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - return ($persistent === TRUE) - ? odbc_pconnect($this->dsn, $this->username, $this->password) - : odbc_connect($this->dsn, $this->username, $this->password); - } - - // -------------------------------------------------------------------- - - /** - * Compile Bindings - * - * @param string $sql SQL statement - * @param array $binds An array of values to bind - * @return string - */ - public function compile_binds($sql, $binds) - { - if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) - { - return $sql; - } - elseif ( ! is_array($binds)) - { - $binds = array($binds); - $bind_count = 1; - } - else - { - // Make sure we're using numeric keys - $binds = array_values($binds); - $bind_count = count($binds); - } - - // We'll need the marker length later - $ml = strlen($this->bind_marker); - - // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) - { - $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', - str_replace($matches[0], - str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), - $sql, $c), - $matches, PREG_OFFSET_CAPTURE); - - // Bind values' count must match the count of markers in the query - if ($bind_count !== $c) - { - return $sql; - } - } - elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) - { - return $sql; - } - - if ($this->bind_marker !== '?') - { - do - { - $c--; - $sql = substr_replace($sql, '?', $matches[0][$c][1], $ml); - } - while ($c !== 0); - } - - if (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql))) - { - $this->binds = array_values($binds); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - if ( ! isset($this->odbc_result)) - { - return odbc_exec($this->conn_id, $sql); - } - elseif ($this->odbc_result === FALSE) - { - return FALSE; - } - - if (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds))) - { - // For queries that return result sets, return the result_id resource on success - $this->is_write_type($sql) OR $success = $this->odbc_result; - } - - $this->odbc_result = NULL; - $this->binds = array(); - - return $success; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return odbc_autocommit($this->conn_id, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if (odbc_commit($this->conn_id)) - { - odbc_autocommit($this->conn_id, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if (odbc_rollback($this->conn_id)) - { - odbc_autocommit($this->conn_id, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - $this->display_error('db_unsupported_feature'); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return odbc_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return bool - */ - public function insert_id() - { - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @param string $table - * @return string - */ - protected function _field_data($table) - { - return 'SELECT TOP 1 FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => odbc_error($this->conn_id), 'message' => odbc_errormsg($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - odbc_close($this->conn_id); - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_forge.php deleted file mode 100644 index 77b2fdf..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_forge.php +++ /dev/null @@ -1,86 +0,0 @@ -num_rows)) - { - return $this->num_rows; - } - elseif (($this->num_rows = odbc_num_rows($this->result_id)) !== -1) - { - return $this->num_rows; - } - - // Work-around for ODBC subdrivers that don't support num_rows() - if (count($this->result_array) > 0) - { - return $this->num_rows = count($this->result_array); - } - elseif (count($this->result_object) > 0) - { - return $this->num_rows = count($this->result_object); - } - - return $this->num_rows = count($this->result_array()); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return odbc_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - $num_fields = $this->num_fields(); - - if ($num_fields > 0) - { - for ($i = 1; $i <= $num_fields; $i++) - { - $field_names[] = odbc_field_name($this->result_id, $i); - } - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $odbc_index = 1, $c = $this->num_fields(); $i < $c; $i++, $odbc_index++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = odbc_field_name($this->result_id, $odbc_index); - $retval[$i]->type = odbc_field_type($this->result_id, $odbc_index); - $retval[$i]->max_length = odbc_field_len($this->result_id, $odbc_index); - $retval[$i]->primary_key = 0; - $retval[$i]->default = ''; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - odbc_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return odbc_fetch_array($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - $row = odbc_fetch_object($this->result_id); - - if ($class_name === 'stdClass' OR ! $row) - { - return $row; - } - - $class_name = new $class_name(); - foreach ($row as $key => $value) - { - $class_name->$key = $value; - } - - return $class_name; - } - -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('odbc_fetch_array')) -{ - /** - * ODBC Fetch array - * - * Emulates the native odbc_fetch_array() function when - * it is not available (odbc_fetch_array() requires unixODBC) - * - * @param resource &$result - * @param int $rownumber - * @return array - */ - function odbc_fetch_array(&$result, $rownumber = 1) - { - $rs = array(); - if ( ! odbc_fetch_into($result, $rs, $rownumber)) - { - return FALSE; - } - - $rs_assoc = array(); - foreach ($rs as $k => $v) - { - $field_name = odbc_field_name($result, $k+1); - $rs_assoc[$field_name] = $v; - } - - return $rs_assoc; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('odbc_fetch_object')) -{ - /** - * ODBC Fetch object - * - * Emulates the native odbc_fetch_object() function when - * it is not available. - * - * @param resource &$result - * @param int $rownumber - * @return object - */ - function odbc_fetch_object(&$result, $rownumber = 1) - { - $rs = array(); - if ( ! odbc_fetch_into($result, $rs, $rownumber)) - { - return FALSE; - } - - $rs_object = new stdClass(); - foreach ($rs as $k => $v) - { - $field_name = odbc_field_name($result, $k+1); - $rs_object->$field_name = $v; - } - - return $rs_object; - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_utility.php deleted file mode 100644 index 643f6ec..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/odbc/odbc_utility.php +++ /dev/null @@ -1,63 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/index.html b/vendor_old/codeigniter/framework/system/database/drivers/pdo/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_driver.php deleted file mode 100644 index 6afc999..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_driver.php +++ /dev/null @@ -1,329 +0,0 @@ -dsn, $match) && count($match) === 2) - { - // If there is a minimum valid dsn string pattern found, we're done - // This is for general PDO users, who tend to have a full DSN string. - $this->subdriver = $match[1]; - return; - } - // Legacy support for DSN specified in the hostname field - elseif (preg_match('/([^:]+):/', $this->hostname, $match) && count($match) === 2) - { - $this->dsn = $this->hostname; - $this->hostname = NULL; - $this->subdriver = $match[1]; - return; - } - elseif (in_array($this->subdriver, array('mssql', 'sybase'), TRUE)) - { - $this->subdriver = 'dblib'; - } - elseif ($this->subdriver === '4D') - { - $this->subdriver = '4d'; - } - elseif ( ! in_array($this->subdriver, array('4d', 'cubrid', 'dblib', 'firebird', 'ibm', 'informix', 'mysql', 'oci', 'odbc', 'pgsql', 'sqlite', 'sqlsrv'), TRUE)) - { - log_message('error', 'PDO: Invalid or non-existent subdriver'); - - if ($this->db_debug) - { - show_error('Invalid or non-existent PDO subdriver'); - } - } - - $this->dsn = NULL; - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if ($persistent === TRUE) - { - $this->options[PDO::ATTR_PERSISTENT] = TRUE; - } - - try - { - return new PDO($this->dsn, $this->username, $this->password, $this->options); - } - catch (PDOException $e) - { - if ($this->db_debug && empty($this->failover)) - { - $this->display_error($e->getMessage(), '', TRUE); - } - - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - // Not all subdrivers support the getAttribute() method - try - { - return $this->data_cache['version'] = $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION); - } - catch (PDOException $e) - { - return parent::version(); - } - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql SQL query - * @return mixed - */ - protected function _execute($sql) - { - return $this->conn_id->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->conn_id->beginTransaction(); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->conn_id->commit(); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->conn_id->rollBack(); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - // Escape the string - $str = $this->conn_id->quote($str); - - // If there are duplicated quotes, trim them away - return ($str[0] === "'") - ? substr($str, 1, -1) - : $str; - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return is_object($this->result_id) ? $this->result_id->rowCount() : 0; - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @param string $name - * @return int - */ - public function insert_id($name = NULL) - { - return $this->conn_id->lastInsertId($name); - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @param string $table - * @return string - */ - protected function _field_data($table) - { - return 'SELECT TOP 1 * FROM '.$this->protect_identifiers($table); - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - $error = array('code' => '00000', 'message' => ''); - $pdo_error = $this->conn_id->errorInfo(); - - if (empty($pdo_error[0])) - { - return $error; - } - - $error['code'] = isset($pdo_error[1]) ? $pdo_error[0].'/'.$pdo_error[1] : $pdo_error[0]; - if (isset($pdo_error[2])) - { - $error['message'] = $pdo_error[2]; - } - - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_forge.php deleted file mode 100644 index 685b677..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_forge.php +++ /dev/null @@ -1,65 +0,0 @@ -num_rows)) - { - return $this->num_rows; - } - elseif (count($this->result_array) > 0) - { - return $this->num_rows = count($this->result_array); - } - elseif (count($this->result_object) > 0) - { - return $this->num_rows = count($this->result_object); - } - elseif (($num_rows = $this->result_id->rowCount()) > 0) - { - return $this->num_rows = $num_rows; - } - - return $this->num_rows = count($this->result_array()); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return $this->result_id->columnCount(); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return bool - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - // Might trigger an E_WARNING due to not all subdrivers - // supporting getColumnMeta() - $field_names[$i] = @$this->result_id->getColumnMeta($i); - $field_names[$i] = $field_names[$i]['name']; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - try - { - $retval = array(); - - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field = $this->result_id->getColumnMeta($i); - - $retval[$i] = new stdClass(); - $retval[$i]->name = $field['name']; - $retval[$i]->type = $field['native_type']; - $retval[$i]->max_length = ($field['len'] > 0) ? $field['len'] : NULL; - $retval[$i]->primary_key = (int) ( ! empty($field['flags']) && in_array('primary_key', $field['flags'], TRUE)); - } - - return $retval; - } - catch (Exception $e) - { - if ($this->db->db_debug) - { - return $this->db->display_error('db_unsupported_feature'); - } - - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_object($this->result_id)) - { - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return $this->result_id->fetch(PDO::FETCH_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return $this->result_id->fetchObject($class_name); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_utility.php deleted file mode 100644 index 5029cac..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/pdo_utility.php +++ /dev/null @@ -1,63 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/index.html b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php deleted file mode 100644 index 7eaeaa1..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php +++ /dev/null @@ -1,200 +0,0 @@ -dsn)) - { - $this->dsn = '4D:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 3) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('TABLE_NAME').' FROM '.$this->escape_identifiers('_USER_TABLES'); - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' WHERE '.$this->escape_identifiers('TABLE_NAME')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT '.$this->escape_identifiers('COLUMN_NAME').' FROM '.$this->escape_identifiers('_USER_COLUMNS') - .' WHERE '.$this->escape_identifiers('TABLE_NAME').' = '.$this->escape($table); - } - - // -------------------------------------------------------------------- - - /** - * Field data query - * - * Generates a platform-specific query so that the column data can be retrieved - * - * @param string $table - * @return string - */ - protected function _field_data($table) - { - return 'SELECT * FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' LIMIT 1'; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php deleted file mode 100644 index 3f636d3..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php +++ /dev/null @@ -1,217 +0,0 @@ - 'INT', - 'SMALLINT' => 'INT', - 'INT' => 'INT64', - 'INT32' => 'INT64' - ); - - /** - * DEFAULT value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_default = FALSE; - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - // No method of modifying columns is supported - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['null'] - .$field['unique'] - .$field['auto_increment']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'INT64'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE'; - - // UNIQUE must be used with NOT NULL - $field['null'] = ' NOT NULL'; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) - { - if (stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' AUTO_INCREMENT'; - } - elseif (strcasecmp($field['type'], 'UUID') === 0) - { - $field['auto_increment'] = ' AUTO_GENERATE'; - } - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php deleted file mode 100644 index fc49e0d..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php +++ /dev/null @@ -1,209 +0,0 @@ -dsn)) - { - $this->dsn = 'cubrid:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES'; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php deleted file mode 100644 index 276cbb6..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php +++ /dev/null @@ -1,230 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'BIGINT' => 'NUMERIC', - 'FLOAT' => 'DOUBLE', - 'REAL' => 'DOUBLE' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; - } - else - { - $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; - $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'LONGTEXT': - $attributes['TYPE'] = 'STRING'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php deleted file mode 100644 index 0824323..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php +++ /dev/null @@ -1,337 +0,0 @@ -dsn)) - { - $this->dsn = $params['subdriver'].':host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - if ( ! empty($this->port)) - { - $this->dsn .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; - } - - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - empty($this->appname) OR $this->dsn .= ';appname='.$this->appname; - } - else - { - if ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - - $this->subdriver = 'dblib'; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if ($persistent === TRUE) - { - log_message('debug', "dblib driver doesn't support persistent connections"); - } - - $this->conn_id = parent::db_connect(FALSE); - - if ( ! is_object($this->conn_id)) - { - return $this->conn_id; - } - - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - $limit = $this->qb_offset + $this->qb_limit; - - // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, - // however an ORDER BY clause is required for it to work - if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php deleted file mode 100644 index d0cca38..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php +++ /dev/null @@ -1,149 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php deleted file mode 100644 index cb93f19..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php +++ /dev/null @@ -1,279 +0,0 @@ -dsn)) - { - $this->dsn = 'firebird:'; - - if ( ! empty($this->database)) - { - $this->dsn .= 'dbname='.$this->database; - } - elseif ( ! empty($this->hostname)) - { - $this->dsn .= 'dbname='.$this->hostname; - } - - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - empty($this->role) OR $this->dsn .= ';role='.$this->role; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 9) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT "RDB$FIELD_NAME" FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", - CASE "fields"."RDB$FIELD_TYPE" - WHEN 7 THEN \'SMALLINT\' - WHEN 8 THEN \'INTEGER\' - WHEN 9 THEN \'QUAD\' - WHEN 10 THEN \'FLOAT\' - WHEN 11 THEN \'DFLOAT\' - WHEN 12 THEN \'DATE\' - WHEN 13 THEN \'TIME\' - WHEN 14 THEN \'CHAR\' - WHEN 16 THEN \'INT64\' - WHEN 27 THEN \'DOUBLE\' - WHEN 35 THEN \'TIMESTAMP\' - WHEN 37 THEN \'VARCHAR\' - WHEN 40 THEN \'CSTRING\' - WHEN 261 THEN \'BLOB\' - ELSE NULL - END AS "type", - "fields"."RDB$FIELD_LENGTH" AS "max_length", - "rfields"."RDB$DEFAULT_VALUE" AS "default" - FROM "RDB$RELATION_FIELDS" "rfields" - JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" - WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' - ORDER BY "rfields"."RDB$FIELD_POSITION"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // Limit clause depends on if Interbase or Firebird - if (stripos($this->version(), 'firebird') !== FALSE) - { - $select = 'FIRST '.$this->qb_limit - .($this->qb_offset > 0 ? ' SKIP '.$this->qb_offset : ''); - } - else - { - $select = 'ROWS ' - .($this->qb_offset > 0 ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); - } - - return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php deleted file mode 100644 index 20c5a68..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php +++ /dev/null @@ -1,237 +0,0 @@ - 'INTEGER', - 'INTEGER' => 'INT64', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return string - */ - public function create_database($db_name) - { - // Firebird databases are flat files, so a path is required - - // Hostname is needed for remote access - empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; - - return parent::create_database('"'.$db_name.'"'); - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - if ( ! ibase_drop_db($this->conn_id)) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' - .($field[$i]['null'] === TRUE ? 'NULL' : '1') - .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) - .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'].$field['length'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INT': - $attributes['TYPE'] = 'INTEGER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'INT64'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php deleted file mode 100644 index 26b556a..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php +++ /dev/null @@ -1,244 +0,0 @@ -dsn)) - { - $this->dsn = 'ibm:'; - - // Pre-defined DSN - if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) - { - if (isset($this->DSN)) - { - $this->dsn .= 'DSN='.$this->DSN; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DSN='.$this->database; - } - - return; - } - - $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; - - if (isset($this->DATABASE)) - { - $this->dsn .= 'DATABASE='.$this->DATABASE.';'; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DATABASE='.$this->database.';'; - } - - if (isset($this->HOSTNAME)) - { - $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; - } - else - { - $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); - } - - if (isset($this->PORT)) - { - $this->dsn .= 'PORT='.$this->port.';'; - } - elseif ( ! empty($this->port)) - { - $this->dsn .= ';PORT='.$this->port.';'; - } - - $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "tabname" FROM "syscat"."tables" - WHERE "type" = \'T\' AND LOWER("tabschema") = '.$this->escape(strtolower($this->database)); - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return array - */ - protected function _list_columns($table = '') - { - return 'SELECT "colname" FROM "syscat"."columns" - WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' - AND LOWER("tabname") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "colname" AS "name", "typename" AS "type", "default" AS "default", "length" AS "max_length", - CASE "keyseq" WHEN NULL THEN 0 ELSE 1 END AS "primary_key" - FROM "syscat"."columns" - WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' - AND LOWER("tabname") = '.$this->escape(strtolower($table)).' - ORDER BY "colno"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - $sql .= ' FETCH FIRST '.($this->qb_limit + $this->qb_offset).' ROWS ONLY'; - - return ($this->qb_offset) - ? 'SELECT * FROM ('.$sql.') WHERE rownum > '.$this->qb_offset - : $sql; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php deleted file mode 100644 index 4238ca0..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php +++ /dev/null @@ -1,154 +0,0 @@ - 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT' - ); - - /** - * DEFAULT value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_default = FALSE; - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'CHANGE') - { - $alter_type = 'MODIFY'; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE'; - - // UNIQUE must be used with NOT NULL - $field['null'] = ' NOT NULL'; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php deleted file mode 100644 index 050171f..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php +++ /dev/null @@ -1,309 +0,0 @@ -dsn)) - { - $this->dsn = 'informix:'; - - // Pre-defined DSN - if (empty($this->hostname) && empty($this->host) && empty($this->port) && empty($this->service)) - { - if (isset($this->DSN)) - { - $this->dsn .= 'DSN='.$this->DSN; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DSN='.$this->database; - } - - return; - } - - if (isset($this->host)) - { - $this->dsn .= 'host='.$this->host; - } - else - { - $this->dsn .= 'host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - } - - if (isset($this->service)) - { - $this->dsn .= '; service='.$this->service; - } - elseif ( ! empty($this->port)) - { - $this->dsn .= '; service='.$this->port; - } - - empty($this->database) OR $this->dsn .= '; database='.$this->database; - empty($this->server) OR $this->dsn .= '; server='.$this->server; - - $this->dsn .= '; protocol='.(isset($this->protocol) ? $this->protocol : 'onsoctcp') - .'; EnableScrollableCursors=1'; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "tabname" FROM "systables" - WHERE "tabid" > 99 AND "tabtype" = \'T\' AND LOWER("owner") = '.$this->escape(strtolower($this->username)); - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - return 'SELECT "colname" FROM "systables", "syscolumns" - WHERE "systables"."tabid" = "syscolumns"."tabid" - AND "systables"."tabtype" = \'T\' - AND LOWER("systables"."owner") = '.$this->escape(strtolower($owner)).' - AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "syscolumns"."colname" AS "name", - CASE "syscolumns"."coltype" - WHEN 0 THEN \'CHAR\' - WHEN 1 THEN \'SMALLINT\' - WHEN 2 THEN \'INTEGER\' - WHEN 3 THEN \'FLOAT\' - WHEN 4 THEN \'SMALLFLOAT\' - WHEN 5 THEN \'DECIMAL\' - WHEN 6 THEN \'SERIAL\' - WHEN 7 THEN \'DATE\' - WHEN 8 THEN \'MONEY\' - WHEN 9 THEN \'NULL\' - WHEN 10 THEN \'DATETIME\' - WHEN 11 THEN \'BYTE\' - WHEN 12 THEN \'TEXT\' - WHEN 13 THEN \'VARCHAR\' - WHEN 14 THEN \'INTERVAL\' - WHEN 15 THEN \'NCHAR\' - WHEN 16 THEN \'NVARCHAR\' - WHEN 17 THEN \'INT8\' - WHEN 18 THEN \'SERIAL8\' - WHEN 19 THEN \'SET\' - WHEN 20 THEN \'MULTISET\' - WHEN 21 THEN \'LIST\' - WHEN 22 THEN \'Unnamed ROW\' - WHEN 40 THEN \'LVARCHAR\' - WHEN 41 THEN \'BLOB/CLOB/BOOLEAN\' - WHEN 4118 THEN \'Named ROW\' - ELSE "syscolumns"."coltype" - END AS "type", - "syscolumns"."collength" as "max_length", - CASE "sysdefaults"."type" - WHEN \'L\' THEN "sysdefaults"."default" - ELSE NULL - END AS "default" - FROM "syscolumns", "systables", "sysdefaults" - WHERE "syscolumns"."tabid" = "systables"."tabid" - AND "systables"."tabid" = "sysdefaults"."tabid" - AND "syscolumns"."colno" = "sysdefaults"."colno" - AND "systables"."tabtype" = \'T\' - AND LOWER("systables"."owner") = '.$this->escape(strtolower($this->username)).' - AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)).' - ORDER BY "syscolumns"."colno"'; - - return (($query = $this->query($sql)) !== FALSE) - ? $query->result_object() - : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE ONLY '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql $SQL Query - * @return string - */ - protected function _limit($sql) - { - $select = 'SELECT '.($this->qb_offset ? 'SKIP '.$this->qb_offset : '').'FIRST '.$this->qb_limit.' '; - return preg_replace('/^(SELECT\s)/i', $select, $sql, 1); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php deleted file mode 100644 index 2ddc2a9..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php +++ /dev/null @@ -1,163 +0,0 @@ - 'INTEGER', - 'INT' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'REAL' => 'DOUBLE PRECISION', - 'SMALLFLOAT' => 'DOUBLE PRECISION' - ); - - /** - * DEFAULT value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_default = ', '; - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'CHANGE') - { - $alter_type = 'MODIFY'; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'BYTE': - case 'TEXT': - case 'BLOB': - case 'CLOB': - $attributes['UNIQUE'] = FALSE; - if (isset($attributes['DEFAULT'])) - { - unset($attributes['DEFAULT']); - } - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_unique(&$attributes, &$field) - { - if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) - { - $field['unique'] = ' UNIQUE CONSTRAINT '.$this->db->escape_identifiers($field['name']); - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php deleted file mode 100644 index 64b13d8..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php +++ /dev/null @@ -1,374 +0,0 @@ -dsn)) - { - $this->dsn = 'mysql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if (isset($this->stricton)) - { - if ($this->stricton) - { - $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; - } - else - { - $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( - @@sql_mode, - "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", ""), - "STRICT_ALL_TABLES", ""), - "STRICT_TRANS_TABLES,", ""), - ",STRICT_TRANS_TABLES", ""), - "STRICT_TRANS_TABLES", "")'; - } - - if ( ! empty($sql)) - { - if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) - { - $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql; - } - else - { - $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql; - } - } - } - - if ($this->compress === TRUE) - { - $this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; - } - - if (is_array($this->encrypt)) - { - $ssl = array(); - empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key']; - empty($this->encrypt['ssl_cert']) OR $ssl[PDO::MYSQL_ATTR_SSL_CERT] = $this->encrypt['ssl_cert']; - empty($this->encrypt['ssl_ca']) OR $ssl[PDO::MYSQL_ATTR_SSL_CA] = $this->encrypt['ssl_ca']; - empty($this->encrypt['ssl_capath']) OR $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath']; - empty($this->encrypt['ssl_cipher']) OR $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher']; - - // DO NOT use array_merge() here! - // It re-indexes numeric keys and the PDO_MYSQL_ATTR_SSL_* constants are integers. - empty($ssl) OR $this->options += $ssl; - } - - // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails - if ( - ($pdo = parent::db_connect($persistent)) !== FALSE - && ! empty($ssl) - && version_compare($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), '5.7.3', '<=') - && empty($pdo->query("SHOW STATUS LIKE 'ssl_cipher'")->fetchObject()->Value) - ) - { - $message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!'; - log_message('error', $message); - return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; - } - - return $pdo; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); - return $this->conn_id->beginTransaction(); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - if ($this->conn_id->commit()) - { - $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - if ($this->conn_id->rollBack()) - { - $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SHOW TABLES'; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', - $retval[$i]->type, - $retval[$i]->max_length - ); - - $retval[$i]->default = $query[$i]->Default; - $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * @return string - */ - protected function _from_tables() - { - if ( ! empty($this->qb_join) && count($this->qb_from) > 1) - { - return '('.implode(', ', $this->qb_from).')'; - } - - return implode(', ', $this->qb_from); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php deleted file mode 100644 index c7a92b8..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php +++ /dev/null @@ -1,256 +0,0 @@ -db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) - { - $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; - } - - if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) - { - $sql .= ' COLLATE = '.$this->db->dbcollat; - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP') - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = ($alter_type === 'ADD') - ? "\n\tADD ".$field[$i]['_literal'] - : "\n\tMODIFY ".$field[$i]['_literal']; - } - else - { - if ($alter_type === 'ADD') - { - $field[$i]['_literal'] = "\n\tADD "; - } - else - { - $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; - } - - $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); - } - } - - return array($sql.implode(',', $field)); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - $extra_clause = isset($field['after']) - ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escape_identifiers($field['name']) - .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) - .' '.$field['type'].$field['length'] - .$field['unsigned'] - .$field['null'] - .$field['default'] - .$field['auto_increment'] - .$field['unique'] - .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) - .$extra_clause; - } - - // -------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _process_indexes($table) - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if ( ! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif ( ! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); - - $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) - .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; - } - - $this->keys = array(); - - return $sql; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php deleted file mode 100644 index abf9167..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php +++ /dev/null @@ -1,326 +0,0 @@ -dsn)) - { - $this->dsn = 'oci:dbname='; - - // Oracle has a slightly different PDO DSN format (Easy Connect), - // which also supports pre-defined DSNs. - if (empty($this->hostname) && empty($this->port)) - { - $this->dsn .= $this->database; - } - else - { - $this->dsn .= '//'.(empty($this->hostname) ? '127.0.0.1' : $this->hostname) - .(empty($this->port) ? '' : ':'.$this->port).'/'; - - empty($this->database) OR $this->dsn .= $this->database; - } - - empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; - } - elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 4) === FALSE) - { - $this->dsn .= ';charset='.$this->char_set; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - $version_string = parent::version(); - if (preg_match('#Release\s(?\d+(?:\.\d+)+)#', $version_string, $match)) - { - return $this->data_cache['version'] = $match[1]; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (strpos($table, '.') !== FALSE) - { - sscanf($table, '%[^.].%s', $owner, $table); - } - else - { - $owner = $this->username; - } - - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE - FROM ALL_TAB_COLUMNS - WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' - AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - - $length = ($query[$i]->CHAR_LENGTH > 0) - ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; - if ($length === NULL) - { - $length = $query[$i]->DATA_LENGTH; - } - $retval[$i]->max_length = $length; - - $default = $query[$i]->DATA_DEFAULT; - if ($default === NULL && $query[$i]->NULLABLE === 'N') - { - $default = ''; - } - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _insert_batch($table, $keys, $values) - { - $keys = implode(', ', $keys); - $sql = "INSERT ALL\n"; - - for ($i = 0, $c = count($values); $i < $c; $i++) - { - $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; - } - - return $sql.'SELECT * FROM dual'; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - $this->where('rownum <= ',$this->qb_limit, FALSE); - $this->qb_limit = FALSE; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - if (version_compare($this->version(), '12.1', '>=')) - { - // OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' - .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): ''); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php deleted file mode 100644 index c8983ee..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php +++ /dev/null @@ -1,176 +0,0 @@ -db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - $field[$i] = "\n\t".$field[$i]['_literal']; - } - else - { - $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - - if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' '.$this->db->escape_identifiers($field[$i]['new_name']); - } - } - } - - $sql .= ' '.$alter_type.' '; - $sql .= (count($field) === 1) - ? $field[0] - : '('.implode(',', $field).')'; - - // RENAME COLUMN must be executed after MODIFY - array_unshift($sqls, $sql); - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - // Not supported - sequences and triggers must be used instead - } - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'INT': - $attributes['TYPE'] = 'NUMBER'; - return; - case 'BIGINT': - $attributes['TYPE'] = 'NUMBER'; - return; - default: return; - } - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php deleted file mode 100644 index 066dd96..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php +++ /dev/null @@ -1,229 +0,0 @@ -dsn)) - { - $this->dsn = 'odbc:'; - - // Pre-defined DSN - if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) - { - if (isset($this->DSN)) - { - $this->dsn .= 'DSN='.$this->DSN; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DSN='.$this->database; - } - - return; - } - - // If the DSN is not pre-configured - try to build an IBM DB2 connection string - $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; - - if (isset($this->DATABASE)) - { - $this->dsn .= 'DATABASE='.$this->DATABASE.';'; - } - elseif ( ! empty($this->database)) - { - $this->dsn .= 'DATABASE='.$this->database.';'; - } - - if (isset($this->HOSTNAME)) - { - $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; - } - else - { - $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); - } - - if (isset($this->PORT)) - { - $this->dsn .= 'PORT='.$this->port.';'; - } - elseif ( ! empty($this->port)) - { - $this->dsn .= ';PORT='.$this->port.';'; - } - - $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); - } - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - $this->display_error('db_unsupported_feature'); - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php deleted file mode 100644 index a2a3bad..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php +++ /dev/null @@ -1,70 +0,0 @@ -dsn)) - { - $this->dsn = 'pgsql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ';port='.$this->port; - empty($this->database) OR $this->dsn .= ';dbname='.$this->database; - - if ( ! empty($this->username)) - { - $this->dsn .= ';username='.$this->username; - empty($this->password) OR $this->dsn .= ';password='.$this->password; - } - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - $this->conn_id = parent::db_connect($persistent); - - if (is_object($this->conn_id) && ! empty($this->schema)) - { - $this->simple_query('SET search_path TO '.$this->schema.',public'); - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @param string $name - * @return int - */ - public function insert_id($name = NULL) - { - if ($name === NULL && version_compare($this->version(), '8.1', '>=')) - { - $query = $this->query('SELECT LASTVAL() AS ins_id'); - $query = $query->row(); - return $query->ins_id; - } - - return $this->conn_id->lastInsertId($name); - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * - * @param string $str - * @return mixed - */ - public function escape($str) - { - if (is_bool($str)) - { - return ($str) ? 'TRUE' : 'FALSE'; - } - - return parent::escape($str); - } - - // -------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderby - * @param string $direction ASC, DESC or RANDOM - * @param bool $escape - * @return object - */ - public function order_by($orderby, $direction = '', $escape = NULL) - { - $direction = strtoupper(trim($direction)); - if ($direction === 'RANDOM') - { - if ( ! is_float($orderby) && ctype_digit((string) $orderby)) - { - $orderby = ($orderby > 1) - ? (float) '0.'.$orderby - : (float) $orderby; - } - - if (is_float($orderby)) - { - $this->simple_query('SET SEED '.$orderby); - } - - $orderby = $this->_random_keyword[0]; - $direction = ''; - $escape = FALSE; - } - - return parent::order_by($orderby, $direction, $escape); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' AND "table_name" LIKE \'' - .$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT "column_name" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->column_name; - $retval[$i]->type = $query[$i]->data_type; - $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; - $retval[$i]->default = $query[$i]->column_default; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]['value']; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k.' = (CASE '.$val[$index]['field']."\n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END), '; - } - - $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php deleted file mode 100644 index b00af4a..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php +++ /dev/null @@ -1,210 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INT4' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'INT8' => 'NUMERIC', - 'BIGINT' => 'NUMERIC', - 'REAL' => 'DOUBLE PRECISION', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * @param object &$db Database object - * @return void - */ - public function __construct(&$db) - { - parent::__construct($db); - - if (version_compare($this->db->version(), '9.0', '>')) - { - $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; - } - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - // Reset field lengths for data types that don't support it - if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) - { - $attributes['CONSTRAINT'] = NULL; - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $field['type'] = ($field['type'] === 'NUMERIC') - ? 'BIGSERIAL' - : 'SERIAL'; - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php deleted file mode 100644 index 9b70f3e..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php +++ /dev/null @@ -1,219 +0,0 @@ -dsn)) - { - $this->dsn = 'sqlite:'; - - if (empty($this->database) && empty($this->hostname)) - { - $this->database = ':memory:'; - } - - $this->database = empty($this->database) ? $this->hostname : $this->database; - } - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\''; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - return $sql.' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * @param string $table Table name - * @return array - */ - public function list_fields($table) - { - // Is there a cached result? - if (isset($this->data_cache['field_names'][$table])) - { - return $this->data_cache['field_names'][$table]; - } - - if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $this->data_cache['field_names'][$table] = array(); - foreach ($result->result_array() as $row) - { - $this->data_cache['field_names'][$table][] = $row['name']; - } - - return $this->data_cache['field_names'][$table]; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $query = $query->result_array(); - if (empty($query)) - { - return FALSE; - } - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]['name']; - $retval[$i]->type = $query[$i]['type']; - $retval[$i]->max_length = NULL; - $retval[$i]->default = $query[$i]['dflt_value']; - $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'INSERT OR '.parent::_replace($table, $keys, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php deleted file mode 100644 index 18c475b..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php +++ /dev/null @@ -1,238 +0,0 @@ -db->version(), '3.3', '<')) - { - $this->_create_table_if = FALSE; - $this->_drop_table_if = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name (ignored) - * @return bool - */ - public function create_database($db_name) - { - // In SQLite, a database is created when you connect to the database. - // We'll return TRUE so that an error isn't generated - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - // In SQLite, a database is dropped when we delete a file - if (file_exists($this->db->database)) - { - // We need to close the pseudo-connection first - $this->db->close(); - if ( ! @unlink($this->db->database)) - { - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') - { - // drop_column(): - // BEGIN TRANSACTION; - // CREATE TEMPORARY TABLE t1_backup(a,b); - // INSERT INTO t1_backup SELECT a,b FROM t1; - // DROP TABLE t1; - // CREATE TABLE t1(a,b); - // INSERT INTO t1 SELECT a,b FROM t1_backup; - // DROP TABLE t1_backup; - // COMMIT; - - return FALSE; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'] - .$field['auto_increment'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primary_keys = array(); - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php deleted file mode 100644 index 07c429e..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php +++ /dev/null @@ -1,369 +0,0 @@ -dsn)) - { - $this->dsn = 'sqlsrv:Server='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); - - empty($this->port) OR $this->dsn .= ','.$this->port; - empty($this->database) OR $this->dsn .= ';Database='.$this->database; - - // Some custom options - - if (isset($this->QuotedId)) - { - $this->dsn .= ';QuotedId='.$this->QuotedId; - $this->_quoted_identifier = (bool) $this->QuotedId; - } - - if (isset($this->ConnectionPooling)) - { - $this->dsn .= ';ConnectionPooling='.$this->ConnectionPooling; - } - - if ($this->encrypt === TRUE) - { - $this->dsn .= ';Encrypt=1'; - } - - if (isset($this->TraceOn)) - { - $this->dsn .= ';TraceOn='.$this->TraceOn; - } - - if (isset($this->TrustServerCertificate)) - { - $this->dsn .= ';TrustServerCertificate='.$this->TrustServerCertificate; - } - - empty($this->APP) OR $this->dsn .= ';APP='.$this->APP; - empty($this->Failover_Partner) OR $this->dsn .= ';Failover_Partner='.$this->Failover_Partner; - empty($this->LoginTimeout) OR $this->dsn .= ';LoginTimeout='.$this->LoginTimeout; - empty($this->MultipleActiveResultSets) OR $this->dsn .= ';MultipleActiveResultSets='.$this->MultipleActiveResultSets; - empty($this->TraceFile) OR $this->dsn .= ';TraceFile='.$this->TraceFile; - empty($this->WSID) OR $this->dsn .= ';WSID='.$this->WSID; - } - elseif (preg_match('/QuotedId=(0|1)/', $this->dsn, $match)) - { - $this->_quoted_identifier = (bool) $match[1]; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return object - */ - public function db_connect($persistent = FALSE) - { - if ( ! empty($this->char_set) && preg_match('/utf[^8]*8/i', $this->char_set)) - { - $this->options[PDO::SQLSRV_ENCODING_UTF8] = 1; - } - - $this->conn_id = parent::db_connect($persistent); - - if ( ! is_object($this->conn_id) OR is_bool($this->_quoted_identifier)) - { - return $this->conn_id; - } - - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // As of SQL Server 2012 (11.0.*) OFFSET is supported - if (version_compare($this->version(), '11', '>=')) - { - // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - $limit = $this->qb_offset + $this->qb_limit; - - // An ORDER BY clause is required for ROW_NUMBER() to work - if ($this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php deleted file mode 100644 index 82a0d51..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php +++ /dev/null @@ -1,149 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/postgre/index.html b/vendor_old/codeigniter/framework/system/database/drivers/postgre/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/postgre/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_driver.php deleted file mode 100644 index bcdfc06..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_driver.php +++ /dev/null @@ -1,620 +0,0 @@ -dsn)) - { - return; - } - - $this->dsn === '' OR $this->dsn = ''; - - if (strpos($this->hostname, '/') !== FALSE) - { - // If UNIX sockets are used, we shouldn't set a port - $this->port = ''; - } - - $this->hostname === '' OR $this->dsn = 'host='.$this->hostname.' '; - - if ( ! empty($this->port) && ctype_digit($this->port)) - { - $this->dsn .= 'port='.$this->port.' '; - } - - if ($this->username !== '') - { - $this->dsn .= 'user='.$this->username.' '; - - /* An empty password is valid! - * - * $db['password'] = NULL must be done in order to ignore it. - */ - $this->password === NULL OR $this->dsn .= "password='".$this->password."' "; - } - - $this->database === '' OR $this->dsn .= 'dbname='.$this->database.' '; - - /* We don't have these options as elements in our standard configuration - * array, but they might be set by parse_url() if the configuration was - * provided via string. Example: - * - * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 - */ - foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key) - { - if (isset($this->$key) && is_string($this->$key) && $this->$key !== '') - { - $this->dsn .= $key."='".$this->$key."' "; - } - } - - $this->dsn = rtrim($this->dsn); - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $persistent - * @return resource - */ - public function db_connect($persistent = FALSE) - { - $this->conn_id = ($persistent === TRUE) - ? pg_pconnect($this->dsn) - : pg_connect($this->dsn); - - if ($this->conn_id !== FALSE) - { - if ($persistent === TRUE - && pg_connection_status($this->conn_id) === PGSQL_CONNECTION_BAD - && pg_ping($this->conn_id) === FALSE - ) - { - return FALSE; - } - - empty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public'); - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Reconnect - * - * Keep / reestablish the db connection if no queries have been - * sent for a length of time exceeding the server's idle timeout - * - * @return void - */ - public function reconnect() - { - if (pg_ping($this->conn_id) === FALSE) - { - $this->conn_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Set client character set - * - * @param string $charset - * @return bool - */ - protected function _db_set_charset($charset) - { - return (pg_set_client_encoding($this->conn_id, $charset) === 0); - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($pg_version = pg_version($this->conn_id)) === FALSE) - { - return FALSE; - } - - /* If PHP was compiled with PostgreSQL lib versions earlier - * than 7.4, pg_version() won't return the server version - * and so we'll have to fall back to running a query in - * order to get it. - */ - return isset($pg_version['server']) - ? $this->data_cache['version'] = $pg_version['server'] - : parent::version(); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return pg_query($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return (bool) pg_query($this->conn_id, 'BEGIN'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return (bool) pg_query($this->conn_id, 'COMMIT'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return (bool) pg_query($this->conn_id, 'ROLLBACK'); - } - - // -------------------------------------------------------------------- - - /** - * Determines if a query is a "write" type. - * - * @param string An SQL query string - * @return bool - */ - public function is_write_type($sql) - { - if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) - { - return FALSE; - } - - return parent::is_write_type($sql); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return pg_escape_string($this->conn_id, $str); - } - - // -------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * - * @param string $str - * @return mixed - */ - public function escape($str) - { - if (is_php('5.4.4') && (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))) - { - return pg_escape_literal($this->conn_id, $str); - } - elseif (is_bool($str)) - { - return ($str) ? 'TRUE' : 'FALSE'; - } - - return parent::escape($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return pg_affected_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return string - */ - public function insert_id() - { - $v = pg_version($this->conn_id); - $v = isset($v['server']) ? $v['server'] : 0; // 'server' key is only available since PosgreSQL 7.4 - - $table = (func_num_args() > 0) ? func_get_arg(0) : NULL; - $column = (func_num_args() > 1) ? func_get_arg(1) : NULL; - - if ($table === NULL && $v >= '8.1') - { - $sql = 'SELECT LASTVAL() AS ins_id'; - } - elseif ($table !== NULL) - { - if ($column !== NULL && $v >= '8.0') - { - $sql = 'SELECT pg_get_serial_sequence(\''.$table."', '".$column."') AS seq"; - $query = $this->query($sql); - $query = $query->row(); - $seq = $query->seq; - } - else - { - // seq_name passed in table parameter - $seq = $table; - } - - $sql = 'SELECT CURRVAL(\''.$seq."') AS ins_id"; - } - else - { - return pg_last_oid($this->result_id); - } - - $query = $this->query($sql); - $query = $query->row(); - return (int) $query->ins_id; - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; - - if ($prefix_limit !== FALSE && $this->dbprefix !== '') - { - return $sql.' AND "table_name" LIKE \'' - .$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT "column_name" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->column_name; - $retval[$i]->type = $query[$i]->data_type; - $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; - $retval[$i]->default = $query[$i]->column_default; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => '', 'message' => pg_last_error($this->conn_id)); - } - - // -------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderby - * @param string $direction ASC, DESC or RANDOM - * @param bool $escape - * @return object - */ - public function order_by($orderby, $direction = '', $escape = NULL) - { - $direction = strtoupper(trim($direction)); - if ($direction === 'RANDOM') - { - if ( ! is_float($orderby) && ctype_digit((string) $orderby)) - { - $orderby = ($orderby > 1) - ? (float) '0.'.$orderby - : (float) $orderby; - } - - if (is_float($orderby)) - { - $this->simple_query('SET SEED '.$orderby); - } - - $orderby = $this->_random_keyword[0]; - $direction = ''; - $escape = FALSE; - } - - return parent::order_by($orderby, $direction, $escape); - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * @return string - */ - protected function _update_batch($table, $values, $index) - { - $ids = array(); - foreach ($values as $key => $val) - { - $ids[] = $val[$index]['value']; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k.' = (CASE '.$val[$index]['field']."\n" - .implode("\n", $v)."\n" - .'ELSE '.$k.' END), '; - } - - $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); - - return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - $this->qb_limit = FALSE; - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - pg_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_forge.php deleted file mode 100644 index cdbff4c..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_forge.php +++ /dev/null @@ -1,205 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INT4' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'INT8' => 'NUMERIC', - 'BIGINT' => 'NUMERIC', - 'REAL' => 'DOUBLE PRECISION', - 'FLOAT' => 'DOUBLE PRECISION' - ); - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - // -------------------------------------------------------------------- - - /** - * Class constructor - * - * @param object &$db Database object - * @return void - */ - public function __construct(&$db) - { - parent::__construct($db); - - if (version_compare($this->db->version(), '9.0', '>')) - { - $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; - } - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - if ($field[$i]['_literal'] !== FALSE) - { - return FALSE; - } - - if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TYPE '.$field[$i]['type'].$field[$i]['length']; - } - - if ( ! empty($field[$i]['default'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' SET DEFAULT '.$field[$i]['default']; - } - - if (isset($field[$i]['null'])) - { - $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); - } - - if ( ! empty($field[$i]['new_name'])) - { - $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) - .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); - } - - if ( ! empty($field[$i]['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN ' - .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) - .' IS '.$field[$i]['comment']; - } - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - // Reset field lengths for data types that don't support it - if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) - { - $attributes['CONSTRAINT'] = NULL; - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) - { - $field['type'] = ($field['type'] === 'NUMERIC') - ? 'BIGSERIAL' - : 'SERIAL'; - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_result.php b/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_result.php deleted file mode 100644 index 57864a7..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_result.php +++ /dev/null @@ -1,182 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = pg_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return pg_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field_names[] = pg_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = pg_field_name($this->result_id, $i); - $retval[$i]->type = pg_field_type($this->result_id, $i); - $retval[$i]->max_length = pg_field_size($this->result_id, $i); - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - pg_free_result($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return pg_result_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return pg_fetch_assoc($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return pg_fetch_object($this->result_id, NULL, $class_name); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_utility.php deleted file mode 100644 index 5ca358d..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/postgre/postgre_utility.php +++ /dev/null @@ -1,78 +0,0 @@ -db->display_error('db_unsupported_feature'); - } -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/index.html b/vendor_old/codeigniter/framework/system/database/drivers/sqlite/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_driver.php deleted file mode 100644 index 03c96e4..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_driver.php +++ /dev/null @@ -1,330 +0,0 @@ -database, 0666, $error) - : sqlite_open($this->database, 0666, $error); - - isset($error) && log_message('error', $error); - - return $conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - return isset($this->data_cache['version']) - ? $this->data_cache['version'] - : $this->data_cache['version'] = sqlite_libversion(); - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return $this->is_write_type($sql) - ? sqlite_exec($this->conn_id, $sql) - : sqlite_query($this->conn_id, $sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->simple_query('BEGIN TRANSACTION'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->simple_query('COMMIT'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->simple_query('ROLLBACK'); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependant string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return sqlite_escape_string($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return sqlite_changes($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return sqlite_last_insert_rowid($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = "SELECT name FROM sqlite_master WHERE type='table'"; - - if ($prefix_limit !== FALSE && $this->dbprefix != '') - { - return $sql." AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); - } - - return $sql; - } - - // -------------------------------------------------------------------- - - /** - * Show column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return bool - */ - protected function _list_columns($table = '') - { - // Not supported - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $query = $query->result_array(); - if (empty($query)) - { - return FALSE; - } - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]['name']; - $retval[$i]->type = $query[$i]['type']; - $retval[$i]->max_length = NULL; - $retval[$i]->default = $query[$i]['dflt_value']; - $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occured. - * - * @return array - */ - public function error() - { - $error = array('code' => sqlite_last_error($this->conn_id)); - $error['message'] = sqlite_error_string($error['code']); - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'INSERT OR '.parent::_replace($table, $keys, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this function maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - sqlite_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_forge.php deleted file mode 100644 index a0fc0cd..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_forge.php +++ /dev/null @@ -1,205 +0,0 @@ -db->database) OR ! @unlink($this->db->database)) - { - return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @todo implement drop_column(), modify_column() - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') - { - // drop_column(): - // BEGIN TRANSACTION; - // CREATE TEMPORARY TABLE t1_backup(a,b); - // INSERT INTO t1_backup SELECT a,b FROM t1; - // DROP TABLE t1; - // CREATE TABLE t1(a,b); - // INSERT INTO t1 SELECT a,b FROM t1_backup; - // DROP TABLE t1_backup; - // COMMIT; - - return FALSE; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'] - .$field['auto_increment'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primary_keys = array(); - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_result.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_result.php deleted file mode 100644 index 34d3ac3..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_result.php +++ /dev/null @@ -1,164 +0,0 @@ -num_rows) - ? $this->num_rows - : $this->num_rows = @sqlite_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return @sqlite_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field_names[$i] = sqlite_field_name($this->result_id, $i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = sqlite_field_name($this->result_id, $i); - $retval[$i]->type = NULL; - $retval[$i]->max_length = NULL; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n - * @return bool - */ - public function data_seek($n = 0) - { - return sqlite_seek($this->result_id, $n); - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return sqlite_fetch_array($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return sqlite_fetch_object($this->result_id, $class_name); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_utility.php deleted file mode 100644 index 90ca4b1..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite/sqlite_utility.php +++ /dev/null @@ -1,61 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/index.html b/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_driver.php deleted file mode 100644 index d131baa..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_driver.php +++ /dev/null @@ -1,350 +0,0 @@ -password) - ? new SQLite3($this->database) - : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); - } - catch (Exception $e) - { - return FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - $version = SQLite3::version(); - return $this->data_cache['version'] = $version['versionString']; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @todo Implement use of SQLite3::querySingle(), if needed - * @param string $sql - * @return mixed SQLite3Result object or bool - */ - protected function _execute($sql) - { - return $this->is_write_type($sql) - ? $this->conn_id->exec($sql) - : $this->conn_id->query($sql); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return $this->conn_id->exec('BEGIN TRANSACTION'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return $this->conn_id->exec('END TRANSACTION'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return $this->conn_id->exec('ROLLBACK'); - } - - // -------------------------------------------------------------------- - - /** - * Platform-dependent string escape - * - * @param string - * @return string - */ - protected function _escape_str($str) - { - return $this->conn_id->escapeString($str); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return $this->conn_id->changes(); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * @return int - */ - public function insert_id() - { - return $this->conn_id->lastInsertRowID(); - } - - // -------------------------------------------------------------------- - - /** - * Show table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool $prefix_limit - * @return string - */ - protected function _list_tables($prefix_limit = FALSE) - { - return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' - .(($prefix_limit !== FALSE && $this->dbprefix != '') - ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr) - : ''); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * @param string $table Table name - * @return array - */ - public function list_fields($table) - { - // Is there a cached result? - if (isset($this->data_cache['field_names'][$table])) - { - return $this->data_cache['field_names'][$table]; - } - - if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $this->data_cache['field_names'][$table] = array(); - foreach ($result->result_array() as $row) - { - $this->data_cache['field_names'][$table][] = $row['name']; - } - - return $this->data_cache['field_names'][$table]; - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) - { - return FALSE; - } - - $query = $query->result_array(); - if (empty($query)) - { - return FALSE; - } - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]['name']; - $retval[$i]->type = $query[$i]['type']; - $retval[$i]->max_length = NULL; - $retval[$i]->default = $query[$i]['dflt_value']; - $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - return array('code' => $this->conn_id->lastErrorCode(), 'message' => $this->conn_id->lastErrorMsg()); - } - - // -------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string - */ - protected function _replace($table, $keys, $values) - { - return 'INSERT OR '.parent::_replace($table, $keys, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'DELETE FROM '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - $this->conn_id->close(); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_forge.php deleted file mode 100644 index 5ee6daa..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_forge.php +++ /dev/null @@ -1,225 +0,0 @@ -db->version(), '3.3', '<')) - { - $this->_create_table_if = FALSE; - $this->_drop_table_if = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Create database - * - * @param string $db_name - * @return bool - */ - public function create_database($db_name) - { - // In SQLite, a database is created when you connect to the database. - // We'll return TRUE so that an error isn't generated - return TRUE; - } - - // -------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $db_name (ignored) - * @return bool - */ - public function drop_database($db_name) - { - // In SQLite, a database is dropped when we delete a file - if (file_exists($this->db->database)) - { - // We need to close the pseudo-connection first - $this->db->close(); - if ( ! @unlink($this->db->database)) - { - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - elseif ( ! empty($this->db->data_cache['db_names'])) - { - $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); - if ($key !== FALSE) - { - unset($this->db->data_cache['db_names'][$key]); - } - } - - return TRUE; - } - - return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @todo implement drop_column(), modify_column() - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') - { - // drop_column(): - // BEGIN TRANSACTION; - // CREATE TEMPORARY TABLE t1_backup(a,b); - // INSERT INTO t1_backup SELECT a,b FROM t1; - // DROP TABLE t1; - // CREATE TABLE t1(a,b); - // INSERT INTO t1 SELECT a,b FROM t1_backup; - // DROP TABLE t1_backup; - // COMMIT; - - return FALSE; - } - - return parent::_alter_table($alter_type, $table, $field); - } - - // -------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _process_column($field) - { - return $this->db->escape_identifiers($field['name']) - .' '.$field['type'] - .$field['auto_increment'] - .$field['null'] - .$field['unique'] - .$field['default']; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primary_keys = array(); - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_result.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_result.php deleted file mode 100644 index 03751f0..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_result.php +++ /dev/null @@ -1,194 +0,0 @@ -result_id->numColumns(); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $field_names[] = $this->result_id->columnName($i); - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - static $data_types = array( - SQLITE3_INTEGER => 'integer', - SQLITE3_FLOAT => 'float', - SQLITE3_TEXT => 'text', - SQLITE3_BLOB => 'blob', - SQLITE3_NULL => 'null' - ); - - $retval = array(); - for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $this->result_id->columnName($i); - - $type = $this->result_id->columnType($i); - $retval[$i]->type = isset($data_types[$type]) ? $data_types[$type] : $type; - - $retval[$i]->max_length = NULL; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_object($this->result_id)) - { - $this->result_id->finalize(); - $this->result_id = NULL; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return $this->result_id->fetchArray(SQLITE3_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - // No native support for fetching rows as objects - if (($row = $this->result_id->fetchArray(SQLITE3_ASSOC)) === FALSE) - { - return FALSE; - } - elseif ($class_name === 'stdClass') - { - return (object) $row; - } - - $class_name = new $class_name(); - foreach (array_keys($row) as $key) - { - $class_name->$key = $row[$key]; - } - - return $class_name; - } - - // -------------------------------------------------------------------- - - /** - * Data Seek - * - * Moves the internal pointer to the desired offset. We call - * this internally before fetching results to make sure the - * result set starts at zero. - * - * @param int $n (ignored) - * @return array - */ - public function data_seek($n = 0) - { - // Only resetting to the start of the result set is supported - return ($n > 0) ? FALSE : $this->result_id->reset(); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_utility.php deleted file mode 100644 index 20d562f..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlite3/sqlite3_utility.php +++ /dev/null @@ -1,61 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/index.html b/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_driver.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_driver.php deleted file mode 100644 index a43e253..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_driver.php +++ /dev/null @@ -1,543 +0,0 @@ -scrollable === NULL) - { - $this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED') - ? SQLSRV_CURSOR_CLIENT_BUFFERED - : FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Database connection - * - * @param bool $pooling - * @return resource - */ - public function db_connect($pooling = FALSE) - { - $charset = in_array(strtolower($this->char_set), array('utf-8', 'utf8'), TRUE) - ? 'UTF-8' : SQLSRV_ENC_CHAR; - - $connection = array( - 'UID' => empty($this->username) ? '' : $this->username, - 'PWD' => empty($this->password) ? '' : $this->password, - 'Database' => $this->database, - 'ConnectionPooling' => ($pooling === TRUE) ? 1 : 0, - 'CharacterSet' => $charset, - 'Encrypt' => ($this->encrypt === TRUE) ? 1 : 0, - 'ReturnDatesAsStrings' => 1 - ); - - // If the username and password are both empty, assume this is a - // 'Windows Authentication Mode' connection. - if (empty($connection['UID']) && empty($connection['PWD'])) - { - unset($connection['UID'], $connection['PWD']); - } - - if (FALSE !== ($this->conn_id = sqlsrv_connect($this->hostname, $connection))) - { - // Determine how identifiers are escaped - $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); - $query = $query->row_array(); - $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; - $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); - } - - return $this->conn_id; - } - - // -------------------------------------------------------------------- - - /** - * Select the database - * - * @param string $database - * @return bool - */ - public function db_select($database = '') - { - if ($database === '') - { - $database = $this->database; - } - - if ($this->_execute('USE '.$this->escape_identifiers($database))) - { - $this->database = $database; - $this->data_cache = array(); - return TRUE; - } - - return FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql an SQL query - * @return resource - */ - protected function _execute($sql) - { - return ($this->scrollable === FALSE OR $this->is_write_type($sql)) - ? sqlsrv_query($this->conn_id, $sql) - : sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => $this->scrollable)); - } - - // -------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return bool - */ - protected function _trans_begin() - { - return sqlsrv_begin_transaction($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return bool - */ - protected function _trans_commit() - { - return sqlsrv_commit($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return bool - */ - protected function _trans_rollback() - { - return sqlsrv_rollback($this->conn_id); - } - - // -------------------------------------------------------------------- - - /** - * Affected Rows - * - * @return int - */ - public function affected_rows() - { - return sqlsrv_rows_affected($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Insert ID - * - * Returns the last id created in the Identity column. - * - * @return string - */ - public function insert_id() - { - return $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->row()->insert_id; - } - - // -------------------------------------------------------------------- - - /** - * Database version number - * - * @return string - */ - public function version() - { - if (isset($this->data_cache['version'])) - { - return $this->data_cache['version']; - } - - if ( ! $this->conn_id OR ($info = sqlsrv_server_info($this->conn_id)) === FALSE) - { - return FALSE; - } - - return $this->data_cache['version'] = $info['SQLServerVersion']; - } - - // -------------------------------------------------------------------- - - /** - * List table query - * - * Generates a platform-specific query string so that the table names can be fetched - * - * @param bool - * @return string $prefix_limit - */ - protected function _list_tables($prefix_limit = FALSE) - { - $sql = 'SELECT '.$this->escape_identifiers('name') - .' FROM '.$this->escape_identifiers('sysobjects') - .' WHERE '.$this->escape_identifiers('type')." = 'U'"; - - if ($prefix_limit === TRUE && $this->dbprefix !== '') - { - $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " - .sprintf($this->_escape_like_str, $this->_escape_like_chr); - } - - return $sql.' ORDER BY '.$this->escape_identifiers('name'); - } - - // -------------------------------------------------------------------- - - /** - * List column query - * - * Generates a platform-specific query string so that the column names can be fetched - * - * @param string $table - * @return string - */ - protected function _list_columns($table = '') - { - return 'SELECT COLUMN_NAME - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - } - - // -------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table - * @return array - */ - public function field_data($table) - { - $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT - FROM INFORMATION_SCHEMA.Columns - WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); - - if (($query = $this->query($sql)) === FALSE) - { - return FALSE; - } - $query = $query->result_object(); - - $retval = array(); - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $query[$i]->COLUMN_NAME; - $retval[$i]->type = $query[$i]->DATA_TYPE; - $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; - $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Error - * - * Returns an array containing code and message of the last - * database error that has occurred. - * - * @return array - */ - public function error() - { - $error = array('code' => '00000', 'message' => ''); - $sqlsrv_errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); - - if ( ! is_array($sqlsrv_errors)) - { - return $error; - } - - $sqlsrv_error = array_shift($sqlsrv_errors); - if (isset($sqlsrv_error['SQLSTATE'])) - { - $error['code'] = isset($sqlsrv_error['code']) ? $sqlsrv_error['SQLSTATE'].'/'.$sqlsrv_error['code'] : $sqlsrv_error['SQLSTATE']; - } - elseif (isset($sqlsrv_error['code'])) - { - $error['code'] = $sqlsrv_error['code']; - } - - if (isset($sqlsrv_error['message'])) - { - $error['message'] = $sqlsrv_error['message']; - } - - return $error; - } - - // -------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * @return string - */ - protected function _update($table, $values) - { - $this->qb_limit = FALSE; - $this->qb_orderby = array(); - return parent::_update($table, $values); - } - - // -------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate($table) - { - return 'TRUNCATE TABLE '.$table; - } - - // -------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table - * @return string - */ - protected function _delete($table) - { - if ($this->qb_limit) - { - return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; - } - - return parent::_delete($table); - } - - // -------------------------------------------------------------------- - - /** - * LIMIT - * - * Generates a platform-specific LIMIT clause - * - * @param string $sql SQL Query - * @return string - */ - protected function _limit($sql) - { - // As of SQL Server 2012 (11.0.*) OFFSET is supported - if (version_compare($this->version(), '11', '>=')) - { - // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause - empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; - - return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; - } - - $limit = $this->qb_offset + $this->qb_limit; - - // An ORDER BY clause is required for ROW_NUMBER() to work - if ($this->qb_offset && ! empty($this->qb_orderby)) - { - $orderby = $this->_compile_order_by(); - - // We have to strip the ORDER BY clause - $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); - - // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results - if (count($this->qb_select) === 0) - { - $select = '*'; // Inevitable - } - else - { - // Use only field names and their aliases, everything else is out of our scope. - $select = array(); - $field_regexp = ($this->_quoted_identifier) - ? '("[^\"]+")' : '(\[[^\]]+\])'; - for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) - { - $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) - ? $m[1] : $this->qb_select[$i]; - } - $select = implode(', ', $select); - } - - return 'SELECT '.$select." FROM (\n\n" - .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) - ."\n\n) ".$this->escape_identifiers('CI_subquery') - ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; - } - - return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); - } - - // -------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * @return string|bool - */ - protected function _insert_batch($table, $keys, $values) - { - // Multiple-value inserts are only supported as of SQL Server 2008 - if (version_compare($this->version(), '10', '>=')) - { - return parent::_insert_batch($table, $keys, $values); - } - - return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; - } - - // -------------------------------------------------------------------- - - /** - * Close DB Connection - * - * @return void - */ - protected function _close() - { - sqlsrv_close($this->conn_id); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_forge.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_forge.php deleted file mode 100644 index aa8490e..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_forge.php +++ /dev/null @@ -1,149 +0,0 @@ - 'SMALLINT', - 'SMALLINT' => 'INT', - 'INT' => 'BIGINT', - 'REAL' => 'FLOAT' - ); - - // -------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alter_table($alter_type, $table, $field) - { - if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) - { - return parent::_alter_table($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; - $sqls = array(); - for ($i = 0, $c = count($field); $i < $c; $i++) - { - $sqls[] = $sql.$this->_process_column($field[$i]); - } - - return $sqls; - } - - // -------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * @return void - */ - protected function _attr_type(&$attributes) - { - if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) - { - unset($attributes['CONSTRAINT']); - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = FALSE; - return; - case 'INTEGER': - $attributes['TYPE'] = 'INT'; - return; - default: return; - } - } - - // -------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * @return void - */ - protected function _attr_auto_increment(&$attributes, &$field) - { - if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) - { - $field['auto_increment'] = ' IDENTITY(1,1)'; - } - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_result.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_result.php deleted file mode 100644 index f784ebe..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_result.php +++ /dev/null @@ -1,193 +0,0 @@ -scrollable = $driver_object->scrollable; - } - - // -------------------------------------------------------------------- - - /** - * Number of rows in the result set - * - * @return int - */ - public function num_rows() - { - // sqlsrv_num_rows() doesn't work with the FORWARD and DYNAMIC cursors (FALSE is the same as FORWARD) - if ( ! in_array($this->scrollable, array(FALSE, SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_DYNAMIC), TRUE)) - { - return parent::num_rows(); - } - - return is_int($this->num_rows) - ? $this->num_rows - : $this->num_rows = sqlsrv_num_rows($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Number of fields in the result set - * - * @return int - */ - public function num_fields() - { - return @sqlsrv_num_fields($this->result_id); - } - - // -------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * Generates an array of column names - * - * @return array - */ - public function list_fields() - { - $field_names = array(); - foreach (sqlsrv_field_metadata($this->result_id) as $offset => $field) - { - $field_names[] = $field['Name']; - } - - return $field_names; - } - - // -------------------------------------------------------------------- - - /** - * Field data - * - * Generates an array of objects containing field meta-data - * - * @return array - */ - public function field_data() - { - $retval = array(); - foreach (sqlsrv_field_metadata($this->result_id) as $i => $field) - { - $retval[$i] = new stdClass(); - $retval[$i]->name = $field['Name']; - $retval[$i]->type = $field['Type']; - $retval[$i]->max_length = $field['Size']; - } - - return $retval; - } - - // -------------------------------------------------------------------- - - /** - * Free the result - * - * @return void - */ - public function free_result() - { - if (is_resource($this->result_id)) - { - sqlsrv_free_stmt($this->result_id); - $this->result_id = FALSE; - } - } - - // -------------------------------------------------------------------- - - /** - * Result - associative array - * - * Returns the result set as an array - * - * @return array - */ - protected function _fetch_assoc() - { - return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); - } - - // -------------------------------------------------------------------- - - /** - * Result - object - * - * Returns the result set as an object - * - * @param string $class_name - * @return object - */ - protected function _fetch_object($class_name = 'stdClass') - { - return sqlsrv_fetch_object($this->result_id, $class_name); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_utility.php b/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_utility.php deleted file mode 100644 index 19c93d0..0000000 --- a/vendor_old/codeigniter/framework/system/database/drivers/sqlsrv/sqlsrv_utility.php +++ /dev/null @@ -1,77 +0,0 @@ -db->display_error('db_unsupported_feature'); - } - -} diff --git a/vendor_old/codeigniter/framework/system/database/index.html b/vendor_old/codeigniter/framework/system/database/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/database/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/fonts/index.html b/vendor_old/codeigniter/framework/system/fonts/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor_old/codeigniter/framework/system/fonts/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

      Directory access is forbidden.

      - - - diff --git a/vendor_old/codeigniter/framework/system/fonts/texb.ttf b/vendor_old/codeigniter/framework/system/fonts/texb.ttf deleted file mode 100644 index 383c88b86b7c17e2e284732af48b2bfc359647ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143830 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 z 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 n`i '', - 'img_path' => '', - 'img_url' => '', - 'img_width' => '150', - 'img_height' => '30', - 'font_path' => '', - 'expiration' => 7200, - 'word_length' => 8, - 'font_size' => 16, - 'img_id' => '', - 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', - 'colors' => array( - 'background' => array(255,255,255), - 'border' => array(153,102,102), - 'text' => array(204,153,153), - 'grid' => array(255,182,182) - ) - ); - - foreach ($defaults as $key => $val) - { - if ( ! is_array($data) && empty($$key)) - { - $$key = $val; - } - else - { - $$key = isset($data[$key]) ? $data[$key] : $val; - } - } - - if ($img_path === '' OR $img_url === '' - OR ! is_dir($img_path) OR ! is_really_writable($img_path) - OR ! extension_loaded('gd')) - { - return FALSE; - } - - // ----------------------------------- - // Remove old images - // ----------------------------------- - - $now = microtime(TRUE); - - $current_dir = @opendir($img_path); - while ($filename = @readdir($current_dir)) - { - if (in_array(substr($filename, -4), array('.jpg', '.png')) - && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) - { - @unlink($img_path.$filename); - } - } - - @closedir($current_dir); - - // ----------------------------------- - // Do we have a "word" yet? - // ----------------------------------- - - if (empty($word)) - { - $word = ''; - $pool_length = strlen($pool); - $rand_max = $pool_length - 1; - - // PHP7 or a suitable polyfill - if (function_exists('random_int')) - { - try - { - for ($i = 0; $i < $word_length; $i++) - { - $word .= $pool[random_int(0, $rand_max)]; - } - } - catch (Exception $e) - { - // This means fallback to the next possible - // alternative to random_int() - $word = ''; - } - } - } - - if (empty($word)) - { - // Nobody will have a larger character pool than - // 256 characters, but let's handle it just in case ... - // - // No, I do not care that the fallback to mt_rand() can - // handle it; if you trigger this, you're very obviously - // trying to break it. -- Narf - if ($pool_length > 256) - { - return FALSE; - } - - // We'll try using the operating system's PRNG first, - // which we can access through CI_Security::get_random_bytes() - $security = get_instance()->security; - - // To avoid numerous get_random_bytes() calls, we'll - // just try fetching as much bytes as we need at once. - if (($bytes = $security->get_random_bytes($pool_length)) !== FALSE) - { - $byte_index = $word_index = 0; - while ($word_index < $word_length) - { - // Do we have more random data to use? - // It could be exhausted by previous iterations - // ignoring bytes higher than $rand_max. - if ($byte_index === $pool_length) - { - // No failures should be possible if the - // first get_random_bytes() call didn't - // return FALSE, but still ... - for ($i = 0; $i < 5; $i++) - { - if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) - { - continue; - } - - $byte_index = 0; - break; - } - - if ($bytes === FALSE) - { - // Sadly, this means fallback to mt_rand() - $word = ''; - break; - } - } - - list(, $rand_index) = unpack('C', $bytes[$byte_index++]); - if ($rand_index > $rand_max) - { - continue; - } - - $word .= $pool[$rand_index]; - $word_index++; - } - } - } - - if (empty($word)) - { - for ($i = 0; $i < $word_length; $i++) - { - $word .= $pool[mt_rand(0, $rand_max)]; - } - } - elseif ( ! is_string($word)) - { - $word = (string) $word; - } - - // ----------------------------------- - // Determine angle and position - // ----------------------------------- - $length = strlen($word); - $angle = ($length >= 6) ? mt_rand(-($length-6), ($length-6)) : 0; - $x_axis = mt_rand(6, (360/$length)-16); - $y_axis = ($angle >= 0) ? mt_rand($img_height, $img_width) : mt_rand(6, $img_height); - - // Create image - // PHP.net recommends imagecreatetruecolor(), but it isn't always available - $im = function_exists('imagecreatetruecolor') - ? imagecreatetruecolor($img_width, $img_height) - : imagecreate($img_width, $img_height); - - // ----------------------------------- - // Assign colors - // ---------------------------------- - - is_array($colors) OR $colors = $defaults['colors']; - - foreach (array_keys($defaults['colors']) as $key) - { - // Check for a possible missing value - is_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key]; - $colors[$key] = imagecolorallocate($im, $colors[$key][0], $colors[$key][1], $colors[$key][2]); - } - - // Create the rectangle - ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']); - - // ----------------------------------- - // Create the spiral pattern - // ----------------------------------- - $theta = 1; - $thetac = 7; - $radius = 16; - $circles = 20; - $points = 32; - - for ($i = 0, $cp = ($circles * $points) - 1; $i < $cp; $i++) - { - $theta += $thetac; - $rad = $radius * ($i / $points); - $x = ($rad * cos($theta)) + $x_axis; - $y = ($rad * sin($theta)) + $y_axis; - $theta += $thetac; - $rad1 = $radius * (($i + 1) / $points); - $x1 = ($rad1 * cos($theta)) + $x_axis; - $y1 = ($rad1 * sin($theta)) + $y_axis; - imageline($im, $x, $y, $x1, $y1, $colors['grid']); - $theta -= $thetac; - } - - // ----------------------------------- - // Write the text - // ----------------------------------- - - $use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext')); - if ($use_font === FALSE) - { - ($font_size > 5) && $font_size = 5; - $x = mt_rand(0, $img_width / ($length / 3)); - $y = 0; - } - else - { - ($font_size > 30) && $font_size = 30; - $x = mt_rand(0, $img_width / ($length / 1.5)); - $y = $font_size + 2; - } - - for ($i = 0; $i < $length; $i++) - { - if ($use_font === FALSE) - { - $y = mt_rand(0 , $img_height / 2); - imagestring($im, $font_size, $x, $y, $word[$i], $colors['text']); - $x += ($font_size * 2); - } - else - { - $y = mt_rand($img_height / 2, $img_height - 3); - imagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]); - $x += $font_size; - } - } - - // Create the border - imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']); - - // ----------------------------------- - // Generate the image - // ----------------------------------- - $img_url = rtrim($img_url, '/').'/'; - - if (function_exists('imagejpeg')) - { - $img_filename = $now.'.jpg'; - imagejpeg($im, $img_path.$img_filename); - } - elseif (function_exists('imagepng')) - { - $img_filename = $now.'.png'; - imagepng($im, $img_path.$img_filename); - } - else - { - return FALSE; - } - - $img = ' '; - ImageDestroy($im); - - return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename); - } -} diff --git a/vendor_old/codeigniter/framework/system/helpers/cookie_helper.php b/vendor_old/codeigniter/framework/system/helpers/cookie_helper.php deleted file mode 100644 index b943edb..0000000 --- a/vendor_old/codeigniter/framework/system/helpers/cookie_helper.php +++ /dev/null @@ -1,113 +0,0 @@ -input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_cookie')) -{ - /** - * Fetch an item from the COOKIE array - * - * @param string - * @param bool - * @return mixed - */ - function get_cookie($index, $xss_clean = NULL) - { - is_bool($xss_clean) OR $xss_clean = (config_item('global_xss_filtering') === TRUE); - $prefix = isset($_COOKIE[$index]) ? '' : config_item('cookie_prefix'); - return get_instance()->input->cookie($prefix.$index, $xss_clean); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('delete_cookie')) -{ - /** - * Delete a COOKIE - * - * @param mixed - * @param string the cookie domain. Usually: .yourdomain.com - * @param string the cookie path - * @param string the cookie prefix - * @return void - */ - function delete_cookie($name, $domain = '', $path = '/', $prefix = '') - { - set_cookie($name, '', '', $domain, $path, $prefix); - } -} diff --git a/vendor_old/codeigniter/framework/system/helpers/date_helper.php b/vendor_old/codeigniter/framework/system/helpers/date_helper.php deleted file mode 100644 index bb15042..0000000 --- a/vendor_old/codeigniter/framework/system/helpers/date_helper.php +++ /dev/null @@ -1,742 +0,0 @@ -format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second); - - return mktime($hour, $minute, $second, $month, $day, $year); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('mdate')) -{ - /** - * Convert MySQL Style Datecodes - * - * This function is identical to PHPs date() function, - * except that it allows date codes to be formatted using - * the MySQL style, where each code letter is preceded - * with a percent sign: %Y %m %d etc... - * - * The benefit of doing dates this way is that you don't - * have to worry about escaping your text letters that - * match the date codes. - * - * @param string - * @param int - * @return int - */ - function mdate($datestr = '', $time = '') - { - if ($datestr === '') - { - return ''; - } - elseif (empty($time)) - { - $time = now(); - } - - $datestr = str_replace( - '%\\', - '', - preg_replace('/([a-z]+?){1}/i', '\\\\\\1', $datestr) - ); - - return date($datestr, $time); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('standard_date')) -{ - /** - * Standard Date - * - * Returns a date formatted according to the submitted standard. - * - * As of PHP 5.2, the DateTime extension provides constants that - * serve for the exact same purpose and are used with date(). - * - * @todo Remove in version 3.1+. - * @deprecated 3.0.0 Use PHP's native date() instead. - * @link http://www.php.net/manual/en/class.datetime.php#datetime.constants.types - * - * @example date(DATE_RFC822, now()); // default - * @example date(DATE_W3C, $time); // a different format and time - * - * @param string $fmt = 'DATE_RFC822' the chosen format - * @param int $time = NULL Unix timestamp - * @return string - */ - function standard_date($fmt = 'DATE_RFC822', $time = NULL) - { - if (empty($time)) - { - $time = now(); - } - - // Procedural style pre-defined constants from the DateTime extension - if (strpos($fmt, 'DATE_') !== 0 OR defined($fmt) === FALSE) - { - return FALSE; - } - - return date(constant($fmt), $time); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('timespan')) -{ - /** - * Timespan - * - * Returns a span of seconds in this format: - * 10 days 14 hours 36 minutes 47 seconds - * - * @param int a number of seconds - * @param int Unix timestamp - * @param int a number of display units - * @return string - */ - function timespan($seconds = 1, $time = '', $units = 7) - { - $CI =& get_instance(); - $CI->lang->load('date'); - - is_numeric($seconds) OR $seconds = 1; - is_numeric($time) OR $time = time(); - is_numeric($units) OR $units = 7; - - $seconds = ($time <= $seconds) ? 1 : $time - $seconds; - - $str = array(); - $years = floor($seconds / 31557600); - - if ($years > 0) - { - $str[] = $years.' '.$CI->lang->line($years > 1 ? 'date_years' : 'date_year'); - } - - $seconds -= $years * 31557600; - $months = floor($seconds / 2629743); - - if (count($str) < $units && ($years > 0 OR $months > 0)) - { - if ($months > 0) - { - $str[] = $months.' '.$CI->lang->line($months > 1 ? 'date_months' : 'date_month'); - } - - $seconds -= $months * 2629743; - } - - $weeks = floor($seconds / 604800); - - if (count($str) < $units && ($years > 0 OR $months > 0 OR $weeks > 0)) - { - if ($weeks > 0) - { - $str[] = $weeks.' '.$CI->lang->line($weeks > 1 ? 'date_weeks' : 'date_week'); - } - - $seconds -= $weeks * 604800; - } - - $days = floor($seconds / 86400); - - if (count($str) < $units && ($months > 0 OR $weeks > 0 OR $days > 0)) - { - if ($days > 0) - { - $str[] = $days.' '.$CI->lang->line($days > 1 ? 'date_days' : 'date_day'); - } - - $seconds -= $days * 86400; - } - - $hours = floor($seconds / 3600); - - if (count($str) < $units && ($days > 0 OR $hours > 0)) - { - if ($hours > 0) - { - $str[] = $hours.' '.$CI->lang->line($hours > 1 ? 'date_hours' : 'date_hour'); - } - - $seconds -= $hours * 3600; - } - - $minutes = floor($seconds / 60); - - if (count($str) < $units && ($days > 0 OR $hours > 0 OR $minutes > 0)) - { - if ($minutes > 0) - { - $str[] = $minutes.' '.$CI->lang->line($minutes > 1 ? 'date_minutes' : 'date_minute'); - } - - $seconds -= $minutes * 60; - } - - if (count($str) === 0) - { - $str[] = $seconds.' '.$CI->lang->line($seconds > 1 ? 'date_seconds' : 'date_second'); - } - - return implode(', ', $str); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('days_in_month')) -{ - /** - * Number of days in a month - * - * Takes a month/year as input and returns the number of days - * for the given month/year. Takes leap years into consideration. - * - * @param int a numeric month - * @param int a numeric year - * @return int - */ - function days_in_month($month = 0, $year = '') - { - if ($month < 1 OR $month > 12) - { - return 0; - } - elseif ( ! is_numeric($year) OR strlen($year) !== 4) - { - $year = date('Y'); - } - - if (defined('CAL_GREGORIAN')) - { - return cal_days_in_month(CAL_GREGORIAN, $month, $year); - } - - if ($year >= 1970) - { - return (int) date('t', mktime(12, 0, 0, $month, 1, $year)); - } - - if ($month == 2) - { - if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0)) - { - return 29; - } - } - - $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); - return $days_in_month[$month - 1]; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('local_to_gmt')) -{ - /** - * Converts a local Unix timestamp to GMT - * - * @param int Unix timestamp - * @return int - */ - function local_to_gmt($time = '') - { - if ($time === '') - { - $time = time(); - } - - return mktime( - gmdate('G', $time), - gmdate('i', $time), - gmdate('s', $time), - gmdate('n', $time), - gmdate('j', $time), - gmdate('Y', $time) - ); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('gmt_to_local')) -{ - /** - * Converts GMT time to a localized value - * - * Takes a Unix timestamp (in GMT) as input, and returns - * at the local value based on the timezone and DST setting - * submitted - * - * @param int Unix timestamp - * @param string timezone - * @param bool whether DST is active - * @return int - */ - function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) - { - if ($time === '') - { - return now(); - } - - $time += timezones($timezone) * 3600; - - return ($dst === TRUE) ? $time + 3600 : $time; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('mysql_to_unix')) -{ - /** - * Converts a MySQL Timestamp to Unix - * - * @param int MySQL timestamp YYYY-MM-DD HH:MM:SS - * @return int Unix timstamp - */ - function mysql_to_unix($time = '') - { - // We'll remove certain characters for backward compatibility - // since the formatting changed with MySQL 4.1 - // YYYY-MM-DD HH:MM:SS - - $time = str_replace(array('-', ':', ' '), '', $time); - - // YYYYMMDDHHMMSS - return mktime( - substr($time, 8, 2), - substr($time, 10, 2), - substr($time, 12, 2), - substr($time, 4, 2), - substr($time, 6, 2), - substr($time, 0, 4) - ); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('unix_to_human')) -{ - /** - * Unix to "Human" - * - * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM - * - * @param int Unix timestamp - * @param bool whether to show seconds - * @param string format: us or euro - * @return string - */ - function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') - { - $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; - - if ($fmt === 'us') - { - $r .= date('h', $time).':'.date('i', $time); - } - else - { - $r .= date('H', $time).':'.date('i', $time); - } - - if ($seconds) - { - $r .= ':'.date('s', $time); - } - - if ($fmt === 'us') - { - return $r.' '.date('A', $time); - } - - return $r; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('human_to_unix')) -{ - /** - * Convert "human" date to GMT - * - * Reverses the above process - * - * @param string format: us or euro - * @return int - */ - function human_to_unix($datestr = '') - { - if ($datestr === '') - { - return FALSE; - } - - $datestr = preg_replace('/\040+/', ' ', trim($datestr)); - - if ( ! preg_match('/^(\d{2}|\d{4})\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) - { - return FALSE; - } - - sscanf($datestr, '%d-%d-%d %s %s', $year, $month, $day, $time, $ampm); - sscanf($time, '%d:%d:%d', $hour, $min, $sec); - isset($sec) OR $sec = 0; - - if (isset($ampm)) - { - $ampm = strtolower($ampm); - - if ($ampm[0] === 'p' && $hour < 12) - { - $hour += 12; - } - elseif ($ampm[0] === 'a' && $hour === 12) - { - $hour = 0; - } - } - - return mktime($hour, $min, $sec, $month, $day, $year); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('nice_date')) -{ - /** - * Turns many "reasonably-date-like" strings into something - * that is actually useful. This only works for dates after unix epoch. - * - * @deprecated 3.1.3 Use DateTime::createFromFormat($input_format, $input)->format($output_format); - * @param string The terribly formatted date-like string - * @param string Date format to return (same as php date function) - * @return string - */ - function nice_date($bad_date = '', $format = FALSE) - { - if (empty($bad_date)) - { - return 'Unknown'; - } - elseif (empty($format)) - { - $format = 'U'; - } - - // Date like: YYYYMM - if (preg_match('/^\d{6}$/i', $bad_date)) - { - if (in_array(substr($bad_date, 0, 2), array('19', '20'))) - { - $year = substr($bad_date, 0, 4); - $month = substr($bad_date, 4, 2); - } - else - { - $month = substr($bad_date, 0, 2); - $year = substr($bad_date, 2, 4); - } - - return date($format, strtotime($year.'-'.$month.'-01')); - } - - // Date Like: YYYYMMDD - if (preg_match('/^\d{8}$/i', $bad_date, $matches)) - { - return DateTime::createFromFormat('Ymd', $bad_date)->format($format); - } - - // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) - if (preg_match('/^(\d{1,2})-(\d{1,2})-(\d{4})$/i', $bad_date, $matches)) - { - return date($format, strtotime($matches[3].'-'.$matches[1].'-'.$matches[2])); - } - - // Any other kind of string, when converted into UNIX time, - // produces "0 seconds after epoc..." is probably bad... - // return "Invalid Date". - if (date('U', strtotime($bad_date)) === '0') - { - return 'Invalid Date'; - } - - // It's probably a valid-ish date format already - return date($format, strtotime($bad_date)); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('timezone_menu')) -{ - /** - * Timezone Menu - * - * Generates a drop-down menu of timezones. - * - * @param string timezone - * @param string classname - * @param string menu name - * @param mixed attributes - * @return string - */ - function timezone_menu($default = 'UTC', $class = '', $name = 'timezones', $attributes = '') - { - $CI =& get_instance(); - $CI->lang->load('date'); - - $default = ($default === 'GMT') ? 'UTC' : $default; - - $menu = ''; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('timezones')) -{ - /** - * Timezones - * - * Returns an array of timezones. This is a helper function - * for various other ones in this library - * - * @param string timezone - * @return string - */ - function timezones($tz = '') - { - // Note: Don't change the order of these even though - // some items appear to be in the wrong order - - $zones = array( - 'UM12' => -12, - 'UM11' => -11, - 'UM10' => -10, - 'UM95' => -9.5, - 'UM9' => -9, - 'UM8' => -8, - 'UM7' => -7, - 'UM6' => -6, - 'UM5' => -5, - 'UM45' => -4.5, - 'UM4' => -4, - 'UM35' => -3.5, - 'UM3' => -3, - 'UM2' => -2, - 'UM1' => -1, - 'UTC' => 0, - 'UP1' => +1, - 'UP2' => +2, - 'UP3' => +3, - 'UP35' => +3.5, - 'UP4' => +4, - 'UP45' => +4.5, - 'UP5' => +5, - 'UP55' => +5.5, - 'UP575' => +5.75, - 'UP6' => +6, - 'UP65' => +6.5, - 'UP7' => +7, - 'UP8' => +8, - 'UP875' => +8.75, - 'UP9' => +9, - 'UP95' => +9.5, - 'UP10' => +10, - 'UP105' => +10.5, - 'UP11' => +11, - 'UP115' => +11.5, - 'UP12' => +12, - 'UP1275' => +12.75, - 'UP13' => +13, - 'UP14' => +14 - ); - - if ($tz === '') - { - return $zones; - } - - return isset($zones[$tz]) ? $zones[$tz] : 0; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('date_range')) -{ - /** - * Date range - * - * Returns a list of dates within a specified period. - * - * @param int unix_start UNIX timestamp of period start date - * @param int unix_end|days UNIX timestamp of period end date - * or interval in days. - * @param mixed is_unix Specifies whether the second parameter - * is a UNIX timestamp or a day interval - * - TRUE or 'unix' for a timestamp - * - FALSE or 'days' for an interval - * @param string date_format Output date format, same as in date() - * @return array - */ - function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d') - { - if ($unix_start == '' OR $mixed == '' OR $format == '') - { - return FALSE; - } - - $is_unix = ! ( ! $is_unix OR $is_unix === 'days'); - - // Validate input and try strtotime() on invalid timestamps/intervals, just in case - if ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_start)) === FALSE) - OR ( ! ctype_digit((string) $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE)) - OR ($is_unix === TRUE && $mixed < $unix_start)) - { - return FALSE; - } - - if ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed))) - { - return array(date($format, $unix_start)); - } - - $range = array(); - - $from = new DateTime(); - $from->setTimestamp($unix_start); - - if ($is_unix) - { - $arg = new DateTime(); - $arg->setTimestamp($mixed); - } - else - { - $arg = (int) $mixed; - } - - $period = new DatePeriod($from, new DateInterval('P1D'), $arg); - foreach ($period as $date) - { - $range[] = $date->format($format); - } - - /* If a period end date was passed to the DatePeriod constructor, it might not - * be in our results. Not sure if this is a bug or it's just possible because - * the end date might actually be less than 24 hours away from the previously - * generated DateTime object, but either way - we have to append it manually. - */ - if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) - { - $range[] = $arg->format($format); - } - - return $range; - } -} diff --git a/vendor_old/codeigniter/framework/system/helpers/directory_helper.php b/vendor_old/codeigniter/framework/system/helpers/directory_helper.php deleted file mode 100644 index 2785241..0000000 --- a/vendor_old/codeigniter/framework/system/helpers/directory_helper.php +++ /dev/null @@ -1,101 +0,0 @@ - 0) && is_dir($source_dir.$file)) - { - $filedata[$file] = directory_map($source_dir.$file, $new_depth, $hidden); - } - else - { - $filedata[] = $file; - } - } - - closedir($fp); - return $filedata; - } - - return FALSE; - } -} diff --git a/vendor_old/codeigniter/framework/system/helpers/download_helper.php b/vendor_old/codeigniter/framework/system/helpers/download_helper.php deleted file mode 100644 index b2a1458..0000000 --- a/vendor_old/codeigniter/framework/system/helpers/download_helper.php +++ /dev/null @@ -1,158 +0,0 @@ - 0) - ? @rmdir($path) - : TRUE; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('get_filenames')) -{ - /** - * Get Filenames - * - * Reads the specified directory and builds an array containing the filenames. - * Any sub-folders contained within the specified path are read as well. - * - * @param string path to source - * @param bool whether to include the path as part of the filename - * @param bool internal variable to determine recursion status - do not use in calls - * @return array - */ - function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) - { - static $_filedata = array(); - - if ($fp = @opendir($source_dir)) - { - // reset the array and make sure $source_dir has a trailing slash on the initial call - if ($_recursion === FALSE) - { - $_filedata = array(); - $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - } - - while (FALSE !== ($file = readdir($fp))) - { - if (is_dir($source_dir.$file) && $file[0] !== '.') - { - get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); - } - elseif ($file[0] !== '.') - { - $_filedata[] = ($include_path === TRUE) ? $source_dir.$file : $file; - } - } - - closedir($fp); - return $_filedata; - } - - return FALSE; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_dir_file_info')) -{ - /** - * Get Directory File Information - * - * Reads the specified directory and builds an array containing the filenames, - * filesize, dates, and permissions - * - * Any sub-folders contained within the specified path are read as well. - * - * @param string path to source - * @param bool Look only at the top level directory specified? - * @param bool internal variable to determine recursion status - do not use in calls - * @return array - */ - function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE) - { - static $_filedata = array(); - $relative_path = $source_dir; - - if ($fp = @opendir($source_dir)) - { - // reset the array and make sure $source_dir has a trailing slash on the initial call - if ($_recursion === FALSE) - { - $_filedata = array(); - $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; - } - - // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast - while (FALSE !== ($file = readdir($fp))) - { - if (is_dir($source_dir.$file) && $file[0] !== '.' && $top_level_only === FALSE) - { - get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); - } - elseif ($file[0] !== '.') - { - $_filedata[$file] = get_file_info($source_dir.$file); - $_filedata[$file]['relative_path'] = $relative_path; - } - } - - closedir($fp); - return $_filedata; - } - - return FALSE; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_file_info')) -{ - /** - * Get File Info - * - * Given a file and path, returns the name, path, size, date modified - * Second parameter allows you to explicitly declare what information you want returned - * Options are: name, server_path, size, date, readable, writable, executable, fileperms - * Returns FALSE if the file cannot be found. - * - * @param string path to file - * @param mixed array or comma separated string of information returned - * @return array - */ - function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) - { - if ( ! file_exists($file)) - { - return FALSE; - } - - if (is_string($returned_values)) - { - $returned_values = explode(',', $returned_values); - } - - foreach ($returned_values as $key) - { - switch ($key) - { - case 'name': - $fileinfo['name'] = basename($file); - break; - case 'server_path': - $fileinfo['server_path'] = $file; - break; - case 'size': - $fileinfo['size'] = filesize($file); - break; - case 'date': - $fileinfo['date'] = filemtime($file); - break; - case 'readable': - $fileinfo['readable'] = is_readable($file); - break; - case 'writable': - $fileinfo['writable'] = is_really_writable($file); - break; - case 'executable': - $fileinfo['executable'] = is_executable($file); - break; - case 'fileperms': - $fileinfo['fileperms'] = fileperms($file); - break; - } - } - - return $fileinfo; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('get_mime_by_extension')) -{ - /** - * Get Mime by Extension - * - * Translates a file extension into a mime type based on config/mimes.php. - * Returns FALSE if it can't determine the type, or open the mime config file - * - * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience - * It should NOT be trusted, and should certainly NOT be used for security - * - * @param string $filename File name - * @return string - */ - function get_mime_by_extension($filename) - { - static $mimes; - - if ( ! is_array($mimes)) - { - $mimes = get_mimes(); - - if (empty($mimes)) - { - return FALSE; - } - } - - $extension = strtolower(substr(strrchr($filename, '.'), 1)); - - if (isset($mimes[$extension])) - { - return is_array($mimes[$extension]) - ? current($mimes[$extension]) // Multiple mime types, just give the first one - : $mimes[$extension]; - } - - return FALSE; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('symbolic_permissions')) -{ - /** - * Symbolic Permissions - * - * Takes a numeric value representing a file's permissions and returns - * standard symbolic notation representing that value - * - * @param int $perms Permissions - * @return string - */ - function symbolic_permissions($perms) - { - if (($perms & 0xC000) === 0xC000) - { - $symbolic = 's'; // Socket - } - elseif (($perms & 0xA000) === 0xA000) - { - $symbolic = 'l'; // Symbolic Link - } - elseif (($perms & 0x8000) === 0x8000) - { - $symbolic = '-'; // Regular - } - elseif (($perms & 0x6000) === 0x6000) - { - $symbolic = 'b'; // Block special - } - elseif (($perms & 0x4000) === 0x4000) - { - $symbolic = 'd'; // Directory - } - elseif (($perms & 0x2000) === 0x2000) - { - $symbolic = 'c'; // Character special - } - elseif (($perms & 0x1000) === 0x1000) - { - $symbolic = 'p'; // FIFO pipe - } - else - { - $symbolic = 'u'; // Unknown - } - - // Owner - $symbolic .= (($perms & 0x0100) ? 'r' : '-') - .(($perms & 0x0080) ? 'w' : '-') - .(($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); - - // Group - $symbolic .= (($perms & 0x0020) ? 'r' : '-') - .(($perms & 0x0010) ? 'w' : '-') - .(($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); - - // World - $symbolic .= (($perms & 0x0004) ? 'r' : '-') - .(($perms & 0x0002) ? 'w' : '-') - .(($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); - - return $symbolic; - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('octal_permissions')) -{ - /** - * Octal Permissions - * - * Takes a numeric value representing a file's permissions and returns - * a three character string representing the file's octal permissions - * - * @param int $perms Permissions - * @return string - */ - function octal_permissions($perms) - { - return substr(sprintf('%o', $perms), -3); - } -} diff --git a/vendor_old/codeigniter/framework/system/helpers/form_helper.php b/vendor_old/codeigniter/framework/system/helpers/form_helper.php deleted file mode 100644 index a49eea8..0000000 --- a/vendor_old/codeigniter/framework/system/helpers/form_helper.php +++ /dev/null @@ -1,1061 +0,0 @@ -config->site_url($CI->uri->uri_string()); - } - // If an action is not a full URL then turn it into one - elseif (strpos($action, '://') === FALSE) - { - $action = $CI->config->site_url($action); - } - - $attributes = _attributes_to_string($attributes); - - if (stripos($attributes, 'method=') === FALSE) - { - $attributes .= ' method="post"'; - } - - if (stripos($attributes, 'accept-charset=') === FALSE) - { - $attributes .= ' accept-charset="'.strtolower(config_item('charset')).'"'; - } - - $form = '
      \n"; - - if (is_array($hidden)) - { - foreach ($hidden as $name => $value) - { - $form .= ''."\n"; - } - } - - // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites - if ($CI->config->item('csrf_protection') === TRUE && strpos($action, $CI->config->base_url()) !== FALSE && ! stripos($form, 'method="get"')) - { - // Prepend/append random-length "white noise" around the CSRF - // token input, as a form of protection against BREACH attacks - if (FALSE !== ($noise = $CI->security->get_random_bytes(1))) - { - list(, $noise) = unpack('c', $noise); - } - else - { - $noise = mt_rand(-128, 127); - } - - // Prepend if $noise has a negative value, append if positive, do nothing for zero - $prepend = $append = ''; - if ($noise < 0) - { - $prepend = str_repeat(" ", abs($noise)); - } - elseif ($noise > 0) - { - $append = str_repeat(" ", $noise); - } - - $form .= sprintf( - '%s%s%s', - $prepend, - $CI->security->get_csrf_token_name(), - $CI->security->get_csrf_hash(), - $append, - "\n" - ); - } - - return $form; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_open_multipart')) -{ - /** - * Form Declaration - Multipart type - * - * Creates the opening portion of the form, but with "multipart/form-data". - * - * @param string the URI segments of the form destination - * @param array a key/value pair of attributes - * @param array a key/value pair hidden data - * @return string - */ - function form_open_multipart($action = '', $attributes = array(), $hidden = array()) - { - if (is_string($attributes)) - { - $attributes .= ' enctype="multipart/form-data"'; - } - else - { - $attributes['enctype'] = 'multipart/form-data'; - } - - return form_open($action, $attributes, $hidden); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_hidden')) -{ - /** - * Hidden Input Field - * - * Generates hidden fields. You can pass a simple key/value string or - * an associative array with multiple values. - * - * @param mixed $name Field name - * @param string $value Field value - * @param bool $recursing - * @return string - */ - function form_hidden($name, $value = '', $recursing = FALSE) - { - static $form; - - if ($recursing === FALSE) - { - $form = "\n"; - } - - if (is_array($name)) - { - foreach ($name as $key => $val) - { - form_hidden($key, $val, TRUE); - } - - return $form; - } - - if ( ! is_array($value)) - { - $form .= '\n"; - } - else - { - foreach ($value as $k => $v) - { - $k = is_int($k) ? '' : $k; - form_hidden($name.'['.$k.']', $v, TRUE); - } - } - - return $form; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_input')) -{ - /** - * Text Input Field - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_input($data = '', $value = '', $extra = '') - { - $defaults = array( - 'type' => 'text', - 'name' => is_array($data) ? '' : $data, - 'value' => $value - ); - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_password')) -{ - /** - * Password Field - * - * Identical to the input function but adds the "password" type - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_password($data = '', $value = '', $extra = '') - { - is_array($data) OR $data = array('name' => $data); - $data['type'] = 'password'; - return form_input($data, $value, $extra); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_upload')) -{ - /** - * Upload Field - * - * Identical to the input function but adds the "file" type - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_upload($data = '', $value = '', $extra = '') - { - $defaults = array('type' => 'file', 'name' => ''); - is_array($data) OR $data = array('name' => $data); - $data['type'] = 'file'; - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_textarea')) -{ - /** - * Textarea field - * - * @param mixed $data - * @param string $value - * @param mixed $extra - * @return string - */ - function form_textarea($data = '', $value = '', $extra = '') - { - $defaults = array( - 'name' => is_array($data) ? '' : $data, - 'cols' => '40', - 'rows' => '10' - ); - - if ( ! is_array($data) OR ! isset($data['value'])) - { - $val = $value; - } - else - { - $val = $data['value']; - unset($data['value']); // textareas don't use the value attribute - } - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_multiselect')) -{ - /** - * Multi-select menu - * - * @param string - * @param array - * @param mixed - * @param mixed - * @return string - */ - function form_multiselect($name = '', $options = array(), $selected = array(), $extra = '') - { - $extra = _attributes_to_string($extra); - if (stripos($extra, 'multiple') === FALSE) - { - $extra .= ' multiple="multiple"'; - } - - return form_dropdown($name, $options, $selected, $extra); - } -} - -// -------------------------------------------------------------------- - -if ( ! function_exists('form_dropdown')) -{ - /** - * Drop-down Menu - * - * @param mixed $data - * @param mixed $options - * @param mixed $selected - * @param mixed $extra - * @return string - */ - function form_dropdown($data = '', $options = array(), $selected = array(), $extra = '') - { - $defaults = array(); - - if (is_array($data)) - { - if (isset($data['selected'])) - { - $selected = $data['selected']; - unset($data['selected']); // select tags don't have a selected attribute - } - - if (isset($data['options'])) - { - $options = $data['options']; - unset($data['options']); // select tags don't use an options attribute - } - } - else - { - $defaults = array('name' => $data); - } - - is_array($selected) OR $selected = array($selected); - is_array($options) OR $options = array($options); - - // If no selected state was submitted we will attempt to set it automatically - if (empty($selected)) - { - if (is_array($data)) - { - if (isset($data['name'], $_POST[$data['name']])) - { - $selected = array($_POST[$data['name']]); - } - } - elseif (isset($_POST[$data])) - { - $selected = array($_POST[$data]); - } - } - - $extra = _attributes_to_string($extra); - - $multiple = (count($selected) > 1 && stripos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; - - $form = '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_checkbox')) -{ - /** - * Checkbox Field - * - * @param mixed - * @param string - * @param bool - * @param mixed - * @return string - */ - function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') - { - $defaults = array('type' => 'checkbox', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); - - if (is_array($data) && array_key_exists('checked', $data)) - { - $checked = $data['checked']; - - if ($checked == FALSE) - { - unset($data['checked']); - } - else - { - $data['checked'] = 'checked'; - } - } - - if ($checked == TRUE) - { - $defaults['checked'] = 'checked'; - } - else - { - unset($defaults['checked']); - } - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_radio')) -{ - /** - * Radio Button - * - * @param mixed - * @param string - * @param bool - * @param mixed - * @return string - */ - function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') - { - is_array($data) OR $data = array('name' => $data); - $data['type'] = 'radio'; - - return form_checkbox($data, $value, $checked, $extra); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_submit')) -{ - /** - * Submit Button - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_submit($data = '', $value = '', $extra = '') - { - $defaults = array( - 'type' => 'submit', - 'name' => is_array($data) ? '' : $data, - 'value' => $value - ); - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_reset')) -{ - /** - * Reset Button - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_reset($data = '', $value = '', $extra = '') - { - $defaults = array( - 'type' => 'reset', - 'name' => is_array($data) ? '' : $data, - 'value' => $value - ); - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_button')) -{ - /** - * Form Button - * - * @param mixed - * @param string - * @param mixed - * @return string - */ - function form_button($data = '', $content = '', $extra = '') - { - $defaults = array( - 'name' => is_array($data) ? '' : $data, - 'type' => 'button' - ); - - if (is_array($data) && isset($data['content'])) - { - $content = $data['content']; - unset($data['content']); // content is not an attribute - } - - return '\n"; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_label')) -{ - /** - * Form Label Tag - * - * @param string The text to appear onscreen - * @param string The id the label applies to - * @param array Additional attributes - * @return string - */ - function form_label($label_text = '', $id = '', $attributes = array()) - { - - $label = ' 0) - { - foreach ($attributes as $key => $val) - { - $label .= ' '.$key.'="'.$val.'"'; - } - } - - return $label.'>'.$label_text.''; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_fieldset')) -{ - /** - * Fieldset Tag - * - * Used to produce
      text. To close fieldset - * use form_fieldset_close() - * - * @param string The legend text - * @param array Additional attributes - * @return string - */ - function form_fieldset($legend_text = '', $attributes = array()) - { - $fieldset = '\n"; - if ($legend_text !== '') - { - return $fieldset.''.$legend_text."\n"; - } - - return $fieldset; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_fieldset_close')) -{ - /** - * Fieldset Close Tag - * - * @param string - * @return string - */ - function form_fieldset_close($extra = '') - { - return '
      '.$extra; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_close')) -{ - /** - * Form Close Tag - * - * @param string - * @return string - */ - function form_close($extra = '') - { - return ''.$extra; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('form_prep')) -{ - /** - * Form Prep - * - * Formats text so that it can be safely placed in a form field in the event it has HTML tags. - * - * @deprecated 3.0.0 An alias for html_escape() - * @param string|string[] $str Value to escape - * @return string|string[] Escaped values - */ - function form_prep($str) - { - return html_escape($str, TRUE); - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('set_value')) -{ - /** - * Form Value - * - * Grabs a value from the POST array for the specified field so you can - * re-populate an input field or textarea. If Form Validation - * is active it retrieves the info from the validation class - * - * @param string $field Field name - * @param string $default Default value - * @param bool $html_escape Whether to escape HTML special characters or not - * @return string - */ - function set_value($field, $default = '', $html_escape = TRUE) - { - $CI =& get_instance(); - - $value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field)) - ? $CI->form_validation->set_value($field, $default) - : $CI->input->post($field, FALSE); - - isset($value) OR $value = $default; - return ($html_escape) ? html_escape($value) : $value; - } -} - -// ------------------------------------------------------------------------ - -if ( ! function_exists('set_select')) -{ - /** - * Set Select - * - * Let's you set the selected value of a