commit
17803c1acb
8275 changed files with 966122 additions and 0 deletions
@ -0,0 +1,78 @@ |
|||||
|
#-------------------------------------------------------------------- |
||||
|
# Example Environment Configuration file |
||||
|
# |
||||
|
# This file can be used as a starting point for your own |
||||
|
# custom .env files, and contains most of the possible settings |
||||
|
# available in a default install. |
||||
|
# |
||||
|
# By default, all of the settings are commented out. If you want |
||||
|
# to override the setting, you must un-comment it by removing the '#' |
||||
|
# at the beginning of the line. |
||||
|
#-------------------------------------------------------------------- |
||||
|
SYSTEMPATH='' |
||||
|
#-------------------------------------------------------------------- |
||||
|
# ENVIRONMENT |
||||
|
#-------------------------------------------------------------------- |
||||
|
|
||||
|
CI_ENVIRONMENT = development |
||||
|
# CI_ENVIRONMENT = production |
||||
|
|
||||
|
#-------------------------------------------------------------------- |
||||
|
# APP |
||||
|
#-------------------------------------------------------------------- |
||||
|
|
||||
|
# app.baseURL = 'http://localhost:8080/' |
||||
|
app.baseURL = 'https://motorbike.mg' |
||||
|
# If you have trouble with `.`, you could also use `_`. |
||||
|
# app_baseURL = '' |
||||
|
# app.forceGlobalSecureRequests = false |
||||
|
# app.CSPEnabled = false |
||||
|
|
||||
|
#-------------------------------------------------------------------- |
||||
|
# DATABASE |
||||
|
#-------------------------------------------------------------------- |
||||
|
|
||||
|
database.default.hostname = localhost |
||||
|
database.default.database = motorbike |
||||
|
database.default.username = motorbike |
||||
|
database.default.password = v81JPgB4pRrSelV |
||||
|
database.default.DBDriver = MySQLi |
||||
|
database.default.DBPrefix = |
||||
|
database.default.port = 3306 |
||||
|
# database.default.hostname =localhost |
||||
|
# database.default.database =motorbike |
||||
|
# database.default.username =root |
||||
|
# database.default.password = |
||||
|
# database.default.DBDriver =MySQLi |
||||
|
# database.default.DBPrefix = |
||||
|
# database.default.port = 3306 |
||||
|
|
||||
|
# If you use MySQLi as tests, first update the values of Config\Database::$tests. |
||||
|
# database.tests.hostname = localhost |
||||
|
# database.tests.database = ci4_test |
||||
|
# database.tests.username = root |
||||
|
# database.tests.password = root |
||||
|
# database.tests.DBDriver = MySQLi |
||||
|
# database.tests.DBPrefix = |
||||
|
# database.tests.charset = utf8mb4 |
||||
|
# database.tests.DBCollat = utf8mb4_general_ci |
||||
|
# database.tests.port = 3306 |
||||
|
|
||||
|
#-------------------------------------------------------------------- |
||||
|
# ENCRYPTION |
||||
|
#-------------------------------------------------------------------- |
||||
|
|
||||
|
# encryption.key = |
||||
|
|
||||
|
#-------------------------------------------------------------------- |
||||
|
# SESSION |
||||
|
#-------------------------------------------------------------------- |
||||
|
|
||||
|
# session.driver = 'CodeIgniter\Session\Handlers\FileHandler' |
||||
|
# session.savePath = null |
||||
|
|
||||
|
#-------------------------------------------------------------------- |
||||
|
# LOGGER |
||||
|
#-------------------------------------------------------------------- |
||||
|
|
||||
|
# logger.threshold = 4 |
||||
@ -0,0 +1,3 @@ |
|||||
|
vendor |
||||
|
.env |
||||
|
composer.lock |
||||
@ -0,0 +1,12 @@ |
|||||
|
{ |
||||
|
"name": "C4M STOCK", |
||||
|
"host": "185.70.105.157", |
||||
|
"protocol": "sftp", |
||||
|
"port": 22, |
||||
|
"username": "motorbike", |
||||
|
"remotePath": "/home/motorbike/public_html/", |
||||
|
"password": "IVrMDogT3XiBcrY", |
||||
|
"uploadOnSave": true, |
||||
|
"useTempFile": false, |
||||
|
"openSsh": false |
||||
|
} |
||||
|
After Width: | Height: | Size: 60 KiB |
@ -0,0 +1,6 @@ |
|||||
|
<IfModule authz_core_module> |
||||
|
Require all denied |
||||
|
</IfModule> |
||||
|
<IfModule !authz_core_module> |
||||
|
Deny from all |
||||
|
</IfModule> |
||||
@ -0,0 +1,15 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* The goal of this file is to allow developers a location |
||||
|
* where they can overwrite core procedural functions and |
||||
|
* replace them with their own. This file is loaded during |
||||
|
* the bootstrap process and is called during the framework's |
||||
|
* execution. |
||||
|
* |
||||
|
* This can be looked at as a `master helper` file that is |
||||
|
* loaded early on, and may also contain additional functions |
||||
|
* that you'd like to use throughout your entire application |
||||
|
* |
||||
|
* @see: https://codeigniter.com/user_guide/extending/common.html |
||||
|
*/ |
||||
@ -0,0 +1,206 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class App extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Base Site URL |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* URL to your CodeIgniter root. Typically, this will be your base URL, |
||||
|
* WITH a trailing slash: |
||||
|
* |
||||
|
* E.g., http://example.com/ |
||||
|
*/ |
||||
|
// public string $baseURL = 'http://localhost/motorbike'; |
||||
|
public string $baseURL = 'https://motorbike.mg/'; |
||||
|
|
||||
|
public $CI_ENVIRONMENT = 'development'; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Allowed Hostnames in the Site URL other than the hostname in the baseURL. |
||||
|
* If you want to accept multiple Hostnames, set this. |
||||
|
* |
||||
|
* E.g., |
||||
|
* When your site URL ($baseURL) is 'http://example.com/', and your site |
||||
|
* also accepts 'http://media.example.com/' and 'http://accounts.example.com/': |
||||
|
* ['media.example.com', 'accounts.example.com'] |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $allowedHostnames = []; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Index File |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Typically, this will be your `index.php` file, unless you've renamed it to |
||||
|
* something else. If you have configured your web server to remove this file |
||||
|
* from your site URIs, set this variable to an empty string. |
||||
|
*/ |
||||
|
public string $indexPage = ''; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* URI PROTOCOL |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This item determines which server global should be used to retrieve the |
||||
|
* URI string. The default setting of 'REQUEST_URI' works for most servers. |
||||
|
* If your links do not seem to work, try one of the other delicious flavors: |
||||
|
* |
||||
|
* 'REQUEST_URI': Uses $_SERVER['REQUEST_URI'] |
||||
|
* 'QUERY_STRING': Uses $_SERVER['QUERY_STRING'] |
||||
|
* 'PATH_INFO': Uses $_SERVER['PATH_INFO'] |
||||
|
* |
||||
|
* WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded! |
||||
|
*/ |
||||
|
public string $uriProtocol = 'REQUEST_URI'; |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| Allowed URL Characters |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| |
||||
|
| This lets you specify which characters are permitted within your URLs. |
||||
|
| When someone tries to submit a URL with disallowed characters they will |
||||
|
| get a warning message. |
||||
|
| |
||||
|
| As a security measure you are STRONGLY encouraged to restrict URLs to |
||||
|
| as few characters as possible. |
||||
|
| |
||||
|
| By default, only these are allowed: `a-z 0-9~%.:_-` |
||||
|
| |
||||
|
| Set an empty string to allow all characters -- but only if you are insane. |
||||
|
| |
||||
|
| The configured value is actually a regular expression character group |
||||
|
| and it will be used as: '/\A[<permittedURIChars>]+\z/iu' |
||||
|
| |
||||
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! |
||||
|
| |
||||
|
*/ |
||||
|
public string $permittedURIChars = 'a-z 0-9~%.:_\-'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Default Locale |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The Locale roughly represents the language and location that your visitor |
||||
|
* is viewing the site from. It affects the language strings and other |
||||
|
* strings (like currency markers, numbers, etc), that your program |
||||
|
* should run under for this request. |
||||
|
*/ |
||||
|
public string $defaultLocale = 'en'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Negotiate Locale |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If true, the current Request object will automatically determine the |
||||
|
* language to use based on the value of the Accept-Language header. |
||||
|
* |
||||
|
* If false, no automatic detection will be performed. |
||||
|
*/ |
||||
|
public bool $negotiateLocale = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Supported Locales |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If $negotiateLocale is true, this array lists the locales supported |
||||
|
* by the application in descending order of priority. If no match is |
||||
|
* found, the first locale will be used. |
||||
|
* |
||||
|
* IncomingRequest::setLocale() also uses this list. |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $supportedLocales = ['en']; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Application Timezone |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The default timezone that will be used in your application to display |
||||
|
* dates with the date helper, and can be retrieved through app_timezone() |
||||
|
* |
||||
|
* @see https://www.php.net/manual/en/timezones.php for list of timezones |
||||
|
* supported by PHP. |
||||
|
*/ |
||||
|
public string $appTimezone = 'Indian/Antananarivo'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Default Character Set |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This determines which character set is used by default in various methods |
||||
|
* that require a character set to be provided. |
||||
|
* |
||||
|
* @see http://php.net/htmlspecialchars for a list of supported charsets. |
||||
|
*/ |
||||
|
public string $charset = 'UTF-8'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Force Global Secure Requests |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If true, this will force every request made to this application to be |
||||
|
* made via a secure connection (HTTPS). If the incoming request is not |
||||
|
* secure, the user will be redirected to a secure version of the page |
||||
|
* and the HTTP Strict Transport Security (HSTS) header will be set. |
||||
|
*/ |
||||
|
public bool $forceGlobalSecureRequests = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Reverse Proxy IPs |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If your server is behind a reverse proxy, you must whitelist the proxy |
||||
|
* IP addresses from which CodeIgniter should trust headers such as |
||||
|
* X-Forwarded-For or Client-IP in order to properly identify |
||||
|
* the visitor's IP address. |
||||
|
* |
||||
|
* You need to set a proxy IP address or IP address with subnets and |
||||
|
* the HTTP header for the client IP address. |
||||
|
* |
||||
|
* Here are some examples: |
||||
|
* [ |
||||
|
* '10.0.1.200' => 'X-Forwarded-For', |
||||
|
* '192.168.5.0/24' => 'X-Real-IP', |
||||
|
* ] |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $proxyIPs = []; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Content Security Policy |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Enables the Response's Content Secure Policy to restrict the sources that |
||||
|
* can be used for images, scripts, CSS files, audio, video, etc. If enabled, |
||||
|
* the Response object will populate default values for the policy from the |
||||
|
* `ContentSecurityPolicy.php` file. Controllers can always add to those |
||||
|
* restrictions at run time. |
||||
|
* |
||||
|
* For a better understanding of CSP, see these documents: |
||||
|
* |
||||
|
* @see http://www.html5rocks.com/en/tutorials/security/content-security-policy/ |
||||
|
* @see http://www.w3.org/TR/CSP/ |
||||
|
*/ |
||||
|
public bool $CSPEnabled = false; |
||||
|
} |
||||
@ -0,0 +1,99 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\AutoloadConfig; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* AUTOLOADER CONFIGURATION |
||||
|
* ------------------------------------------------------------------- |
||||
|
* |
||||
|
* This file defines the namespaces and class maps so the Autoloader |
||||
|
* can find the files as needed. |
||||
|
* |
||||
|
* NOTE: If you use an identical key in $psr4 or $classmap, then |
||||
|
* the values in this file will overwrite the framework's values. |
||||
|
* |
||||
|
* NOTE: This class is required prior to Autoloader instantiation, |
||||
|
* and does not extend BaseConfig. |
||||
|
* |
||||
|
* @immutable |
||||
|
*/ |
||||
|
class Autoload extends AutoloadConfig |
||||
|
{ |
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Namespaces |
||||
|
* ------------------------------------------------------------------- |
||||
|
* This maps the locations of any namespaces in your application to |
||||
|
* their location on the file system. These are used by the autoloader |
||||
|
* to locate files the first time they have been instantiated. |
||||
|
* |
||||
|
* The '/app' and '/system' directories are already mapped for you. |
||||
|
* you may change the name of the 'App' namespace if you wish, |
||||
|
* but this should be done prior to creating any namespaced classes, |
||||
|
* else you will need to modify all of those classes for this to work. |
||||
|
* |
||||
|
* Prototype: |
||||
|
* $psr4 = [ |
||||
|
* 'CodeIgniter' => SYSTEMPATH, |
||||
|
* 'App' => APPPATH |
||||
|
* ]; |
||||
|
* |
||||
|
* @var array<string, list<string>|string> |
||||
|
*/ |
||||
|
public $psr4 = [ |
||||
|
APP_NAMESPACE => APPPATH, // For custom app namespace |
||||
|
'Config' => APPPATH . 'Config', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Class Map |
||||
|
* ------------------------------------------------------------------- |
||||
|
* The class map provides a map of class names and their exact |
||||
|
* location on the drive. Classes loaded in this manner will have |
||||
|
* slightly faster performance because they will not have to be |
||||
|
* searched for within one or more directories as they would if they |
||||
|
* were being autoloaded through a namespace. |
||||
|
* |
||||
|
* Prototype: |
||||
|
* $classmap = [ |
||||
|
* 'MyClass' => '/path/to/class/file.php' |
||||
|
* ]; |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public $classmap = []; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Files |
||||
|
* ------------------------------------------------------------------- |
||||
|
* The files array provides a list of paths to __non-class__ files |
||||
|
* that will be autoloaded. This can be useful for bootstrap operations |
||||
|
* or for loading functions. |
||||
|
* |
||||
|
* Prototype: |
||||
|
* $files = [ |
||||
|
* '/path/to/my/file.php', |
||||
|
* ]; |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public $files = []; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Helpers |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Prototype: |
||||
|
* $helpers = [ |
||||
|
* 'form', |
||||
|
* ]; |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public $helpers = ['global_helper']; |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| ERROR DISPLAY |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| In development, we want to show as many errors as possible to help |
||||
|
| make sure they don't make it to production. And save us hours of |
||||
|
| painful debugging. |
||||
|
| |
||||
|
| If you set 'display_errors' to '1', CI4's detailed error report will show. |
||||
|
*/ |
||||
|
error_reporting(E_ALL); |
||||
|
ini_set('display_errors', '1'); |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| DEBUG BACKTRACES |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| If true, this constant will tell the error screens to display debug |
||||
|
| backtraces along with the other error information. If you would |
||||
|
| prefer to not see this, set this value to false. |
||||
|
*/ |
||||
|
defined('SHOW_DEBUG_BACKTRACE') || define('SHOW_DEBUG_BACKTRACE', true); |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| DEBUG MODE |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| Debug mode is an experimental flag that can allow changes throughout |
||||
|
| the system. This will control whether Kint is loaded, and a few other |
||||
|
| items. It can always be used within your own application too. |
||||
|
*/ |
||||
|
defined('CI_DEBUG') || define('CI_DEBUG', true); |
||||
@ -0,0 +1,23 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| ERROR DISPLAY |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| Don't show ANY in production environments. Instead, let the system catch |
||||
|
| it and display a generic error message. |
||||
|
| |
||||
|
| If you set 'display_errors' to '1', CI4's detailed error report will show. |
||||
|
*/ |
||||
|
ini_set('display_errors', '0'); |
||||
|
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED); |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| DEBUG MODE |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| Debug mode is an experimental flag that can allow changes throughout |
||||
|
| the system. It's not widely used currently, and may not survive |
||||
|
| release of the framework. |
||||
|
*/ |
||||
|
defined('CI_DEBUG') || define('CI_DEBUG', false); |
||||
@ -0,0 +1,38 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/* |
||||
|
* The environment testing is reserved for PHPUnit testing. It has special |
||||
|
* conditions built into the framework at various places to assist with that. |
||||
|
* You can’t use it for your development. |
||||
|
*/ |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| ERROR DISPLAY |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| In development, we want to show as many errors as possible to help |
||||
|
| make sure they don't make it to production. And save us hours of |
||||
|
| painful debugging. |
||||
|
*/ |
||||
|
error_reporting(E_ALL); |
||||
|
ini_set('display_errors', '1'); |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| DEBUG BACKTRACES |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| If true, this constant will tell the error screens to display debug |
||||
|
| backtraces along with the other error information. If you would |
||||
|
| prefer to not see this, set this value to false. |
||||
|
*/ |
||||
|
defined('SHOW_DEBUG_BACKTRACE') || define('SHOW_DEBUG_BACKTRACE', true); |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| DEBUG MODE |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| Debug mode is an experimental flag that can allow changes throughout |
||||
|
| the system. It's not widely used currently, and may not survive |
||||
|
| release of the framework. |
||||
|
*/ |
||||
|
defined('CI_DEBUG') || define('CI_DEBUG', true); |
||||
@ -0,0 +1,20 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class CURLRequest extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CURLRequest Share Options |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Whether share options between requests or not. |
||||
|
* |
||||
|
* If true, all the options won't be reset between requests. |
||||
|
* It may cause an error request with unnecessary headers. |
||||
|
*/ |
||||
|
public bool $shareOptions = false; |
||||
|
} |
||||
@ -0,0 +1,171 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Cache\CacheInterface; |
||||
|
use CodeIgniter\Cache\Handlers\DummyHandler; |
||||
|
use CodeIgniter\Cache\Handlers\FileHandler; |
||||
|
use CodeIgniter\Cache\Handlers\MemcachedHandler; |
||||
|
use CodeIgniter\Cache\Handlers\PredisHandler; |
||||
|
use CodeIgniter\Cache\Handlers\RedisHandler; |
||||
|
use CodeIgniter\Cache\Handlers\WincacheHandler; |
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class Cache extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Primary Handler |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The name of the preferred handler that should be used. If for some reason |
||||
|
* it is not available, the $backupHandler will be used in its place. |
||||
|
*/ |
||||
|
public string $handler = 'file'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Backup Handler |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The name of the handler that will be used in case the first one is |
||||
|
* unreachable. Often, 'file' is used here since the filesystem is |
||||
|
* always available, though that's not always practical for the app. |
||||
|
*/ |
||||
|
public string $backupHandler = 'dummy'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cache Directory Path |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The path to where cache files should be stored, if using a file-based |
||||
|
* system. |
||||
|
* |
||||
|
* @deprecated Use the driver-specific variant under $file |
||||
|
*/ |
||||
|
public string $storePath = WRITEPATH . 'cache/'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cache Include Query String |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Whether to take the URL query string into consideration when generating |
||||
|
* output cache files. Valid options are: |
||||
|
* |
||||
|
* false = Disabled |
||||
|
* true = Enabled, take all query parameters into account. |
||||
|
* Please be aware that this may result in numerous cache |
||||
|
* files generated for the same page over and over again. |
||||
|
* ['q'] = Enabled, but only take into account the specified list |
||||
|
* of query parameters. |
||||
|
* |
||||
|
* @var bool|list<string> |
||||
|
*/ |
||||
|
public $cacheQueryString = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Key Prefix |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This string is added to all cache item names to help avoid collisions |
||||
|
* if you run multiple applications with the same cache engine. |
||||
|
*/ |
||||
|
public string $prefix = ''; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Default TTL |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The default number of seconds to save items when none is specified. |
||||
|
* |
||||
|
* WARNING: This is not used by framework handlers where 60 seconds is |
||||
|
* hard-coded, but may be useful to projects and modules. This will replace |
||||
|
* the hard-coded value in a future release. |
||||
|
*/ |
||||
|
public int $ttl = 60; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Reserved Characters |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* A string of reserved characters that will not be allowed in keys or tags. |
||||
|
* Strings that violate this restriction will cause handlers to throw. |
||||
|
* Default: {}()/\@: |
||||
|
* |
||||
|
* NOTE: The default set is required for PSR-6 compliance. |
||||
|
*/ |
||||
|
public string $reservedCharacters = '{}()/\@:'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* File settings |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Your file storage preferences can be specified below, if you are using |
||||
|
* the File driver. |
||||
|
* |
||||
|
* @var array<string, int|string|null> |
||||
|
*/ |
||||
|
public array $file = [ |
||||
|
'storePath' => WRITEPATH . 'cache/', |
||||
|
'mode' => 0640, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------------- |
||||
|
* Memcached settings |
||||
|
* ------------------------------------------------------------------------- |
||||
|
* Your Memcached servers can be specified below, if you are using |
||||
|
* the Memcached drivers. |
||||
|
* |
||||
|
* @see https://codeigniter.com/user_guide/libraries/caching.html#memcached |
||||
|
* |
||||
|
* @var array<string, bool|int|string> |
||||
|
*/ |
||||
|
public array $memcached = [ |
||||
|
'host' => '127.0.0.1', |
||||
|
'port' => 11211, |
||||
|
'weight' => 1, |
||||
|
'raw' => false, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------------- |
||||
|
* Redis settings |
||||
|
* ------------------------------------------------------------------------- |
||||
|
* Your Redis server can be specified below, if you are using |
||||
|
* the Redis or Predis drivers. |
||||
|
* |
||||
|
* @var array<string, int|string|null> |
||||
|
*/ |
||||
|
public array $redis = [ |
||||
|
'host' => '127.0.0.1', |
||||
|
'password' => null, |
||||
|
'port' => 6379, |
||||
|
'timeout' => 0, |
||||
|
'database' => 0, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Available Cache Handlers |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This is an array of cache engine alias' and class names. Only engines |
||||
|
* that are listed here are allowed to be used. |
||||
|
* |
||||
|
* @var array<string, class-string<CacheInterface>> |
||||
|
*/ |
||||
|
public array $validHandlers = [ |
||||
|
'dummy' => DummyHandler::class, |
||||
|
'file' => FileHandler::class, |
||||
|
'memcached' => MemcachedHandler::class, |
||||
|
'predis' => PredisHandler::class, |
||||
|
'redis' => RedisHandler::class, |
||||
|
'wincache' => WincacheHandler::class, |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,94 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/* |
||||
|
| -------------------------------------------------------------------- |
||||
|
| App Namespace |
||||
|
| -------------------------------------------------------------------- |
||||
|
| |
||||
|
| This defines the default Namespace that is used throughout |
||||
|
| CodeIgniter to refer to the Application directory. Change |
||||
|
| this constant to change the namespace that all application |
||||
|
| classes should use. |
||||
|
| |
||||
|
| NOTE: changing this will require manually modifying the |
||||
|
| existing namespaces of App\* namespaced-classes. |
||||
|
*/ |
||||
|
defined('APP_NAMESPACE') || define('APP_NAMESPACE', 'App'); |
||||
|
|
||||
|
/* |
||||
|
| -------------------------------------------------------------------------- |
||||
|
| Composer Path |
||||
|
| -------------------------------------------------------------------------- |
||||
|
| |
||||
|
| The path that Composer's autoload file is expected to live. By default, |
||||
|
| the vendor folder is in the Root directory, but you can customize that here. |
||||
|
*/ |
||||
|
defined('COMPOSER_PATH') || define('COMPOSER_PATH', ROOTPATH . 'vendor/autoload.php'); |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| Timing Constants |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| |
||||
|
| Provide simple ways to work with the myriad of PHP functions that |
||||
|
| require information to be in seconds. |
||||
|
*/ |
||||
|
defined('SECOND') || define('SECOND', 1); |
||||
|
defined('MINUTE') || define('MINUTE', 60); |
||||
|
defined('HOUR') || define('HOUR', 3600); |
||||
|
defined('DAY') || define('DAY', 86400); |
||||
|
defined('WEEK') || define('WEEK', 604800); |
||||
|
defined('MONTH') || define('MONTH', 2_592_000); |
||||
|
defined('YEAR') || define('YEAR', 31_536_000); |
||||
|
defined('DECADE') || define('DECADE', 315_360_000); |
||||
|
|
||||
|
/* |
||||
|
| -------------------------------------------------------------------------- |
||||
|
| Exit Status Codes |
||||
|
| -------------------------------------------------------------------------- |
||||
|
| |
||||
|
| Used to indicate the conditions under which the script is exit()ing. |
||||
|
| While there is no universal standard for error codes, there are some |
||||
|
| broad conventions. Three such conventions are mentioned below, for |
||||
|
| those who wish to make use of them. The CodeIgniter defaults were |
||||
|
| chosen for the least overlap with these conventions, while still |
||||
|
| leaving room for others to be defined in future versions and user |
||||
|
| applications. |
||||
|
| |
||||
|
| The three main conventions used for determining exit status codes |
||||
|
| are as follows: |
||||
|
| |
||||
|
| Standard C/C++ Library (stdlibc): |
||||
|
| http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html |
||||
|
| (This link also contains other GNU-specific conventions) |
||||
|
| BSD sysexits.h: |
||||
|
| http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits |
||||
|
| Bash scripting: |
||||
|
| http://tldp.org/LDP/abs/html/exitcodes.html |
||||
|
| |
||||
|
*/ |
||||
|
defined('EXIT_SUCCESS') || define('EXIT_SUCCESS', 0); // no errors |
||||
|
defined('EXIT_ERROR') || define('EXIT_ERROR', 1); // generic error |
||||
|
defined('EXIT_CONFIG') || define('EXIT_CONFIG', 3); // configuration error |
||||
|
defined('EXIT_UNKNOWN_FILE') || define('EXIT_UNKNOWN_FILE', 4); // file not found |
||||
|
defined('EXIT_UNKNOWN_CLASS') || define('EXIT_UNKNOWN_CLASS', 5); // unknown class |
||||
|
defined('EXIT_UNKNOWN_METHOD') || define('EXIT_UNKNOWN_METHOD', 6); // unknown class member |
||||
|
defined('EXIT_USER_INPUT') || define('EXIT_USER_INPUT', 7); // invalid user input |
||||
|
defined('EXIT_DATABASE') || define('EXIT_DATABASE', 8); // database error |
||||
|
defined('EXIT__AUTO_MIN') || define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code |
||||
|
defined('EXIT__AUTO_MAX') || define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code |
||||
|
|
||||
|
/** |
||||
|
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_LOW instead. |
||||
|
*/ |
||||
|
define('EVENT_PRIORITY_LOW', 200); |
||||
|
|
||||
|
/** |
||||
|
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_NORMAL instead. |
||||
|
*/ |
||||
|
define('EVENT_PRIORITY_NORMAL', 100); |
||||
|
|
||||
|
/** |
||||
|
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_HIGH instead. |
||||
|
*/ |
||||
|
define('EVENT_PRIORITY_HIGH', 10); |
||||
@ -0,0 +1,176 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
/** |
||||
|
* Stores the default settings for the ContentSecurityPolicy, if you |
||||
|
* choose to use it. The values here will be read in and set as defaults |
||||
|
* for the site. If needed, they can be overridden on a page-by-page basis. |
||||
|
* |
||||
|
* Suggested reference for explanations: |
||||
|
* |
||||
|
* @see https://www.html5rocks.com/en/tutorials/security/content-security-policy/ |
||||
|
*/ |
||||
|
class ContentSecurityPolicy extends BaseConfig |
||||
|
{ |
||||
|
// ------------------------------------------------------------------------- |
||||
|
// Broadbrush CSP management |
||||
|
// ------------------------------------------------------------------------- |
||||
|
|
||||
|
/** |
||||
|
* Default CSP report context |
||||
|
*/ |
||||
|
public bool $reportOnly = false; |
||||
|
|
||||
|
/** |
||||
|
* Specifies a URL where a browser will send reports |
||||
|
* when a content security policy is violated. |
||||
|
*/ |
||||
|
public ?string $reportURI = null; |
||||
|
|
||||
|
/** |
||||
|
* Instructs user agents to rewrite URL schemes, changing |
||||
|
* HTTP to HTTPS. This directive is for websites with |
||||
|
* large numbers of old URLs that need to be rewritten. |
||||
|
*/ |
||||
|
public bool $upgradeInsecureRequests = false; |
||||
|
|
||||
|
// ------------------------------------------------------------------------- |
||||
|
// Sources allowed |
||||
|
// NOTE: once you set a policy to 'none', it cannot be further restricted |
||||
|
// ------------------------------------------------------------------------- |
||||
|
|
||||
|
/** |
||||
|
* Will default to self if not overridden |
||||
|
* |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $defaultSrc; |
||||
|
|
||||
|
/** |
||||
|
* Lists allowed scripts' URLs. |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $scriptSrc = 'self'; |
||||
|
|
||||
|
/** |
||||
|
* Lists allowed stylesheets' URLs. |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $styleSrc = 'self'; |
||||
|
|
||||
|
/** |
||||
|
* Defines the origins from which images can be loaded. |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $imageSrc = 'self'; |
||||
|
|
||||
|
/** |
||||
|
* Restricts the URLs that can appear in a page's `<base>` element. |
||||
|
* |
||||
|
* Will default to self if not overridden |
||||
|
* |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $baseURI; |
||||
|
|
||||
|
/** |
||||
|
* Lists the URLs for workers and embedded frame contents |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $childSrc = 'self'; |
||||
|
|
||||
|
/** |
||||
|
* Limits the origins that you can connect to (via XHR, |
||||
|
* WebSockets, and EventSource). |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $connectSrc = 'self'; |
||||
|
|
||||
|
/** |
||||
|
* Specifies the origins that can serve web fonts. |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $fontSrc; |
||||
|
|
||||
|
/** |
||||
|
* Lists valid endpoints for submission from `<form>` tags. |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $formAction = 'self'; |
||||
|
|
||||
|
/** |
||||
|
* Specifies the sources that can embed the current page. |
||||
|
* This directive applies to `<frame>`, `<iframe>`, `<embed>`, |
||||
|
* and `<applet>` tags. This directive can't be used in |
||||
|
* `<meta>` tags and applies only to non-HTML resources. |
||||
|
* |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $frameAncestors; |
||||
|
|
||||
|
/** |
||||
|
* The frame-src directive restricts the URLs which may |
||||
|
* be loaded into nested browsing contexts. |
||||
|
* |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $frameSrc; |
||||
|
|
||||
|
/** |
||||
|
* Restricts the origins allowed to deliver video and audio. |
||||
|
* |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $mediaSrc; |
||||
|
|
||||
|
/** |
||||
|
* Allows control over Flash and other plugins. |
||||
|
* |
||||
|
* @var list<string>|string |
||||
|
*/ |
||||
|
public $objectSrc = 'self'; |
||||
|
|
||||
|
/** |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $manifestSrc; |
||||
|
|
||||
|
/** |
||||
|
* Limits the kinds of plugins a page may invoke. |
||||
|
* |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $pluginTypes; |
||||
|
|
||||
|
/** |
||||
|
* List of actions allowed. |
||||
|
* |
||||
|
* @var list<string>|string|null |
||||
|
*/ |
||||
|
public $sandbox; |
||||
|
|
||||
|
/** |
||||
|
* Nonce tag for style |
||||
|
*/ |
||||
|
public string $styleNonceTag = '{csp-style-nonce}'; |
||||
|
|
||||
|
/** |
||||
|
* Nonce tag for script |
||||
|
*/ |
||||
|
public string $scriptNonceTag = '{csp-script-nonce}'; |
||||
|
|
||||
|
/** |
||||
|
* Replace nonce tag automatically |
||||
|
*/ |
||||
|
public bool $autoNonce = true; |
||||
|
} |
||||
@ -0,0 +1,107 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use DateTimeInterface; |
||||
|
|
||||
|
class Cookie extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie Prefix |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Set a cookie name prefix if you need to avoid collisions. |
||||
|
*/ |
||||
|
public string $prefix = ''; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie Expires Timestamp |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Default expires timestamp for cookies. Setting this to `0` will mean the |
||||
|
* cookie will not have the `Expires` attribute and will behave as a session |
||||
|
* cookie. |
||||
|
* |
||||
|
* @var DateTimeInterface|int|string |
||||
|
*/ |
||||
|
public $expires = 0; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie Path |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Typically will be a forward slash. |
||||
|
*/ |
||||
|
public string $path = '/'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie Domain |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Set to `.your-domain.com` for site-wide cookies. |
||||
|
*/ |
||||
|
public string $domain = ''; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie Secure |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Cookie will only be set if a secure HTTPS connection exists. |
||||
|
*/ |
||||
|
public bool $secure = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie HTTPOnly |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Cookie will only be accessible via HTTP(S) (no JavaScript). |
||||
|
*/ |
||||
|
public bool $httponly = true; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie SameSite |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Configure cookie SameSite setting. Allowed values are: |
||||
|
* - None |
||||
|
* - Lax |
||||
|
* - Strict |
||||
|
* - '' |
||||
|
* |
||||
|
* Alternatively, you can use the constant names: |
||||
|
* - `Cookie::SAMESITE_NONE` |
||||
|
* - `Cookie::SAMESITE_LAX` |
||||
|
* - `Cookie::SAMESITE_STRICT` |
||||
|
* |
||||
|
* Defaults to `Lax` for compatibility with modern browsers. Setting `''` |
||||
|
* (empty string) means default SameSite attribute set by browsers (`Lax`) |
||||
|
* will be set on cookies. If set to `None`, `$secure` must also be set. |
||||
|
* |
||||
|
* @phpstan-var 'None'|'Lax'|'Strict'|'' |
||||
|
*/ |
||||
|
public string $samesite = 'Lax'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Cookie Raw |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This flag allows setting a "raw" cookie, i.e., its name and value are |
||||
|
* not URL encoded using `rawurlencode()`. |
||||
|
* |
||||
|
* If this is set to `true`, cookie names should be compliant of RFC 2616's |
||||
|
* list of allowed characters. |
||||
|
* |
||||
|
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes |
||||
|
* @see https://tools.ietf.org/html/rfc2616#section-2.2 |
||||
|
*/ |
||||
|
public bool $raw = false; |
||||
|
} |
||||
@ -0,0 +1,89 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Database\Config; |
||||
|
|
||||
|
/** |
||||
|
* Database Configuration |
||||
|
*/ |
||||
|
class Database extends Config |
||||
|
{ |
||||
|
/** |
||||
|
* The directory that holds the Migrations |
||||
|
* and Seeds directories. |
||||
|
*/ |
||||
|
public string $filesPath = APPPATH . 'Database' . DIRECTORY_SEPARATOR; |
||||
|
|
||||
|
/** |
||||
|
* Lets you choose which connection group to |
||||
|
* use if no other is specified. |
||||
|
*/ |
||||
|
public string $defaultGroup = 'default'; |
||||
|
|
||||
|
/** |
||||
|
* The default database connection. |
||||
|
* |
||||
|
* @var array<string, mixed> |
||||
|
*/ |
||||
|
public array $default = [ |
||||
|
'DSN' => '', |
||||
|
'hostname' => 'localhost', |
||||
|
'username' => 'root', |
||||
|
'password' => '', |
||||
|
'database' => 'stock', |
||||
|
'DBDriver' => 'MySQLi', |
||||
|
'DBPrefix' => '', |
||||
|
'pConnect' => false, |
||||
|
'DBDebug' => true, |
||||
|
'charset' => 'utf8', |
||||
|
'DBCollat' => 'utf8_general_ci', |
||||
|
'swapPre' => '', |
||||
|
'encrypt' => false, |
||||
|
'compress' => false, |
||||
|
'strictOn' => false, |
||||
|
'failover' => [], |
||||
|
'port' => 3306, |
||||
|
'numberNative' => false, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* This database connection is used when |
||||
|
* running PHPUnit database tests. |
||||
|
* |
||||
|
* @var array<string, mixed> |
||||
|
*/ |
||||
|
public array $tests = [ |
||||
|
'DSN' => '', |
||||
|
'hostname' => '127.0.0.1', |
||||
|
'username' => '', |
||||
|
'password' => '', |
||||
|
'database' => ':memory:', |
||||
|
'DBDriver' => 'SQLite3', |
||||
|
'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS |
||||
|
'pConnect' => false, |
||||
|
'DBDebug' => true, |
||||
|
'charset' => 'utf8', |
||||
|
'DBCollat' => 'utf8_general_ci', |
||||
|
'swapPre' => '', |
||||
|
'encrypt' => false, |
||||
|
'compress' => false, |
||||
|
'strictOn' => false, |
||||
|
'failover' => [], |
||||
|
'port' => 3306, |
||||
|
'foreignKeys' => true, |
||||
|
'busyTimeout' => 1000, |
||||
|
]; |
||||
|
|
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
|
||||
|
// Ensure that we always set the database group to 'tests' if |
||||
|
// we are currently running an automated test suite, so that |
||||
|
// we don't overwrite live data on accident. |
||||
|
if (ENVIRONMENT === 'testing') { |
||||
|
$this->defaultGroup = 'tests'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
/** |
||||
|
* @immutable |
||||
|
*/ |
||||
|
class DocTypes |
||||
|
{ |
||||
|
/** |
||||
|
* List of valid document types. |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $list = [ |
||||
|
'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">', |
||||
|
'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">', |
||||
|
'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">', |
||||
|
'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">', |
||||
|
'xhtml-basic11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">', |
||||
|
'html5' => '<!DOCTYPE html>', |
||||
|
'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">', |
||||
|
'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">', |
||||
|
'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">', |
||||
|
'mathml1' => '<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">', |
||||
|
'mathml2' => '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">', |
||||
|
'svg10' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">', |
||||
|
'svg11' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">', |
||||
|
'svg11-basic' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">', |
||||
|
'svg11-tiny' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">', |
||||
|
'xhtml-math-svg-xh' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">', |
||||
|
'xhtml-math-svg-sh' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">', |
||||
|
'xhtml-rdfa-1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">', |
||||
|
'xhtml-rdfa-2' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* Whether to remove the solidus (`/`) character for void HTML elements (e.g. `<input>`) |
||||
|
* for HTML5 compatibility. |
||||
|
* |
||||
|
* Set to: |
||||
|
* `true` - to be HTML5 compatible |
||||
|
* `false` - to be XHTML compatible |
||||
|
*/ |
||||
|
public bool $html5 = true; |
||||
|
} |
||||
@ -0,0 +1,121 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class Email extends BaseConfig |
||||
|
{ |
||||
|
public string $fromEmail = ''; |
||||
|
public string $fromName = ''; |
||||
|
public string $recipients = ''; |
||||
|
|
||||
|
/** |
||||
|
* The "user agent" |
||||
|
*/ |
||||
|
public string $userAgent = 'CodeIgniter'; |
||||
|
|
||||
|
/** |
||||
|
* The mail sending protocol: mail, sendmail, smtp |
||||
|
*/ |
||||
|
public string $protocol = 'mail'; |
||||
|
|
||||
|
/** |
||||
|
* The server path to Sendmail. |
||||
|
*/ |
||||
|
public string $mailPath = '/usr/sbin/sendmail'; |
||||
|
|
||||
|
/** |
||||
|
* SMTP Server Hostname |
||||
|
*/ |
||||
|
public string $SMTPHost = ''; |
||||
|
|
||||
|
/** |
||||
|
* SMTP Username |
||||
|
*/ |
||||
|
public string $SMTPUser = ''; |
||||
|
|
||||
|
/** |
||||
|
* SMTP Password |
||||
|
*/ |
||||
|
public string $SMTPPass = ''; |
||||
|
|
||||
|
/** |
||||
|
* SMTP Port |
||||
|
*/ |
||||
|
public int $SMTPPort = 25; |
||||
|
|
||||
|
/** |
||||
|
* SMTP Timeout (in seconds) |
||||
|
*/ |
||||
|
public int $SMTPTimeout = 5; |
||||
|
|
||||
|
/** |
||||
|
* Enable persistent SMTP connections |
||||
|
*/ |
||||
|
public bool $SMTPKeepAlive = false; |
||||
|
|
||||
|
/** |
||||
|
* SMTP Encryption. |
||||
|
* |
||||
|
* @var string '', 'tls' or 'ssl'. 'tls' will issue a STARTTLS command |
||||
|
* to the server. 'ssl' means implicit SSL. Connection on port |
||||
|
* 465 should set this to ''. |
||||
|
*/ |
||||
|
public string $SMTPCrypto = 'tls'; |
||||
|
|
||||
|
/** |
||||
|
* Enable word-wrap |
||||
|
*/ |
||||
|
public bool $wordWrap = true; |
||||
|
|
||||
|
/** |
||||
|
* Character count to wrap at |
||||
|
*/ |
||||
|
public int $wrapChars = 76; |
||||
|
|
||||
|
/** |
||||
|
* Type of mail, either 'text' or 'html' |
||||
|
*/ |
||||
|
public string $mailType = 'text'; |
||||
|
|
||||
|
/** |
||||
|
* Character set (utf-8, iso-8859-1, etc.) |
||||
|
*/ |
||||
|
public string $charset = 'UTF-8'; |
||||
|
|
||||
|
/** |
||||
|
* Whether to validate the email address |
||||
|
*/ |
||||
|
public bool $validate = false; |
||||
|
|
||||
|
/** |
||||
|
* Email Priority. 1 = highest. 5 = lowest. 3 = normal |
||||
|
*/ |
||||
|
public int $priority = 3; |
||||
|
|
||||
|
/** |
||||
|
* Newline character. (Use “\r\n” to comply with RFC 822) |
||||
|
*/ |
||||
|
public string $CRLF = "\r\n"; |
||||
|
|
||||
|
/** |
||||
|
* Newline character. (Use “\r\n” to comply with RFC 822) |
||||
|
*/ |
||||
|
public string $newline = "\r\n"; |
||||
|
|
||||
|
/** |
||||
|
* Enable BCC Batch Mode. |
||||
|
*/ |
||||
|
public bool $BCCBatchMode = false; |
||||
|
|
||||
|
/** |
||||
|
* Number of emails in each BCC batch |
||||
|
*/ |
||||
|
public int $BCCBatchSize = 200; |
||||
|
|
||||
|
/** |
||||
|
* Enable notify message from server |
||||
|
*/ |
||||
|
public bool $DSN = false; |
||||
|
} |
||||
@ -0,0 +1,92 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
/** |
||||
|
* Encryption configuration. |
||||
|
* |
||||
|
* These are the settings used for encryption, if you don't pass a parameter |
||||
|
* array to the encrypter for creation/initialization. |
||||
|
*/ |
||||
|
class Encryption extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Encryption Key Starter |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If you use the Encryption class you must set an encryption key (seed). |
||||
|
* You need to ensure it is long enough for the cipher and mode you plan to use. |
||||
|
* See the user guide for more info. |
||||
|
*/ |
||||
|
public string $key = ''; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Encryption Driver to Use |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* One of the supported encryption drivers. |
||||
|
* |
||||
|
* Available drivers: |
||||
|
* - OpenSSL |
||||
|
* - Sodium |
||||
|
*/ |
||||
|
public string $driver = 'OpenSSL'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* SodiumHandler's Padding Length in Bytes |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This is the number of bytes that will be padded to the plaintext message |
||||
|
* before it is encrypted. This value should be greater than zero. |
||||
|
* |
||||
|
* See the user guide for more information on padding. |
||||
|
*/ |
||||
|
public int $blockSize = 16; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Encryption digest |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* HMAC digest to use, e.g. 'SHA512' or 'SHA256'. Default value is 'SHA512'. |
||||
|
*/ |
||||
|
public string $digest = 'SHA512'; |
||||
|
|
||||
|
/** |
||||
|
* Whether the cipher-text should be raw. If set to false, then it will be base64 encoded. |
||||
|
* This setting is only used by OpenSSLHandler. |
||||
|
* |
||||
|
* Set to false for CI3 Encryption compatibility. |
||||
|
*/ |
||||
|
public bool $rawData = true; |
||||
|
|
||||
|
/** |
||||
|
* Encryption key info. |
||||
|
* This setting is only used by OpenSSLHandler. |
||||
|
* |
||||
|
* Set to 'encryption' for CI3 Encryption compatibility. |
||||
|
*/ |
||||
|
public string $encryptKeyInfo = ''; |
||||
|
|
||||
|
/** |
||||
|
* Authentication key info. |
||||
|
* This setting is only used by OpenSSLHandler. |
||||
|
* |
||||
|
* Set to 'authentication' for CI3 Encryption compatibility. |
||||
|
*/ |
||||
|
public string $authKeyInfo = ''; |
||||
|
|
||||
|
/** |
||||
|
* Cipher to use. |
||||
|
* This setting is only used by OpenSSLHandler. |
||||
|
* |
||||
|
* Set to 'AES-128-CBC' to decrypt encrypted data that encrypted |
||||
|
* by CI3 Encryption default configuration. |
||||
|
*/ |
||||
|
public string $cipher = 'AES-256-CTR'; |
||||
|
} |
||||
@ -0,0 +1,55 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Events\Events; |
||||
|
use CodeIgniter\Exceptions\FrameworkException; |
||||
|
use CodeIgniter\HotReloader\HotReloader; |
||||
|
|
||||
|
/* |
||||
|
* -------------------------------------------------------------------- |
||||
|
* Application Events |
||||
|
* -------------------------------------------------------------------- |
||||
|
* Events allow you to tap into the execution of the program without |
||||
|
* modifying or extending core files. This file provides a central |
||||
|
* location to define your events, though they can always be added |
||||
|
* at run-time, also, if needed. |
||||
|
* |
||||
|
* You create code that can execute by subscribing to events with |
||||
|
* the 'on()' method. This accepts any form of callable, including |
||||
|
* Closures, that will be executed when the event is triggered. |
||||
|
* |
||||
|
* Example: |
||||
|
* Events::on('create', [$myInstance, 'myMethod']); |
||||
|
*/ |
||||
|
|
||||
|
Events::on('pre_system', static function () { |
||||
|
if (ENVIRONMENT !== 'testing') { |
||||
|
if (ini_get('zlib.output_compression')) { |
||||
|
throw FrameworkException::forEnabledZlibOutputCompression(); |
||||
|
} |
||||
|
|
||||
|
while (ob_get_level() > 0) { |
||||
|
ob_end_flush(); |
||||
|
} |
||||
|
|
||||
|
ob_start(static fn ($buffer) => $buffer); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* -------------------------------------------------------------------- |
||||
|
* Debug Toolbar Listeners. |
||||
|
* -------------------------------------------------------------------- |
||||
|
* If you delete, they will no longer be collected. |
||||
|
*/ |
||||
|
if (CI_DEBUG && ! is_cli()) { |
||||
|
Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect'); |
||||
|
Services::toolbar()->respond(); |
||||
|
// Hot Reload route - for framework use on the hot reloader. |
||||
|
if (ENVIRONMENT === 'development') { |
||||
|
Services::routes()->get('__hot-reload', static function () { |
||||
|
(new HotReloader())->run(); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,108 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Debug\ExceptionHandler; |
||||
|
use CodeIgniter\Debug\ExceptionHandlerInterface; |
||||
|
use Psr\Log\LogLevel; |
||||
|
use Throwable; |
||||
|
|
||||
|
/** |
||||
|
* Setup how the exception handler works. |
||||
|
*/ |
||||
|
class Exceptions extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* LOG EXCEPTIONS? |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* If true, then exceptions will be logged |
||||
|
* through Services::Log. |
||||
|
* |
||||
|
* Default: true |
||||
|
*/ |
||||
|
public bool $log = true; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* DO NOT LOG STATUS CODES |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Any status codes here will NOT be logged if logging is turned on. |
||||
|
* By default, only 404 (Page Not Found) exceptions are ignored. |
||||
|
* |
||||
|
* @var list<int> |
||||
|
*/ |
||||
|
public array $ignoreCodes = [404]; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Error Views Path |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* This is the path to the directory that contains the 'cli' and 'html' |
||||
|
* directories that hold the views used to generate errors. |
||||
|
* |
||||
|
* Default: APPPATH.'Views/errors' |
||||
|
*/ |
||||
|
public string $errorViewPath = APPPATH . 'Views/errors'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* HIDE FROM DEBUG TRACE |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Any data that you would like to hide from the debug trace. |
||||
|
* In order to specify 2 levels, use "/" to separate. |
||||
|
* ex. ['server', 'setup/password', 'secret_token'] |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $sensitiveDataInTrace = []; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* LOG DEPRECATIONS INSTEAD OF THROWING? |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* By default, CodeIgniter converts deprecations into exceptions. Also, |
||||
|
* starting in PHP 8.1 will cause a lot of deprecated usage warnings. |
||||
|
* Use this option to temporarily cease the warnings and instead log those. |
||||
|
* This option also works for user deprecations. |
||||
|
*/ |
||||
|
public bool $logDeprecations = true; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* LOG LEVEL THRESHOLD FOR DEPRECATIONS |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* If `$logDeprecations` is set to `true`, this sets the log level |
||||
|
* to which the deprecation will be logged. This should be one of the log |
||||
|
* levels recognized by PSR-3. |
||||
|
* |
||||
|
* The related `Config\Logger::$threshold` should be adjusted, if needed, |
||||
|
* to capture logging the deprecations. |
||||
|
*/ |
||||
|
public string $deprecationLogLevel = LogLevel::WARNING; |
||||
|
|
||||
|
/* |
||||
|
* DEFINE THE HANDLERS USED |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Given the HTTP status code, returns exception handler that |
||||
|
* should be used to deal with this error. By default, it will run CodeIgniter's |
||||
|
* default handler and display the error information in the expected format |
||||
|
* for CLI, HTTP, or AJAX requests, as determined by is_cli() and the expected |
||||
|
* response format. |
||||
|
* |
||||
|
* Custom handlers can be returned if you want to handle one or more specific |
||||
|
* error codes yourself like: |
||||
|
* |
||||
|
* if (in_array($statusCode, [400, 404, 500])) { |
||||
|
* return new \App\Libraries\MyExceptionHandler(); |
||||
|
* } |
||||
|
* if ($exception instanceOf PageNotFoundException) { |
||||
|
* return new \App\Libraries\MyExceptionHandler(); |
||||
|
* } |
||||
|
*/ |
||||
|
public function handler(int $statusCode, Throwable $exception): ExceptionHandlerInterface |
||||
|
{ |
||||
|
return new ExceptionHandler($this); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
/** |
||||
|
* Enable/disable backward compatibility breaking features. |
||||
|
*/ |
||||
|
class Feature extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* Enable multiple filters for a route or not. |
||||
|
* |
||||
|
* If you enable this: |
||||
|
* - CodeIgniter\CodeIgniter::handleRequest() uses: |
||||
|
* - CodeIgniter\Filters\Filters::enableFilters(), instead of enableFilter() |
||||
|
* - CodeIgniter\CodeIgniter::tryToRouteIt() uses: |
||||
|
* - CodeIgniter\Router\Router::getFilters(), instead of getFilter() |
||||
|
* - CodeIgniter\Router\Router::handle() uses: |
||||
|
* - property $filtersInfo, instead of $filterInfo |
||||
|
* - CodeIgniter\Router\RouteCollection::getFiltersForRoute(), instead of getFilterForRoute() |
||||
|
*/ |
||||
|
public bool $multipleFilters = false; |
||||
|
|
||||
|
/** |
||||
|
* Use improved new auto routing instead of the default legacy version. |
||||
|
*/ |
||||
|
public bool $autoRoutesImproved = false; |
||||
|
} |
||||
@ -0,0 +1,75 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Filters\CSRF; |
||||
|
use CodeIgniter\Filters\DebugToolbar; |
||||
|
use CodeIgniter\Filters\Honeypot; |
||||
|
use CodeIgniter\Filters\InvalidChars; |
||||
|
use CodeIgniter\Filters\SecureHeaders; |
||||
|
use App\Filters\LoggedInFilter; |
||||
|
|
||||
|
class Filters extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* Configures aliases for Filter classes to |
||||
|
* make reading things nicer and simpler. |
||||
|
* |
||||
|
* @var array<string, class-string|list<class-string>> [filter_name => classname] |
||||
|
* or [filter_name => [classname1, classname2, ...]] |
||||
|
*/ |
||||
|
public array $aliases = [ |
||||
|
'csrf' => CSRF::class, |
||||
|
'toolbar' => DebugToolbar::class, |
||||
|
'honeypot' => Honeypot::class, |
||||
|
'invalidchars' => InvalidChars::class, |
||||
|
'secureheaders' => SecureHeaders::class, |
||||
|
'loggedIn' => LoggedInFilter::class, // Add this line |
||||
|
'auth' => \App\Filters\AuthCheck::class, |
||||
|
'intended' => \App\Filters\PublicCheck::class, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* List of filter aliases that are always |
||||
|
* applied before and after every request. |
||||
|
* |
||||
|
* @var array<string, array<string, array<string, string>>>|array<string, list<string>> |
||||
|
*/ |
||||
|
public array $globals = [ |
||||
|
'before' => [ |
||||
|
'auth' => ['except' => ['login', 'register', 'public/*']], // Apply the 'auth' filter globally, except specified routes |
||||
|
], |
||||
|
'after' => [ |
||||
|
'toolbar', |
||||
|
// 'honeypot', |
||||
|
// 'secureheaders', |
||||
|
], |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* List of filter aliases that works on a |
||||
|
* particular HTTP method (GET, POST, etc.). |
||||
|
* |
||||
|
* Example: |
||||
|
* 'post' => ['foo', 'bar'] |
||||
|
* |
||||
|
* If you use this, you should disable auto-routing because auto-routing |
||||
|
* permits any HTTP method to access a controller. Accessing the controller |
||||
|
* with a method you don't expect could bypass the filter. |
||||
|
* |
||||
|
* @var array<string, list<string>> |
||||
|
*/ |
||||
|
public array $methods = []; |
||||
|
|
||||
|
/** |
||||
|
* List of filter aliases that should run on any |
||||
|
* before or after URI patterns. |
||||
|
* |
||||
|
* Example: |
||||
|
* 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']] |
||||
|
* |
||||
|
* @var array<string, array<string, list<string>>> |
||||
|
*/ |
||||
|
public array $filters = []; |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\ForeignCharacters as BaseForeignCharacters; |
||||
|
|
||||
|
/** |
||||
|
* @immutable |
||||
|
*/ |
||||
|
class ForeignCharacters extends BaseForeignCharacters |
||||
|
{ |
||||
|
} |
||||
@ -0,0 +1,77 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Format\FormatterInterface; |
||||
|
use CodeIgniter\Format\JSONFormatter; |
||||
|
use CodeIgniter\Format\XMLFormatter; |
||||
|
|
||||
|
class Format extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Available Response Formats |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* When you perform content negotiation with the request, these are the |
||||
|
* available formats that your application supports. This is currently |
||||
|
* only used with the API\ResponseTrait. A valid Formatter must exist |
||||
|
* for the specified format. |
||||
|
* |
||||
|
* These formats are only checked when the data passed to the respond() |
||||
|
* method is an array. |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $supportedResponseFormats = [ |
||||
|
'application/json', |
||||
|
'application/xml', // machine-readable XML |
||||
|
'text/xml', // human-readable XML |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Formatters |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Lists the class to use to format responses with of a particular type. |
||||
|
* For each mime type, list the class that should be used. Formatters |
||||
|
* can be retrieved through the getFormatter() method. |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $formatters = [ |
||||
|
'application/json' => JSONFormatter::class, |
||||
|
'application/xml' => XMLFormatter::class, |
||||
|
'text/xml' => XMLFormatter::class, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Formatters Options |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Additional Options to adjust default formatters behaviour. |
||||
|
* For each mime type, list the additional options that should be used. |
||||
|
* |
||||
|
* @var array<string, int> |
||||
|
*/ |
||||
|
public array $formatterOptions = [ |
||||
|
'application/json' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES, |
||||
|
'application/xml' => 0, |
||||
|
'text/xml' => 0, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* A Factory method to return the appropriate formatter for the given mime type. |
||||
|
* |
||||
|
* @return FormatterInterface |
||||
|
* |
||||
|
* @deprecated This is an alias of `\CodeIgniter\Format\Format::getFormatter`. Use that instead. |
||||
|
*/ |
||||
|
public function getFormatter(string $mime) |
||||
|
{ |
||||
|
return Services::format()->getFormatter($mime); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,42 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class Generators extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Generator Commands' Views |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This array defines the mapping of generator commands to the view files |
||||
|
* they are using. If you need to customize them for your own, copy these |
||||
|
* view files in your own folder and indicate the location here. |
||||
|
* |
||||
|
* You will notice that the views have special placeholders enclosed in |
||||
|
* curly braces `{...}`. These placeholders are used internally by the |
||||
|
* generator commands in processing replacements, thus you are warned |
||||
|
* not to delete them or modify the names. If you will do so, you may |
||||
|
* end up disrupting the scaffolding process and throw errors. |
||||
|
* |
||||
|
* YOU HAVE BEEN WARNED! |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $views = [ |
||||
|
'make:cell' => 'CodeIgniter\Commands\Generators\Views\cell.tpl.php', |
||||
|
'make:cell_view' => 'CodeIgniter\Commands\Generators\Views\cell_view.tpl.php', |
||||
|
'make:command' => 'CodeIgniter\Commands\Generators\Views\command.tpl.php', |
||||
|
'make:config' => 'CodeIgniter\Commands\Generators\Views\config.tpl.php', |
||||
|
'make:controller' => 'CodeIgniter\Commands\Generators\Views\controller.tpl.php', |
||||
|
'make:entity' => 'CodeIgniter\Commands\Generators\Views\entity.tpl.php', |
||||
|
'make:filter' => 'CodeIgniter\Commands\Generators\Views\filter.tpl.php', |
||||
|
'make:migration' => 'CodeIgniter\Commands\Generators\Views\migration.tpl.php', |
||||
|
'make:model' => 'CodeIgniter\Commands\Generators\Views\model.tpl.php', |
||||
|
'make:seeder' => 'CodeIgniter\Commands\Generators\Views\seeder.tpl.php', |
||||
|
'make:validation' => 'CodeIgniter\Commands\Generators\Views\validation.tpl.php', |
||||
|
'session:migration' => 'CodeIgniter\Commands\Generators\Views\migration.tpl.php', |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,42 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class Honeypot extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* Makes Honeypot visible or not to human |
||||
|
*/ |
||||
|
public bool $hidden = true; |
||||
|
|
||||
|
/** |
||||
|
* Honeypot Label Content |
||||
|
*/ |
||||
|
public string $label = 'Fill This Field'; |
||||
|
|
||||
|
/** |
||||
|
* Honeypot Field Name |
||||
|
*/ |
||||
|
public string $name = 'honeypot'; |
||||
|
|
||||
|
/** |
||||
|
* Honeypot HTML Template |
||||
|
*/ |
||||
|
public string $template = '<label>{label}</label><input type="text" name="{name}" value="">'; |
||||
|
|
||||
|
/** |
||||
|
* Honeypot container |
||||
|
* |
||||
|
* If you enabled CSP, you can remove `style="display:none"`. |
||||
|
*/ |
||||
|
public string $container = '<div style="display:none">{template}</div>'; |
||||
|
|
||||
|
/** |
||||
|
* The id attribute for Honeypot container tag |
||||
|
* |
||||
|
* Used when CSP is enabled. |
||||
|
*/ |
||||
|
public string $containerId = 'hpc'; |
||||
|
} |
||||
@ -0,0 +1,31 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Images\Handlers\GDHandler; |
||||
|
use CodeIgniter\Images\Handlers\ImageMagickHandler; |
||||
|
|
||||
|
class Images extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* Default handler used if no other handler is specified. |
||||
|
*/ |
||||
|
public string $defaultHandler = 'gd'; |
||||
|
|
||||
|
/** |
||||
|
* The path to the image library. |
||||
|
* Required for ImageMagick, GraphicsMagick, or NetPBM. |
||||
|
*/ |
||||
|
public string $libraryPath = '/usr/local/bin/convert'; |
||||
|
|
||||
|
/** |
||||
|
* The available handler classes. |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $handlers = [ |
||||
|
'gd' => GDHandler::class, |
||||
|
'imagick' => ImageMagickHandler::class, |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,66 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use Kint\Parser\ConstructablePluginInterface; |
||||
|
use Kint\Renderer\AbstractRenderer; |
||||
|
use Kint\Renderer\Rich\TabPluginInterface; |
||||
|
use Kint\Renderer\Rich\ValuePluginInterface; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Kint |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* We use Kint's `RichRenderer` and `CLIRenderer`. This area contains options |
||||
|
* that you can set to customize how Kint works for you. |
||||
|
* |
||||
|
* @see https://kint-php.github.io/kint/ for details on these settings. |
||||
|
*/ |
||||
|
class Kint extends BaseConfig |
||||
|
{ |
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| Global Settings |
||||
|
|-------------------------------------------------------------------------- |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* @var list<class-string<ConstructablePluginInterface>|ConstructablePluginInterface>|null |
||||
|
*/ |
||||
|
public $plugins; |
||||
|
|
||||
|
public int $maxDepth = 6; |
||||
|
public bool $displayCalledFrom = true; |
||||
|
public bool $expanded = false; |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| RichRenderer Settings |
||||
|
|-------------------------------------------------------------------------- |
||||
|
*/ |
||||
|
public string $richTheme = 'aante-light.css'; |
||||
|
public bool $richFolder = false; |
||||
|
public int $richSort = AbstractRenderer::SORT_FULL; |
||||
|
|
||||
|
/** |
||||
|
* @var array<string, class-string<ValuePluginInterface>>|null |
||||
|
*/ |
||||
|
public $richObjectPlugins; |
||||
|
|
||||
|
/** |
||||
|
* @var array<string, class-string<TabPluginInterface>>|null |
||||
|
*/ |
||||
|
public $richTabPlugins; |
||||
|
|
||||
|
/* |
||||
|
|-------------------------------------------------------------------------- |
||||
|
| CLI Settings |
||||
|
|-------------------------------------------------------------------------- |
||||
|
*/ |
||||
|
public bool $cliColors = true; |
||||
|
public bool $cliForceUTF8 = false; |
||||
|
public bool $cliDetectWidth = true; |
||||
|
public int $cliMinWidth = 40; |
||||
|
} |
||||
@ -0,0 +1,150 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Log\Handlers\FileHandler; |
||||
|
|
||||
|
class Logger extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Error Logging Threshold |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* You can enable error logging by setting a threshold over zero. The |
||||
|
* threshold determines what gets logged. Any values below or equal to the |
||||
|
* threshold will be logged. |
||||
|
* |
||||
|
* Threshold options are: |
||||
|
* |
||||
|
* - 0 = Disables logging, Error logging TURNED OFF |
||||
|
* - 1 = Emergency Messages - System is unusable |
||||
|
* - 2 = Alert Messages - Action Must Be Taken Immediately |
||||
|
* - 3 = Critical Messages - Application component unavailable, unexpected exception. |
||||
|
* - 4 = Runtime Errors - Don't need immediate action, but should be monitored. |
||||
|
* - 5 = Warnings - Exceptional occurrences that are not errors. |
||||
|
* - 6 = Notices - Normal but significant events. |
||||
|
* - 7 = Info - Interesting events, like user logging in, etc. |
||||
|
* - 8 = Debug - Detailed debug information. |
||||
|
* - 9 = All Messages |
||||
|
* |
||||
|
* You can also pass an array with threshold levels to show individual error types |
||||
|
* |
||||
|
* array(1, 2, 3, 8) = Emergency, Alert, Critical, and Debug messages |
||||
|
* |
||||
|
* For a live site you'll usually enable Critical or higher (3) to be logged otherwise |
||||
|
* your log files will fill up very fast. |
||||
|
* |
||||
|
* @var int|list<int> |
||||
|
*/ |
||||
|
public $threshold = (ENVIRONMENT === 'production') ? 4 : 9; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Date Format for Logs |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Each item that is logged has an associated date. You can use PHP date |
||||
|
* codes to set your own date formatting |
||||
|
*/ |
||||
|
public string $dateFormat = 'Y-m-d H:i:s'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Log Handlers |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The logging system supports multiple actions to be taken when something |
||||
|
* is logged. This is done by allowing for multiple Handlers, special classes |
||||
|
* designed to write the log to their chosen destinations, whether that is |
||||
|
* a file on the getServer, a cloud-based service, or even taking actions such |
||||
|
* as emailing the dev team. |
||||
|
* |
||||
|
* Each handler is defined by the class name used for that handler, and it |
||||
|
* MUST implement the `CodeIgniter\Log\Handlers\HandlerInterface` interface. |
||||
|
* |
||||
|
* The value of each key is an array of configuration items that are sent |
||||
|
* to the constructor of each handler. The only required configuration item |
||||
|
* is the 'handles' element, which must be an array of integer log levels. |
||||
|
* This is most easily handled by using the constants defined in the |
||||
|
* `Psr\Log\LogLevel` class. |
||||
|
* |
||||
|
* Handlers are executed in the order defined in this array, starting with |
||||
|
* the handler on top and continuing down. |
||||
|
* |
||||
|
* @var array<class-string, array<string, int|list<string>|string>> |
||||
|
*/ |
||||
|
public array $handlers = [ |
||||
|
/* |
||||
|
* -------------------------------------------------------------------- |
||||
|
* File Handler |
||||
|
* -------------------------------------------------------------------- |
||||
|
*/ |
||||
|
FileHandler::class => [ |
||||
|
// The log levels that this handler will handle. |
||||
|
'handles' => [ |
||||
|
'critical', |
||||
|
'alert', |
||||
|
'emergency', |
||||
|
'debug', |
||||
|
'error', |
||||
|
'info', |
||||
|
'notice', |
||||
|
'warning', |
||||
|
], |
||||
|
|
||||
|
/* |
||||
|
* The default filename extension for log files. |
||||
|
* An extension of 'php' allows for protecting the log files via basic |
||||
|
* scripting, when they are to be stored under a publicly accessible directory. |
||||
|
* |
||||
|
* NOTE: Leaving it blank will default to 'log'. |
||||
|
*/ |
||||
|
'fileExtension' => '', |
||||
|
|
||||
|
/* |
||||
|
* The file system permissions to be applied on newly created log files. |
||||
|
* |
||||
|
* IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal |
||||
|
* integer notation (i.e. 0700, 0644, etc.) |
||||
|
*/ |
||||
|
'filePermissions' => 0644, |
||||
|
|
||||
|
/* |
||||
|
* Logging Directory Path |
||||
|
* |
||||
|
* By default, logs are written to WRITEPATH . 'logs/' |
||||
|
* Specify a different destination here, if desired. |
||||
|
*/ |
||||
|
'path' => '', |
||||
|
], |
||||
|
|
||||
|
/* |
||||
|
* The ChromeLoggerHandler requires the use of the Chrome web browser |
||||
|
* and the ChromeLogger extension. Uncomment this block to use it. |
||||
|
*/ |
||||
|
// 'CodeIgniter\Log\Handlers\ChromeLoggerHandler' => [ |
||||
|
// /* |
||||
|
// * The log levels that this handler will handle. |
||||
|
// */ |
||||
|
// 'handles' => ['critical', 'alert', 'emergency', 'debug', |
||||
|
// 'error', 'info', 'notice', 'warning'], |
||||
|
// ], |
||||
|
|
||||
|
/* |
||||
|
* The ErrorlogHandler writes the logs to PHP's native `error_log()` function. |
||||
|
* Uncomment this block to use it. |
||||
|
*/ |
||||
|
// 'CodeIgniter\Log\Handlers\ErrorlogHandler' => [ |
||||
|
// /* The log levels this handler can handle. */ |
||||
|
// 'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'], |
||||
|
// |
||||
|
// /* |
||||
|
// * The message type where the error should go. Can be 0 or 4, or use the |
||||
|
// * class constants: `ErrorlogHandler::TYPE_OS` (0) or `ErrorlogHandler::TYPE_SAPI` (4) |
||||
|
// */ |
||||
|
// 'messageType' => 0, |
||||
|
// ], |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,50 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class Migrations extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Enable/Disable Migrations |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Migrations are enabled by default. |
||||
|
* |
||||
|
* You should enable migrations whenever you intend to do a schema migration |
||||
|
* and disable it back when you're done. |
||||
|
*/ |
||||
|
public bool $enabled = true; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Migrations Table |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This is the name of the table that will store the current migrations state. |
||||
|
* When migrations runs it will store in a database table which migration |
||||
|
* files have already been run. |
||||
|
*/ |
||||
|
public string $table = 'migrations'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Timestamp Format |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* This is the format that will be used when creating new migrations |
||||
|
* using the CLI command: |
||||
|
* > php spark make:migration |
||||
|
* |
||||
|
* NOTE: if you set an unsupported format, migration runner will not find |
||||
|
* your migration files. |
||||
|
* |
||||
|
* Supported formats: |
||||
|
* - YmdHis_ |
||||
|
* - Y-m-d-His_ |
||||
|
* - Y_m_d_His_ |
||||
|
*/ |
||||
|
public string $timestampFormat = 'Y-m-d-His_'; |
||||
|
} |
||||
@ -0,0 +1,536 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
/** |
||||
|
* Mimes |
||||
|
* |
||||
|
* This file contains an array of mime types. It is used by the |
||||
|
* Upload class to help identify allowed file types. |
||||
|
* |
||||
|
* When more than one variation for an extension exist (like jpg, jpeg, etc) |
||||
|
* the most common one should be first in the array to aid the guess* |
||||
|
* methods. The same applies when more than one mime-type exists for a |
||||
|
* single extension. |
||||
|
* |
||||
|
* When working with mime types, please make sure you have the ´fileinfo´ |
||||
|
* extension enabled to reliably detect the media types. |
||||
|
* |
||||
|
* @immutable |
||||
|
*/ |
||||
|
class Mimes |
||||
|
{ |
||||
|
/** |
||||
|
* Map of extensions to mime types. |
||||
|
* |
||||
|
* @var array<string, list<string>|string> |
||||
|
*/ |
||||
|
public static array $mimes = [ |
||||
|
'hqx' => [ |
||||
|
'application/mac-binhex40', |
||||
|
'application/mac-binhex', |
||||
|
'application/x-binhex40', |
||||
|
'application/x-mac-binhex40', |
||||
|
], |
||||
|
'cpt' => 'application/mac-compactpro', |
||||
|
'csv' => [ |
||||
|
'text/csv', |
||||
|
'text/x-comma-separated-values', |
||||
|
'text/comma-separated-values', |
||||
|
'application/vnd.ms-excel', |
||||
|
'application/x-csv', |
||||
|
'text/x-csv', |
||||
|
'application/csv', |
||||
|
'application/excel', |
||||
|
'application/vnd.msexcel', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'bin' => [ |
||||
|
'application/macbinary', |
||||
|
'application/mac-binary', |
||||
|
'application/octet-stream', |
||||
|
'application/x-binary', |
||||
|
'application/x-macbinary', |
||||
|
], |
||||
|
'dms' => 'application/octet-stream', |
||||
|
'lha' => 'application/octet-stream', |
||||
|
'lzh' => 'application/octet-stream', |
||||
|
'exe' => [ |
||||
|
'application/octet-stream', |
||||
|
'application/vnd.microsoft.portable-executable', |
||||
|
'application/x-dosexec', |
||||
|
'application/x-msdownload', |
||||
|
], |
||||
|
'class' => 'application/octet-stream', |
||||
|
'psd' => [ |
||||
|
'application/x-photoshop', |
||||
|
'image/vnd.adobe.photoshop', |
||||
|
], |
||||
|
'so' => 'application/octet-stream', |
||||
|
'sea' => 'application/octet-stream', |
||||
|
'dll' => 'application/octet-stream', |
||||
|
'oda' => 'application/oda', |
||||
|
'pdf' => [ |
||||
|
'application/pdf', |
||||
|
'application/force-download', |
||||
|
'application/x-download', |
||||
|
], |
||||
|
'ai' => [ |
||||
|
'application/pdf', |
||||
|
'application/postscript', |
||||
|
], |
||||
|
'eps' => 'application/postscript', |
||||
|
'ps' => 'application/postscript', |
||||
|
'smi' => 'application/smil', |
||||
|
'smil' => 'application/smil', |
||||
|
'mif' => 'application/vnd.mif', |
||||
|
'xls' => [ |
||||
|
'application/vnd.ms-excel', |
||||
|
'application/msexcel', |
||||
|
'application/x-msexcel', |
||||
|
'application/x-ms-excel', |
||||
|
'application/x-excel', |
||||
|
'application/x-dos_ms_excel', |
||||
|
'application/xls', |
||||
|
'application/x-xls', |
||||
|
'application/excel', |
||||
|
'application/download', |
||||
|
'application/vnd.ms-office', |
||||
|
'application/msword', |
||||
|
], |
||||
|
'ppt' => [ |
||||
|
'application/vnd.ms-powerpoint', |
||||
|
'application/powerpoint', |
||||
|
'application/vnd.ms-office', |
||||
|
'application/msword', |
||||
|
], |
||||
|
'pptx' => [ |
||||
|
'application/vnd.openxmlformats-officedocument.presentationml.presentation', |
||||
|
], |
||||
|
'wbxml' => 'application/wbxml', |
||||
|
'wmlc' => 'application/wmlc', |
||||
|
'dcr' => 'application/x-director', |
||||
|
'dir' => 'application/x-director', |
||||
|
'dxr' => 'application/x-director', |
||||
|
'dvi' => 'application/x-dvi', |
||||
|
'gtar' => 'application/x-gtar', |
||||
|
'gz' => 'application/x-gzip', |
||||
|
'gzip' => 'application/x-gzip', |
||||
|
'php' => [ |
||||
|
'application/x-php', |
||||
|
'application/x-httpd-php', |
||||
|
'application/php', |
||||
|
'text/php', |
||||
|
'text/x-php', |
||||
|
'application/x-httpd-php-source', |
||||
|
], |
||||
|
'php4' => 'application/x-httpd-php', |
||||
|
'php3' => 'application/x-httpd-php', |
||||
|
'phtml' => 'application/x-httpd-php', |
||||
|
'phps' => 'application/x-httpd-php-source', |
||||
|
'js' => [ |
||||
|
'application/x-javascript', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'swf' => 'application/x-shockwave-flash', |
||||
|
'sit' => 'application/x-stuffit', |
||||
|
'tar' => 'application/x-tar', |
||||
|
'tgz' => [ |
||||
|
'application/x-tar', |
||||
|
'application/x-gzip-compressed', |
||||
|
], |
||||
|
'z' => 'application/x-compress', |
||||
|
'xhtml' => 'application/xhtml+xml', |
||||
|
'xht' => 'application/xhtml+xml', |
||||
|
'zip' => [ |
||||
|
'application/x-zip', |
||||
|
'application/zip', |
||||
|
'application/x-zip-compressed', |
||||
|
'application/s-compressed', |
||||
|
'multipart/x-zip', |
||||
|
], |
||||
|
'rar' => [ |
||||
|
'application/vnd.rar', |
||||
|
'application/x-rar', |
||||
|
'application/rar', |
||||
|
'application/x-rar-compressed', |
||||
|
], |
||||
|
'mid' => 'audio/midi', |
||||
|
'midi' => 'audio/midi', |
||||
|
'mpga' => 'audio/mpeg', |
||||
|
'mp2' => 'audio/mpeg', |
||||
|
'mp3' => [ |
||||
|
'audio/mpeg', |
||||
|
'audio/mpg', |
||||
|
'audio/mpeg3', |
||||
|
'audio/mp3', |
||||
|
], |
||||
|
'aif' => [ |
||||
|
'audio/x-aiff', |
||||
|
'audio/aiff', |
||||
|
], |
||||
|
'aiff' => [ |
||||
|
'audio/x-aiff', |
||||
|
'audio/aiff', |
||||
|
], |
||||
|
'aifc' => 'audio/x-aiff', |
||||
|
'ram' => 'audio/x-pn-realaudio', |
||||
|
'rm' => 'audio/x-pn-realaudio', |
||||
|
'rpm' => 'audio/x-pn-realaudio-plugin', |
||||
|
'ra' => 'audio/x-realaudio', |
||||
|
'rv' => 'video/vnd.rn-realvideo', |
||||
|
'wav' => [ |
||||
|
'audio/x-wav', |
||||
|
'audio/wave', |
||||
|
'audio/wav', |
||||
|
], |
||||
|
'bmp' => [ |
||||
|
'image/bmp', |
||||
|
'image/x-bmp', |
||||
|
'image/x-bitmap', |
||||
|
'image/x-xbitmap', |
||||
|
'image/x-win-bitmap', |
||||
|
'image/x-windows-bmp', |
||||
|
'image/ms-bmp', |
||||
|
'image/x-ms-bmp', |
||||
|
'application/bmp', |
||||
|
'application/x-bmp', |
||||
|
'application/x-win-bitmap', |
||||
|
], |
||||
|
'gif' => 'image/gif', |
||||
|
'jpg' => [ |
||||
|
'image/jpeg', |
||||
|
'image/pjpeg', |
||||
|
], |
||||
|
'jpeg' => [ |
||||
|
'image/jpeg', |
||||
|
'image/pjpeg', |
||||
|
], |
||||
|
'jpe' => [ |
||||
|
'image/jpeg', |
||||
|
'image/pjpeg', |
||||
|
], |
||||
|
'jp2' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'j2k' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'jpf' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'jpg2' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'jpx' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'jpm' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'mj2' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'mjp2' => [ |
||||
|
'image/jp2', |
||||
|
'video/mj2', |
||||
|
'image/jpx', |
||||
|
'image/jpm', |
||||
|
], |
||||
|
'png' => [ |
||||
|
'image/png', |
||||
|
'image/x-png', |
||||
|
], |
||||
|
'webp' => 'image/webp', |
||||
|
'tif' => 'image/tiff', |
||||
|
'tiff' => 'image/tiff', |
||||
|
'css' => [ |
||||
|
'text/css', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'html' => [ |
||||
|
'text/html', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'htm' => [ |
||||
|
'text/html', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'shtml' => [ |
||||
|
'text/html', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'txt' => 'text/plain', |
||||
|
'text' => 'text/plain', |
||||
|
'log' => [ |
||||
|
'text/plain', |
||||
|
'text/x-log', |
||||
|
], |
||||
|
'rtx' => 'text/richtext', |
||||
|
'rtf' => 'text/rtf', |
||||
|
'xml' => [ |
||||
|
'application/xml', |
||||
|
'text/xml', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'xsl' => [ |
||||
|
'application/xml', |
||||
|
'text/xsl', |
||||
|
'text/xml', |
||||
|
], |
||||
|
'mpeg' => 'video/mpeg', |
||||
|
'mpg' => 'video/mpeg', |
||||
|
'mpe' => 'video/mpeg', |
||||
|
'qt' => 'video/quicktime', |
||||
|
'mov' => 'video/quicktime', |
||||
|
'avi' => [ |
||||
|
'video/x-msvideo', |
||||
|
'video/msvideo', |
||||
|
'video/avi', |
||||
|
'application/x-troff-msvideo', |
||||
|
], |
||||
|
'movie' => 'video/x-sgi-movie', |
||||
|
'doc' => [ |
||||
|
'application/msword', |
||||
|
'application/vnd.ms-office', |
||||
|
], |
||||
|
'docx' => [ |
||||
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document', |
||||
|
'application/zip', |
||||
|
'application/msword', |
||||
|
'application/x-zip', |
||||
|
], |
||||
|
'dot' => [ |
||||
|
'application/msword', |
||||
|
'application/vnd.ms-office', |
||||
|
], |
||||
|
'dotx' => [ |
||||
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document', |
||||
|
'application/zip', |
||||
|
'application/msword', |
||||
|
], |
||||
|
'xlsx' => [ |
||||
|
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', |
||||
|
'application/zip', |
||||
|
'application/vnd.ms-excel', |
||||
|
'application/msword', |
||||
|
'application/x-zip', |
||||
|
], |
||||
|
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', |
||||
|
'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', |
||||
|
'word' => [ |
||||
|
'application/msword', |
||||
|
'application/octet-stream', |
||||
|
], |
||||
|
'xl' => 'application/excel', |
||||
|
'eml' => 'message/rfc822', |
||||
|
'json' => [ |
||||
|
'application/json', |
||||
|
'text/json', |
||||
|
], |
||||
|
'pem' => [ |
||||
|
'application/x-x509-user-cert', |
||||
|
'application/x-pem-file', |
||||
|
'application/octet-stream', |
||||
|
], |
||||
|
'p10' => [ |
||||
|
'application/x-pkcs10', |
||||
|
'application/pkcs10', |
||||
|
], |
||||
|
'p12' => 'application/x-pkcs12', |
||||
|
'p7a' => 'application/x-pkcs7-signature', |
||||
|
'p7c' => [ |
||||
|
'application/pkcs7-mime', |
||||
|
'application/x-pkcs7-mime', |
||||
|
], |
||||
|
'p7m' => [ |
||||
|
'application/pkcs7-mime', |
||||
|
'application/x-pkcs7-mime', |
||||
|
], |
||||
|
'p7r' => 'application/x-pkcs7-certreqresp', |
||||
|
'p7s' => 'application/pkcs7-signature', |
||||
|
'crt' => [ |
||||
|
'application/x-x509-ca-cert', |
||||
|
'application/x-x509-user-cert', |
||||
|
'application/pkix-cert', |
||||
|
], |
||||
|
'crl' => [ |
||||
|
'application/pkix-crl', |
||||
|
'application/pkcs-crl', |
||||
|
], |
||||
|
'der' => 'application/x-x509-ca-cert', |
||||
|
'kdb' => 'application/octet-stream', |
||||
|
'pgp' => 'application/pgp', |
||||
|
'gpg' => 'application/gpg-keys', |
||||
|
'sst' => 'application/octet-stream', |
||||
|
'csr' => 'application/octet-stream', |
||||
|
'rsa' => 'application/x-pkcs7', |
||||
|
'cer' => [ |
||||
|
'application/pkix-cert', |
||||
|
'application/x-x509-ca-cert', |
||||
|
], |
||||
|
'3g2' => 'video/3gpp2', |
||||
|
'3gp' => [ |
||||
|
'video/3gp', |
||||
|
'video/3gpp', |
||||
|
], |
||||
|
'mp4' => 'video/mp4', |
||||
|
'm4a' => 'audio/x-m4a', |
||||
|
'f4v' => [ |
||||
|
'video/mp4', |
||||
|
'video/x-f4v', |
||||
|
], |
||||
|
'flv' => 'video/x-flv', |
||||
|
'webm' => 'video/webm', |
||||
|
'aac' => 'audio/x-acc', |
||||
|
'm4u' => 'application/vnd.mpegurl', |
||||
|
'm3u' => 'text/plain', |
||||
|
'xspf' => 'application/xspf+xml', |
||||
|
'vlc' => 'application/videolan', |
||||
|
'wmv' => [ |
||||
|
'video/x-ms-wmv', |
||||
|
'video/x-ms-asf', |
||||
|
], |
||||
|
'au' => 'audio/x-au', |
||||
|
'ac3' => 'audio/ac3', |
||||
|
'flac' => 'audio/x-flac', |
||||
|
'ogg' => [ |
||||
|
'audio/ogg', |
||||
|
'video/ogg', |
||||
|
'application/ogg', |
||||
|
], |
||||
|
'kmz' => [ |
||||
|
'application/vnd.google-earth.kmz', |
||||
|
'application/zip', |
||||
|
'application/x-zip', |
||||
|
], |
||||
|
'kml' => [ |
||||
|
'application/vnd.google-earth.kml+xml', |
||||
|
'application/xml', |
||||
|
'text/xml', |
||||
|
], |
||||
|
'ics' => 'text/calendar', |
||||
|
'ical' => 'text/calendar', |
||||
|
'zsh' => 'text/x-scriptzsh', |
||||
|
'7zip' => [ |
||||
|
'application/x-compressed', |
||||
|
'application/x-zip-compressed', |
||||
|
'application/zip', |
||||
|
'multipart/x-zip', |
||||
|
], |
||||
|
'cdr' => [ |
||||
|
'application/cdr', |
||||
|
'application/coreldraw', |
||||
|
'application/x-cdr', |
||||
|
'application/x-coreldraw', |
||||
|
'image/cdr', |
||||
|
'image/x-cdr', |
||||
|
'zz-application/zz-winassoc-cdr', |
||||
|
], |
||||
|
'wma' => [ |
||||
|
'audio/x-ms-wma', |
||||
|
'video/x-ms-asf', |
||||
|
], |
||||
|
'jar' => [ |
||||
|
'application/java-archive', |
||||
|
'application/x-java-application', |
||||
|
'application/x-jar', |
||||
|
'application/x-compressed', |
||||
|
], |
||||
|
'svg' => [ |
||||
|
'image/svg+xml', |
||||
|
'image/svg', |
||||
|
'application/xml', |
||||
|
'text/xml', |
||||
|
], |
||||
|
'vcf' => 'text/x-vcard', |
||||
|
'srt' => [ |
||||
|
'text/srt', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'vtt' => [ |
||||
|
'text/vtt', |
||||
|
'text/plain', |
||||
|
], |
||||
|
'ico' => [ |
||||
|
'image/x-icon', |
||||
|
'image/x-ico', |
||||
|
'image/vnd.microsoft.icon', |
||||
|
], |
||||
|
'stl' => [ |
||||
|
'application/sla', |
||||
|
'application/vnd.ms-pki.stl', |
||||
|
'application/x-navistyle', |
||||
|
], |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* Attempts to determine the best mime type for the given file extension. |
||||
|
* |
||||
|
* @return string|null The mime type found, or none if unable to determine. |
||||
|
*/ |
||||
|
public static function guessTypeFromExtension(string $extension) |
||||
|
{ |
||||
|
$extension = trim(strtolower($extension), '. '); |
||||
|
|
||||
|
if (! array_key_exists($extension, static::$mimes)) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
return is_array(static::$mimes[$extension]) ? static::$mimes[$extension][0] : static::$mimes[$extension]; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Attempts to determine the best file extension for a given mime type. |
||||
|
* |
||||
|
* @param string|null $proposedExtension - default extension (in case there is more than one with the same mime type) |
||||
|
* |
||||
|
* @return string|null The extension determined, or null if unable to match. |
||||
|
*/ |
||||
|
public static function guessExtensionFromType(string $type, ?string $proposedExtension = null) |
||||
|
{ |
||||
|
$type = trim(strtolower($type), '. '); |
||||
|
|
||||
|
$proposedExtension = trim(strtolower($proposedExtension ?? '')); |
||||
|
|
||||
|
if ( |
||||
|
$proposedExtension !== '' |
||||
|
&& array_key_exists($proposedExtension, static::$mimes) |
||||
|
&& in_array($type, (array) static::$mimes[$proposedExtension], true) |
||||
|
) { |
||||
|
// The detected mime type matches with the proposed extension. |
||||
|
return $proposedExtension; |
||||
|
} |
||||
|
|
||||
|
// Reverse check the mime type list if no extension was proposed. |
||||
|
// This search is order sensitive! |
||||
|
foreach (static::$mimes as $ext => $types) { |
||||
|
if (in_array($type, (array) $types, true)) { |
||||
|
return $ext; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,84 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Modules\Modules as BaseModules; |
||||
|
|
||||
|
/** |
||||
|
* Modules Configuration. |
||||
|
* |
||||
|
* NOTE: This class is required prior to Autoloader instantiation, |
||||
|
* and does not extend BaseConfig. |
||||
|
* |
||||
|
* @immutable |
||||
|
*/ |
||||
|
class Modules extends BaseModules |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Enable Auto-Discovery? |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If true, then auto-discovery will happen across all elements listed in |
||||
|
* $aliases below. If false, no auto-discovery will happen at all, |
||||
|
* giving a slight performance boost. |
||||
|
* |
||||
|
* @var bool |
||||
|
*/ |
||||
|
public $enabled = true; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Enable Auto-Discovery Within Composer Packages? |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If true, then auto-discovery will happen across all namespaces loaded |
||||
|
* by Composer, as well as the namespaces configured locally. |
||||
|
* |
||||
|
* @var bool |
||||
|
*/ |
||||
|
public $discoverInComposer = true; |
||||
|
|
||||
|
/** |
||||
|
* The Composer package list for Auto-Discovery |
||||
|
* This setting is optional. |
||||
|
* |
||||
|
* E.g.: |
||||
|
* [ |
||||
|
* 'only' => [ |
||||
|
* // List up all packages to auto-discover |
||||
|
* 'codeigniter4/shield', |
||||
|
* ], |
||||
|
* ] |
||||
|
* or |
||||
|
* [ |
||||
|
* 'exclude' => [ |
||||
|
* // List up packages to exclude. |
||||
|
* 'pestphp/pest', |
||||
|
* ], |
||||
|
* ] |
||||
|
* |
||||
|
* @var array{only?: list<string>, exclude?: list<string>} |
||||
|
*/ |
||||
|
public $composerPackages = []; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Auto-Discovery Rules |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Aliases list of all discovery classes that will be active and used during |
||||
|
* the current application request. |
||||
|
* |
||||
|
* If it is not listed, only the base application elements will be used. |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public $aliases = [ |
||||
|
'events', |
||||
|
'filters', |
||||
|
'registrars', |
||||
|
'routes', |
||||
|
'services', |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class Pager extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Templates |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Pagination links are rendered out using views to configure their |
||||
|
* appearance. This array contains aliases and the view names to |
||||
|
* use when rendering the links. |
||||
|
* |
||||
|
* Within each view, the Pager object will be available as $pager, |
||||
|
* and the desired group as $pagerGroup; |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $templates = [ |
||||
|
'default_full' => 'CodeIgniter\Pager\Views\default_full', |
||||
|
'default_simple' => 'CodeIgniter\Pager\Views\default_simple', |
||||
|
'default_head' => 'CodeIgniter\Pager\Views\default_head', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Items Per Page |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The default number of results shown in a single page. |
||||
|
*/ |
||||
|
public int $perPage = 20; |
||||
|
} |
||||
@ -0,0 +1,75 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
/** |
||||
|
* Paths |
||||
|
* |
||||
|
* Holds the paths that are used by the system to |
||||
|
* locate the main directories, app, system, etc. |
||||
|
* |
||||
|
* Modifying these allows you to restructure your application, |
||||
|
* share a system folder between multiple applications, and more. |
||||
|
* |
||||
|
* All paths are relative to the project's root folder. |
||||
|
*/ |
||||
|
class Paths |
||||
|
{ |
||||
|
/** |
||||
|
* --------------------------------------------------------------- |
||||
|
* SYSTEM FOLDER NAME |
||||
|
* --------------------------------------------------------------- |
||||
|
* |
||||
|
* This must contain the name of your "system" folder. Include |
||||
|
* the path if the folder is not in the same directory as this file. |
||||
|
*/ |
||||
|
public string $systemDirectory = __DIR__ . '/../../vendor/codeigniter4/framework/system'; |
||||
|
|
||||
|
/** |
||||
|
* --------------------------------------------------------------- |
||||
|
* APPLICATION FOLDER NAME |
||||
|
* --------------------------------------------------------------- |
||||
|
* |
||||
|
* If you want this front controller to use a different "app" |
||||
|
* folder than the default one you can set its name here. The folder |
||||
|
* can also be renamed or relocated anywhere on your server. If |
||||
|
* you do, use a full server path. |
||||
|
* |
||||
|
* @see http://codeigniter.com/user_guide/general/managing_apps.html |
||||
|
*/ |
||||
|
public string $appDirectory = __DIR__ . '/..'; |
||||
|
|
||||
|
/** |
||||
|
* --------------------------------------------------------------- |
||||
|
* WRITABLE DIRECTORY NAME |
||||
|
* --------------------------------------------------------------- |
||||
|
* |
||||
|
* This variable must contain the name of your "writable" directory. |
||||
|
* The writable directory allows you to group all directories that |
||||
|
* need write permission to a single place that can be tucked away |
||||
|
* for maximum security, keeping it out of the app and/or |
||||
|
* system directories. |
||||
|
*/ |
||||
|
public string $writableDirectory = __DIR__ . '/../../writable'; |
||||
|
|
||||
|
/** |
||||
|
* --------------------------------------------------------------- |
||||
|
* TESTS DIRECTORY NAME |
||||
|
* --------------------------------------------------------------- |
||||
|
* |
||||
|
* This variable must contain the name of your "tests" directory. |
||||
|
*/ |
||||
|
public string $testsDirectory = __DIR__ . '/../../tests'; |
||||
|
|
||||
|
/** |
||||
|
* --------------------------------------------------------------- |
||||
|
* VIEW DIRECTORY NAME |
||||
|
* --------------------------------------------------------------- |
||||
|
* |
||||
|
* This variable must contain the name of the directory that |
||||
|
* contains the view files used by your application. By |
||||
|
* default this is in `app/Views`. This value |
||||
|
* is used when no value is provided to `Services::renderer()`. |
||||
|
*/ |
||||
|
public string $viewDirectory = __DIR__ . '/../Views'; |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\Publisher as BasePublisher; |
||||
|
|
||||
|
/** |
||||
|
* Publisher Configuration |
||||
|
* |
||||
|
* Defines basic security restrictions for the Publisher class |
||||
|
* to prevent abuse by injecting malicious files into a project. |
||||
|
*/ |
||||
|
class Publisher extends BasePublisher |
||||
|
{ |
||||
|
/** |
||||
|
* A list of allowed destinations with a (pseudo-)regex |
||||
|
* of allowed files for each destination. |
||||
|
* Attempts to publish to directories not in this list will |
||||
|
* result in a PublisherException. Files that do no fit the |
||||
|
* pattern will cause copy/merge to fail. |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public $restrictions = [ |
||||
|
ROOTPATH => '*', |
||||
|
FCPATH => '#\.(s?css|js|map|html?|xml|json|webmanifest|ttf|eot|woff2?|gif|jpe?g|tiff?|png|webp|bmp|ico|svg)$#i', |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,283 @@ |
|||||
|
<?php |
||||
|
|
||||
|
use App\Controllers\Auth; |
||||
|
use App\Controllers\Dashboard; |
||||
|
use App\Controllers\UserController; |
||||
|
use App\Controllers\BrandController; |
||||
|
use App\Controllers\GroupController; |
||||
|
use App\Controllers\OrderController; |
||||
|
use App\Controllers\StoreController; |
||||
|
use App\Controllers\QrCodeController; |
||||
|
use App\Controllers\ReportController; |
||||
|
use App\Controllers\AttribuController; |
||||
|
use App\Controllers\AvanceController; |
||||
|
use App\Controllers\CompanyController; |
||||
|
use App\Controllers\ProductCOntroller; |
||||
|
use App\Controllers\CategoryController; |
||||
|
use App\Controllers\MecanicienController; |
||||
|
use App\Controllers\NotificationController; |
||||
|
use App\Controllers\StatistiqueController; |
||||
|
use App\Controllers\RecouvrementController; |
||||
|
use App\Controllers\ReservationController; |
||||
|
use App\Controllers\SecuriteController; |
||||
|
use App\Controllers\SortieCaisseController; |
||||
|
use App\Controllers\RemiseController; |
||||
|
use App\Controllers\PerformanceController; |
||||
|
/** |
||||
|
* auth route |
||||
|
* the option array filter make a filter, |
||||
|
* if the user are already loged in, redirect to dashboard |
||||
|
*/ |
||||
|
$routes->get('/login', [Auth::class, 'login'], ['filter' => 'loggedIn']); |
||||
|
$routes->post('/login', [Auth::class, 'loginPost'], ['filter' => 'loggedIn']); |
||||
|
|
||||
|
/** |
||||
|
* route to all the rest of web app |
||||
|
* the filter do if user not connectet try to acces this route |
||||
|
* redirect imediatly iny login |
||||
|
*/ |
||||
|
$routes->group('', ['filter' => 'auth'], function ($routes) { |
||||
|
|
||||
|
/** |
||||
|
* dashboard route |
||||
|
*/ |
||||
|
$routes->get('/', [Dashboard::class, 'index']); |
||||
|
$routes->get('/ventes', [Auth::class, 'ventes']); |
||||
|
$routes->get('/ventes/(:num)', [Auth::class, 'addImage']); |
||||
|
$routes->get('/ventes/fetchProductVente/(:num)', [Auth::class, 'fetchProductVente']); |
||||
|
$routes->get('/ventes/show/(:num)', [Auth::class, 'getSingle']); |
||||
|
$routes->post('/ventes/moreimage/(:num)', [Auth::class, 'uploadImagePub']); |
||||
|
$routes->post('/ventes/moreimage/supp/(:num)', [Auth::class, 'delete']); |
||||
|
|
||||
|
/** |
||||
|
* route to logout |
||||
|
*/ |
||||
|
$routes->get('/logout', [Auth::class, 'logout']); |
||||
|
|
||||
|
/** |
||||
|
* route for the users |
||||
|
*/ |
||||
|
$routes->group('/users', function ($routes) { |
||||
|
$routes->get('/', [UserController::class, 'index']); |
||||
|
$routes->get('create', [UserController::class, 'create']); |
||||
|
$routes->post('create', [UserController::class, 'create']); |
||||
|
$routes->get('edit/(:num)', [UserController::class, 'edit']); |
||||
|
$routes->post('edit/(:num)', [UserController::class, 'edit']); |
||||
|
$routes->get('delete/(:num)', [UserController::class, 'delete']); |
||||
|
$routes->post('delete/(:num)', [UserController::class, 'delete']); |
||||
|
$routes->get('profile', [UserController::class, 'profile']); |
||||
|
$routes->get('fetchProfile/(:num)', [UserController::class, 'fetchProfile']); |
||||
|
$routes->get('setting', [UserController::class, 'setting']); |
||||
|
$routes->post('setting', [UserController::class, 'setting']); |
||||
|
$routes->post('assign_store', [UserController::class, 'assign_store']); |
||||
|
$routes->get('login/(:num)', [UserController::class, 'loginToOtherAccount']); |
||||
|
$routes->get('fetchUserData', [UserController::class,'fetchUserData']); |
||||
|
$routes->post('fetchUserForAssign', [UserController::class,'fetchUserForAssign']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the groups |
||||
|
*/ |
||||
|
$routes->group('/groups', function ($routes) { |
||||
|
$routes->get('/', [GroupController::class, 'index']); |
||||
|
$routes->get('create', [GroupController::class, 'create']); |
||||
|
$routes->post('create', [GroupController::class, 'create']); |
||||
|
$routes->get('edit/(:num)', [GroupController::class, 'edit']); |
||||
|
$routes->post('edit/(:num)', [GroupController::class, 'edit']); |
||||
|
$routes->get('delete/(:num)', [GroupController::class, 'delete']); |
||||
|
$routes->post('delete/(:num)', [GroupController::class, 'delete']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the brands |
||||
|
*/ |
||||
|
$routes->group('/brands', function ($routes) { |
||||
|
$routes->get('/', [BrandController::class, 'index']); |
||||
|
$routes->get('fetchBrandData', [BrandController::class, 'fetchBrandData']); |
||||
|
$routes->post('create', [BrandController::class, 'create']); |
||||
|
$routes->post('fetchBrandDataById/(:num)', [BrandController::class, 'fetchBrandDataById']); |
||||
|
$routes->post('update/(:num)', [BrandController::class, 'update']); |
||||
|
$routes->post('remove', [BrandController::class, 'remove']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the category |
||||
|
*/ |
||||
|
$routes->group('/category', function ($routes) { |
||||
|
$routes->get('/', [CategoryController::class, 'index']); |
||||
|
$routes->get('fetchCategoryData', [CategoryController::class, 'fetchCategoryData']); |
||||
|
$routes->post('create', [CategoryController::class, 'create']); |
||||
|
$routes->post('fetchCategoryDataById/(:num)', [CategoryController::class, 'fetchCategoryDataById']); |
||||
|
$routes->post('update/(:num)', [CategoryController::class, 'update']); |
||||
|
$routes->post('remove', [CategoryController::class, 'remove']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the stores |
||||
|
*/ |
||||
|
$routes->group('/stores', function ($routes) { |
||||
|
$routes->get('/', [StoreController::class, 'index']); |
||||
|
$routes->get('fetchStoresData', [StoreController::class, 'fetchStoresData']); |
||||
|
$routes->post('fetchStoresDataById/(:num)', [StoreController::class, 'fetchStoresDataById']); |
||||
|
$routes->post('create', [StoreController::class, 'create']); |
||||
|
$routes->post('update/(:num)', [StoreController::class, 'update']); |
||||
|
$routes->post('remove/', [StoreController::class, 'remove']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the Securite |
||||
|
*/ |
||||
|
$routes->group('/validateSecurite', function ($routes) { |
||||
|
$routes->get('/', [SecuriteController::class, 'index']); |
||||
|
$routes->get('fetchSecuriteData', [SecuriteController::class, 'fetchSecuriteData']); |
||||
|
$routes->post('fetchSecuriteDataById/(:num)', [SecuriteController::class, 'fetchSecuriteDataById']); |
||||
|
$routes->post('update/(:num)', [SecuriteController::class, 'update']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the attributes |
||||
|
*/ |
||||
|
$routes->group('/attributes', function ($routes) { |
||||
|
$routes->get('/', [AttribuController::class, 'index']); |
||||
|
$routes->get('values/(:num)', [AttribuController::class, 'getValue']); |
||||
|
$routes->get('fetchAttributeData', [AttribuController::class, 'fetchCategoryData']); |
||||
|
$routes->get('fetchAttributeValueData/(:num)', [AttribuController::class, 'fetchCategoryValueData']); |
||||
|
$routes->post('fetchAttributeDataById/(:num)', [AttribuController::class, 'fetchAttributeDataById']); |
||||
|
$routes->post('fetchAttributeValueById/(:num)', [AttribuController::class, 'fetchAttributeValueById']); |
||||
|
$routes->post('create', [AttribuController::class, 'create']); |
||||
|
$routes->post('update/(:num)', [AttribuController::class, 'update']); |
||||
|
$routes->post('remove', [AttribuController::class, 'remove']); |
||||
|
$routes->post('createValue', [AttribuController::class, 'createValue']); |
||||
|
$routes->post('updateValue/(:num)', [AttribuController::class, 'updateValue']); |
||||
|
$routes->post('removeValue', [AttribuController::class, 'removeValue']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the products |
||||
|
*/ |
||||
|
$routes->group('/products', function ($routes) { |
||||
|
$routes->get('/', [ProductCOntroller::class, 'index']); |
||||
|
$routes->get('fetchProductData', [ProductCOntroller::class, 'fetchProductData']); |
||||
|
$routes->get('create', [ProductCOntroller::class, 'create']); |
||||
|
$routes->post('create', [ProductCOntroller::class, 'create']); |
||||
|
$routes->get('update/(:num)', [ProductCOntroller::class, 'update']); |
||||
|
$routes->post('update/(:num)', [ProductCOntroller::class, 'update']); |
||||
|
$routes->post('remove', [ProductCOntroller::class, 'remove']); |
||||
|
// $routes->get('generateqrcode/(:num)', [QrCodeController::class, 'generate']); |
||||
|
$routes->post('assign_store', [ProductCOntroller::class, 'assign_store']); |
||||
|
$routes->post('createByExcel', [ProductCOntroller::class, 'createByExcel']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the orders |
||||
|
*/ |
||||
|
$routes->group('/orders', function ($routes) { |
||||
|
$routes->get('/', [OrderController::class, 'index']); |
||||
|
$routes->get('fetchOrdersData', [OrderController::class, 'fetchOrdersData']); |
||||
|
$routes->get('create', [OrderController::class, 'create']); |
||||
|
$routes->post('create', [OrderController::class, 'create']); |
||||
|
$routes->post('getProductValueById', [OrderController::class, 'getProductValueById']); |
||||
|
$routes->post('getTableProductRow', [OrderController::class, 'getTableProductRow']); |
||||
|
$routes->get('update/(:num)', [OrderController::class, 'update']); |
||||
|
$routes->post('update/(:num)', [OrderController::class, 'update']); |
||||
|
$routes->get('printDiv/(:num)', [OrderController::class, 'print5']); |
||||
|
$routes->get('printDivBL/(:num)', [OrderController::class, 'print7']); |
||||
|
$routes->get('printDivBLF/(:num)', [OrderController::class, 'print31']); |
||||
|
$routes->post('remove', [OrderController::class, 'remove']); |
||||
|
$routes->get('lookOrder/(:num)', [OrderController::class, 'lookOrder']); |
||||
|
$routes->get('createFromEspace/(:num)', [OrderController::class, 'createById']); |
||||
|
$routes->get('resrevation', [ReservationController::class, 'index']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the reports |
||||
|
*/ |
||||
|
$routes->group('/reports', function ($routes) { |
||||
|
$routes->get('/', [ReportController::class, 'index']); |
||||
|
$routes->post('/', [ReportController::class, 'index']); |
||||
|
$routes->get('detail/stock', [ReportController::class, 'stockDetail']); |
||||
|
$routes->get('detail/fetctData/(:num)', [ReportController::class, 'fetchProductSodled']); |
||||
|
$routes->get('detail/fetctDataStock/(:num)', [ReportController::class, 'fetchProductStock']); |
||||
|
$routes->get('detail/fetctDataStock2/(:num)', [ReportController::class, 'fetchProductStock2']); |
||||
|
$routes->get('detail/performance', [ReportController::class, 'performancedetail']); |
||||
|
$routes->get('detail/fetchPerformances', [ReportController::class, 'fetchPerformances']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the company |
||||
|
*/ |
||||
|
$routes->group('/company', function ($routes) { |
||||
|
$routes->get('/', [CompanyController::class, 'index']); |
||||
|
$routes->post('/', [CompanyController::class, 'index']); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* route for the users statistic |
||||
|
*/ |
||||
|
$routes->group('/statistic', function ($routes) { |
||||
|
$routes->get('/', [StatistiqueController::class, 'index']); |
||||
|
$routes->get('(:num)', [StatistiqueController::class, 'singleStat']); |
||||
|
}); |
||||
|
// routes for recouvrement |
||||
|
$routes->group('/recouvrement', function ($routes) { |
||||
|
$routes->get('/', [RecouvrementController::class, 'index']); |
||||
|
$routes->get('fetchRecouvrementData', [RecouvrementController::class, 'fetchRecouvrementData']); |
||||
|
$routes->get('fetchTotalRecouvrementData', [RecouvrementController::class, 'fetchTotalRecouvrementData']); |
||||
|
$routes->get('fetchTotalData', [RecouvrementController::class, 'fetchTotal']); |
||||
|
$routes->post('fetchRecouvrementSingle/(:num)', [RecouvrementController::class, 'fetchRecouvrementSingle']); |
||||
|
$routes->post('create', [RecouvrementController::class, 'createRecouvrement']); |
||||
|
$routes->post('delete', [RecouvrementController::class, 'removeRecouvrement']); |
||||
|
$routes->post('update/(:num)', [RecouvrementController::class, 'updateRecouvrement']); |
||||
|
// $routes->put('update/(:num)', 'RecouvrementController::updateRecouvrement/$1'); |
||||
|
}); |
||||
|
/** |
||||
|
* route for the users mecanicien |
||||
|
*/ |
||||
|
$routes->group('/mecanicien', function ($routes) { |
||||
|
$routes->get('/', [MecanicienController::class, 'index']); |
||||
|
$routes->get('fetchMecanicien', [MecanicienController::class, 'fetchMecanicien']); |
||||
|
// $routes->get('fetchMecanicien_1/(:num)', [MecanicienController::class, 'fetchMecanicien_1']); |
||||
|
$routes->post('fetchmecanicienSingle/(:num)', [MecanicienController::class, 'fetchmecanicienSingle']); |
||||
|
$routes->post('create', [MecanicienController::class, 'create']); |
||||
|
$routes->post('delete', [MecanicienController::class, 'delete']); |
||||
|
$routes->post('update/(:num)', [MecanicienController::class, 'update']); |
||||
|
$routes->get('fetchMecanicienPerformances', [MecanicienController::class, 'fetchMecanicienPerformances']); |
||||
|
// $routes->put('update/(:num)', 'MecanicienController::update/$1'); |
||||
|
}); |
||||
|
|
||||
|
$routes->group('/notifications', function ($routes) { |
||||
|
$routes->get('/', [NotificationController::class, 'getNotification']); |
||||
|
$routes->post('markAsRead/(:num)', [NotificationController::class, 'markAsRead']); |
||||
|
}); |
||||
|
// routes for sortie caisse |
||||
|
$routes->group('/sortieCaisse', function ($routes) { |
||||
|
$routes->get('/', [SortieCaisseController::class, 'index']); |
||||
|
$routes->get('fetchSortieCaisseData', [SortieCaisseController::class, 'fetchSortieCaisseData']); |
||||
|
$routes->get('fetchSortieCaisseData1', [SortieCaisseController::class, 'fetchSortieCaisseData1']); |
||||
|
$routes->post('fetchSortieCaisseSingle/(:num)', [SortieCaisseController::class, 'fetchSortieCaisseSingle']); |
||||
|
$routes->post('createSortieCaisse', [SortieCaisseController::class, 'createSortieCaisse']); |
||||
|
// $routes->post('delete', [RecouvrementController::class, 'removeRecouvrement']); |
||||
|
$routes->post('updateSortieCaisse/(:num)', [SortieCaisseController::class, 'updateSortieCaisse']); |
||||
|
$routes->post('validateSortieCaisse/(:num)', [SortieCaisseController::class, 'validateSortieCaisse']); |
||||
|
}); |
||||
|
|
||||
|
// remise |
||||
|
$routes->group('/remise', function ($routes) { |
||||
|
$routes->get('/', [RemiseController::class, 'index']); |
||||
|
$routes->get('fetchRemiseData', [RemiseController::class, 'fetchRemiseData']); |
||||
|
// $routes->post('delete', [RecouvrementController::class, 'removeRecouvrement']); |
||||
|
$routes->post('updateRemise/(:num)', [RemiseController::class, 'updateRemise']); |
||||
|
}); |
||||
|
|
||||
|
// avance |
||||
|
$routes->group('/avances', function ($routes) { |
||||
|
$routes->get('/', [AvanceController::class, 'index']); |
||||
|
$routes->get('fetchAvanceData', [AvanceController::class, 'fetchAvanceData']); |
||||
|
$routes->get('fetchAvanceBecameOrder', [AvanceController::class, 'fetchAvanceBecameOrder']); |
||||
|
$routes->get('fetchExpiredAvance', [AvanceController::class, 'fetcheExpiredAvance']); |
||||
|
$routes->get('fetchSingleAvance/(:num)', [AvanceController::class, 'fetchSingleAvance']); |
||||
|
$routes->post('createAvance', [AvanceController::class, 'createAvance']); |
||||
|
$routes->post('deleteAvance', [AvanceController::class, 'removeAvance']); |
||||
|
$routes->post('updateAvance/(:num)', [AvanceController::class, 'updateAvance']); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,114 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* This file is part of CodeIgniter 4 framework. |
||||
|
* |
||||
|
* (c) CodeIgniter Foundation <Conseil@codeigniter.com> |
||||
|
* |
||||
|
* For the full copyright and license information, please view |
||||
|
* the LICENSE file that was distributed with this source code. |
||||
|
*/ |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\Routing as BaseRouting; |
||||
|
|
||||
|
/** |
||||
|
* Routing configuration |
||||
|
*/ |
||||
|
class Routing extends BaseRouting |
||||
|
{ |
||||
|
/** |
||||
|
* An array of files that contain route definitions. |
||||
|
* Route files are read in order, with the first match |
||||
|
* found taking precedence. |
||||
|
* |
||||
|
* Default: APPPATH . 'Config/Routes.php' |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $routeFiles = [ |
||||
|
APPPATH . 'Config/Routes.php', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* The default namespace to use for Controllers when no other |
||||
|
* namespace has been specified. |
||||
|
* |
||||
|
* Default: 'App\Controllers' |
||||
|
*/ |
||||
|
public string $defaultNamespace = 'App\Controllers'; |
||||
|
|
||||
|
/** |
||||
|
* The default controller to use when no other controller has been |
||||
|
* specified. |
||||
|
* |
||||
|
* Default: 'Home' |
||||
|
*/ |
||||
|
public string $defaultController = 'Home'; |
||||
|
|
||||
|
/** |
||||
|
* The default method to call on the controller when no other |
||||
|
* method has been set in the route. |
||||
|
* |
||||
|
* Default: 'index' |
||||
|
*/ |
||||
|
public string $defaultMethod = 'index'; |
||||
|
|
||||
|
/** |
||||
|
* Whether to translate dashes in URIs to underscores. |
||||
|
* Primarily useful when using the auto-routing. |
||||
|
* |
||||
|
* Default: false |
||||
|
*/ |
||||
|
public bool $translateURIDashes = false; |
||||
|
|
||||
|
/** |
||||
|
* Sets the class/method that should be called if routing doesn't |
||||
|
* find a match. It can be the controller/method name like: Users::index |
||||
|
* |
||||
|
* This setting is passed to the Router class and handled there. |
||||
|
* |
||||
|
* If you want to use a closure, you will have to set it in the |
||||
|
* routes file by calling: |
||||
|
* |
||||
|
* $routes->set404Override(function() { |
||||
|
* // Do something here |
||||
|
* }); |
||||
|
* |
||||
|
* Example: |
||||
|
* public $override404 = 'App\Errors::show404'; |
||||
|
*/ |
||||
|
public ?string $override404 = null; |
||||
|
|
||||
|
/** |
||||
|
* If TRUE, the system will attempt to match the URI against |
||||
|
* Controllers by matching each segment against folders/files |
||||
|
* in APPPATH/Controllers, when a match wasn't found against |
||||
|
* defined routes. |
||||
|
* |
||||
|
* If FALSE, will stop searching and do NO automatic routing. |
||||
|
*/ |
||||
|
public bool $autoRoute = false; |
||||
|
|
||||
|
/** |
||||
|
* If TRUE, will enable the use of the 'prioritize' option |
||||
|
* when defining routes. |
||||
|
* |
||||
|
* Default: false |
||||
|
*/ |
||||
|
public bool $prioritize = false; |
||||
|
|
||||
|
/** |
||||
|
* Map of URI segments and namespaces. For Auto Routing (Improved). |
||||
|
* |
||||
|
* The key is the first URI segment. The value is the controller namespace. |
||||
|
* E.g., |
||||
|
* [ |
||||
|
* 'blog' => 'Acme\Blog\Controllers', |
||||
|
* ] |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $moduleRoutes = []; |
||||
|
} |
||||
@ -0,0 +1,101 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
class Security extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Protection Method |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Protection Method for Cross Site Request Forgery protection. |
||||
|
* |
||||
|
* @var string 'cookie' or 'session' |
||||
|
*/ |
||||
|
public string $csrfProtection = 'cookie'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Token Randomization |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Randomize the CSRF Token for added security. |
||||
|
*/ |
||||
|
public bool $tokenRandomize = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Token Name |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Token name for Cross Site Request Forgery protection. |
||||
|
*/ |
||||
|
public string $tokenName = 'csrf_test_name'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Header Name |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Header name for Cross Site Request Forgery protection. |
||||
|
*/ |
||||
|
public string $headerName = 'X-CSRF-TOKEN'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Cookie Name |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Cookie name for Cross Site Request Forgery protection. |
||||
|
*/ |
||||
|
public string $cookieName = 'csrf_cookie_name'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Expires |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Expiration time for Cross Site Request Forgery protection cookie. |
||||
|
* |
||||
|
* Defaults to two hours (in seconds). |
||||
|
*/ |
||||
|
public int $expires = 7200; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Regenerate |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Regenerate CSRF Token on every submission. |
||||
|
*/ |
||||
|
public bool $regenerate = true; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF Redirect |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Redirect to previous page with error on failure. |
||||
|
*/ |
||||
|
public bool $redirect = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* CSRF SameSite |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Setting for CSRF SameSite cookie token. |
||||
|
* |
||||
|
* Allowed values are: None - Lax - Strict - ''. |
||||
|
* |
||||
|
* Defaults to `Lax` as recommended in this link: |
||||
|
* |
||||
|
* @see https://portswigger.net/web-security/csrf/samesite-cookies |
||||
|
* |
||||
|
* @deprecated `Config\Cookie` $samesite property is used. |
||||
|
*/ |
||||
|
public string $samesite = 'Lax'; |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseService; |
||||
|
|
||||
|
/** |
||||
|
* Services Configuration file. |
||||
|
* |
||||
|
* Services are simply other classes/libraries that the system uses |
||||
|
* to do its job. This is used by CodeIgniter to allow the core of the |
||||
|
* framework to be swapped out easily without affecting the usage within |
||||
|
* the rest of your application. |
||||
|
* |
||||
|
* This file holds any application-specific services, or service overrides |
||||
|
* that you might need. An example has been included with the general |
||||
|
* method format you should use for your service methods. For more examples, |
||||
|
* see the core Services file at system/Config/Services.php. |
||||
|
*/ |
||||
|
class Services extends BaseService |
||||
|
{ |
||||
|
/* |
||||
|
* public static function example($getShared = true) |
||||
|
* { |
||||
|
* if ($getShared) { |
||||
|
* return static::getSharedInstance('example'); |
||||
|
* } |
||||
|
* |
||||
|
* return new \CodeIgniter\Example(); |
||||
|
* } |
||||
|
*/ |
||||
|
} |
||||
@ -0,0 +1,102 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Session\Handlers\BaseHandler; |
||||
|
use CodeIgniter\Session\Handlers\FileHandler; |
||||
|
|
||||
|
class Session extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Driver |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The session storage driver to use: |
||||
|
* - `CodeIgniter\Session\Handlers\FileHandler` |
||||
|
* - `CodeIgniter\Session\Handlers\DatabaseHandler` |
||||
|
* - `CodeIgniter\Session\Handlers\MemcachedHandler` |
||||
|
* - `CodeIgniter\Session\Handlers\RedisHandler` |
||||
|
* |
||||
|
* @var class-string<BaseHandler> |
||||
|
*/ |
||||
|
public string $driver = FileHandler::class; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Cookie Name |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The session cookie name, must contain only [0-9a-z_-] characters |
||||
|
*/ |
||||
|
public string $cookieName = 'ci_session'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Expiration |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The number of SECONDS you want the session to last. |
||||
|
* Setting to 0 (zero) means expire when the browser is closed. |
||||
|
*/ |
||||
|
public int $expiration = 7200; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Save Path |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The location to save sessions to and is driver dependent. |
||||
|
* |
||||
|
* For the 'files' driver, it's a path to a writable directory. |
||||
|
* WARNING: Only absolute paths are supported! |
||||
|
* |
||||
|
* For the 'database' driver, it's a table name. |
||||
|
* Please read up the manual for the format with other session drivers. |
||||
|
* |
||||
|
* IMPORTANT: You are REQUIRED to set a valid save path! |
||||
|
*/ |
||||
|
public string $savePath = WRITEPATH . 'session'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Match IP |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Whether to match the user's IP address when reading the session data. |
||||
|
* |
||||
|
* WARNING: If you're using the database driver, don't forget to update |
||||
|
* your session table's PRIMARY KEY when changing this setting. |
||||
|
*/ |
||||
|
public bool $matchIP = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Time to Update |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* How many seconds between CI regenerating the session ID. |
||||
|
*/ |
||||
|
public int $timeToUpdate = 300; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Regenerate Destroy |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Whether to destroy session data associated with the old session ID |
||||
|
* when auto-regenerating the session ID. When set to FALSE, the data |
||||
|
* will be later deleted by the garbage collector. |
||||
|
*/ |
||||
|
public bool $regenerateDestroy = false; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Session Database Group |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* DB Group for the database session. |
||||
|
*/ |
||||
|
public ?string $DBGroup = null; |
||||
|
} |
||||
@ -0,0 +1,126 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Debug\Toolbar\Collectors\Database; |
||||
|
use CodeIgniter\Debug\Toolbar\Collectors\Events; |
||||
|
use CodeIgniter\Debug\Toolbar\Collectors\Files; |
||||
|
use CodeIgniter\Debug\Toolbar\Collectors\Logs; |
||||
|
use CodeIgniter\Debug\Toolbar\Collectors\Routes; |
||||
|
use CodeIgniter\Debug\Toolbar\Collectors\Timers; |
||||
|
use CodeIgniter\Debug\Toolbar\Collectors\Views; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Debug Toolbar |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The Debug Toolbar provides a way to see information about the performance |
||||
|
* and state of your application during that page display. By default it will |
||||
|
* NOT be displayed under production environments, and will only display if |
||||
|
* `CI_DEBUG` is true, since if it's not, there's not much to display anyway. |
||||
|
*/ |
||||
|
class Toolbar extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Toolbar Collectors |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* List of toolbar collectors that will be called when Debug Toolbar |
||||
|
* fires up and collects data from. |
||||
|
* |
||||
|
* @var list<class-string> |
||||
|
*/ |
||||
|
public array $collectors = [ |
||||
|
Timers::class, |
||||
|
Database::class, |
||||
|
Logs::class, |
||||
|
Views::class, |
||||
|
// \CodeIgniter\Debug\Toolbar\Collectors\Cache::class, |
||||
|
Files::class, |
||||
|
Routes::class, |
||||
|
Events::class, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Collect Var Data |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If set to false var data from the views will not be collected. Useful to |
||||
|
* avoid high memory usage when there are lots of data passed to the view. |
||||
|
*/ |
||||
|
public bool $collectVarData = true; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Max History |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* `$maxHistory` sets a limit on the number of past requests that are stored, |
||||
|
* helping to conserve file space used to store them. You can set it to |
||||
|
* 0 (zero) to not have any history stored, or -1 for unlimited history. |
||||
|
*/ |
||||
|
public int $maxHistory = 20; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Toolbar Views Path |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* The full path to the the views that are used by the toolbar. |
||||
|
* This MUST have a trailing slash. |
||||
|
*/ |
||||
|
public string $viewsPath = SYSTEMPATH . 'Debug/Toolbar/Views/'; |
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Max Queries |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* If the Database Collector is enabled, it will log every query that the |
||||
|
* the system generates so they can be displayed on the toolbar's timeline |
||||
|
* and in the query log. This can lead to memory issues in some instances |
||||
|
* with hundreds of queries. |
||||
|
* |
||||
|
* `$maxQueries` defines the maximum amount of queries that will be stored. |
||||
|
*/ |
||||
|
public int $maxQueries = 100; |
||||
|
|
||||
|
public $enabled = true; // Ensure this is set to true |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Watched Directories |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Contains an array of directories that will be watched for changes and |
||||
|
* used to determine if the hot-reload feature should reload the page or not. |
||||
|
* We restrict the values to keep performance as high as possible. |
||||
|
* |
||||
|
* NOTE: The ROOTPATH will be prepended to all values. |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $watchedDirectories = [ |
||||
|
'app', |
||||
|
]; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* Watched File Extensions |
||||
|
* -------------------------------------------------------------------------- |
||||
|
* |
||||
|
* Contains an array of file extensions that will be watched for changes and |
||||
|
* used to determine if the hot-reload feature should reload the page or not. |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $watchedExtensions = [ |
||||
|
'php', 'css', 'js', 'html', 'svg', 'json', 'env', |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,252 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* User Agents |
||||
|
* ------------------------------------------------------------------- |
||||
|
* |
||||
|
* This file contains four arrays of user agent data. It is used by the |
||||
|
* User Agent Class to help identify browser, platform, robot, and |
||||
|
* mobile device data. The array keys are used to identify the device |
||||
|
* and the array values are used to set the actual name of the item. |
||||
|
*/ |
||||
|
class UserAgents extends BaseConfig |
||||
|
{ |
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* OS Platforms |
||||
|
* ------------------------------------------------------------------- |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $platforms = [ |
||||
|
'windows nt 10.0' => 'Windows 10', |
||||
|
'windows nt 6.3' => 'Windows 8.1', |
||||
|
'windows nt 6.2' => 'Windows 8', |
||||
|
'windows nt 6.1' => 'Windows 7', |
||||
|
'windows nt 6.0' => 'Windows Vista', |
||||
|
'windows nt 5.2' => 'Windows 2003', |
||||
|
'windows nt 5.1' => 'Windows XP', |
||||
|
'windows nt 5.0' => 'Windows 2000', |
||||
|
'windows nt 4.0' => 'Windows NT 4.0', |
||||
|
'winnt4.0' => 'Windows NT 4.0', |
||||
|
'winnt 4.0' => 'Windows NT', |
||||
|
'winnt' => 'Windows NT', |
||||
|
'windows 98' => 'Windows 98', |
||||
|
'win98' => 'Windows 98', |
||||
|
'windows 95' => 'Windows 95', |
||||
|
'win95' => 'Windows 95', |
||||
|
'windows phone' => 'Windows Phone', |
||||
|
'windows' => 'Unknown Windows OS', |
||||
|
'android' => 'Android', |
||||
|
'blackberry' => 'BlackBerry', |
||||
|
'iphone' => 'iOS', |
||||
|
'ipad' => 'iOS', |
||||
|
'ipod' => 'iOS', |
||||
|
'os x' => 'Mac OS X', |
||||
|
'ppc mac' => 'Power PC Mac', |
||||
|
'freebsd' => 'FreeBSD', |
||||
|
'ppc' => 'Macintosh', |
||||
|
'linux' => 'Linux', |
||||
|
'debian' => 'Debian', |
||||
|
'sunos' => 'Sun Solaris', |
||||
|
'beos' => 'BeOS', |
||||
|
'apachebench' => 'ApacheBench', |
||||
|
'aix' => 'AIX', |
||||
|
'irix' => 'Irix', |
||||
|
'osf' => 'DEC OSF', |
||||
|
'hp-ux' => 'HP-UX', |
||||
|
'netbsd' => 'NetBSD', |
||||
|
'bsdi' => 'BSDi', |
||||
|
'openbsd' => 'OpenBSD', |
||||
|
'gnu' => 'GNU/Linux', |
||||
|
'unix' => 'Unknown Unix OS', |
||||
|
'symbian' => 'Symbian OS', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Browsers |
||||
|
* ------------------------------------------------------------------- |
||||
|
* |
||||
|
* The order of this array should NOT be changed. Many browsers return |
||||
|
* multiple browser types so we want to identify the subtype first. |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $browsers = [ |
||||
|
'OPR' => 'Opera', |
||||
|
'Flock' => 'Flock', |
||||
|
'Edge' => 'Spartan', |
||||
|
'Edg' => 'Edge', |
||||
|
'Chrome' => 'Chrome', |
||||
|
// Opera 10+ always reports Opera/9.80 and appends Version/<real version> to the user agent string |
||||
|
'Opera.*?Version' => 'Opera', |
||||
|
'Opera' => 'Opera', |
||||
|
'MSIE' => 'Internet Explorer', |
||||
|
'Internet Explorer' => 'Internet Explorer', |
||||
|
'Trident.* rv' => 'Internet Explorer', |
||||
|
'Shiira' => 'Shiira', |
||||
|
'Firefox' => 'Firefox', |
||||
|
'Chimera' => 'Chimera', |
||||
|
'Phoenix' => 'Phoenix', |
||||
|
'Firebird' => 'Firebird', |
||||
|
'Camino' => 'Camino', |
||||
|
'Netscape' => 'Netscape', |
||||
|
'OmniWeb' => 'OmniWeb', |
||||
|
'Safari' => 'Safari', |
||||
|
'Mozilla' => 'Mozilla', |
||||
|
'Konqueror' => 'Konqueror', |
||||
|
'icab' => 'iCab', |
||||
|
'Lynx' => 'Lynx', |
||||
|
'Links' => 'Links', |
||||
|
'hotjava' => 'HotJava', |
||||
|
'amaya' => 'Amaya', |
||||
|
'IBrowse' => 'IBrowse', |
||||
|
'Maxthon' => 'Maxthon', |
||||
|
'Ubuntu' => 'Ubuntu Web Browser', |
||||
|
'Vivaldi' => 'Vivaldi', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Mobiles |
||||
|
* ------------------------------------------------------------------- |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $mobiles = [ |
||||
|
// legacy array, old values commented out |
||||
|
'mobileexplorer' => 'Mobile Explorer', |
||||
|
// 'openwave' => 'Open Wave', |
||||
|
// 'opera mini' => 'Opera Mini', |
||||
|
// 'operamini' => 'Opera Mini', |
||||
|
// 'elaine' => 'Palm', |
||||
|
'palmsource' => 'Palm', |
||||
|
// 'digital paths' => 'Palm', |
||||
|
// 'avantgo' => 'Avantgo', |
||||
|
// 'xiino' => 'Xiino', |
||||
|
'palmscape' => 'Palmscape', |
||||
|
// 'nokia' => 'Nokia', |
||||
|
// 'ericsson' => 'Ericsson', |
||||
|
// 'blackberry' => 'BlackBerry', |
||||
|
// 'motorola' => 'Motorola' |
||||
|
|
||||
|
// Phones and Manufacturers |
||||
|
'motorola' => 'Motorola', |
||||
|
'nokia' => 'Nokia', |
||||
|
'palm' => 'Palm', |
||||
|
'iphone' => 'Apple iPhone', |
||||
|
'ipad' => 'iPad', |
||||
|
'ipod' => 'Apple iPod Touch', |
||||
|
'sony' => 'Sony Ericsson', |
||||
|
'ericsson' => 'Sony Ericsson', |
||||
|
'blackberry' => 'BlackBerry', |
||||
|
'cocoon' => 'O2 Cocoon', |
||||
|
'blazer' => 'Treo', |
||||
|
'lg' => 'LG', |
||||
|
'amoi' => 'Amoi', |
||||
|
'xda' => 'XDA', |
||||
|
'mda' => 'MDA', |
||||
|
'vario' => 'Vario', |
||||
|
'htc' => 'HTC', |
||||
|
'samsung' => 'Samsung', |
||||
|
'sharp' => 'Sharp', |
||||
|
'sie-' => 'Siemens', |
||||
|
'alcatel' => 'Alcatel', |
||||
|
'benq' => 'BenQ', |
||||
|
'ipaq' => 'HP iPaq', |
||||
|
'mot-' => 'Motorola', |
||||
|
'playstation portable' => 'PlayStation Portable', |
||||
|
'playstation 3' => 'PlayStation 3', |
||||
|
'playstation vita' => 'PlayStation Vita', |
||||
|
'hiptop' => 'Danger Hiptop', |
||||
|
'nec-' => 'NEC', |
||||
|
'panasonic' => 'Panasonic', |
||||
|
'philips' => 'Philips', |
||||
|
'sagem' => 'Sagem', |
||||
|
'sanyo' => 'Sanyo', |
||||
|
'spv' => 'SPV', |
||||
|
'zte' => 'ZTE', |
||||
|
'sendo' => 'Sendo', |
||||
|
'nintendo dsi' => 'Nintendo DSi', |
||||
|
'nintendo ds' => 'Nintendo DS', |
||||
|
'nintendo 3ds' => 'Nintendo 3DS', |
||||
|
'wii' => 'Nintendo Wii', |
||||
|
'open web' => 'Open Web', |
||||
|
'openweb' => 'OpenWeb', |
||||
|
|
||||
|
// Operating Systems |
||||
|
'android' => 'Android', |
||||
|
'symbian' => 'Symbian', |
||||
|
'SymbianOS' => 'SymbianOS', |
||||
|
'elaine' => 'Palm', |
||||
|
'series60' => 'Symbian S60', |
||||
|
'windows ce' => 'Windows CE', |
||||
|
|
||||
|
// Browsers |
||||
|
'obigo' => 'Obigo', |
||||
|
'netfront' => 'Netfront Browser', |
||||
|
'openwave' => 'Openwave Browser', |
||||
|
'mobilexplorer' => 'Mobile Explorer', |
||||
|
'operamini' => 'Opera Mini', |
||||
|
'opera mini' => 'Opera Mini', |
||||
|
'opera mobi' => 'Opera Mobile', |
||||
|
'fennec' => 'Firefox Mobile', |
||||
|
|
||||
|
// Other |
||||
|
'digital paths' => 'Digital Paths', |
||||
|
'avantgo' => 'AvantGo', |
||||
|
'xiino' => 'Xiino', |
||||
|
'novarra' => 'Novarra Transcoder', |
||||
|
'vodafone' => 'Vodafone', |
||||
|
'docomo' => 'NTT DoCoMo', |
||||
|
'o2' => 'O2', |
||||
|
|
||||
|
// Fallback |
||||
|
'mobile' => 'Generic Mobile', |
||||
|
'wireless' => 'Generic Mobile', |
||||
|
'j2me' => 'Generic Mobile', |
||||
|
'midp' => 'Generic Mobile', |
||||
|
'cldc' => 'Generic Mobile', |
||||
|
'up.link' => 'Generic Mobile', |
||||
|
'up.browser' => 'Generic Mobile', |
||||
|
'smartphone' => 'Generic Mobile', |
||||
|
'cellphone' => 'Generic Mobile', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* ------------------------------------------------------------------- |
||||
|
* Robots |
||||
|
* ------------------------------------------------------------------- |
||||
|
* |
||||
|
* There are hundred of bots but these are the most common. |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $robots = [ |
||||
|
'googlebot' => 'Googlebot', |
||||
|
'msnbot' => 'MSNBot', |
||||
|
'baiduspider' => 'Baiduspider', |
||||
|
'bingbot' => 'Bing', |
||||
|
'slurp' => 'Inktomi Slurp', |
||||
|
'yahoo' => 'Yahoo', |
||||
|
'ask jeeves' => 'Ask Jeeves', |
||||
|
'fastcrawler' => 'FastCrawler', |
||||
|
'infoseek' => 'InfoSeek Robot 1.0', |
||||
|
'lycos' => 'Lycos', |
||||
|
'yandex' => 'YandexBot', |
||||
|
'mediapartners-google' => 'MediaPartners Google', |
||||
|
'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', |
||||
|
'adsbot-google' => 'AdsBot Google', |
||||
|
'feedfetcher-google' => 'Feedfetcher Google', |
||||
|
'curious george' => 'Curious George', |
||||
|
'ia_archiver' => 'Alexa Crawler', |
||||
|
'MJ12bot' => 'Majestic-12', |
||||
|
'Uptimebot' => 'Uptimebot', |
||||
|
]; |
||||
|
} |
||||
@ -0,0 +1,44 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\BaseConfig; |
||||
|
use CodeIgniter\Validation\StrictRules\CreditCardRules; |
||||
|
use CodeIgniter\Validation\StrictRules\FileRules; |
||||
|
use CodeIgniter\Validation\StrictRules\FormatRules; |
||||
|
use CodeIgniter\Validation\StrictRules\Rules; |
||||
|
|
||||
|
class Validation extends BaseConfig |
||||
|
{ |
||||
|
// -------------------------------------------------------------------- |
||||
|
// Setup |
||||
|
// -------------------------------------------------------------------- |
||||
|
|
||||
|
/** |
||||
|
* Stores the classes that contain the |
||||
|
* rules that are available. |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
public array $ruleSets = [ |
||||
|
Rules::class, |
||||
|
FormatRules::class, |
||||
|
FileRules::class, |
||||
|
CreditCardRules::class, |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* Specifies the views that are used to display the |
||||
|
* errors. |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
*/ |
||||
|
public array $templates = [ |
||||
|
'list' => 'CodeIgniter\Validation\Views\list', |
||||
|
'single' => 'CodeIgniter\Validation\Views\single', |
||||
|
]; |
||||
|
|
||||
|
// -------------------------------------------------------------------- |
||||
|
// Rules |
||||
|
// -------------------------------------------------------------------- |
||||
|
} |
||||
@ -0,0 +1,62 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Config; |
||||
|
|
||||
|
use CodeIgniter\Config\View as BaseView; |
||||
|
use CodeIgniter\View\ViewDecoratorInterface; |
||||
|
|
||||
|
/** |
||||
|
* @phpstan-type parser_callable (callable(mixed): mixed) |
||||
|
* @phpstan-type parser_callable_string (callable(mixed): mixed)&string |
||||
|
*/ |
||||
|
class View extends BaseView |
||||
|
{ |
||||
|
/** |
||||
|
* When false, the view method will clear the data between each |
||||
|
* call. This keeps your data safe and ensures there is no accidental |
||||
|
* leaking between calls, so you would need to explicitly pass the data |
||||
|
* to each view. You might prefer to have the data stick around between |
||||
|
* calls so that it is available to all views. If that is the case, |
||||
|
* set $saveData to true. |
||||
|
* |
||||
|
* @var bool |
||||
|
*/ |
||||
|
public $saveData = true; |
||||
|
|
||||
|
/** |
||||
|
* Parser Filters map a filter name with any PHP callable. When the |
||||
|
* Parser prepares a variable for display, it will chain it |
||||
|
* through the filters in the order defined, inserting any parameters. |
||||
|
* To prevent potential abuse, all filters MUST be defined here |
||||
|
* in order for them to be available for use within the Parser. |
||||
|
* |
||||
|
* Examples: |
||||
|
* { title|esc(js) } |
||||
|
* { created_on|date(Y-m-d)|esc(attr) } |
||||
|
* |
||||
|
* @var array<string, string> |
||||
|
* @phpstan-var array<string, parser_callable_string> |
||||
|
*/ |
||||
|
public $filters = []; |
||||
|
|
||||
|
/** |
||||
|
* Parser Plugins provide a way to extend the functionality provided |
||||
|
* by the core Parser by creating aliases that will be replaced with |
||||
|
* any callable. Can be single or tag pair. |
||||
|
* |
||||
|
* @var array<string, callable|list<string>|string> |
||||
|
* @phpstan-var array<string, list<parser_callable_string>|parser_callable_string|parser_callable> |
||||
|
*/ |
||||
|
public $plugins = []; |
||||
|
|
||||
|
/** |
||||
|
* View Decorators are class methods that will be run in sequence to |
||||
|
* have a chance to alter the generated output just prior to caching |
||||
|
* the results. |
||||
|
* |
||||
|
* All classes must implement CodeIgniter\View\ViewDecoratorInterface |
||||
|
* |
||||
|
* @var list<class-string<ViewDecoratorInterface>> |
||||
|
*/ |
||||
|
public array $decorators = []; |
||||
|
} |
||||
@ -0,0 +1,233 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Groups; |
||||
|
use App\Models\Company; |
||||
|
use CodeIgniter\Controller; |
||||
|
use CodeIgniter\HTTP\RequestInterface; |
||||
|
use CodeIgniter\HTTP\ResponseInterface; |
||||
|
use CodeIgniter\Logger\LoggerInterface; |
||||
|
|
||||
|
abstract class AdminController extends BaseController |
||||
|
{ |
||||
|
protected $permission = []; |
||||
|
|
||||
|
public function __construct() |
||||
|
{ |
||||
|
if (empty(session()->get('user'))) { |
||||
|
redirect()->to('/login'); |
||||
|
} else { |
||||
|
$userIfo = session()->get('user'); |
||||
|
$userId = $userIfo['id']; |
||||
|
|
||||
|
$Groups = new Groups(); |
||||
|
$group_data = $Groups->getUserGroupByUserId($userId); |
||||
|
|
||||
|
$this->permission = unserialize($group_data['permission']); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* finction to verify role of users |
||||
|
* @return mixed |
||||
|
*/ |
||||
|
protected function verifyRole(string $role) |
||||
|
{ |
||||
|
if (!in_array( $role, $this->permission)) { |
||||
|
redirect()->to('/')->send(); |
||||
|
exit(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Render template with page data |
||||
|
protected function render_template($page = null, $data = []) |
||||
|
{ |
||||
|
$data['user_permission'] = $this->permission; |
||||
|
echo view('templates/header', $data); |
||||
|
echo view('templates/header_menu', $data); |
||||
|
echo view('templates/side_menubar', $data); |
||||
|
echo view($page, $data); |
||||
|
echo view('templates/footer', $data); |
||||
|
} |
||||
|
|
||||
|
// Get company currency using model |
||||
|
public function company_currency() |
||||
|
{ |
||||
|
$model_company = new Company(); |
||||
|
$company_currency = $model_company->getCompanyData(1); |
||||
|
$currencies = $this->currency(); |
||||
|
|
||||
|
$currency = ''; |
||||
|
foreach ($currencies as $key => $value) { |
||||
|
if ($key == $company_currency['currency']) { |
||||
|
$currency = $value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $currency; |
||||
|
} |
||||
|
|
||||
|
// Return currency symbols |
||||
|
public function currency() |
||||
|
{ |
||||
|
return [ |
||||
|
'AED' => 'د.إ', // ? |
||||
|
'AFN' => 'Af', |
||||
|
'ALL' => 'Lek', |
||||
|
'ANG' => 'ƒ', |
||||
|
'AOA' => 'Kz', // ? |
||||
|
'ARS' => '$', |
||||
|
'AUD' => '$', |
||||
|
'AWG' => 'ƒ', |
||||
|
'AZN' => 'ман', |
||||
|
'BAM' => 'KM', |
||||
|
'BBD' => '$', |
||||
|
'BDT' => '৳', // ? |
||||
|
'BGN' => 'лв', |
||||
|
'BHD' => '.د.ب', // ? |
||||
|
'BIF' => 'FBu', // ? |
||||
|
'BMD' => '$', |
||||
|
'BND' => '$', |
||||
|
'BOB' => '$b', |
||||
|
'BRL' => 'R$', |
||||
|
'BSD' => '$', |
||||
|
'BTN' => 'Nu.', // ? |
||||
|
'BWP' => 'P', |
||||
|
'BYR' => 'p.', |
||||
|
'BZD' => 'BZ$', |
||||
|
'CAD' => '$', |
||||
|
'CDF' => 'FC', |
||||
|
'CHF' => 'CHF', |
||||
|
'CLP' => '$', |
||||
|
'CNY' => '¥', |
||||
|
'COP' => '$', |
||||
|
'CRC' => '₡', |
||||
|
'CUP' => '⃌', |
||||
|
'CVE' => '$', // ? |
||||
|
'CZK' => 'Kč', |
||||
|
'DJF' => 'Fdj', // ? |
||||
|
'DKK' => 'kr', |
||||
|
'DOP' => 'RD$', |
||||
|
'DZD' => 'دج', // ? |
||||
|
'EGP' => '£', |
||||
|
'ETB' => 'Br', |
||||
|
'EUR' => '€', |
||||
|
'FJD' => '$', |
||||
|
'FKP' => '£', |
||||
|
'GBP' => '£', |
||||
|
'GEL' => 'ლ', // ? |
||||
|
'GHS' => '¢', |
||||
|
'GIP' => '£', |
||||
|
'GMD' => 'D', // ? |
||||
|
'GNF' => 'FG', // ? |
||||
|
'GTQ' => 'Q', |
||||
|
'GYD' => '$', |
||||
|
'HKD' => '$', |
||||
|
'HNL' => 'L', |
||||
|
'HRK' => 'kn', |
||||
|
'HTG' => 'G', // ? |
||||
|
'HUF' => 'Ft', |
||||
|
'IDR' => 'Rp', |
||||
|
'ILS' => '₪', |
||||
|
'INR' => '₹', |
||||
|
'IQD' => 'ع.د', // ? |
||||
|
'IRR' => '﷼', |
||||
|
'ISK' => 'kr', |
||||
|
'JEP' => '£', |
||||
|
'JMD' => 'J$', |
||||
|
'JOD' => 'JD', // ? |
||||
|
'JPY' => '¥', |
||||
|
'KES' => 'KSh', // ? |
||||
|
'KGS' => 'лв', |
||||
|
'KHR' => '៛', |
||||
|
'KMF' => 'CF', // ? |
||||
|
'KPW' => '₩', |
||||
|
'KRW' => '₩', |
||||
|
'KWD' => 'د.ك', // ? |
||||
|
'KYD' => '$', |
||||
|
'KZT' => 'лв', |
||||
|
'LAK' => '₭', |
||||
|
'LBP' => '£', |
||||
|
'LKR' => '₨', |
||||
|
'LRD' => '$', |
||||
|
'LSL' => 'L', // ? |
||||
|
'LTL' => 'Lt', |
||||
|
'LVL' => 'Ls', |
||||
|
'LYD' => 'ل.د', // ? |
||||
|
'MAD' => 'د.م.', //? |
||||
|
'MDL' => 'L', |
||||
|
'MGA' => 'Ar', // ? |
||||
|
'MKD' => 'ден', |
||||
|
'MMK' => 'K', |
||||
|
'MNT' => '₮', |
||||
|
'MOP' => 'MOP$', // ? |
||||
|
'MRO' => 'UM', // ? |
||||
|
'MUR' => '₨', // ? |
||||
|
'MVR' => '.ރ', // ? |
||||
|
'MWK' => 'MK', |
||||
|
'MXN' => '$', |
||||
|
'MYR' => 'RM', |
||||
|
'MZN' => 'MT', |
||||
|
'NAD' => '$', |
||||
|
'NGN' => '₦', |
||||
|
'NIO' => 'C$', |
||||
|
'NOK' => 'kr', |
||||
|
'NPR' => '₨', |
||||
|
'NZD' => '$', |
||||
|
'OMR' => '﷼', |
||||
|
'PAB' => 'B/.', |
||||
|
'PEN' => 'S/.', |
||||
|
'PGK' => 'K', // ? |
||||
|
'PHP' => '₱', |
||||
|
'PKR' => '₨', |
||||
|
'PLN' => 'zł', |
||||
|
'PYG' => 'Gs', |
||||
|
'QAR' => '﷼', |
||||
|
'RON' => 'lei', |
||||
|
'RSD' => 'Дин.', |
||||
|
'RUB' => 'руб', |
||||
|
'RWF' => 'ر.س', |
||||
|
'SAR' => '﷼', |
||||
|
'SBD' => '$', |
||||
|
'SCR' => '₨', |
||||
|
'SDG' => '£', // ? |
||||
|
'SEK' => 'kr', |
||||
|
'SGD' => '$', |
||||
|
'SHP' => '£', |
||||
|
'SLL' => 'Le', // ? |
||||
|
'SOS' => 'S', |
||||
|
'SRD' => '$', |
||||
|
'STD' => 'Db', // ? |
||||
|
'SVC' => '$', |
||||
|
'SYP' => '£', |
||||
|
'SZL' => 'L', // ? |
||||
|
'THB' => '฿', |
||||
|
'TJS' => 'TJS', // ? TJS (guess) |
||||
|
'TMT' => 'm', |
||||
|
'TND' => 'د.ت', |
||||
|
'TOP' => 'T$', |
||||
|
'TRY' => '₤', // New Turkey Lira (old symbol used) |
||||
|
'TTD' => '$', |
||||
|
'TWD' => 'NT$', |
||||
|
'UAH' => '₴', |
||||
|
'UGX' => 'USh', |
||||
|
'USD' => '$', |
||||
|
'UYU' => '$U', |
||||
|
'UZS' => 'лв', |
||||
|
'VEF' => 'Bs', |
||||
|
'VND' => '₫', |
||||
|
'VUV' => 'VT', |
||||
|
'WST' => 'WS$', |
||||
|
'XAF' => 'FCFA', |
||||
|
'XCD' => '$', |
||||
|
'XPF' => 'F', |
||||
|
'YER' => '﷼', |
||||
|
'ZAR' => 'R', |
||||
|
'ZMK' => 'ZK', // ? |
||||
|
'ZWL' => 'Z$', |
||||
|
// ... add the rest of the currencies |
||||
|
]; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,341 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Attributes; |
||||
|
|
||||
|
class AttribuController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
// Assuming permission is being set from a session |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Attributes'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewCategory'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
return $this->render_template('attributes/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchAttributeDataById(int $id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
$Attributes = new Attributes(); |
||||
|
$data = $Attributes->getAttributeData($id); |
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchCategoryData() |
||||
|
{ |
||||
|
// Prepare the response array |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
$Attributes = new Attributes(); |
||||
|
// Get category data |
||||
|
$data = $Attributes->getAttributeData(); // Make sure this function exists in your CategoryModel |
||||
|
|
||||
|
// Iterate through each category and build the response |
||||
|
foreach ($data as $key => $value) { |
||||
|
|
||||
|
// Initialize button HTML |
||||
|
$buttons = ''; |
||||
|
|
||||
|
// Check if the user has permission to update |
||||
|
if (in_array('updateCategory', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['id'] . ')" data-toggle="modal" data-target="#editModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Check if the user has permission to delete |
||||
|
if (in_array('deleteCategory', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-default" onclick="removeFunc(' . $value['id'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
// Check if the user has permission to delete |
||||
|
if (in_array('deleteCategory', $this->permission)) { |
||||
|
$buttons .= ' <a class="btn btn-default" href="values/' . $value['id'] . '"><i class="fa fa-plus"></i></a>'; |
||||
|
} |
||||
|
|
||||
|
// Determine the status label |
||||
|
$status = ($value['active'] == 1) ? '<span class="label label-success">Active</span>' : '<span class="label label-warning">Inactive</span>'; |
||||
|
$attributCount = $Attributes->countAttributeValue($value['id']); |
||||
|
// Add data to the result array |
||||
|
$result['data'][] = [ |
||||
|
$value['name'], |
||||
|
$attributCount, |
||||
|
$status, |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
// Return the result as JSON |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$this->verifyRole('createAttribute'); |
||||
|
$response = []; |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'attribute_name' => 'required', |
||||
|
'active' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'attribute_name' => $this->request->getPost('attribute_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
$Attributes = new Attributes(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('attribute_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
if ($Attributes->create($data)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Crée avec succès'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données lors de la création des informations sur la marque'; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function update(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateAttribute'); |
||||
|
$response = []; |
||||
|
|
||||
|
if ($id) { |
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'edit_attribute_name' => 'required', |
||||
|
'edit_active' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'edit_attribute_name' => $this->request->getPost('edit_attribute_name'), |
||||
|
'edit_active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
$Attributes = new Attributes(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('edit_attribute_name'), |
||||
|
'active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
if ($Attributes->updateAttribute($data, $id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Succesfully updated'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Error in the database while updated the brand information'; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Error please refresh the page again!!'; |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function remove() |
||||
|
{ |
||||
|
$this->verifyRole('deleteAttribute'); |
||||
|
$attribute_id = $this->request->getPost('attribute_id'); |
||||
|
|
||||
|
if ($attribute_id) { |
||||
|
$Attributes = new Attributes(); |
||||
|
if ($Attributes->delete($attribute_id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Successfully removed"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Error in the database while removing the brand information"; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Refersh the page again!!"; |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function getValue(int $id) |
||||
|
{ |
||||
|
$Attributes = new Attributes(); |
||||
|
$data['attribute_data'] = $Attributes->getAttributeData($id); |
||||
|
$this->verifyRole('viewCategory'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
// die(var_dump($data)); |
||||
|
$data['test'] = $id; |
||||
|
|
||||
|
return $this->render_template('attributes/addvalue', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchCategoryValueData(int $id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
// Prepare the response array |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
$Attributes = new Attributes(); |
||||
|
// Get category data |
||||
|
$data = $Attributes->getAttributeValueData($id); // Make sure this function exists in your CategoryModel |
||||
|
|
||||
|
// Iterate through each category and build the response |
||||
|
foreach ($data as $key => $value) { |
||||
|
|
||||
|
// Initialize button HTML |
||||
|
$buttons = ''; |
||||
|
|
||||
|
// Check if the user has permission to update |
||||
|
if (in_array('updateCategory', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['id'] . ')" data-toggle="modal" data-target="#editModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Check if the user has permission to delete |
||||
|
if (in_array('deleteCategory', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-default" onclick="removeFunc(' . $value['id'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Add data to the result array |
||||
|
$result['data'][] = [ |
||||
|
$value['value'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
// Return the result as JSON |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function createValue() |
||||
|
{ |
||||
|
$this->verifyRole('createAttribute'); |
||||
|
$response = []; |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'attribute_value_name' => 'required', |
||||
|
'attribute_parent_id' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'attribute_value_name' => $this->request->getPost('attribute_value_name'), |
||||
|
'attribute_parent_id' => $this->request->getPost('attribute_parent_id'), |
||||
|
]; |
||||
|
|
||||
|
$Attributes = new Attributes(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'value' => $this->request->getPost('attribute_value_name'), |
||||
|
'attribute_parent_id' => $this->request->getPost('attribute_parent_id'), |
||||
|
]; |
||||
|
|
||||
|
if ($Attributes->createValue($data)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Crée avec succès'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données lors de la création des informations sur la marque'; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function fetchAttributeValueById(int $id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
$Attributes = new Attributes(); |
||||
|
$data = $Attributes->getAttributeValueById($id); |
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function updateValue(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateAttribute'); |
||||
|
$response = []; |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'edit_attribute_value_name' => 'required', |
||||
|
'attribute_parent_id' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'edit_attribute_value_name' => $this->request->getPost('edit_attribute_value_name'), |
||||
|
'attribute_parent_id' => $this->request->getPost('attribute_parent_id'), |
||||
|
]; |
||||
|
|
||||
|
$Attributes = new Attributes(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'value' => $this->request->getPost('edit_attribute_value_name'), |
||||
|
'attribute_parent_id' => $this->request->getPost('attribute_parent_id'), |
||||
|
]; |
||||
|
|
||||
|
if ($Attributes->updateValue($data, $id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Succesfully updated'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Error in the database while updated the brand information'; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function removeValue() |
||||
|
{ |
||||
|
$response = []; |
||||
|
$Attributes = new Attributes(); |
||||
|
|
||||
|
if ($this->request->getPost('attribute_value_id') && $Attributes->removeValue($this->request->getPost('attribute_value_id'))) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Succesfully removed'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Error in the database while updated the brand information'; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,214 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\ProductImage; |
||||
|
use App\Models\Users; |
||||
|
use App\Models\Stores; |
||||
|
use App\Models\Products; |
||||
|
|
||||
|
class Auth extends AdminController |
||||
|
{ |
||||
|
/** |
||||
|
* function who return the view login |
||||
|
* @return string |
||||
|
*/ |
||||
|
public function login() |
||||
|
{ |
||||
|
return view('login'); |
||||
|
} |
||||
|
|
||||
|
private function uploadImage($file) |
||||
|
{ |
||||
|
// Define the upload directory |
||||
|
$uploadPath = 'assets/images/product_image'; |
||||
|
|
||||
|
// Ensure the directory exists |
||||
|
if (!is_dir($uploadPath)) { |
||||
|
mkdir($uploadPath, 0777, true); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// Check if the file is uploaded via the form |
||||
|
// $file = $this->request->getFile('images'); |
||||
|
if ($file && $file->isValid() && !$file->hasMoved()) { |
||||
|
// Generate a unique file name |
||||
|
$newName = uniqid() . '.' . $file->getExtension(); |
||||
|
|
||||
|
// Move the file to the target directory |
||||
|
$file->move($uploadPath, $newName); |
||||
|
|
||||
|
// Return the actual file name |
||||
|
return $newName; |
||||
|
} |
||||
|
|
||||
|
// If an error occurs, return the error message |
||||
|
return $file ? $file->getErrorString() : 'No file was uploaded.'; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* function used to login |
||||
|
* @return \CodeIgniter\HTTP\RedirectResponse |
||||
|
*/ |
||||
|
public function loginPost() |
||||
|
{ |
||||
|
$email = $this->request->getPost('email'); |
||||
|
$password = $this->request->getPost('password'); |
||||
|
|
||||
|
// Load the model and attempt login |
||||
|
$userModel = new Users(); |
||||
|
|
||||
|
$user = $userModel->attempt($email, $password); |
||||
|
|
||||
|
if ($user) { |
||||
|
// Set user session |
||||
|
session()->set('user', $user); |
||||
|
|
||||
|
// Redirect to dashboard |
||||
|
return redirect()->to('/'); |
||||
|
} |
||||
|
|
||||
|
// If login fails, redirect back with an error |
||||
|
return redirect()->to('/login')->with('error', 'Invalid email or password.'); |
||||
|
} |
||||
|
|
||||
|
public function logout() |
||||
|
{ |
||||
|
session()->destroy(); |
||||
|
return redirect()->to('/login'); |
||||
|
} |
||||
|
|
||||
|
public function ventes() |
||||
|
{ |
||||
|
$this->verifyRole('viewCom'); |
||||
|
$data['page_title'] = "Espace commercial"; |
||||
|
|
||||
|
$session = session(); |
||||
|
$user_id = $session->get('user'); |
||||
|
$data['id'] = $user_id['store_id']; |
||||
|
// die(var_dump($user_id['store_id'])); |
||||
|
|
||||
|
|
||||
|
return $this->render_template('commercial/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchProductVente(int $id) |
||||
|
{ |
||||
|
// Initialize the response array |
||||
|
$result = ['data' => []]; |
||||
|
$Products = new Products(); |
||||
|
|
||||
|
// Fetch product data from the model |
||||
|
$data = $Products->getProductDataStore($id); // Ensure this method exists in your ProductModel |
||||
|
|
||||
|
foreach ($data as $key => $value) { |
||||
|
|
||||
|
// Construct buttons |
||||
|
$buttons = ''; |
||||
|
|
||||
|
if (in_array('viewCom', $this->permission)) { |
||||
|
$buttons .= " <a href='/ventes/show/" . $value['id'] . "' class='btn btn-default'><i class='fa fa-eye'></i></a>"; |
||||
|
} |
||||
|
|
||||
|
if (is_array($this->permission) && in_array('createOrder', $this->permission)) { |
||||
|
$buttons .= ($value['qty'] == 1) |
||||
|
? " <a href='/orders/createFromEspace/" . $value['id'] . "' class='btn btn-default'><i class='fa fa-shopping-cart'></i></a>" |
||||
|
: " <button class='btn btn-default' title='0 en stock'><i class='fa fa-shopping-cart'></i></button>"; |
||||
|
} |
||||
|
|
||||
|
// Image HTML |
||||
|
$img = '<img src="' . base_url('assets/images/product_image/' . $value['image']) . '" alt="' . $value['name'] . '" class="img-circle" width="50" height="50" />'; |
||||
|
|
||||
|
// Populate the result data |
||||
|
$result['data'][] = [ |
||||
|
$img, |
||||
|
$value['sku'], |
||||
|
$value['name'], |
||||
|
number_format($value['prix_vente'], 0, ',', ' '), |
||||
|
$value['puissance'] . ' CC', |
||||
|
$value['numero_de_moteur'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return JSON response |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function addImage(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateProduct'); |
||||
|
$data['page_title'] = "Espace commercial"; |
||||
|
$Products = new Products(); |
||||
|
$ProductImage = new ProductImage(); |
||||
|
|
||||
|
$data['products'] = $Products->getProductData($id); |
||||
|
$data['galleries'] = $ProductImage->getAll($id); |
||||
|
|
||||
|
return $this->render_template('commercial/addImage', $data); |
||||
|
} |
||||
|
|
||||
|
public function uploadImagePub($id) |
||||
|
{ |
||||
|
$this->verifyRole('updateProduct'); |
||||
|
// die(var_dump($this->request->getFiles())); |
||||
|
$files = $this->request->getFiles(); |
||||
|
$ProductImage = new ProductImage(); |
||||
|
$isTrue = false; |
||||
|
for ($i = 0; $i < count($files['images']); $i++) { |
||||
|
$imageName = $this->uploadImage($files['images'][$i]); |
||||
|
$data = [ |
||||
|
'product_id' => $id, |
||||
|
'images' => $imageName |
||||
|
]; |
||||
|
|
||||
|
if ($ProductImage->create($data)) { |
||||
|
$isTrue = true; |
||||
|
} else { |
||||
|
$isTrue = false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if ($isTrue) { |
||||
|
session()->setFlashdata('success', 'Mise à jour réusit'); |
||||
|
return redirect()->to('/products'); |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Error occurred while creating the product'); |
||||
|
return redirect()->to('ventes/' . $id); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function delete(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateProduct'); |
||||
|
$ProductImage = new ProductImage(); |
||||
|
if ($id) { |
||||
|
$result = $ProductImage->deleteOne($id); |
||||
|
|
||||
|
if ($result) { |
||||
|
return redirect()->back(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function getSingle(int $id) |
||||
|
{ |
||||
|
$data['page_title'] = "Espace commercial"; |
||||
|
$Products = new Products(); |
||||
|
$ProductImage = new ProductImage(); |
||||
|
$Stores = new Stores(); |
||||
|
|
||||
|
$data['products'] = $Products->getProductData($id); |
||||
|
$data['stores'] = ''; |
||||
|
$data['galleries'] = $ProductImage->getAll($id); |
||||
|
$allStores = $Stores->getActiveStore(); |
||||
|
|
||||
|
for ($i = 0; $i < count($allStores); $i++) { |
||||
|
if ($allStores[$i]['id'] == $data['products']['store_id']) { |
||||
|
$data['stores'] = $allStores[$i]['name']; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $this->render_template('commercial/single', $data); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,381 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Company; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\Avance; |
||||
|
|
||||
|
class AvanceController extends AdminController |
||||
|
{ |
||||
|
private $pageTitle = 'Avances'; |
||||
|
|
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewAvance'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
$Products = new Products(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$store_id = $users['store_id']; |
||||
|
$data['products'] = $Products->getProductDataStore($store_id); |
||||
|
return $this->render_template('avances/avance', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchAvanceData() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$Avance = new Avance(); |
||||
|
$product = new Products(); |
||||
|
$result = ['data' => []]; |
||||
|
$data = $Avance->getAllAvanceData(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
$isCommerciale = in_array($users['group_name'], ['COMMERCIALE']); |
||||
|
$isCaissier = in_array($users['group_name'], ['Caissier']); |
||||
|
foreach ($data as $key => $value) { |
||||
|
$isOwner = $users['id'] === $value['user_id']; |
||||
|
$date_time = date('d-m-Y h:i a', strtotime($value['avance_date'])); |
||||
|
|
||||
|
// Boutons d’action |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc('. $value['avance_id'] .')">' |
||||
|
. '<i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
if (in_array('deleteAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-danger" onclick="removeFunc(' . $value['avance_id'] . ',' . $value['product_id'] . ')"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
if (in_array('viewAvance', $this->permission) && !$isAdmin) { |
||||
|
$buttons .= ' <a href="#" data-order-id="'.$value['id'].'" class="btn btn-default btn-view" title="Voir"><i class="fa fa-eye"></i></a>'; |
||||
|
} |
||||
|
if ($isAdmin) { |
||||
|
$row = [ |
||||
|
$value['customer_name'], |
||||
|
$value['customer_phone'], |
||||
|
$value['customer_address'], |
||||
|
$product->getProductNameById($value['product_id']), |
||||
|
number_format((int)$value['gross_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['amount_due'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
// dd($row);die; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
if ($isCommerciale || $isCaissier) { |
||||
|
$row = [ |
||||
|
$value['avance_id'], |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['amount_due'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function createAvance() |
||||
|
{ |
||||
|
// $this->verifyRole('createAvance'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$Avance = new Avance(); |
||||
|
$Products = new Products(); |
||||
|
$Notification = New NotificationController(); |
||||
|
|
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
|
||||
|
$data = [ |
||||
|
'customer_name' => $this->request->getPost('customer_name_avance'), |
||||
|
'customer_address' => $this->request->getPost('customer_address_avance'), |
||||
|
'customer_phone' => $this->request->getPost('customer_phone_avance'), |
||||
|
'customer_cin' => $this->request->getPost('customer_cin_avance'), |
||||
|
'avance_date' => date('Y-m-d'), |
||||
|
'user_id' => $users['id'], |
||||
|
'store_id' => $users['store_id'], |
||||
|
'product_id' => $this->request->getPost('id_product'), |
||||
|
'gross_amount' => (float)$this->request->getPost('gross_amount'), |
||||
|
'avance_amount' => (float)$this->request->getPost('avance_amount'), |
||||
|
'amount_due' => (float)$this->request->getPost('amount_due'), |
||||
|
'is_order' => (float)0, |
||||
|
'active' => 1, |
||||
|
]; |
||||
|
|
||||
|
if($avance_id = $Avance->createAvance($data)){ |
||||
|
$product = new Products(); |
||||
|
$product->update((int)$this->request->getPost('id_product'), ['product_sold' => 1]); |
||||
|
$Notification->createNotification('Une avance a été créé', "Conseil",(int)$users['store_id'], 'avances'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Avance créé avec succès !' |
||||
|
]); |
||||
|
} |
||||
|
else{ |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Une erreur est survenue lors de la création d\une avance !' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function updateAvance(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateAvance'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$Products = new Products(); |
||||
|
$Avance = new Avance(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
$data = [ |
||||
|
'customer_name' => $this->request->getPost('customer_name_avance_edit'), |
||||
|
'customer_address'=> $this->request->getPost('customer_address_avance_edit'), |
||||
|
'customer_phone' => $this->request->getPost('customer_phone_avance_edit'), |
||||
|
'customer_cin' => $this->request->getPost('customer_cin_avance_edit'), |
||||
|
'gross_amout' => $this->request->getPost('gros_amount_edit'), |
||||
|
'avance_amount' => (int)$this->request->getPost('avance_amount_edit'), |
||||
|
'amount_due' => (int)$this->request->getPost('amount_due_edit'), |
||||
|
'product_id' => $this->request->getPost('id_product_edit'), |
||||
|
]; |
||||
|
$bill_no = 'BILPR-' . strtoupper(substr(md5(uniqid(mt_rand(), true)), 0, 4)); |
||||
|
$Company = new Company(); |
||||
|
$company = $Company->getCompanyData(1); |
||||
|
$company['vat_charge_value'] > 0; |
||||
|
$service_charge_rate = $company['service_charge_value']; |
||||
|
$vat_charge_rate = $company['vat_charge_value']; |
||||
|
$gross_amount = $this->request->getPost('gross_amount_edit'); |
||||
|
$vat_charge = ($gross_amount / 100) * $vat_charge_rate; |
||||
|
$amount_due = (int)$this->request->getPost('amount_due_edit'); |
||||
|
$product_id = (array)$this->request->getPost('id_product_edit'); |
||||
|
|
||||
|
if ($amount_due <= 0) { |
||||
|
$Orders = new Orders(); |
||||
|
|
||||
|
$data = [ |
||||
|
'bill_no' => $bill_no, |
||||
|
'customer_name' => $this->request->getPost('customer_name_avance_edit'), |
||||
|
'customer_address'=> $this->request->getPost('customer_address_avance_edit'), |
||||
|
'customer_phone' => $this->request->getPost('customer_phone_avance_edit'), |
||||
|
'customer_cin' => $this->request->getPost('customer_cin_avance_edit'), |
||||
|
'gross_amout' => $gross_amount, |
||||
|
'net_amount' => $gross_amount, |
||||
|
'date_time' => date('Y-m-d H:i:s'), |
||||
|
'service_charge_rate' => $service_charge_rate, |
||||
|
'vat_charge_rate' => $vat_charge_rate, |
||||
|
'vat_charge' => $vat_charge, |
||||
|
'discount' => (int) 0, |
||||
|
'paid_status' => 1, |
||||
|
'user_id' => $users['id'], |
||||
|
'store_id' => $users['store_id'], |
||||
|
'amount_value' => $gross_amount, |
||||
|
'rate_value' => $gross_amount, |
||||
|
]; |
||||
|
$data1 = ['is_order' => 1]; |
||||
|
if($Orders->create($data,$product_id)){ |
||||
|
$Avance->updateAvance($id,$data1); |
||||
|
$Notification = New NotificationController(); |
||||
|
$Notification->createNotification('Une commande a été créé', "Conseil",(int)$users['store_id'], 'orders'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'success. Avance convertie en commande avec succès.' |
||||
|
]); |
||||
|
} |
||||
|
else{ |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Erreur lors de la convertion de l\'avance' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
else{ |
||||
|
if ($Avance->updateAvance($id, $data)) { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'success', 'Avance mise à jour avec succès.' |
||||
|
|
||||
|
]); |
||||
|
} else { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Errors', 'Une erreur est survenue lors de la mise à jour.' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function removeAvance() |
||||
|
{ |
||||
|
$this->verifyRole('deleteAvance'); |
||||
|
$avance_id = $this->request->getPost('avance_id'); |
||||
|
$product_id = $this->request->getPost('product_id'); |
||||
|
$response = []; |
||||
|
|
||||
|
$Avance = new Avance(); |
||||
|
if ($Avance->removeAvance($avance_id)) { |
||||
|
$product = new Products(); |
||||
|
$product->update($product_id, ['product_sold' => 0]); |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Avance supprimée avec succès. Ce produit peut désormais être réservé à nouveau."; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "une erreur est survenue lors de la suppression d'une avance"; |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function fetchSingleAvance($avance_id) |
||||
|
{ |
||||
|
$this->verifyRole('updateAvance'); |
||||
|
|
||||
|
try { |
||||
|
$avanceModel = new Avance(); |
||||
|
|
||||
|
$data = $avanceModel->fetchSingleAvance($avance_id); |
||||
|
|
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
catch (\Throwable $th) { |
||||
|
log_message('error', "Erreur lors de la récupération d'une avance: " . $th->getMessage()); |
||||
|
|
||||
|
return $this->response |
||||
|
->setStatusCode(500) |
||||
|
->setJSON(['error' => 'Une erreur interne est survenue. Lors de la création d\'une avance']); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchAvanceBecameOrder() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$Avance = new Avance(); |
||||
|
$product = new Products(); |
||||
|
$result = ['data' => []]; |
||||
|
$data = $Avance->getAllAvanceData1(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
$isCommerciale = in_array($users['group_name'], ['COMMERCIALE']); |
||||
|
$isCaissier = in_array($users['group_name'], ['Caissier']); |
||||
|
foreach ($data as $key => $value) { |
||||
|
$isOwner = $users['id'] === $value['user_id']; |
||||
|
$date_time = date('d-m-Y h:i a', strtotime($value['avance_date'])); |
||||
|
|
||||
|
// Boutons d’action |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc('. $value['avance_id'] .')">' |
||||
|
. '<i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
if (in_array('deleteAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-danger" onclick="removeFunc(' . $value['avance_id'] . ',' . $value['product_id'] . ')"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
if (in_array('viewAvance', $this->permission) && !$isAdmin) { |
||||
|
$buttons .= ' <a href="#" data-order-id="'.$value['id'].'" class="btn btn-default btn-view" title="Voir"><i class="fa fa-eye"></i></a>'; |
||||
|
} |
||||
|
if ($isAdmin) { |
||||
|
$row = [ |
||||
|
$value['customer_name'], |
||||
|
$value['customer_phone'], |
||||
|
$value['customer_address'], |
||||
|
$product->getProductNameById($value['product_id']), |
||||
|
number_format((int)$value['gross_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['amount_due'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
// dd($row);die; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
if ($isCommerciale || $isCaissier) { |
||||
|
$row = [ |
||||
|
$value['avance_id'], |
||||
|
$product->getProductNameById($value['product_id']), |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['amount_due'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function fetcheExpiredAvance() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$Avance = new Avance(); |
||||
|
$product = new Products(); |
||||
|
$result = ['data' => []]; |
||||
|
$data = $Avance->getAllAvanceData2(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
$isCommerciale = in_array($users['group_name'], ['COMMERCIALE']); |
||||
|
$isCaissier = in_array($users['group_name'], ['Caissier']); |
||||
|
foreach ($data as $key => $value) { |
||||
|
$isOwner = $users['id'] === $value['user_id']; |
||||
|
$date_time = date('d-m-Y h:i a', strtotime($value['avance_date'])); |
||||
|
|
||||
|
// Boutons d’action |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc('. $value['avance_id'] .')">' |
||||
|
. '<i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
if (in_array('deleteAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-danger" onclick="removeFunc(' . $value['avance_id'] . ',' . $value['product_id'] . ')"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
if (in_array('viewAvance', $this->permission) && !$isAdmin) { |
||||
|
$buttons .= ' <a href="#" data-order-id="'.$value['id'].'" class="btn btn-default btn-view" title="Voir"><i class="fa fa-eye"></i></a>'; |
||||
|
} |
||||
|
if ($isAdmin) { |
||||
|
$row = [ |
||||
|
$value['customer_name'], |
||||
|
$value['customer_phone'], |
||||
|
$value['customer_address'], |
||||
|
$product->getProductNameById($value['product_id']), |
||||
|
number_format((int)$value['gross_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['amount_due'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
// dd($row);die; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
if ($isCommerciale || $isCaissier) { |
||||
|
$row = [ |
||||
|
$value['avance_id'], |
||||
|
$product->getProductNameById($value['product_id']), |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['amount_due'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,201 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Products; |
||||
|
use App\Models\Avance; |
||||
|
|
||||
|
class AvanceController extends AdminController |
||||
|
{ |
||||
|
private $pageTitle = 'Avances'; |
||||
|
|
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewAvance'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
return $this->render_template('avances/avance', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchAvanceData() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$Avance = new Avance(); |
||||
|
|
||||
|
$result = ['data' => []]; |
||||
|
$data = $Avance->getAvanceData(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
$isCommerciale = in_array($users['group_name'], ['COMMERCIALE']); |
||||
|
$isCaissier = in_array($users['group_name'], ['Caissier']); |
||||
|
foreach ($data as $key => $value) { |
||||
|
$isOwner = $users['id'] === $value['user_id']; |
||||
|
$date_time = date('d-m-Y h:i a', strtotime($value['avance_date'])); |
||||
|
|
||||
|
// Boutons d’action |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc('. $value['avance_id'] .')">' |
||||
|
. '<i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
if (in_array('deleteAvance', $this->permission) && ($isAdmin || $isOwner)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeFunc('.$value['avance_id'].')"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
if (in_array('viewAvance', $this->permission) && !$isAdmin) { |
||||
|
$buttons .= ' <a href="#" data-order-id="'.$value['id'].'" class="btn btn-default btn-view" title="Voir"><i class="fa fa-eye"></i></a>'; |
||||
|
} |
||||
|
if ($isAdmin) { |
||||
|
$row = [ |
||||
|
$value['customer_name'], |
||||
|
$value['customer_phone'], |
||||
|
$value['customer_address'], |
||||
|
number_format((int)$value['gross_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
if ($isCommerciale || $isCaissier) { |
||||
|
$row = [ |
||||
|
$value['avance_id'], |
||||
|
number_format((int)$value['avance_amount'], 0, ',', ' '), |
||||
|
number_format((int)$value['amount_due'], 0, ',', ' '), |
||||
|
$date_time, |
||||
|
$buttons, |
||||
|
]; |
||||
|
$result['data'][] = $row; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function createAvance() |
||||
|
{ |
||||
|
$this->verifyRole('createAvance'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$validation = \Config\Services::validation(); |
||||
|
$products = $this->request->getPost('product'); |
||||
|
|
||||
|
// Unicité des produits |
||||
|
if ($products !== null && count($products) !== count(array_unique($products))) { |
||||
|
return redirect()->back()->withInput()->with('errors', ['product' => 'Chaque produit sélectionné doit être unique.']); |
||||
|
} |
||||
|
|
||||
|
// Règles de validation |
||||
|
$validation->setRules([ |
||||
|
'product' => 'required' |
||||
|
]); |
||||
|
|
||||
|
$validationData = ['product' => $products]; |
||||
|
$Avance = new Avance(); |
||||
|
$Products = new Products(); |
||||
|
$Notification = New NotificationController(); |
||||
|
|
||||
|
if ($this->request->getMethod() === 'post' && $validation->run($validationData)) { |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
|
||||
|
$data = [ |
||||
|
'customer_name' => $this->request->getPost('customer_name_avance'), |
||||
|
'customer_address' => $this->request->getPost('customer_address_avance'), |
||||
|
'customer_phone' => $this->request->getPost('customer_phone_avance'), |
||||
|
'customer_cin' => $this->request->getPost('customer_cin_avance'), |
||||
|
'avance_date' => date('Y-m-d H:i:s'), |
||||
|
'user_id' => $users['id'], |
||||
|
'store_id' => $users['store_id'], |
||||
|
'product_id' => $this->request->getPost('product_id'), |
||||
|
'gross_amount' => (float)$this->request->getPost('gross_amount_avance'), |
||||
|
'avance_amount' => (float)$this->request->getPost('avance_amount'), |
||||
|
'amount_due' => (float)$this->request->getPost('amount_due'), |
||||
|
]; |
||||
|
$posts = $products; |
||||
|
|
||||
|
if($avance_id = $Avance->createAvance($data)){ |
||||
|
$Notification->createNotification('Une avance a été créé', "Conseil",$users['store_id'], 'avance'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Avance créé avec succès !' |
||||
|
]); |
||||
|
} |
||||
|
else{ |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Une erreur est survenue lors de la création d\une avance !' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function updateAvance(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateAvance'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$Products = new Products(); |
||||
|
$Avance = new Avance(); |
||||
|
|
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
$data = [ |
||||
|
'customer_name' => $this->request->getPost('customer_name_avance'), |
||||
|
'customer_address'=> $this->request->getPost('customer_address_avance'), |
||||
|
'customer_phone' => $this->request->getPost('customer_phone_avance'), |
||||
|
'customer_cin' => $this->request->getPost('customer_cin_avance'), |
||||
|
'avance_amount' => (float)$this->request->getPost('avance_amount'), |
||||
|
'amount_due' => (float)$this->request->getPost('amount_due'), |
||||
|
]; |
||||
|
|
||||
|
if ($Avance->updates($id, $data)) { |
||||
|
session()->setFlashData('success', 'Avance mise à jour avec succès.'); |
||||
|
} else { |
||||
|
session()->setFlashData('errors', 'Une erreur est survenue lors de la mise à jour.'); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function remove() |
||||
|
{ |
||||
|
$this->verifyRole('deleteAvance'); |
||||
|
$avance_id = $this->request->getPost('avance_id'); |
||||
|
$response = []; |
||||
|
|
||||
|
$Avance = new Avance(); |
||||
|
if ($Avance->remove($avance_id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Avance Supprimé avec succès"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "une erreur est survenue lors de la suppression d'une avance"; |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function fetchSingleAvance($avance_id) |
||||
|
{ |
||||
|
$this->verifyRole('updateAvance'); |
||||
|
|
||||
|
try { |
||||
|
$avanceModel = new Avance(); |
||||
|
|
||||
|
$data = $avanceModel->fetchSingleAvance($avance_id); |
||||
|
|
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
catch (\Throwable $th) { |
||||
|
log_message('error', "Erreur lors de la récupération d'une avance: " . $th->getMessage()); |
||||
|
|
||||
|
return $this->response |
||||
|
->setStatusCode(500) |
||||
|
->setJSON(['error' => 'Une erreur interne est survenue. Lors de la création d\'une avance']); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,58 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use CodeIgniter\Controller; |
||||
|
use CodeIgniter\HTTP\CLIRequest; |
||||
|
use CodeIgniter\HTTP\IncomingRequest; |
||||
|
use CodeIgniter\HTTP\RequestInterface; |
||||
|
use CodeIgniter\HTTP\ResponseInterface; |
||||
|
use Psr\Log\LoggerInterface; |
||||
|
|
||||
|
/** |
||||
|
* Class BaseController |
||||
|
* |
||||
|
* BaseController provides a convenient place for loading components |
||||
|
* and performing functions that are needed by all your controllers. |
||||
|
* Extend this class in any new controllers: |
||||
|
* class Home extends BaseController |
||||
|
* |
||||
|
* For security be sure to declare any new methods as protected or private. |
||||
|
*/ |
||||
|
abstract class BaseController extends Controller |
||||
|
{ |
||||
|
/** |
||||
|
* Instance of the main Request object. |
||||
|
* |
||||
|
* @var CLIRequest|IncomingRequest |
||||
|
*/ |
||||
|
protected $request; |
||||
|
|
||||
|
/** |
||||
|
* An array of helpers to be loaded automatically upon |
||||
|
* class instantiation. These helpers will be available |
||||
|
* to all other controllers that extend BaseController. |
||||
|
* |
||||
|
* @var list<string> |
||||
|
*/ |
||||
|
protected $helpers = []; |
||||
|
|
||||
|
/** |
||||
|
* Be sure to declare properties for any property fetch you initialized. |
||||
|
* The creation of dynamic property is deprecated in PHP 8.2. |
||||
|
*/ |
||||
|
// protected $session; |
||||
|
|
||||
|
/** |
||||
|
* @return void |
||||
|
*/ |
||||
|
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) |
||||
|
{ |
||||
|
// Do Not Edit This Line |
||||
|
parent::initController($request, $response, $logger); |
||||
|
|
||||
|
// Preload any models, libraries, etc, here. |
||||
|
|
||||
|
// E.g.: $this->session = \Config\Services::session(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,203 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Brands; |
||||
|
|
||||
|
class BrandController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
// Assuming permission is being set from a session |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Brands'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewBrand'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$Brands = new Brands(); |
||||
|
|
||||
|
$result = $Brands->getBrandData(); |
||||
|
$data['results'] = $result; |
||||
|
// die(var_dump($data)); |
||||
|
return $this->render_template('brands/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchBrandData() |
||||
|
{ |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
// Load the model |
||||
|
$brandModel = new Brands(); |
||||
|
$data = $brandModel->getBrandData(); |
||||
|
|
||||
|
// Loop through the data |
||||
|
foreach ($data as $key => $value) { |
||||
|
// Action buttons |
||||
|
$buttons = ''; |
||||
|
|
||||
|
// Check permissions |
||||
|
if (in_array('viewBrand', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editBrand(' . $value['id'] . ')" data-bs-toggle="modal" data-bs-target="#editBrandModal"> |
||||
|
<i class="fa fa-pencil"></i> |
||||
|
</button>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('deleteBrand', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeBrand(' . $value['id'] . ')" data-bs-toggle="modal" data-bs-target="#removeBrandModal"> |
||||
|
<i class="fa fa-trash"></i> |
||||
|
</button>'; |
||||
|
} |
||||
|
|
||||
|
// Status |
||||
|
$status = ($value['active'] == 1) |
||||
|
? '<span class="label label-success">Active</span>' |
||||
|
: '<span class="label label-warning">Inactive</span>'; |
||||
|
|
||||
|
// Prepare the data for DataTable |
||||
|
$result['data'][$key] = [ |
||||
|
$value['name'], |
||||
|
$status, |
||||
|
$buttons, |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return as JSON response |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$this->verifyRole('createBrand'); |
||||
|
|
||||
|
$response = []; |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'brand_name' => 'required', |
||||
|
'active' => 'required', |
||||
|
]); |
||||
|
$validationData = [ |
||||
|
'brand_name' => $this->request->getPost('brand_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
$Brands = new Brands(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('brand_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
|
||||
|
if ($Brands->create($data)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Créé avec succès'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données lors de la création des informations sur la marque'; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public function fetchBrandDataById(int $id) |
||||
|
{ |
||||
|
$Brands = new Brands(); |
||||
|
if ($id) { |
||||
|
$data = $Brands->getBrandData($id); |
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function update(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateBrand'); |
||||
|
|
||||
|
$response = []; |
||||
|
|
||||
|
if ($id) { |
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'edit_brand_name' => 'required', |
||||
|
'edit_active' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'edit_brand_name' => $this->request->getPost('edit_brand_name'), |
||||
|
'edit_active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
$Brands = new Brands(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('edit_brand_name'), |
||||
|
'active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
if ($Brands->updateBrand($data, $id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Mis à jour avec succès'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données lors de la mise à jour des informations sur la marque'; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur, veuillez actualiser la page à nouveau !!'; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public function remove() |
||||
|
{ |
||||
|
$this->verifyRole('deleteBrand'); |
||||
|
$response = []; |
||||
|
|
||||
|
$brand_id = $this->request->getPost('brand_id'); |
||||
|
|
||||
|
if ($brand_id) { |
||||
|
$Brands = new Brands(); |
||||
|
|
||||
|
if ($Brands->delete($brand_id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Supprimé avec succès"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Erreur dans la base de données lors de la suppression des informations sur la marque"; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Référez à nouveau la page !!"; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Controllers\AdminController; |
||||
|
use App\Models\Caisse; |
||||
|
use App\Models\Orders; |
||||
|
use CodeIgniter\Controller; |
||||
|
class CaisseController extends AdminController{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
public function createCaisse(){ |
||||
|
$orderModel = new Orders(); |
||||
|
$paymentData = $orderModel->getPaymentModes(); |
||||
|
|
||||
|
// Initialisation des totaux avec 0 au cas où il n'y aurait pas de données |
||||
|
$total = isset($paymentData->total) ? $paymentData->total : 0; |
||||
|
$total_mvola1 = isset($paymentData->total_mvola1) ? $paymentData->total_mvola1 : 0; |
||||
|
$total_mvola2 = isset($paymentData->total_mvola2) ? $paymentData->total_mvola2 : 0; |
||||
|
$total_espece1 = isset($paymentData->total_espece1) ? $paymentData->total_espece1 : 0; |
||||
|
$total_espece2 = isset($paymentData->total_espece2) ? $paymentData->total_espece2 : 0; |
||||
|
$total_virement_bancaire1 = isset($paymentData->total_virement_bancaire1) ? $paymentData->total_virement_bancaire1 : 0; |
||||
|
$total_virement_bancaire2 = isset($paymentData->total_virement_bancaire2) ? $paymentData->total_virement_bancaire2 : 0; |
||||
|
// Calcul des totaux pour chaque mode de paiement |
||||
|
$total_mvola = $total_mvola1 + $total_mvola2; |
||||
|
$total_espece = $total_espece1 + $total_espece2; |
||||
|
$total_virement_bancaire = $total_virement_bancaire1 + $total_virement_bancaire2; |
||||
|
// Fusion des données dans la variable $data |
||||
|
$data = [ |
||||
|
'total' => $total, |
||||
|
'total_mvola' => $total_mvola, |
||||
|
'total_espece' => $total_espece, |
||||
|
'total_banque' => $total_virement_bancaire, |
||||
|
]; |
||||
|
$caisse = new Caisse(); |
||||
|
if($data) { |
||||
|
return $caisse->updateCaisse($data); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
<?php |
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
class CashController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
public function addInCash() |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,187 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Category; |
||||
|
|
||||
|
class CategoryController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
// Assuming permission is being set from a session |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Categorie'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewCategory'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
return $this->render_template('category/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchCategoryData() |
||||
|
{ |
||||
|
// Prepare the response array |
||||
|
$result = ['data' => []]; |
||||
|
$Category = new Category(); |
||||
|
// Get category data |
||||
|
$data = $Category->getCategoryData(); // Make sure this function exists in your CategoryModel |
||||
|
|
||||
|
// Iterate through each category and build the response |
||||
|
foreach ($data as $key => $value) { |
||||
|
|
||||
|
// Initialize button HTML |
||||
|
$buttons = ''; |
||||
|
|
||||
|
// Check if the user has permission to update |
||||
|
if (in_array('updateCategory', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['id'] . ')" data-toggle="modal" data-target="#editModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Check if the user has permission to delete |
||||
|
if (in_array('deleteCategory', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-default" onclick="removeFunc(' . $value['id'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Determine the status label |
||||
|
$status = ($value['active'] == 1) ? '<span class="label label-success">Active</span>' : '<span class="label label-warning">Inactive</span>'; |
||||
|
|
||||
|
// Add data to the result array |
||||
|
$result['data'][] = [ |
||||
|
$value['name'], |
||||
|
$status, |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return the result as JSON |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$this->verifyRole('createCategory'); |
||||
|
$response = []; |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'category_name' => 'required', |
||||
|
'active' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'category_name' => $this->request->getPost('category_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
$Category = new Category(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('category_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
if ($Category->create($data)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Créé avec succès'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données lors de la création des informations sur la marque'; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function fetchCategoryDataById(int $id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
$Category = new Category(); |
||||
|
$data = $Category->getCategoryData($id); |
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function update(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateCategory'); |
||||
|
$response = []; |
||||
|
|
||||
|
if ($id) { |
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'edit_category_name' => 'required', |
||||
|
'edit_active' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'edit_category_name' => $this->request->getPost('edit_category_name'), |
||||
|
'edit_active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
$Category = new Category(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('edit_category_name'), |
||||
|
'active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
if ($Category->updateCategory($data, $id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Mis à jour avec succès'; |
||||
|
} |
||||
|
else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données lors de la mise à jour des informations sur la marque'; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur, veuillez actualiser la page à nouveau !!'; |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function remove() |
||||
|
{ |
||||
|
$this->verifyRole('deleteCategory'); |
||||
|
$category_id = $this->request->getPost('category_id'); |
||||
|
|
||||
|
$response = []; |
||||
|
|
||||
|
if ($category_id) { |
||||
|
$Category = new Category(); |
||||
|
|
||||
|
if ($Category->remove($category_id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Supprimé avec succès"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Erreur dans la base de données lors de la suppression des informations sur la marque"; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Erreur, veuillez actualiser la page à nouveau !!"; |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,68 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Company; |
||||
|
|
||||
|
class CompanyController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Company'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('updateCompany'); |
||||
|
|
||||
|
// Validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
$validation->setRules([ |
||||
|
'company_name' => 'trim|required', |
||||
|
'service_charge_value' => 'trim|integer', |
||||
|
'vat_charge_value' => 'trim|integer', |
||||
|
'address' => 'trim|required', |
||||
|
'message' => 'trim|required', |
||||
|
]); |
||||
|
|
||||
|
$Company = new Company(); |
||||
|
// die(var_dump($validation->getErrors())); |
||||
|
if ($this->request->getMethod() == 'post' && $validation->withRequest($this->request)->run()) { |
||||
|
// If the form is valid |
||||
|
$data = [ |
||||
|
'company_name' => $this->request->getPost('company_name'), |
||||
|
'service_charge_value' => $this->request->getPost('service_charge_value'), |
||||
|
'vat_charge_value' => $this->request->getPost('vat_charge_value'), |
||||
|
'address' => $this->request->getPost('address'), |
||||
|
'phone' => $this->request->getPost('phone'), |
||||
|
'phone2' => $this->request->getPost('phone2'), |
||||
|
'NIF' => $this->request->getPost('nif'), |
||||
|
'STAT' => $this->request->getPost('stat'), |
||||
|
'country' => $this->request->getPost('country'), |
||||
|
'message' => $this->request->getPost('message'), |
||||
|
'currency' => $this->request->getPost('currency'), |
||||
|
]; |
||||
|
|
||||
|
if ($Company->updateCompany($data, 1)) { |
||||
|
session()->setFlashdata('success', 'Successfully updated'); |
||||
|
return redirect()->to('/company'); |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Error occurred!'); |
||||
|
return redirect()->to('/company/index'); |
||||
|
} |
||||
|
} else { |
||||
|
// If the form is invalid |
||||
|
$data = [ |
||||
|
'currency_symbols' => $this->currency(), |
||||
|
'company_data' => $Company->getCompanyData(1), |
||||
|
'page_title' => $this->pageTitle, |
||||
|
'validation_errors' => $validation->getErrors() // Pass the Validation object |
||||
|
]; |
||||
|
|
||||
|
return $this->render_template('company/index', $data); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,189 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Avance; |
||||
|
use App\Models\Brands; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\Stores; |
||||
|
use App\Models\Users; |
||||
|
use App\Models\Recouvrement; |
||||
|
use App\Models\SortieCaisse; |
||||
|
class Dashboard extends AdminController |
||||
|
{ |
||||
|
|
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$productModel = new Products(); |
||||
|
$orderModel = new Orders(); |
||||
|
$userModel = new Users(); |
||||
|
$storeModel = new Stores(); |
||||
|
$Brancds = new Brands(); |
||||
|
$allUsers = $userModel->getUserData(); |
||||
|
$orderPaid = $orderModel->getPaidOrderData(); |
||||
|
$paymentData = $orderModel->getPaymentModes(); |
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
$totalRecouvrement = $Recouvrement->getTotalRecouvrements(); |
||||
|
$sortieCaisse = new SortieCaisse(); |
||||
|
$total_sortie_caisse = $sortieCaisse->getTotalSortieCaisse(); |
||||
|
$total_sortie_caisse1= $total_sortie_caisse->mr; |
||||
|
// dd($totalRecouvrement); |
||||
|
$total_recouvrement_me = $totalRecouvrement->me; |
||||
|
$total_recouvrement_bm = $totalRecouvrement->bm; |
||||
|
$total_recouvrement_be = $totalRecouvrement->be; |
||||
|
$total_recouvrement_mb = $totalRecouvrement->mb; |
||||
|
// total avance |
||||
|
$Avance = new Avance(); |
||||
|
$totalAvance = $Avance->getTotalAvance(); |
||||
|
$total_avance = $totalAvance->ta; |
||||
|
// Initialisation des totaux avec 0 au cas où il n'y aurait pas de données |
||||
|
$total = isset($paymentData->total) ? $paymentData->total : 0; |
||||
|
$total_mvola1 = isset($paymentData->total_mvola1) ? $paymentData->total_mvola1 : 0; |
||||
|
$total_mvola2 = isset($paymentData->total_mvola2) ? $paymentData->total_mvola2 : 0; |
||||
|
$total_espece1 = isset($paymentData->total_espece1) ? $paymentData->total_espece1 : 0; |
||||
|
$total_espece2 = isset($paymentData->total_espece2) ? $paymentData->total_espece2 : 0; |
||||
|
$total_virement_bancaire1 = isset($paymentData->total_virement_bancaire1) ? $paymentData->total_virement_bancaire1 : 0; |
||||
|
$total_virement_bancaire2 = isset($paymentData->total_virement_bancaire2) ? $paymentData->total_virement_bancaire2 : 0; |
||||
|
|
||||
|
$total_mvola = $total_mvola1 + $total_mvola2; |
||||
|
$total_mvola1 = $total_mvola - $total_recouvrement_me - $total_recouvrement_mb + $total_recouvrement_bm; |
||||
|
|
||||
|
$total_espece = $total_espece1 + $total_espece2; |
||||
|
$total_espece1 = $total_espece + $total_recouvrement_me + $total_recouvrement_be - $total_sortie_caisse1 + $total_avance; |
||||
|
|
||||
|
//die("Test Stephane " . $total_recouvrement_me); |
||||
|
$total_virement_bancaire = $total_virement_bancaire1 + $total_virement_bancaire2; |
||||
|
$total_virement_bancaire1 = $total_virement_bancaire - $total_recouvrement_be -$total_recouvrement_bm + $total_recouvrement_mb; |
||||
|
|
||||
|
// check avance expired |
||||
|
$avance = new Avance(); |
||||
|
$avance->checkExpiredAvance(); |
||||
|
|
||||
|
$data = [ |
||||
|
'total' => $total, |
||||
|
'total_mvola' => $total_mvola1, |
||||
|
'total_espece' => $total_espece1, |
||||
|
'total_virement_bancaire' => $total_virement_bancaire1, |
||||
|
'user_permission' => $this->permission, |
||||
|
|
||||
|
]; |
||||
|
|
||||
|
$data['total_products'] = $productModel->countTotalProducts(); |
||||
|
$data['total_paid_orders'] = $orderModel->countTotalPaidOrders(); |
||||
|
$data['total_users'] = $userModel->countTotalUsers(); |
||||
|
$data['total_stores'] = $storeModel->countTotalStores(); |
||||
|
|
||||
|
|
||||
|
$newData = []; |
||||
|
for ($i=0; $i < count($orderPaid); $i++) { |
||||
|
$transitionData = []; |
||||
|
for ($k=0; $k < count($allUsers); $k++) { |
||||
|
if ($allUsers[$k]['id'] == $orderPaid[$i]['user_id']) { |
||||
|
$transitionData2 = [ |
||||
|
'userId' => $allUsers[$k]['id'], |
||||
|
'userName' => $allUsers[$k]['username'], |
||||
|
'billId' => $orderPaid[$i]['id'], |
||||
|
'billNo' => $orderPaid[$i]['bill_no'], |
||||
|
'dateVente' => $orderPaid[$i]['date_time'], |
||||
|
'montantNet' => $orderPaid[$i]['net_amount'], |
||||
|
]; |
||||
|
$transitionData[] = $transitionData2; |
||||
|
} |
||||
|
} |
||||
|
$newData[] = $transitionData; |
||||
|
} |
||||
|
|
||||
|
//data for the camember in dashboard |
||||
|
$totalStoreOrder = $orderModel->getTotalOrderPerStore(); |
||||
|
$totalOrders = $orderModel->getTotalOrders(); |
||||
|
$totalOrdersCount = (int) $totalOrders->total_orders; |
||||
|
if($totalOrdersCount>0){ |
||||
|
foreach ($totalStoreOrder as $totalOrdersInStore) { |
||||
|
$storeList = $storeModel->getStoreById($totalOrdersInStore->store_id); |
||||
|
$labelStore[] = $storeList->name ?? 'Inconnu'; |
||||
|
$totalPerStore[] = ((int)$totalOrdersInStore->total / $totalOrdersCount) * 100; |
||||
|
} |
||||
|
} |
||||
|
else{ |
||||
|
$labelStore[] = "zéro vente"; |
||||
|
$totalPerStore[] = 0; |
||||
|
} |
||||
|
$data['labelStore'] = json_encode($labelStore); |
||||
|
$data['totalPerStore'] = json_encode($totalPerStore); |
||||
|
|
||||
|
// filter to keep non empty array |
||||
|
$filteredArray = array_filter($newData, function($item) { |
||||
|
return !empty($item); // Keep only non-empty arrays |
||||
|
}); |
||||
|
|
||||
|
// Re-index the array (optional, if you want sequential keys) |
||||
|
$userWhoSoldProducts = array_values($filteredArray); |
||||
|
|
||||
|
// Count occurrences of each userId |
||||
|
$userIdCounts = array_reduce($userWhoSoldProducts, function($carry, $item) { |
||||
|
$userId = $item[0]['userId']; |
||||
|
if (!isset($carry[$userId])) { |
||||
|
$carry[$userId] = 0; |
||||
|
} |
||||
|
$carry[$userId]++; |
||||
|
return $carry; |
||||
|
}, []); |
||||
|
|
||||
|
$countId = []; |
||||
|
foreach ($userIdCounts as $key => $value) { |
||||
|
$countId[] = $key; |
||||
|
} |
||||
|
|
||||
|
$data['count_id'] = $countId; |
||||
|
// Check if the user is an Conseil |
||||
|
$session = session(); |
||||
|
$user_id = $session->get('user'); |
||||
|
$data['is_admin'] = false; |
||||
|
$data['isCommercial'] = false; |
||||
|
$data['isChef'] = false; |
||||
|
$data['isCaissier'] = false; |
||||
|
$data['isMecanicien'] = false; |
||||
|
if ($user_id['group_name'] == "Direction" || $user_id['group_name'] == "Conseil") { |
||||
|
$data['is_admin'] = true; |
||||
|
} |
||||
|
|
||||
|
$data['user_order'] = []; |
||||
|
|
||||
|
if ($user_id['group_name'] == \strtoupper("commerciale")) { |
||||
|
$data['isCommercial'] = true; |
||||
|
$data['user_order'] = json_encode($orderModel->getSingleStat($user_id['id']), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP); |
||||
|
} |
||||
|
if ($user_id['group_name'] == "Cheffe d'Agence") { |
||||
|
$data['isChef'] = true; |
||||
|
} |
||||
|
if ($user_id['group_name'] == "Caissière") { |
||||
|
$data['isCaissier'] = true; |
||||
|
} |
||||
|
if ($user_id['group_name'] == "MECANICIEN") { |
||||
|
$data['isMecanicien'] = true; |
||||
|
} |
||||
|
$data['page_title'] = 'Dashboard'; |
||||
|
$data['marques_total'] = json_encode($orderModel->getTotalProductvente()); |
||||
|
$data['marques'] = json_encode($Brancds->getName()); |
||||
|
$Orders = new Orders(); |
||||
|
$Products = new Products(); |
||||
|
$Stores = new Stores(); |
||||
|
$productVente = $Orders->getTotalProductvente(); |
||||
|
$produitStock = $Products->getProductData(); |
||||
|
$stor = $Stores->getActiveStore(); |
||||
|
|
||||
|
$data['ventes'] = \json_encode($productVente); |
||||
|
$data['stock'] = \json_encode($produitStock); |
||||
|
$data['stores'] = $stor; |
||||
|
|
||||
|
// Load the dashboard view with the data |
||||
|
return $this->render_template('dashboard', $data); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,174 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Groups; |
||||
|
|
||||
|
class GroupController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
// Assuming permission is being set from a session |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Groups'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewGroup'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$Groups = new Groups(); |
||||
|
$data['groups_data'] = $Groups->getGroupData(); |
||||
|
|
||||
|
return $this->render_template('groups/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$this->verifyRole('createGroup'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation->setRules([ |
||||
|
'group_name' => [ |
||||
|
'label' => 'Group name', |
||||
|
'rules' => 'required', |
||||
|
'errors' => [ |
||||
|
'required' => 'The {field} field is required.' |
||||
|
] |
||||
|
] |
||||
|
]); |
||||
|
|
||||
|
// Check if form validation is successful |
||||
|
if ($this->request->getMethod() == 'post') { |
||||
|
|
||||
|
if ($validation->withRequest($this->request)->run()) { |
||||
|
|
||||
|
$permission = serialize($this->request->getPost('permission')); |
||||
|
$data = [ |
||||
|
'group_name' => $this->request->getPost('group_name'), |
||||
|
'permission' => $permission |
||||
|
]; |
||||
|
|
||||
|
$groupsModel = new Groups(); // Load Groups model |
||||
|
$create = $groupsModel->createGroup($data); |
||||
|
// die(var_dump($create)); |
||||
|
|
||||
|
if ($create) { |
||||
|
session()->setFlashdata('success', 'Creation réussie'); |
||||
|
return redirect()->to('/groups'); |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Une erreur est survenue !!'); |
||||
|
return redirect()->to('/groups/create'); |
||||
|
} |
||||
|
} else { |
||||
|
// If validation fails, load the form with validation errors |
||||
|
$data['validation'] = $validation; |
||||
|
|
||||
|
return $this->render_template('groups/create', $data); // Render the create view |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
|
||||
|
return $this->render_template('groups/create', $data); // Render the create view |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function edit($id = null) |
||||
|
{ |
||||
|
$this->verifyRole('updateGroup'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$groupsModel = new Groups(); |
||||
|
|
||||
|
if ($id) { |
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
$validation->setRules([ |
||||
|
'group_name' => 'required', |
||||
|
]); |
||||
|
|
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
|
||||
|
if ($validation->withRequest($this->request)->run()) { |
||||
|
// Validation passed |
||||
|
$permission = serialize($this->request->getPost('permission')); |
||||
|
|
||||
|
$data = [ |
||||
|
'group_name' => $this->request->getPost('group_name'), |
||||
|
'permission' => $permission, |
||||
|
]; |
||||
|
// die(var_dump($groupsModel->editGroup($data, $id))); |
||||
|
// Update group |
||||
|
if ($groupsModel->editGroup($data, $id)) { |
||||
|
session()->setFlashdata('success', 'Mise à jour réussie'); |
||||
|
return redirect()->to('/groups'); |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Une erreur est survenue !!'); |
||||
|
return redirect()->to("/groups/edit/{$id}"); |
||||
|
} |
||||
|
} else { |
||||
|
// If validation fails, load the form with validation errors |
||||
|
$data['validation'] = $validation; |
||||
|
|
||||
|
return $this->render_template('groups/create', $data); // Render the create view |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
// Validation failed or no POST request |
||||
|
$groupData = $groupsModel->find($id); // Fetch group data |
||||
|
if (!$groupData) { |
||||
|
session()->setFlashdata('errors', 'Group pas trouver!'); |
||||
|
return redirect()->to('/groups'); |
||||
|
} |
||||
|
|
||||
|
$data['group_data'] = $groupData; |
||||
|
// die(var_dump($data)); |
||||
|
return $this->render_template('groups/edit', $data); |
||||
|
} |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Group ID ne correspond pas!'); |
||||
|
return redirect()->to('/groups'); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function delete(int $id = null) |
||||
|
{ |
||||
|
$this->verifyRole('deleteGroup'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
$groupsModel = new Groups(); |
||||
|
|
||||
|
if ($id) { |
||||
|
if ($this->request->getMethod() === 'post' && $this->request->getPost('confirm')) { |
||||
|
// Check if the group exists in the user group |
||||
|
$check = $groupsModel->existInUserGroup($id); |
||||
|
if ($check) { |
||||
|
session()->setFlashdata('error', 'Group exists in the users'); |
||||
|
return redirect()->to('/groups'); |
||||
|
} else { |
||||
|
// Delete group |
||||
|
if ($groupsModel->delete($id)) { |
||||
|
session()->setFlashdata('success', 'Successfully removed'); |
||||
|
return redirect()->to('/groups'); |
||||
|
} else { |
||||
|
session()->setFlashdata('error', 'Error occurred!!'); |
||||
|
return redirect()->to("/groups/delete/{$id}"); |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
// Show confirmation view |
||||
|
$data['id'] = $id; |
||||
|
return $this->render_template('groups/delete', $data); |
||||
|
} |
||||
|
} else { |
||||
|
session()->setFlashdata('error', 'Invalid Group ID!'); |
||||
|
return redirect()->to('/groups'); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,368 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Mecanicien; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\Users; |
||||
|
|
||||
|
class MecanicienController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Mécanicien'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$session = session(); |
||||
|
$user_id = $session->get('user'); |
||||
|
// if($user_id CONTAINS MECANICIEN) |
||||
|
// is mecanicien true |
||||
|
$data['id'] = $user_id['id']; |
||||
|
$Products = new Products(); |
||||
|
$Users = new Users(); |
||||
|
|
||||
|
$data['moto'] = $Products->getActiveProductData(); |
||||
|
$data['users'] = $Users->getUsers(); |
||||
|
|
||||
|
return $this->render_template('mecanicien/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchmecanicienSingle($id) |
||||
|
{ |
||||
|
// die(var_dump($id)); |
||||
|
if ($id) { |
||||
|
$Mecanicien = new Mecanicien(); |
||||
|
|
||||
|
$data = $Mecanicien->getReparationSingle($id); |
||||
|
echo json_encode($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchMecanicien() |
||||
|
{ |
||||
|
$Mecanicien = new Mecanicien(); |
||||
|
$session = session(); |
||||
|
$user_id = $session->get('user'); |
||||
|
|
||||
|
$data['id'] = $user_id['id']; |
||||
|
$reparation = $Mecanicien->getReparation($data['id']); |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
function strReparation($repastatus) |
||||
|
{ |
||||
|
$reparation = ''; |
||||
|
if ($repastatus == 1) { |
||||
|
$reparation = 'En cours de réparation'; |
||||
|
} else if ($repastatus == 2) { |
||||
|
$reparation = 'Réparer'; |
||||
|
} else { |
||||
|
$reparation = 'Non réparer'; |
||||
|
} |
||||
|
|
||||
|
return $reparation; |
||||
|
} |
||||
|
|
||||
|
// Iterate through the data |
||||
|
foreach ($reparation as $key => $repa) { |
||||
|
// Action buttons |
||||
|
$buttons = ''; |
||||
|
// dd($repa['reparationsID']); |
||||
|
// Check permissions for updating the store |
||||
|
if (in_array('updateMecanicien', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $repa['reparationsID'] . ')" data-toggle="modal" data-target="#editModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Check permissions for deleting the store |
||||
|
if (in_array('deleteMecanicien', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeFunc(' . $repa['reparationsID'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
$image = '<img src="' . base_url('assets/images/product_image/' . $repa['image']) . '" alt="' . $repa['name'] . '" class="img-circle" width="50" height="50" />'; |
||||
|
$produit = $repa['sku']; |
||||
|
// Status display |
||||
|
$status = strReparation($repa['reparation_statut']); |
||||
|
$username = $repa['username']; |
||||
|
|
||||
|
$observation = $repa['reparation_observation']; |
||||
|
$date_debut = date("d/m/Y", strtotime($repa['reparation_debut'])); |
||||
|
$date_fin = date("d/m/Y", strtotime($repa['reparation_fin'])); |
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$image, |
||||
|
$produit, |
||||
|
$username, |
||||
|
$status, |
||||
|
$observation, |
||||
|
$date_debut, |
||||
|
$date_fin, |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function fetchMecanicien_1(int $id) |
||||
|
{ |
||||
|
$Mecanicien = new Mecanicien(); |
||||
|
|
||||
|
$reparation = $Mecanicien->getReparation($id); |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
// die(var_dump($reparation)); |
||||
|
// Iterate through the data |
||||
|
foreach ($reparation as $key => $repa) { |
||||
|
// Action buttons |
||||
|
$buttons = ''; |
||||
|
// dd($repa['reparationsID']); |
||||
|
// Check permissions for updating the store |
||||
|
if (in_array('updateMecanicien', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $repa['reparationsID'] . ')" data-toggle="modal" data-target="#editModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Check permissions for deleting the store |
||||
|
if (in_array('deleteMecanicien', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeFunc(' . $repa['reparationsID'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
$image = '<img src="' . base_url('assets/images/product_image/' . $repa['image']) . '" alt="' . $repa['name'] . '" class="img-circle" width="50" height="50" />'; |
||||
|
$produit = $repa['name']; |
||||
|
// Status display |
||||
|
$status = $repa['reparation_statut']; |
||||
|
$username = $repa['username']; |
||||
|
|
||||
|
$observation = $repa['reparation_observation']; |
||||
|
$date_debut = date("d/m/Y", strtotime($repa['reparation_debut'])); |
||||
|
$date_fin = date("d/m/Y", strtotime($repa['reparation_fin'])); |
||||
|
|
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$image, |
||||
|
$produit, |
||||
|
$username, |
||||
|
$status, |
||||
|
$observation, |
||||
|
$date_debut, |
||||
|
$date_fin, |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$this->verifyRole('createMecanicien'); |
||||
|
$response = []; |
||||
|
$data = []; |
||||
|
|
||||
|
$validation = \Config\Services::validation(); |
||||
|
$validation->setRules([ |
||||
|
'motos' => 'required', |
||||
|
'mecano' => 'required', |
||||
|
'statut' => 'required', |
||||
|
'observation' => 'required', |
||||
|
'date_debut' => 'required', |
||||
|
'date_fin' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'motos' => $this->request->getPost('motos'), |
||||
|
'mecano' => $this->request->getPost('mecano'), |
||||
|
'statut' => $this->request->getPost('statut'), |
||||
|
'observation' => $this->request->getPost('observation'), |
||||
|
'date_debut' => $this->request->getPost('date_debut'), |
||||
|
'date_fin' => $this->request->getPost('date_fin'), |
||||
|
]; |
||||
|
|
||||
|
// Run validation |
||||
|
if ($validation->run($validationData)) { |
||||
|
// // Prepare data |
||||
|
$data = [ |
||||
|
'user_id' => $this->request->getPost('mecano'), |
||||
|
'produit_id' => $this->request->getPost('motos'), |
||||
|
'reparation_observation' => $this->request->getPost('observation'), |
||||
|
'reparation_statut' => $this->request->getPost('statut'), |
||||
|
'reparation_debut' => $this->request->getPost('date_debut'), |
||||
|
'reparation_fin' => $this->request->getPost('date_fin'), |
||||
|
]; |
||||
|
|
||||
|
// Load the model and create the store |
||||
|
$Mecanicien = new Mecanicien(); |
||||
|
if ($Mecanicien->createRepation($data)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Créé avec succès'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur de base de données'; |
||||
|
} |
||||
|
} else { |
||||
|
// Validation failed, return error messages |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function delete() |
||||
|
{ |
||||
|
$this->verifyRole('deleteMecanicien'); |
||||
|
$response = []; |
||||
|
|
||||
|
$reparation_id = $this->request->getPost('reparation_id'); |
||||
|
|
||||
|
if ($reparation_id) { |
||||
|
$Mecanicien = new Mecanicien(); |
||||
|
|
||||
|
if ($Mecanicien->delete($reparation_id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Supprimé avec succès"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Erreur dans la base de données lors de la suppression des informations sur la marque"; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Référez à nouveau la page !!"; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function update(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateMecanicien'); |
||||
|
$response = []; |
||||
|
|
||||
|
if ($id) { |
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'motos_edit' => 'required', |
||||
|
'mecano' => 'required', |
||||
|
'statut_edit' => 'required', |
||||
|
'observation_edit' => 'required', |
||||
|
'date_debut_edit' => 'required', |
||||
|
'date_fin_edit' => 'required', |
||||
|
]); |
||||
|
$statutList = [ |
||||
|
"1" => "En cours de réparation", |
||||
|
"2" => "Reparé", |
||||
|
"3" => "Non reparé" |
||||
|
]; |
||||
|
$statut = $this->request->getPost('statut'); |
||||
|
$validationData = [ |
||||
|
'motos_edit' => $this->request->getPost('motos'), |
||||
|
'mecano' => $this->request->getPost('mecano'), |
||||
|
'statut_edit' => $statutList[$statut], |
||||
|
'observation_edit' => $this->request->getPost('observation'), |
||||
|
'date_debut_edit' => $this->request->getPost('date_debut'), |
||||
|
'date_fin_edit' => $this->request->getPost('date_fin'), |
||||
|
]; |
||||
|
|
||||
|
$Mecanicien = new Mecanicien(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
|
||||
|
$data = [ |
||||
|
'user_id' => $this->request->getPost('mecano'), |
||||
|
'produit_id' => $this->request->getPost('motos'), |
||||
|
'reparation_statut' => (int) $this->request->getPost('statut'), |
||||
|
'reparation_observation' => $this->request->getPost('observation'), |
||||
|
'reparation_debut' => $this->request->getPost('date_debut'), |
||||
|
'reparation_fin' => $this->request->getPost('date_fin'), |
||||
|
]; |
||||
|
// echo '<pre>'; |
||||
|
// die(var_dump($data)); |
||||
|
|
||||
|
if ($Mecanicien->updateReparation($data, $id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Mise à jour réussie'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données'; |
||||
|
} |
||||
|
} else { |
||||
|
// Validation failed, return error messages |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur, veuillez actualiser la page à nouveau !!'; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function fetchMecanicienPerformances() |
||||
|
{ |
||||
|
$Mecanicien = new Mecanicien(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
|
||||
|
$data['id'] = $users['id']; |
||||
|
$reparation = $Mecanicien->getReparation($data['id']); |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
|
||||
|
// Iterate through the data |
||||
|
if($users['group_name'] == "Conseil" || $users['group_name'] == "Direction"){ |
||||
|
foreach ($reparation as $key => $repa) { |
||||
|
$image = '<img src="' . base_url('assets/images/product_image/' . $repa['image']) . '" alt="' . $repa['name'] . '" class="img-circle" width="50" height="50" />'; |
||||
|
$produit = esc($repa['name']); |
||||
|
$first_name = esc($repa['firstname']); |
||||
|
$last_name = esc($repa['lastname']); |
||||
|
$user_name = $first_name . ' ' . $last_name; |
||||
|
$date_debut = date("d/m/Y", strtotime($repa['reparation_debut'])); |
||||
|
$date_fin = date("d/m/Y", strtotime($repa['reparation_fin'])); |
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$user_name, |
||||
|
$image, |
||||
|
$produit, |
||||
|
$repa['sku'], |
||||
|
$date_debut, |
||||
|
$date_fin, |
||||
|
]; |
||||
|
} |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
else{ |
||||
|
foreach ($reparation as $key => $repa) { |
||||
|
$image = '<img src="' . base_url('assets/images/product_image/' . $repa['image']) . '" alt="' . $repa['name'] . '" class="img-circle" width="50" height="50" />'; |
||||
|
$produit = $repa['name']; |
||||
|
// Status display |
||||
|
$username = $repa['username']; |
||||
|
|
||||
|
$date_debut = date("d/m/Y", strtotime($repa['reparation_debut'])); |
||||
|
$date_fin = date("d/m/Y", strtotime($repa['reparation_fin'])); |
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$image, |
||||
|
$produit, |
||||
|
$repa['sku'], |
||||
|
$date_debut, |
||||
|
$date_fin, |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
// Iterate through the data |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Notification; |
||||
|
|
||||
|
class NotificationController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
public function getNotification() |
||||
|
{ |
||||
|
$Notification = new Notification(); |
||||
|
|
||||
|
$notifications = $Notification->getNotifications(); |
||||
|
|
||||
|
return $this->response->setJSON($notifications); |
||||
|
} |
||||
|
|
||||
|
public function markAsRead(int $id) |
||||
|
{ |
||||
|
$Notification = new Notification(); |
||||
|
$Notification->markAsRead($id); |
||||
|
|
||||
|
return $this->response->setJSON(['status' => 'success']); |
||||
|
} |
||||
|
|
||||
|
public function createNotification(string $message, string $group, ?int $store_id, ?string $link) |
||||
|
{ |
||||
|
$Notification = new Notification(); |
||||
|
|
||||
|
$data = [ |
||||
|
'message' => $message, |
||||
|
'is_read' => 0, |
||||
|
'forgroup' => $group, |
||||
|
'store_id' => $store_id, |
||||
|
'link' => $link, |
||||
|
'created_at' => date('Y-m-d H:i:s') |
||||
|
]; |
||||
|
|
||||
|
$Notification->insertNotification($data); |
||||
|
} |
||||
|
} |
||||
File diff suppressed because it is too large
@ -0,0 +1,156 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Controllers\AdminController; |
||||
|
use App\Models\OrderItems; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\Recouvrement; |
||||
|
|
||||
|
|
||||
|
class PerformanceController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Performance'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewPerformance'); |
||||
|
|
||||
|
$data = [ |
||||
|
'user_permission' => $this->permission, |
||||
|
'page_title' => $this->pageTitle |
||||
|
]; |
||||
|
|
||||
|
$this->render_template('performance/index', $data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
public function fetchPerformanceData() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
|
||||
|
$Orders = new Orders(); |
||||
|
$OrderItems = new OrderItems(); |
||||
|
$Products = new Products(); |
||||
|
|
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
$date = $this->request->getGet('date'); // format: YYYY-MM-DD / YYYY-W## / YYYY-MM |
||||
|
$type = $this->request->getGet('type'); // 'day', 'week', 'month' |
||||
|
|
||||
|
if (!$type || !$date) { |
||||
|
$type = 'day'; |
||||
|
$date = date('Y-m-d'); |
||||
|
} |
||||
|
|
||||
|
// Déterminer les données à récupérer |
||||
|
if ($type === 'day') { |
||||
|
$performance_data = $Orders->getUserPerformanceToday($date); |
||||
|
} elseif ($type === 'week') { |
||||
|
$performance_data = $Orders->getUserPerformanceByWeek($date); |
||||
|
} elseif ($type === 'month') { |
||||
|
$performance_data = $Orders->getUserPerformanceByMonth($date); |
||||
|
} else { |
||||
|
$performance_data = []; |
||||
|
} |
||||
|
|
||||
|
$totalOrdersAllUsers = 0; |
||||
|
$totalSalesAllUsers = 0; |
||||
|
$totalProductPricesAllUsers = 0; |
||||
|
$data = []; |
||||
|
|
||||
|
foreach ($performance_data as $value) { |
||||
|
$userId = $value['user_id']; |
||||
|
$userName = $value['full_name']; |
||||
|
$orders = (int) $value['total_user_order']; |
||||
|
$sales = (float) $value['total_prix_vente']; |
||||
|
$orderIds = $value['order_ids'] ?? []; |
||||
|
|
||||
|
$productIds = $OrderItems->getProductIds($orderIds); |
||||
|
$totalProductPrice = $Products->getTotalProductPriceByIds($productIds); |
||||
|
|
||||
|
$totalOrdersAllUsers += $orders; |
||||
|
$totalSalesAllUsers += $sales; |
||||
|
$totalProductPricesAllUsers += $totalProductPrice; |
||||
|
|
||||
|
|
||||
|
$data[] = [ |
||||
|
$userName, |
||||
|
number_format($orders, 0, '.', ' '), |
||||
|
number_format($sales - $totalProductPrice, 0, '.', ' ') . ' Ar' |
||||
|
]; |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON([ |
||||
|
'data' => $data |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
public function fetchTotalPerformanceData() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
|
||||
|
$Orders = new Orders(); |
||||
|
$OrderItems = new OrderItems(); |
||||
|
$Products = new Products(); |
||||
|
|
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
$date = $this->request->getGet('date'); // format: YYYY-MM-DD / YYYY-W## / YYYY-MM |
||||
|
$type = $this->request->getGet('type'); // 'day', 'week', 'month' |
||||
|
|
||||
|
if (!$type || !$date) { |
||||
|
$type = 'day'; |
||||
|
$date = date('Y-m-d'); |
||||
|
} |
||||
|
|
||||
|
// Déterminer les données à récupérer |
||||
|
if ($type === 'day') { |
||||
|
$performance_data = $Orders->getUserPerformanceToday($date); |
||||
|
} elseif ($type === 'week') { |
||||
|
$performance_data = $Orders->getUserPerformanceByWeek($date); |
||||
|
} elseif ($type === 'month') { |
||||
|
$performance_data = $Orders->getUserPerformanceByMonth($date); |
||||
|
} else { |
||||
|
$performance_data = []; |
||||
|
} |
||||
|
|
||||
|
$totalOrdersAllUsers = 0; |
||||
|
$totalSalesAllUsers = 0; |
||||
|
$totalProductPricesAllUsers = 0; |
||||
|
$data = []; |
||||
|
|
||||
|
foreach ($performance_data as $value) { |
||||
|
$userId = $value['user_id']; |
||||
|
$userName = $value['full_name']; |
||||
|
$orders = (int) $value['total_user_order']; |
||||
|
$sales = (float) $value['total_prix_vente']; |
||||
|
$orderIds = $value['order_ids'] ?? []; |
||||
|
|
||||
|
$productIds = $OrderItems->getProductIds($orderIds); |
||||
|
$totalProductPrice = (float) $Products->getTotalProductPriceByIds($productIds); |
||||
|
|
||||
|
$totalOrdersAllUsers += $orders; |
||||
|
$totalSalesAllUsers += $sales; |
||||
|
$totalProductPricesAllUsers += $totalProductPrice; |
||||
|
|
||||
|
$data = [ |
||||
|
"total_commande"=> $orders, |
||||
|
"total_benefice"=> number_format($totalSalesAllUsers - $totalProductPricesAllUsers, 0, '.', ' '), |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
@ -0,0 +1,588 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Attributes; |
||||
|
use App\Models\Brands; |
||||
|
use App\Models\Category; |
||||
|
use App\Models\FourchettePrix; |
||||
|
use App\Models\Notification; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\Stores; |
||||
|
use Config\Services; |
||||
|
use PhpOffice\PhpSpreadsheet\IOFactory; |
||||
|
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; |
||||
|
|
||||
|
class ProductCOntroller extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
// Assuming permission is being set from a session |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
private $pageTitle = 'Produits'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$Stores = new Stores(); |
||||
|
$this->verifyRole('viewProduct'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
$Product = new Products(); |
||||
|
$data['motos'] = $Product->getActiveProductData(); |
||||
|
$data['stores'] = $Stores->getActiveStore(); |
||||
|
return $this->render_template('products/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function assign_store() |
||||
|
{ |
||||
|
// Vérifie que la requête est bien une requête AJAX |
||||
|
if (!$this->request->isAJAX()) { |
||||
|
$response = Services::response(); |
||||
|
$response->setStatusCode(404, 'Page Not Found')->send(); |
||||
|
exit; |
||||
|
} |
||||
|
|
||||
|
// Récupère les données POST sous format JSON |
||||
|
$data = $this->request->getJSON(true); // Décodage en tableau associatif |
||||
|
|
||||
|
|
||||
|
if (!isset($data['product_id']) || !isset($data['store_id'])) { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'message' => 'Paramètres manquants.' |
||||
|
])->setStatusCode(400); |
||||
|
} |
||||
|
|
||||
|
$product_id = $data['product_id']; |
||||
|
$store_id = $data['store_id']; |
||||
|
|
||||
|
$productsModel = new Products(); |
||||
|
|
||||
|
// Appeler la méthode assignToStore pour mettre à jour la base de données |
||||
|
$result = $productsModel->assignToStore($product_id, $store_id); |
||||
|
|
||||
|
// Répondre en JSON avec le résultat |
||||
|
if ($result) { |
||||
|
return $this->response->setJSON(['success' => true]); |
||||
|
} else { |
||||
|
return $this->response->setJSON(['success' => false, 'message' => 'Échec de la mise à jour.']); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchProductData() |
||||
|
{ |
||||
|
// Initialize the response array |
||||
|
$result = ['data' => []]; |
||||
|
$Products = new Products(); |
||||
|
$Stores = new Stores(); |
||||
|
|
||||
|
function convertString($name) |
||||
|
{ |
||||
|
return "$name"; |
||||
|
} |
||||
|
// Fetch product data from the model |
||||
|
$data = $Products->getProductData(); // Ensure this method exists in your ProductModel |
||||
|
|
||||
|
foreach ($data as $key => $value) { |
||||
|
|
||||
|
// Fetch store data |
||||
|
$store_data = $Stores->getStoresData($value['store_id']); // Ensure this method exists in your StoreModel |
||||
|
$store_data['name'] = $value['store_id'] == 0 ? "TOUS" : $Stores->getStoresData($value['store_id'])["name"]; |
||||
|
// Construct buttons |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateProduct', $this->permission ?? [])) { |
||||
|
$buttons .= '<a href="' . base_url('products/update/' . $value['id']) . '" class="btn btn-default"><i class="fa fa-pencil"></i></a>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('deleteProduct', $this->permission ?? [])) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeFunc(' . $value['id'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('updateProduct', $this->permission ?? [])) { |
||||
|
$buttons .= ' <a href="ventes/' . $value['id'] . '" class="btn btn-default"><i class="fa fa-image"></i></a>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('updateProduct', $this->permission ?? [])) { |
||||
|
$buttons .= ' <button class="btn btn-default" onclick="generateQrPdf(' . $value["id"] . ')"><i class="fa fa-qrcode"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('viewProduct', $this->permission ?? [])) { |
||||
|
$buttons .= " <a href='/ventes/show/" . $value['id'] . "' class='btn btn-default'><i class='fa fa-eye'></i></a>"; |
||||
|
} |
||||
|
if (in_array('assignStore', $this->permission ?? [])) { |
||||
|
$buttons .= |
||||
|
'<button type="button" class="btn btn-info assignbtn" title="Assigner sur un magasin" data-magasin="' . $store_data['name'] . '" data-products-id="' . $value["id"] . '" data-toggle="modal" data-target="#assignStoreModal"> |
||||
|
<i class="fa fa-forward"></i> |
||||
|
</button>'; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// Image HTML |
||||
|
$img = '<img src="' . base_url('assets/images/product_image/' . $value['image']) . '" alt="' . $value['name'] . '" class="img-circle" width="50" height="50" />'; |
||||
|
|
||||
|
// Availability Status |
||||
|
$availability = ($value['availability'] == 1) ? '<span class="label label-success">Disponible</span>' : '<span class="label label-warning">Indisponible</span>'; |
||||
|
|
||||
|
// Quantity Status |
||||
|
$qty_status = ''; |
||||
|
if ($value['qty'] <= 10 && $value['qty'] > 0) { |
||||
|
$qty_status = '<span class="label label-warning">Low!</span>'; |
||||
|
} elseif ($value['product_sold'] == false) { |
||||
|
$qty_status = '<span class="label label-danger">Rupture de stock!</span>'; |
||||
|
} |
||||
|
|
||||
|
// Populate the result data |
||||
|
$result['data'][] = [ |
||||
|
$img, |
||||
|
$value['sku'], |
||||
|
$value['name'], |
||||
|
number_format($value['prix_vente'], 0, ',', ' '), |
||||
|
$store_data['name'] ?? 'Unknown Store', |
||||
|
$availability, |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return JSON response |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$Products = new Products(); |
||||
|
$Brands = new Brands(); |
||||
|
$Category = new Category(); |
||||
|
$Stores = new Stores(); |
||||
|
$Notification = new NotificationController(); |
||||
|
$this->verifyRole('createProduct'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
// die(var_dump(json_encode($this->request->getPost('categorie[]')))); |
||||
|
// Validate form inputs |
||||
|
$validation = \Config\Services::validation(); |
||||
|
$validation->setRules([ |
||||
|
'nom_de_produit' => 'required', |
||||
|
'marque' => 'required', |
||||
|
'numero_de_moteur' => 'required', |
||||
|
'prix' => 'required|numeric', |
||||
|
'price_vente' => 'required|numeric', |
||||
|
'puissance' => 'required', |
||||
|
'store' => 'required', |
||||
|
'availability' => 'required', |
||||
|
'price_min' => 'required|numeric', |
||||
|
]); |
||||
|
|
||||
|
if ($this->request->getMethod() === 'post' && $validation->withRequest($this->request)->run()) { |
||||
|
// die(var_dump($this->request->getPost())); |
||||
|
// Handle image upload |
||||
|
$upload_image = $this->uploadImage(); |
||||
|
|
||||
|
// Prepare data for insertion |
||||
|
$product_sold = false; |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('nom_de_produit'), |
||||
|
'sku' => $this->request->getPost('numero_de_serie'), |
||||
|
'price' => $this->request->getPost('prix'), |
||||
|
'qty' => 1, |
||||
|
'image' => $upload_image, |
||||
|
'description' => $this->request->getPost('description'), |
||||
|
'numero_de_moteur' => $this->request->getPost('numero_de_moteur'), |
||||
|
'marque' => $this->request->getPost('marque'), |
||||
|
'chasis' => $this->request->getPost('chasis'), |
||||
|
'store_id' => $this->request->getPost('store'), |
||||
|
'availability' => $this->request->getPost('availability'), |
||||
|
'prix_vente' => $this->request->getPost('price_vente'), |
||||
|
'date_arivage' => $this->request->getPost('datea'), |
||||
|
'puissance' => $this->request->getPost('puissance'), |
||||
|
'cler' => $this->request->getPost('cler'), |
||||
|
'categorie_id' => json_encode($this->request->getPost('categorie[]')), |
||||
|
'etats' => $this->request->getPost('etats'), |
||||
|
'infoManquekit' => $this->request->getPost('infoManquekit'), |
||||
|
'info' => $this->request->getPost('info'), |
||||
|
'infoManque' => $this->request->getPost('infoManque'), |
||||
|
'product_sold' => $product_sold, |
||||
|
]; |
||||
|
$store_id1 = (int)$this->request->getPost('store'); |
||||
|
// Insert data into the database |
||||
|
if ($Products->create($data)) { |
||||
|
$data = [ |
||||
|
'product_id' => $Products->insertID(), |
||||
|
'prix_minimal' => $this->request->getPost('price_min'), |
||||
|
]; |
||||
|
$Fourchette = new FourchettePrix(); |
||||
|
|
||||
|
$Fourchette->createFourchettePrix($data); |
||||
|
session()->setFlashdata('success', 'Créé avec succès'); |
||||
|
$Notification->createNotification("Un nouveau Produit a été crée", "COMMERCIALE",$store_id1,'product/'); |
||||
|
return redirect()->to('/products'); |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Error occurred while creating the product'); |
||||
|
return redirect()->to('products/create'); |
||||
|
} |
||||
|
} else { |
||||
|
$data = [ |
||||
|
'stores' => $Stores->getActiveStore(), |
||||
|
'validation' => $validation, // Pass validation errors to the view |
||||
|
'page_title' => $this->pageTitle, |
||||
|
'marque' => $Brands->getActiveBrands(), |
||||
|
'categorie' => $Category->getActiveCategory(), |
||||
|
]; |
||||
|
|
||||
|
// Render the form view |
||||
|
return $this->render_template('products/create', $data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private function uploadImage() |
||||
|
{ |
||||
|
// Define the upload directory |
||||
|
$uploadPath = 'assets/images/product_image'; |
||||
|
|
||||
|
// Ensure the directory exists |
||||
|
if (!is_dir($uploadPath)) { |
||||
|
mkdir($uploadPath, 0777, true); |
||||
|
} |
||||
|
|
||||
|
// Check if the file is uploaded via the form |
||||
|
$file = $this->request->getFile('product_image'); |
||||
|
if ($file && $file->isValid() && !$file->hasMoved()) { |
||||
|
// Generate a unique file name |
||||
|
$newName = uniqid() . '.' . $file->getExtension(); |
||||
|
|
||||
|
// Move the file to the target directory |
||||
|
$file->move($uploadPath, $newName); |
||||
|
|
||||
|
// Return the actual file name |
||||
|
return $newName; |
||||
|
} |
||||
|
|
||||
|
// If an error occurs, return the error message |
||||
|
return $file ? $file->getErrorString() : 'No file was uploaded.'; |
||||
|
} |
||||
|
|
||||
|
public function update(int $id) |
||||
|
{ |
||||
|
$Products = new Products(); |
||||
|
$Stores = new Stores(); |
||||
|
$Category = new Category(); |
||||
|
$this->verifyRole('updateProduct'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
$Brands = new Brands(); |
||||
|
|
||||
|
// Validate form inputs |
||||
|
$validation = \Config\Services::validation(); |
||||
|
$validation->setRules([ |
||||
|
'nom_de_produit' => 'required', |
||||
|
'marque' => 'required', |
||||
|
]); |
||||
|
|
||||
|
if ($this->request->getMethod() === 'post' && $validation->withRequest($this->request)->run()) { |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('nom_de_produit'), |
||||
|
'sku' => $this->request->getPost('numero_de_serie'), |
||||
|
'price' => $this->request->getPost('price'), |
||||
|
'qty' => 1, |
||||
|
'description' => $this->request->getPost('description'), |
||||
|
'numero_de_moteur' => $this->request->getPost('numero_de_moteur'), |
||||
|
'marque' => $this->request->getPost('marque'), |
||||
|
'chasis' => $this->request->getPost('chasis'), |
||||
|
'store_id' => $this->request->getPost('store'), |
||||
|
'availability' => $this->request->getPost('availability'), |
||||
|
'prix_vente' => $this->request->getPost('price_vente'), |
||||
|
'date_arivage' => $this->request->getPost('datea'), |
||||
|
'puissance' => $this->request->getPost('puissance'), |
||||
|
'cler' => $this->request->getPost('cler'), |
||||
|
'categorie_id' => json_encode($this->request->getPost('categorie[]')), |
||||
|
'etats' => $this->request->getPost('etats'), |
||||
|
'infoManquekit' => $this->request->getPost('infoManquekit'), |
||||
|
'info' => $this->request->getPost('info'), |
||||
|
'infoManque' => $this->request->getPost('infoManque'), |
||||
|
]; |
||||
|
// Check if a product image is uploaded |
||||
|
if ($this->request->getFile('product_image')->isValid()) { |
||||
|
$uploadImage = $this->uploadImage(); // Use the previously provided upload function |
||||
|
$uploadData = ['image' => $uploadImage]; |
||||
|
|
||||
|
// Update the product with the uploaded image |
||||
|
$Products->update($id, $uploadData); |
||||
|
} |
||||
|
|
||||
|
if ($Products->updateProduct($data, $id)) { |
||||
|
// die(var_dump('tonga eto')); |
||||
|
session()->setFlashdata('success', 'Successfully updated'); |
||||
|
return redirect()->to('/products'); |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Error occurred!!'); |
||||
|
return redirect()->to('/produtcs/update/' . $id); |
||||
|
} |
||||
|
} else { |
||||
|
|
||||
|
|
||||
|
$data = [ |
||||
|
'stores' => $Stores->getActiveStore(), |
||||
|
'validation' => $validation, // Pass validation errors to the view |
||||
|
'page_title' => $this->pageTitle, |
||||
|
'product_data' => $Products->getProductData($id), |
||||
|
'categorie' => $Category->getActiveCategory(), |
||||
|
'marque' => $Brands->getActiveBrands() |
||||
|
]; |
||||
|
|
||||
|
return $this->render_template('products/editbackup', $data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function remove() |
||||
|
{ |
||||
|
$this->verifyRole('deleteProduct'); |
||||
|
$product_id = $this->request->getPost('product_id'); |
||||
|
$response = []; |
||||
|
$Products = new Products(); |
||||
|
|
||||
|
if ($product_id) { |
||||
|
if ($Products->remove($product_id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Successfully removed"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Error in the database while removing the product information"; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Refersh the page again!!"; |
||||
|
} |
||||
|
// Return JSON response |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function createByExcel() |
||||
|
{ |
||||
|
$this->verifyRole("createProduct"); |
||||
|
|
||||
|
// 1) Récupération et validation du fichier |
||||
|
$file = $this->request->getFile('excel_product'); |
||||
|
if (!$file || !$file->isValid() || $file->hasMoved()) { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => "Aucun fichier valide reçu" |
||||
|
]); |
||||
|
} |
||||
|
$ext = strtolower($file->getClientExtension()); |
||||
|
if (! in_array($ext, ['xls', 'xlsx'])) { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => "Seuls les fichiers xls/xlsx sont autorisés" |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
// 2) Chargement du fichier Excel |
||||
|
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file->getTempName()); |
||||
|
$sheet = $spreadsheet->getActiveSheet(); |
||||
|
|
||||
|
// 3) Lecture des données brutes et mapping des en-têtes |
||||
|
$allRows = $sheet->toArray(null, true, true, true); |
||||
|
if (count($allRows) < 2) { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => "Le fichier ne contient aucune donnée" |
||||
|
]); |
||||
|
} |
||||
|
$headerRow = array_shift($allRows); |
||||
|
$map = []; |
||||
|
foreach ($headerRow as $col => $heading) { |
||||
|
$h = mb_strtolower(trim($heading)); |
||||
|
$h = str_replace(['’', '‘', '“', '”'], '\'', $h); |
||||
|
$h = iconv('UTF-8', 'ASCII//TRANSLIT', $h); |
||||
|
$h = preg_replace('/[^a-z0-9_]/', '_', $h); |
||||
|
$h = preg_replace('/_+/', '_', $h); |
||||
|
$h = trim($h, '_'); |
||||
|
|
||||
|
switch ($h) { |
||||
|
case 'designation': |
||||
|
case 'nom': |
||||
|
$map[$col] = 'name'; break; |
||||
|
case 'n_serie': |
||||
|
$map[$col] = 'sku'; break; |
||||
|
case 'prix_ar': |
||||
|
$map[$col] = 'prix_vente'; break; |
||||
|
case 'prix_d_achat': |
||||
|
case 'prix_dachat': |
||||
|
case 'prixd_achat': |
||||
|
$map[$col] = 'price'; break; |
||||
|
case 'marque': |
||||
|
$map[$col] = 'marque'; break; |
||||
|
case 'description': |
||||
|
$map[$col] = 'description'; break; |
||||
|
case 'code_moteur': |
||||
|
case 'n_moteur': |
||||
|
$map[$col] = 'numero_de_moteur'; break; |
||||
|
case 'chassis': |
||||
|
case 'chasis': |
||||
|
$map[$col] = 'chasis'; break; |
||||
|
case 'date_arrivage': |
||||
|
case 'date_d_arivage': |
||||
|
$map[$col] = 'date_arrivage'; break; |
||||
|
case 'puissance': |
||||
|
$map[$col] = 'puissance'; break; |
||||
|
case 'availability': |
||||
|
case 'disponibilite': |
||||
|
$map[$col] = 'availability'; break; |
||||
|
case 'piece': |
||||
|
case 'piece_manquant': |
||||
|
$map[$col] = 'is_piece'; break; |
||||
|
case 'cle': |
||||
|
$map[$col] = 'cler'; break; |
||||
|
case 'categories': |
||||
|
case 'categorie_id': |
||||
|
$map[$col] = 'categorie_id'; break; |
||||
|
case 'etat': |
||||
|
case 'etats': |
||||
|
$map[$col] = 'etats'; break; |
||||
|
case 'magasin': |
||||
|
$map[$col] = 'store_id'; break; |
||||
|
case 'info_manquekit': |
||||
|
case 'infomanquekit': |
||||
|
$map[$col] = 'infoManquekit'; break; |
||||
|
case 'info': |
||||
|
case 'info_piece': |
||||
|
$map[$col] = 'info'; break; |
||||
|
case 'info_manque': |
||||
|
$map[$col] = 'infoManque'; break; |
||||
|
case 'image': |
||||
|
case 'image_s': |
||||
|
$map[$col] = 'image'; break; |
||||
|
default: |
||||
|
// Non mappé |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 4) Extraction des images intégrées, si présent |
||||
|
$imagesMap = []; |
||||
|
foreach ($sheet->getDrawingCollection() as $drawing) { |
||||
|
if ($drawing instanceof \PhpOffice\PhpSpreadsheet\Worksheet\Drawing) { |
||||
|
$coord = $drawing->getCoordinates(); |
||||
|
$extImg = pathinfo($drawing->getPath(), PATHINFO_EXTENSION); |
||||
|
$name = uniqid('img_') . ".$extImg"; |
||||
|
$dir = FCPATH . 'assets/images/product_image/'; |
||||
|
if (! is_dir($dir)) { |
||||
|
mkdir($dir, 0777, true); |
||||
|
} |
||||
|
file_put_contents($dir . $name, file_get_contents($drawing->getPath())); |
||||
|
$imagesMap[$coord] = $name; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 5) Chargement des modèles |
||||
|
$ProductsModel = new \App\Models\Products(); |
||||
|
$ProductsModel->skipValidation(true); |
||||
|
$BrandsModel = new \App\Models\Brands(); |
||||
|
$CatModel = new \App\Models\Category(); |
||||
|
$countInserted = 0; |
||||
|
|
||||
|
// 6) Boucle sur chaque ligne de données |
||||
|
foreach ($allRows as $rowIndex => $row) { |
||||
|
$data = []; |
||||
|
|
||||
|
// Lecture des cellules formatées pour chaque champ mappé |
||||
|
foreach ($map as $col => $field) { |
||||
|
$cellValue = $sheet |
||||
|
->getCell($col . ($rowIndex + 2)) |
||||
|
->getFormattedValue(); |
||||
|
$data[$field] = trim((string)$cellValue); |
||||
|
} |
||||
|
|
||||
|
if (empty($data['name'])) { |
||||
|
continue; // champ désignation vide |
||||
|
} |
||||
|
|
||||
|
// Conversion du prix AR : capture tous les groupes de chiffres |
||||
|
if (! empty($data['prix_vente'])) { |
||||
|
preg_match_all('/\d+/', $data['prix_vente'], $matches); |
||||
|
$digits = implode('', $matches[0]); // ex. ["2","000","000"] => "2000000" |
||||
|
$data['prix_vente'] = intval($digits); |
||||
|
} else { |
||||
|
$data['prix_vente'] = 0; |
||||
|
} |
||||
|
|
||||
|
// Valeurs par défaut |
||||
|
$data['qty'] = 1; |
||||
|
$data['product_sold'] = 0; |
||||
|
$data['availability'] = isset($data['availability']) |
||||
|
? (strtolower($data['availability']) === 'oui' ? 1 : 0) |
||||
|
: 0; |
||||
|
$data['is_piece'] = isset($data['is_piece']) |
||||
|
? (strtolower($data['is_piece']) === 'oui' ? 1 : 0) |
||||
|
: 0; |
||||
|
$data['cler'] = isset($data['cler']) |
||||
|
? (strtolower($data['cler']) === 'oui' ? 1 : 0) |
||||
|
: 1; |
||||
|
$data['etats'] = isset($data['etats']) |
||||
|
? (strtolower($data['etats']) === 'kit' ? 1 : 0) |
||||
|
: 1; |
||||
|
|
||||
|
// Association d’image si présente |
||||
|
foreach ($map as $col => $field) { |
||||
|
if ($field === 'image') { |
||||
|
$coordImg = $col . ($rowIndex + 2); |
||||
|
if (isset($imagesMap[$coordImg])) { |
||||
|
$data['image'] = $imagesMap[$coordImg]; |
||||
|
} |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Gestion des clés étrangères |
||||
|
if (! empty($data['marque'])) { |
||||
|
$data['marque'] = $BrandsModel->getOrCreateIdByName($data['marque']); |
||||
|
} |
||||
|
if (! empty($data['categorie_id'])) { |
||||
|
$labels = array_map('trim', explode(',', $data['categorie_id'])); |
||||
|
$catIds = []; |
||||
|
foreach ($labels as $label) { |
||||
|
if ($label !== '') { |
||||
|
$catIds[] = $CatModel->getOrCreateIdByName($label); |
||||
|
} |
||||
|
} |
||||
|
$data['categorie_id'] = $catIds; |
||||
|
} |
||||
|
if (! empty($data['store_id'])) { |
||||
|
// store_id depuis la session |
||||
|
$Store = new Stores(); |
||||
|
$store = $Store->getIdStoreByName($data['store_id']); |
||||
|
$data['store_id'] = $store; |
||||
|
} |
||||
|
|
||||
|
// Insertion |
||||
|
$id = $ProductsModel->insert($data); |
||||
|
if ($id !== false) { |
||||
|
$countInserted++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 7) Notification et réponse |
||||
|
$Notification = new \App\Controllers\NotificationController(); |
||||
|
$user = session()->get('user'); |
||||
|
$Notification->createNotification( |
||||
|
"$countInserted produits ajoutés", |
||||
|
"COMMERCIALE", |
||||
|
(int)$user['store_id'], |
||||
|
"avances" |
||||
|
); |
||||
|
|
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => "Produits importés avec succès ($countInserted)" |
||||
|
]); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', $e->getMessage()); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => "Erreur pendant l’import : " . $e->getMessage() |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,58 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use Mpdf\Mpdf; |
||||
|
use Endroid\QrCode\Color\Color; |
||||
|
use Endroid\QrCode\Builder\Builder; |
||||
|
use App\Controllers\AdminController; |
||||
|
use Endroid\QrCode\Writer\PngWriter; |
||||
|
use Endroid\QrCode\Encoding\Encoding; |
||||
|
use Endroid\QrCode\RoundBlockSizeMode; |
||||
|
use Endroid\QrCode\ErrorCorrectionLevel; |
||||
|
|
||||
|
|
||||
|
class QrCodeController extends AdminController |
||||
|
{ |
||||
|
public function generate($id) |
||||
|
{ |
||||
|
// Define the product URL |
||||
|
$url = base_url("products/show/$id"); |
||||
|
|
||||
|
// if (class_exists(class: \Endroid\QrCode\Builder\Builder::class)) { |
||||
|
// echo "Builder class is available!"; |
||||
|
// } else { |
||||
|
// echo "Builder class NOT found!"; |
||||
|
// } |
||||
|
// exit; |
||||
|
|
||||
|
// Create QR Code |
||||
|
$result = \Endroid\QrCode\Builder\Builder::create() |
||||
|
->writer(new PngWriter()) |
||||
|
->data($url) |
||||
|
->encoding(new Encoding('UTF-8')) |
||||
|
->errorCorrectionLevel(ErrorCorrectionLevel::High) |
||||
|
->size(300) |
||||
|
->margin(10) |
||||
|
->roundBlockSizeMode(RoundBlockSizeMode::Margin) |
||||
|
->foregroundColor(new Color(0, 0, 0)) // Black |
||||
|
->backgroundColor(new Color(255, 255, 255)) // White |
||||
|
->build(); |
||||
|
|
||||
|
// Get QR Code as PNG string |
||||
|
$qrCodeImage = $result->getString(); |
||||
|
|
||||
|
die(var_dump($url)); |
||||
|
// Convert QR Code image to Base64 for embedding in PDF |
||||
|
$base64Qr = base64_encode($qrCodeImage); |
||||
|
|
||||
|
// Generate PDF using mPDF |
||||
|
$mpdf = new Mpdf(); |
||||
|
$mpdf->WriteHTML('<h1 style="text-align: center;">QR Code for Product</h1>'); |
||||
|
$mpdf->WriteHTML('<p style="text-align: center;">Scan this QR code to view the product:</p>'); |
||||
|
$mpdf->WriteHTML('<div style="text-align: center;"><img src="data:image/png;base64,' . $base64Qr . '" /></div>'); |
||||
|
|
||||
|
// Output PDF as download |
||||
|
return $mpdf->Output('QRCode_Product_' . $id . '.pdf', 'D'); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,410 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Controllers\AdminController; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Recouvrement; |
||||
|
use App\Models\SortieCaisse; |
||||
|
use App\Models\Avance; |
||||
|
|
||||
|
class RecouvrementController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Recouvrements'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewRecouvrement'); |
||||
|
|
||||
|
$data = $this->getTotalsArray(); |
||||
|
|
||||
|
$this->render_template('recouvrement/index', $data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// Create an AJAX endpoint to access the fetchTotal() function |
||||
|
public function getTotalData() |
||||
|
{ |
||||
|
echo $this->fetchTotal(); |
||||
|
exit; |
||||
|
} |
||||
|
|
||||
|
public function fetchTotal() |
||||
|
{ |
||||
|
$data = $this->getTotalsArray(); |
||||
|
|
||||
|
return $this->response->setJSON($data); |
||||
|
} |
||||
|
|
||||
|
private function getTotalsArray(): array |
||||
|
{ |
||||
|
$orders = new Orders(); |
||||
|
$recouvrement = new Recouvrement(); |
||||
|
$sortieCaisse = new SortieCaisse(); |
||||
|
$avance = new Avance(); |
||||
|
|
||||
|
// Récupère les données brutes |
||||
|
$paymentData = $orders->getPaymentModes(); |
||||
|
$total_sortie_caisse = $sortieCaisse->getTotalSortieCaisse()->mr ?? 0; |
||||
|
$totalRecouvrement = $recouvrement->getTotalRecouvrements(); |
||||
|
|
||||
|
// Totaux recouvrement |
||||
|
$me = $totalRecouvrement->me ?? 0; |
||||
|
$bm = $totalRecouvrement->bm ?? 0; |
||||
|
$be = $totalRecouvrement->be ?? 0; |
||||
|
$mb = $totalRecouvrement->mb ?? 0; |
||||
|
$ta = $avance->getTotalAvance()->ta ?? 0; |
||||
|
|
||||
|
// Totaux paiements initiaux |
||||
|
$t = $paymentData->total ?? 0; |
||||
|
$mv1 = $paymentData->total_mvola1 ?? 0; |
||||
|
$mv2 = $paymentData->total_mvola2 ?? 0; |
||||
|
$es1 = $paymentData->total_espece1 ?? 0; |
||||
|
$es2 = $paymentData->total_espece2 ?? 0; |
||||
|
$vb1 = $paymentData->total_virement_bancaire1 ?? 0; |
||||
|
$vb2 = $paymentData->total_virement_bancaire2 ?? 0; |
||||
|
|
||||
|
// Calculs |
||||
|
$total_mvola = $mv1 + $mv2; |
||||
|
$mv_calc = $total_mvola - $me - $mb + $bm; |
||||
|
|
||||
|
$total_espece = $es1 + $es2; |
||||
|
$es_calc = $total_espece + $me + $be - $total_sortie_caisse + $ta; |
||||
|
|
||||
|
$total_vb = $vb1 + $vb2; |
||||
|
$vb_calc = $total_vb - $be - $bm + $mb; |
||||
|
|
||||
|
// Retourne le tableau à utiliser |
||||
|
return [ |
||||
|
'total' => $t, |
||||
|
'total_mvola' => $mv_calc, |
||||
|
'total_espece' => $es_calc, |
||||
|
'total_virement_bancaire' => $vb_calc, |
||||
|
'page_title' => $this->pageTitle, |
||||
|
'permission' => $this->permission |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
public function fetchRecouvrementData() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
|
||||
|
// Initialiser les variables pour DataTables |
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if($users['group_name'] === "Caissière"){ |
||||
|
$data = $Recouvrement->getAllRecouvrements($users['id'] ); |
||||
|
$totalRecords = count($data); // Nombre total de recouvrements |
||||
|
|
||||
|
$result = [ |
||||
|
"draw" => $draw, |
||||
|
"recordsTotal" => $totalRecords, |
||||
|
"recordsFiltered" => $totalRecords, |
||||
|
"data" => [] |
||||
|
]; |
||||
|
|
||||
|
foreach ($data as $key => $value) { |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateRecouvrement', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['recouvrement_id'] . ')" data-toggle="modal" data-target="#updateModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('deleteRecouvrement', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeFunc(' . $value['recouvrement_id'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
$result['data'][$key] = [ |
||||
|
$value['recouvrement_id'], |
||||
|
number_format($value['recouvrement_montant'], 0, '.', ' '), |
||||
|
$value['recouvrement_date'], |
||||
|
$value['recouvrement_personnel'], |
||||
|
$value['send_money'], |
||||
|
$value['get_money'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
$data = $Recouvrement->getAllRecouvrements(); |
||||
|
$totalRecords = count($data); // Nombre total de recouvrements |
||||
|
|
||||
|
$result = [ |
||||
|
"draw" => $draw, |
||||
|
"recordsTotal" => $totalRecords, |
||||
|
"recordsFiltered" => $totalRecords, |
||||
|
"data" => [] |
||||
|
]; |
||||
|
|
||||
|
foreach ($data as $key => $value) { |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateRecouvrement', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['recouvrement_id'] . ')" data-toggle="modal" data-target="#updateModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('deleteRecouvrement', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeFunc(' . $value['recouvrement_id'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
$result['data'][$key] = [ |
||||
|
$value['recouvrement_id'], |
||||
|
number_format($value['recouvrement_montant'], 0, '.', ' '), |
||||
|
$value['recouvrement_date'], |
||||
|
$value['recouvrement_personnel'], |
||||
|
$value['send_money'], |
||||
|
$value['get_money'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function removeRecouvrement() |
||||
|
{ |
||||
|
$this->verifyRole('deleteRecouvrement'); |
||||
|
$recouvrement_id = $this->request->getPost('recouvrement_id'); |
||||
|
|
||||
|
|
||||
|
$response = []; |
||||
|
|
||||
|
if ($recouvrement_id) { |
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
if ($Recouvrement->deleteRecouvrement($recouvrement_id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Recouvrement supprimé avec succès !"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Erreur lors de la suppression du recouvrement."; |
||||
|
} |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Veuillez actualiser la page."; |
||||
|
} |
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function createRecouvrement() |
||||
|
{ |
||||
|
$this->verifyRole('createRecouvrement'); |
||||
|
|
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
// echo "<pre>"; |
||||
|
// die(var_dump($this->request->getPost())); |
||||
|
|
||||
|
// Load validation service |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'send_mode' => 'required', |
||||
|
'get_mode' => 'required', |
||||
|
'recouvrement_montant' => 'required', |
||||
|
'recouvrement_date' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'send_mode' => $this->request->getPost('send_mode'), |
||||
|
'get_mode' => $this->request->getPost('get_mode'), |
||||
|
'recouvrement_montant' => $this->request->getPost('recouvrement_montant'), |
||||
|
'recouvrement_date' => $this->request->getPost('recouvrement_date'), |
||||
|
]; |
||||
|
|
||||
|
// Set validation rules |
||||
|
|
||||
|
$Notification = new NotificationController(); |
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
// $recouvrement_id = $this->request->getPost('recouvrement_id'); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if ($users && isset($users['firstname'], $users['lastname'])) { |
||||
|
$fullname = $users['firstname'] . ' ' . $users['lastname']; |
||||
|
} |
||||
|
|
||||
|
// $orders = new Orders(); |
||||
|
// $Recouvrement = new Recouvrement(); |
||||
|
// $paymentData = $orders->getPaymentModes(); |
||||
|
// $totalRecouvrement = $Recouvrement->getTotalRecouvrements(); |
||||
|
// $total_recouvrement = $totalRecouvrement->total_recouvrement; |
||||
|
// Initialisation des totaux avec 0 au cas où il n'y aurait pas de données |
||||
|
// $total_mvola1 = isset($paymentData->total_mvola1) ? $paymentData->total_mvola1 : 0; |
||||
|
// $total_mvola2 = isset($paymentData->total_mvola2) ? $paymentData->total_mvola2 : 0; |
||||
|
|
||||
|
// $total_mvola = $total_mvola1 + $total_mvola2; |
||||
|
// $total_mvola1 = $total_mvola - $total_recouvrement; |
||||
|
|
||||
|
// die(var_dump($data['recouvrement'])) |
||||
|
|
||||
|
// if ($data['recouvrement_montant'] <= $total_mvola1) { |
||||
|
// if ($Recouvrement->addRecouvrement($data)) { |
||||
|
// session()->setFlashdata('success', 'Créé avec succès'); |
||||
|
|
||||
|
// $Notification->createNotification("Un nouveau recouvrement crée", "TOUS", 0, 'recouvrement/'); |
||||
|
// return redirect()->to('recouvrement/'); |
||||
|
// } else { |
||||
|
// session()->setFlashdata('errors', 'Error occurred while creating the product'); |
||||
|
// return redirect()->to('recouvrement/'); |
||||
|
// } |
||||
|
// } else { |
||||
|
// session()->setFlashdata('errors', 'Solde MVOLA insuffisant'); |
||||
|
// return redirect()->to('recouvrement/'); |
||||
|
// } |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
// // Prepare data |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$data = [ |
||||
|
'recouvrement_montant' => $this->request->getPost('recouvrement_montant'), |
||||
|
'recouvrement_date' => $this->request->getPost('recouvrement_date'), |
||||
|
'recouvrement_personnel' => $fullname, |
||||
|
'get_money' => $this->request->getPost('get_mode'), |
||||
|
'send_money' => $this->request->getPost('send_mode'), |
||||
|
'user_id' => $users['id'], |
||||
|
'store_id' => $users['store_id'], |
||||
|
|
||||
|
]; |
||||
|
|
||||
|
if ($Recouvrement->addRecouvrement($data)) { |
||||
|
$Notification->createNotification("Un nouveau recouvrement a été crée", "Direction", (int)$users["store_id"], 'recouvrement'); |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Recouvrement créé avec succès'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur lors de la création du recouvrement.'; |
||||
|
} |
||||
|
} else { |
||||
|
// Validation failed, return error messages |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
public function updateRecouvrement($recouvrement_id) |
||||
|
{ |
||||
|
$this->verifyRole('updateRecouvrement'); |
||||
|
|
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
// Load validation service |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation->setRules([ |
||||
|
'product[]' => 'required' |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'product[]' => $this->request->getPost('product[]') |
||||
|
]; |
||||
|
|
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
// $recouvrement_id = (int) $this->request->getPost('recouvrement_id'); |
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
$data = [ |
||||
|
'recouvrement_montant' => (int) $this->request->getPost('recouvrement_montant_edit'), |
||||
|
'recouvrement_date' => $this->request->getPost('recouvrement_date_edit') |
||||
|
|
||||
|
]; |
||||
|
if ($Recouvrement->updateRecouvrement($recouvrement_id, $data)) { |
||||
|
// $Notification->createNotification("Un nouveau recouvrement crée", "Conseil", $users['store_id'], 'recouvrement'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Recouvrement modifié avec succès !' |
||||
|
]); |
||||
|
} else { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Erreur lors de la modification du recouvrement.' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchRecouvrementSingle($id) |
||||
|
{ |
||||
|
// die(var_dump('hghjbhj')); |
||||
|
if ($id) { |
||||
|
$recouvrement = new Recouvrement(); |
||||
|
|
||||
|
$data = $recouvrement->getRecouvrementSingle($id); |
||||
|
echo json_encode($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchTotalRecouvrementData() { |
||||
|
helper(['url', 'form']); |
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
$start_date = $this->request->getGet('start_date'); |
||||
|
$end_date = $this->request->getGet('end_date'); |
||||
|
if ($start_date && $end_date) { |
||||
|
|
||||
|
// Initialiser les variables pour DataTables |
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if($users['group_name'] === "Caissière"){ |
||||
|
$data = $Recouvrement->getTotalRecouvrements($users['id'] ); |
||||
|
|
||||
|
$result = [ |
||||
|
"draw" => $draw, |
||||
|
"recordsTotal" => 1, |
||||
|
"recordsFiltered" => 1, |
||||
|
"data" => [] |
||||
|
]; |
||||
|
|
||||
|
$totalRecouvrement = $Recouvrement->getTotalRecouvrements($users['id'], $start_date, $end_date ); |
||||
|
$total_recouvrement_me = $totalRecouvrement->me; |
||||
|
$total_recouvrement_bm = $totalRecouvrement->bm; |
||||
|
$total_recouvrement_be = $totalRecouvrement->be; |
||||
|
$total_recouvrement_mb = $totalRecouvrement->mb; |
||||
|
$total_recouvrement = $total_recouvrement_me + $total_recouvrement_me + $total_recouvrement_be + $total_recouvrement_mb; |
||||
|
$data = [ |
||||
|
number_format($total_recouvrement_me,0,'.',' '), |
||||
|
number_format($total_recouvrement_bm,0,'.',' '), |
||||
|
number_format($total_recouvrement_be,0,'.',' '), |
||||
|
number_format($total_recouvrement_mb,0,'.',' '), |
||||
|
number_format($total_recouvrement,0,'.',' '), |
||||
|
]; |
||||
|
} |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
// Initialiser les variables pour DataTables |
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if($users['group_name'] === "Caissière"){ |
||||
|
$data = $Recouvrement->getTotalRecouvrements($users['id'] ); |
||||
|
|
||||
|
$result = [ |
||||
|
"draw" => $draw, |
||||
|
"recordsTotal" => 1, |
||||
|
"recordsFiltered" => 1, |
||||
|
"data" => [] |
||||
|
]; |
||||
|
$totalRecouvrement = $Recouvrement->getTotalRecouvrements($users['id'] ); |
||||
|
$total_recouvrement_me = $totalRecouvrement->me; |
||||
|
$total_recouvrement_bm = $totalRecouvrement->bm; |
||||
|
$total_recouvrement_be = $totalRecouvrement->be; |
||||
|
$total_recouvrement_mb = $totalRecouvrement->mb; |
||||
|
$total_recouvrement = $total_recouvrement_me + $total_recouvrement_me + $total_recouvrement_be + $total_recouvrement_mb; |
||||
|
$data = [ |
||||
|
number_format($total_recouvrement_me,0,'.',' '), |
||||
|
number_format($total_recouvrement_bm,0,'.',' '), |
||||
|
number_format($total_recouvrement_be,0,'.',' '), |
||||
|
number_format($total_recouvrement_mb,0,'.',' '), |
||||
|
number_format($total_recouvrement,0,'.',' '), |
||||
|
]; |
||||
|
} |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,129 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Controllers\AdminController; |
||||
|
use App\Models\Notification; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Remise; |
||||
|
|
||||
|
class RemiseController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Remise'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewRemise'); |
||||
|
|
||||
|
$data = json_decode($this->fetchTotal(),true); |
||||
|
|
||||
|
$this->render_template('demande/index', $data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function fetchTotal(){ |
||||
|
$data = [ |
||||
|
'user_permission' => $this->permission, |
||||
|
'page_title' => $this->pageTitle |
||||
|
]; |
||||
|
return json_encode($data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function fetchRemiseData() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$Remise = new Remise(); // Assure-toi du bon namespace |
||||
|
|
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
$data = $Remise->getAllDemandeRemiseToday(); |
||||
|
$totalRecords = count($data); |
||||
|
|
||||
|
$result = [ |
||||
|
"draw" => $draw, |
||||
|
"recordsTotal" => $totalRecords, |
||||
|
"recordsFiltered" => $totalRecords, |
||||
|
"data" => [] |
||||
|
]; |
||||
|
foreach ($data as $key => $value) { |
||||
|
$buttons = ''; |
||||
|
|
||||
|
if (in_array('validateRemise', $this->permission) && $value['demande_status'] == 'En attente') { |
||||
|
$buttons .= '<button type="submit" class="btn btn-success" onclick="valideFunc(' . $value['id_demande'] . ')">'; |
||||
|
$buttons .= '<i class="fa fa-check-circle"></i>'; |
||||
|
$buttons .= '</button>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('refusedRemise', $this->permission) && $value['demande_status'] == 'En attente') { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="refuseFunc(' . $value['id_demande'] . ')">'; |
||||
|
$buttons .= '<i class="fa fa-times-circle"></i>'; |
||||
|
$buttons .= '</button>'; |
||||
|
} |
||||
|
// die(var_dump($value)); |
||||
|
$result['data'][$key] = [ |
||||
|
$value['id_demande'], |
||||
|
$value['product'], |
||||
|
number_format($value['total_price'], 0, '.', ' '), |
||||
|
number_format($value['montant_demande'], 0, '.', ' '), |
||||
|
$value['demande_status'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function updateRemise($id_demande) { |
||||
|
$this->verifyRole('validateRemise'); |
||||
|
|
||||
|
// Load validation service |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'demande_status' => 'required' |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'demande_status' => $this->request->getPost('demande_status') |
||||
|
]; |
||||
|
$data = [ |
||||
|
'demande_status' => $this->request->getPost('demande_status') |
||||
|
]; |
||||
|
|
||||
|
$Remise = new Remise(); |
||||
|
if ($this->request->getMethod()=='post') { |
||||
|
$today = date('Y-m-d'); |
||||
|
$data = [ |
||||
|
'demande_status' => $this->request->getPost('demande_status'), |
||||
|
'date_demande' => $today, |
||||
|
]; |
||||
|
|
||||
|
if ($Remise->updateRemise($id_demande, $data)) { |
||||
|
$remise_product = $Remise->getProductByDemandeId($id_demande); |
||||
|
$Notification = new NotificationController(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$Notification->createNotification("Une demande de remise a été " . $this->request->getPost('demande_status')." Pour le produit: ".$remise_product,"Caissière",(int)$users['store_id'],'remise/'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Vous avez '.$this->request->getPost('demande_status').' la remise' |
||||
|
]); |
||||
|
} else { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Erreur lors de la modification de la remise.' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,338 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use DateTime; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Stores; |
||||
|
use App\Models\Reports; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\OrderItems; |
||||
|
|
||||
|
class ReportController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Reports'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewReports'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
// Get the current year or the selected year from the form |
||||
|
$today_year = date('Y'); |
||||
|
if ($this->request->getPost('select_year')) { |
||||
|
$today_year = $this->request->getPost('select_year'); |
||||
|
} |
||||
|
|
||||
|
// // Fetch order data and years |
||||
|
$Reports = new Reports(); |
||||
|
$Orders = new Orders(); |
||||
|
$Store = new Stores(); |
||||
|
$parking_data = $Reports->getOrderData($today_year); |
||||
|
$data['report_years'] = $Reports->getOrderYear(); |
||||
|
|
||||
|
// // Process the parking data and calculate total amounts |
||||
|
$final_parking_data = []; |
||||
|
foreach ($parking_data as $month => $orders) { |
||||
|
$total_amount_earned = 0; // Initialize the total amount for the month |
||||
|
|
||||
|
// If there are orders for this month, sum the gross_amount |
||||
|
if (!empty($orders)) { |
||||
|
foreach ($orders as $order) { |
||||
|
// Cast gross_amount to float and add to the total |
||||
|
$total_amount_earned += (float) $order['net_amount']; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Assign the total amount for the month to the final array |
||||
|
$final_parking_data[$month] = $total_amount_earned; |
||||
|
} |
||||
|
|
||||
|
// //data for the camembert |
||||
|
|
||||
|
$paymentModes = $Orders->getPaymentModes(); |
||||
|
$total_mvola1 = $paymentModes->total_mvola1; |
||||
|
$total_mvola2 = $paymentModes->total_mvola2; |
||||
|
$total_espece1 = $paymentModes->total_espece1; |
||||
|
$total_espece2 = $paymentModes->total_espece2; |
||||
|
$total_banque1 = $paymentModes->total_virement_bancaire1; |
||||
|
$total_banque2 = $paymentModes->total_virement_bancaire2; |
||||
|
$total_mvola = $total_mvola1 + $total_mvola2; |
||||
|
$total_banque = $total_banque1 + $total_banque2; |
||||
|
$total_espece = $total_espece1 + $total_espece2; |
||||
|
$totalOrders = $Orders->getTotalOrders(); |
||||
|
$totalAmountPerPaymentModes = ["MVOLA" => $total_mvola, "Espece" => $total_espece, "Virement Bancaire" => $total_banque]; |
||||
|
$totalOrdersCount = (int) $totalOrders->total_orders; |
||||
|
// // dd($paymentModes); |
||||
|
$labels = []; |
||||
|
$totals = []; |
||||
|
|
||||
|
if ($totalOrdersCount > 0) { |
||||
|
foreach ($totalAmountPerPaymentModes as $mode => $total) { |
||||
|
$labels[] = $mode; |
||||
|
$totals[] = $total; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
$data['labels'] = json_encode($labels); |
||||
|
$data['totals'] = json_encode($totals); |
||||
|
|
||||
|
// // prepare data for product chart |
||||
|
$OrderItem = new OrderItems(); |
||||
|
$productTable = $OrderItem->getAllSoldProductToday(); |
||||
|
|
||||
|
$product_sold = (int) $productTable->total_product_sold; |
||||
|
$unsold_product = (int) $productTable->total_unsold_product; |
||||
|
|
||||
|
// Définir les labels et les valeurs pour le Pie Chart |
||||
|
$labels1 = ["Produits vendus", "Produits non vendus"]; |
||||
|
$totals2 = [$product_sold, $unsold_product]; |
||||
|
|
||||
|
// Encoder les données en JSON pour le Pie Chart |
||||
|
$data['labels_product'] = json_encode($labels1); |
||||
|
$data['totals_product'] = json_encode($totals2); |
||||
|
|
||||
|
// // Prepare data for the view |
||||
|
$data['selected_year'] = $today_year; |
||||
|
$data['company_currency'] = $this->companycurrency(); |
||||
|
$data['results'] = $final_parking_data; |
||||
|
|
||||
|
// //data for the camember in dashboard |
||||
|
$totalStoreOrder = $Orders->getTotalOrderPerStore(); |
||||
|
$totalOrders = $Orders->getTotalOrders(); |
||||
|
$totalOrdersCount = (int) $totalOrders->total_orders; |
||||
|
foreach ($totalStoreOrder as $totalOrdersInStore) { |
||||
|
$storeList = $Store->getStoreById($totalOrdersInStore->store_id); |
||||
|
$labelStore[] = $storeList->name ?? 'Inconnu'; |
||||
|
$totalPerStore[] = ((int) $totalOrdersInStore->total / $totalOrdersCount) * 100; |
||||
|
} |
||||
|
$data['labelStore'] = json_encode($labelStore); |
||||
|
$data['totalPerStore'] = json_encode($totalPerStore); |
||||
|
|
||||
|
// Load the view |
||||
|
// return view('reports/index', $this->data); |
||||
|
return $this->render_template('reports/index', $data); |
||||
|
} |
||||
|
private function companycurrency() |
||||
|
{ |
||||
|
return 'AR'; // Replace with your actual logic for company currency |
||||
|
} |
||||
|
|
||||
|
public function stockDetail() |
||||
|
{ |
||||
|
$this->verifyRole('viewReports'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
$Orders = new Orders(); |
||||
|
$Products = new Products(); |
||||
|
$Stores = new Stores(); |
||||
|
$productVente = $Orders->getTotalProductvente(); |
||||
|
$produitStock = $Products->getProductData(); |
||||
|
$stor = $Stores->getActiveStore(); |
||||
|
|
||||
|
$data['ventes'] = \json_encode($productVente); |
||||
|
$data['stock'] = \json_encode($produitStock); |
||||
|
$data['stores'] = $stor; |
||||
|
|
||||
|
// echo '<pre>'; |
||||
|
// die(var_dump($produitStock)); |
||||
|
|
||||
|
return $this->render_template('reports/stockDetail', $data); |
||||
|
} |
||||
|
|
||||
|
private function returnName(int $id) |
||||
|
{ |
||||
|
$Stores = new Stores(); |
||||
|
$stor = $Stores->getActiveStore(); |
||||
|
$Storename = ""; |
||||
|
foreach ($stor as $key => $value) { |
||||
|
if ($value['id'] == $id) { |
||||
|
$Storename = $value['name']; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $Storename; |
||||
|
} |
||||
|
|
||||
|
public function fetchProductSodled(int $id) |
||||
|
{ |
||||
|
$Orders = new Orders(); |
||||
|
|
||||
|
$productVente = $Orders->getTotalProductvente2($id); |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
foreach ($productVente as $key => $value) { |
||||
|
// die(var_dump($value)); // Debugging: Check what $value contains |
||||
|
|
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$value->sku, |
||||
|
$value->date_time, |
||||
|
$this->returnName($value->store_id) |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
private function checkArrivalDate($dateArivage) |
||||
|
{ |
||||
|
$dateArivage = new DateTime($dateArivage); |
||||
|
$today = new DateTime(); |
||||
|
$interval = $dateArivage->diff($today); |
||||
|
|
||||
|
// Return the date only if it is within the last 15 days |
||||
|
return $interval->days . " Jours"; |
||||
|
} |
||||
|
|
||||
|
public function fetchProductStock(int $id) |
||||
|
{ |
||||
|
$Products = new Products(); |
||||
|
|
||||
|
$produitStock = $Products->getProductData2($id); |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
foreach ($produitStock as $key => $value) { |
||||
|
// die(var_dump($value)); // Debugging: Check what $value contains |
||||
|
|
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$value['brand_name'], |
||||
|
$value['total_product'] . " Motos", |
||||
|
$this->returnName($value['store_id']) |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function fetchProductStock2(int $id) |
||||
|
{ |
||||
|
$Products = new Orders(); |
||||
|
|
||||
|
$produitStock = $Products->getOrderVendue(); |
||||
|
$result = ['data' => []]; |
||||
|
// echo '<pre>'; |
||||
|
// die(var_dump($produitStock)); |
||||
|
|
||||
|
foreach ($produitStock as $key => $value) { |
||||
|
// die(var_dump($value)); // Debugging: Check what $value contains |
||||
|
|
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$value['sku'], |
||||
|
$value['qty'], |
||||
|
$value['totalNet'], |
||||
|
(new DateTime($value['DateTime']))->format('Y-m-d'), |
||||
|
$this->returnName($value['store_id']) |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function performancedetail() |
||||
|
{ |
||||
|
$this->verifyRole('viewReports'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
$Stores = new Stores(); |
||||
|
|
||||
|
// echo '<pre>'; |
||||
|
// die(var_dump($orderTest)); |
||||
|
$data['stores'] = $Stores->getActiveStore(); |
||||
|
|
||||
|
return $this->render_template('reports/performance', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchPerformances() |
||||
|
{ |
||||
|
$result = ['data' => []]; |
||||
|
$Orders = new Orders(); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if ($users['group_name'] === "Conseil" || $users['group_name'] === "Direction" ) { |
||||
|
$orderPaid = $Orders->getPerformanceByOrders(); |
||||
|
foreach ($orderPaid as $key => $value) { |
||||
|
$benefice = |
||||
|
$result['data'][$key] = [ |
||||
|
$value['firstname'] . ' ' . $value['lastname'], |
||||
|
$value['email'], |
||||
|
($value['sku'] == "" ? $value['motoname'] : $value['sku']), |
||||
|
(new DateTime($value['datevente']))->format('Y-m-d'), |
||||
|
number_format($value['price'],0,'.',' '), |
||||
|
number_format($value['prix_vente'],0,'.',' '), |
||||
|
$this->returnName($value['store_id']), |
||||
|
number_format($value['prix_vente'] - $value['price'],0,'.',' '), |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
if ($users['group_name'] === "Conseil" || $users['group_name'] === "Direction") { |
||||
|
$orderPaid = $Orders->getPerformanceByOrders1(); |
||||
|
foreach ($orderPaid as $key => $value) { |
||||
|
$benefice = |
||||
|
$result['data'][$key] = [ |
||||
|
$value['firstname'] . ' ' . $value['lastname'], |
||||
|
$value['email'], |
||||
|
($value['sku'] == "" ? $value['motoname'] : $value['sku']), |
||||
|
(new DateTime($value['datevente']))->format('Y-m-d'), |
||||
|
number_format($value['price'],0,'.',' '), |
||||
|
number_format($value['prix_vente'],0,'.',' '), |
||||
|
$this->returnName($value['store_id']), |
||||
|
number_format($value['prix_vente'] - $value['price'],0,'.',' '), |
||||
|
|
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
if ($users['group_name'] === "COMMERCIALE") { |
||||
|
$orderPaid = $Orders->getPerformanceByOrders2(); |
||||
|
foreach ($orderPaid as $key => $value) { |
||||
|
$benefice = |
||||
|
$result['data'][$key] = [ |
||||
|
$value['firstname'] . ' ' . $value['lastname'], |
||||
|
($value['sku'] == "" ? $value['motoname'] : $value['sku']), |
||||
|
(new DateTime($value['datevente']))->format('Y-m-d'), |
||||
|
number_format($value['prix_vente'],0,'.',' '), |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
if ($users['group_name'] === "Cheffe d'Agence") { |
||||
|
$orderPaid = $Orders->getPerformanceByOrders1(); |
||||
|
foreach ($orderPaid as $key => $value) { |
||||
|
$benefice = |
||||
|
$result['data'][$key] = [ |
||||
|
$value['firstname'] . ' ' . $value['lastname'], |
||||
|
($value['sku'] == "" ? $value['motoname'] : $value['sku']), |
||||
|
(new DateTime($value['datevente']))->format('Y-m-d'), |
||||
|
number_format($value['prix_vente'],0,'.',' '), |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchmecperformance() |
||||
|
{ |
||||
|
$result = ['data'=> []]; |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
<?php |
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Products; |
||||
|
|
||||
|
class ReservationController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = "Reservation"; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewOrder'); |
||||
|
$Products = new Products(); |
||||
|
$userIfo = session()->get('user'); |
||||
|
$store_id = $userIfo['store_id']; |
||||
|
$dataProducts = $Products->getProductData2($store_id); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
// die(var_dump($dataProducts)); |
||||
|
$data['product'] = $dataProducts; |
||||
|
|
||||
|
return $this->render_template('reservation/index', $data); |
||||
|
} |
||||
|
public function addReservation() |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,150 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Securite; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Stores; |
||||
|
|
||||
|
class SecuriteController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Validation sortie motos'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewSecurite'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
return $this->render_template('securite/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchSecuriteData() |
||||
|
{ |
||||
|
$securiteModel = new Securite(); |
||||
|
$Products = new Products(); |
||||
|
$securites = $securiteModel->getAllSecuriteData(); |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
foreach ($securites as $securite) { |
||||
|
if ($securite['status'] === 'PENDING') { |
||||
|
$product = $Products->getProductData($securite['product_id']); |
||||
|
if (! $product) continue; |
||||
|
|
||||
|
// Bouton d’action |
||||
|
$buttons = in_array('validateCommande1', $this->permission) |
||||
|
? '<button type="button" class="btn btn-success" onclick="editFunc(' . $securite['id'] . ')" data-toggle="modal" data-target="#editModal"><i class="fa fa-check"></i></button>' |
||||
|
: ''; |
||||
|
|
||||
|
// Statut |
||||
|
$statut = '<span class="label label-warning">EN ATTENTE DE VALIDATION</span>'; |
||||
|
|
||||
|
// Image |
||||
|
$img = '<img src="' . base_url('assets/images/product_image/' . $product['image']) . '" ' |
||||
|
. 'alt="' . esc($product['name']) . '" class="img-circle" width="50" height="50" />'; |
||||
|
|
||||
|
$result['data'][] = [ |
||||
|
'image' => $img, |
||||
|
'ugs' => esc($product['sku']), |
||||
|
'designation' => esc($product['name']), |
||||
|
'statut' => $statut, |
||||
|
'action' => $buttons |
||||
|
]; |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function fetchSecuriteDataById($id) |
||||
|
{ |
||||
|
|
||||
|
if ($id) { |
||||
|
$Securite = new Securite(); |
||||
|
$Orders = new Orders(); |
||||
|
$Products = new Products(); |
||||
|
|
||||
|
$data = $Securite->getSecuriteData($id); |
||||
|
$order_data = $Orders->getOrdersDataByBillNo($data['bill_no']); |
||||
|
$product = $Products->getProductData($data['product_id']); |
||||
|
|
||||
|
$response = [ |
||||
|
'image' => base_url('assets/images/product_image/' . $product['image']), |
||||
|
'nom' => $product['name'], |
||||
|
'ugs' => $product['sku'], |
||||
|
'bill_no' => $data['bill_no'], |
||||
|
'customer_name' => $order_data['customer_name'], |
||||
|
'customer_address' => $order_data['customer_address'], |
||||
|
'customer_phone' => $order_data['customer_phone'], |
||||
|
'customer_cin' => $order_data['customer_cin'], |
||||
|
]; |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function update(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateCommande1'); |
||||
|
$storeModel = new Securite(); |
||||
|
$post = $this->request->getPost(); |
||||
|
$response = []; |
||||
|
|
||||
|
if ($id && isset($post['status'])) { |
||||
|
$data = [ |
||||
|
'status' => $post['status'], |
||||
|
'active' => 0 |
||||
|
]; |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$Notification = new NotificationController(); |
||||
|
if ($storeModel->updateSecurite($data, $id)) { |
||||
|
if ($post['status'] === "Validé") { |
||||
|
$Notification->createNotification('Une commande a été validé', "COMMERCIALE",(int)$users['store_id'], 'orders'); |
||||
|
} |
||||
|
$response = ['success' => true, 'messages' => 'Mise à jour réussie']; |
||||
|
} else { |
||||
|
$response = ['success' => false, 'messages' => 'Erreur en base lors de la mise à jour']; |
||||
|
} |
||||
|
} else { |
||||
|
$response = ['success' => false, 'messages' => 'ID ou statut manquant']; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
public function remove() |
||||
|
{ |
||||
|
$this->verifyRole('deleteCommande1'); |
||||
|
$response = []; |
||||
|
|
||||
|
$storeId = $this->request->getPost('store_id'); |
||||
|
|
||||
|
if ($storeId) { |
||||
|
$storeModel = new Stores(); |
||||
|
|
||||
|
if ($storeModel->delete($storeId)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Supprimé avec succès"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Erreur dans la base de données lors de la suppression des informations sur la marque"; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Référez à nouveau la page !!"; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,672 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Controllers\AdminController; |
||||
|
use App\Models\SortieCaisse; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Recouvrement; |
||||
|
use App\Models\Stores; |
||||
|
|
||||
|
class SortieCaisseController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
private $mapping = [ |
||||
|
// ----- Raisons Admin ----- |
||||
|
"Achat de matériel informatique" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Achat équipement de sécurité" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Achat mobilier de bureau" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Paiement salaire des collaborateurs" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Cotisation sociales" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Remboursement d'avance moto" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Payement prime ou endemnité" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Paiement sous-traitant" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Frais de formation" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Paiement loyer" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Frais de formation externe" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Abonnement internet" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Entretien locaux" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Paiement fournisseur" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Remboursement de frais" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Paiement assurance" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Réparation immobilisation" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"DVD" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Déclaration fiscale - Déclaration d'impôts" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
"Enregistrement des contrats de bail au centre fiscal" => [ |
||||
|
'source_fond' => 'Budget Directionnel', |
||||
|
'initiateur_demande' => 'Direction' |
||||
|
], |
||||
|
|
||||
|
// ----- Raisons Caissier ----- |
||||
|
"Achat materiel - Réparation immobilisation" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Réparation matériel" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Maintenance équipement" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Achats de Matériaux et Fournitures" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Achat produits de nettoyage" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Achat consommable informatique" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Achat petit outillage" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Avance à un prestataire" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Payement prestataire" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Payement éléctricité" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Frais de mission - Déplacement" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Achat de carburant" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Paiement transport marchandise" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
"Achat pièces pour réparation moto" => [ |
||||
|
'source_fond' => 'Caisse Courante', |
||||
|
'initiateur_demande' => 'Caissière' |
||||
|
], |
||||
|
]; |
||||
|
|
||||
|
|
||||
|
private $pageTitle = 'Décaissement'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewSortieCaisse'); |
||||
|
$admin_options = [ |
||||
|
"Achat de matériel informatique", |
||||
|
"Achat équipement de sécurité", |
||||
|
"Achat mobilier de bureau", |
||||
|
"Paiement salaire des collaborateurs", |
||||
|
"Cotisation sociales", |
||||
|
"Remboursement d'avance moto", |
||||
|
"Payement prime ou endemnité", |
||||
|
"Paiement sous-traitant", |
||||
|
"Frais de formation", |
||||
|
"Paiement loyer", |
||||
|
"Frais de formation externe", |
||||
|
"Abonnement internet", |
||||
|
"Entretien locaux", |
||||
|
"Paiement fournisseur", |
||||
|
"Remboursement de frais", |
||||
|
"Paiement assurance", |
||||
|
"Réparation immobilisation", |
||||
|
"DVD", |
||||
|
"Déclaration fiscale - Déclaration d'impôts", |
||||
|
"Enregistrement des contrats de bail au centre fiscal" |
||||
|
]; |
||||
|
|
||||
|
$caissier_options = [ |
||||
|
"Achat materiel - Réparation immobilisation", |
||||
|
"Réparation matériel", |
||||
|
"Maintenance équipement", |
||||
|
"Achats de Matériaux et Fournitures", |
||||
|
"Achat produits de nettoyage", |
||||
|
"Achat consommable informatique", |
||||
|
"Achat petit outillage", |
||||
|
"Avance à un prestataire", |
||||
|
"Payement prestataire", |
||||
|
"Payement éléctricité", |
||||
|
"Frais de mission - Déplacement", |
||||
|
"Achat de carburant", |
||||
|
"Paiement transport marchandise", |
||||
|
"Achat pièces pour réparation moto" |
||||
|
]; |
||||
|
|
||||
|
$Stores = new Stores(); |
||||
|
$stor = $Stores->getActiveStore(); |
||||
|
$data = json_decode($this->fetchTotal(),true); |
||||
|
$data['admin_options'] = $admin_options; |
||||
|
$data['caissier_options'] = $caissier_options; |
||||
|
$data['stores'] = $stor; |
||||
|
|
||||
|
$this->render_template('sortieCaisse/index', $data); |
||||
|
} |
||||
|
|
||||
|
// Create an AJAX endpoint to access the fetchTotal() function |
||||
|
|
||||
|
public function fetchTotal(){ |
||||
|
$data = [ |
||||
|
'user_permission' => $this->permission, |
||||
|
'page_title' => $this->pageTitle |
||||
|
]; |
||||
|
return json_encode($data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function fetchSortieCaisseData() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$SortieCaisse = new SortieCaisse(); |
||||
|
|
||||
|
// Initialiser les variables pour DataTables |
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
|
||||
|
$data = $SortieCaisse->getAllSortieCaisse(); |
||||
|
$totalRecords = count($data); |
||||
|
|
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$result = [ |
||||
|
"draw" => $draw, |
||||
|
"recordsTotal" => $totalRecords, |
||||
|
"recordsFiltered" => $totalRecords, |
||||
|
"data" => [] |
||||
|
]; |
||||
|
|
||||
|
foreach ($data as $key => $value) { |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateSortieCaisse', $this->permission) && $value['id_sortie'] == $users['id']) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['id_sortie'] . ')" data-toggle="modal" data-target="#updateModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
if (in_array('validateSortieCaisse', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="validateFunc(' . $value['id_sortie'] . ')"><i class="fa fa-check-circle"></i></button>'; |
||||
|
} |
||||
|
// D'éventuelles autres actions peuvent être ajoutées ici |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if($users["group_name"] === "Caissière"){ |
||||
|
$result['data'][$key] = [ |
||||
|
$value['id_sortie'], |
||||
|
number_format($value['montant_retire'], 0, '.', ' '), |
||||
|
$value['date_retrait'], |
||||
|
$value['sortie_personnel'], |
||||
|
$value['motif'], |
||||
|
$value['statut'], |
||||
|
$value['admin_raison'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
elseif ($users["group_name"] === "Direction" || $users["group_name"] === "Conseil") { |
||||
|
$result['data'][$key] = [ |
||||
|
$value['id_sortie'], |
||||
|
number_format($value['montant_retire'], 0, '.', ' '), |
||||
|
$value['date_retrait'], |
||||
|
$value['sortie_personnel'], |
||||
|
$value['motif'], |
||||
|
$value['source_fond'], |
||||
|
$value['initiateur_demande'], |
||||
|
$this->returnStoreName($value['store_id']), |
||||
|
$value['commentaire'], |
||||
|
$value['statut'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function fetchSortieCaisseData1() |
||||
|
{ |
||||
|
helper(['url', 'form']); |
||||
|
$SortieCaisse = new SortieCaisse(); |
||||
|
|
||||
|
// Initialiser les variables pour DataTables |
||||
|
$draw = intval($this->request->getVar('draw')); |
||||
|
|
||||
|
$data = $SortieCaisse->getAllSortieCaisse1(); |
||||
|
$totalRecords = count($data); |
||||
|
|
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$result = [ |
||||
|
"draw" => $draw, |
||||
|
"recordsTotal" => $totalRecords, |
||||
|
"recordsFiltered" => $totalRecords, |
||||
|
"data" => [] |
||||
|
]; |
||||
|
|
||||
|
foreach ($data as $key => $value) { |
||||
|
$buttons = ''; |
||||
|
if (in_array('updateSortieCaisse', $this->permission) && $value['id_sortie'] == $users['id']) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['id_sortie'] . ')" data-toggle="modal" data-target="#updateModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
if (in_array('validateSortieCaisse', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="validateFunc(' . $value['id_sortie'] . ')"><i class="fa fa-check-circle"></i></button>'; |
||||
|
} |
||||
|
// D'éventuelles autres actions peuvent être ajoutées ici |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if($users["group_name"] === "Caissière"){ |
||||
|
$result['data'][$key] = [ |
||||
|
$value['id_sortie'], |
||||
|
number_format($value['montant_retire'], 0, '.', ' '), |
||||
|
$value['date_retrait'], |
||||
|
$value['sortie_personnel'], |
||||
|
$value['motif'], |
||||
|
$value['statut'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
elseif ($users["group_name"] === "Direction" || $users["group_name"] === "Conseil") { |
||||
|
$result['data'][$key] = [ |
||||
|
$value['id_sortie'], |
||||
|
number_format($value['montant_retire'], 0, '.', ' '), |
||||
|
$value['date_retrait'], |
||||
|
$value['sortie_personnel'], |
||||
|
$value['motif'], |
||||
|
$value['source_fond'], |
||||
|
$value['initiateur_demande'], |
||||
|
$this->returnStoreName($value['store_id']), |
||||
|
$value['commentaire'], |
||||
|
$value['statut'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
private function returnStoreName(int $id) |
||||
|
{ |
||||
|
$Stores = new Stores(); |
||||
|
$stor = $Stores->getActiveStore(); |
||||
|
$Storename = ""; |
||||
|
foreach ($stor as $key => $value) { |
||||
|
if ($value['id'] == $id) { |
||||
|
$Storename = $value['name']; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $Storename; |
||||
|
} |
||||
|
|
||||
|
public function createSortieCaisse() |
||||
|
{ |
||||
|
$this->verifyRole('createSortieCaisse'); |
||||
|
|
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'montant_retire' => 'required', |
||||
|
'motif' => 'required', |
||||
|
]); |
||||
|
|
||||
|
|
||||
|
$validationData = [ |
||||
|
'montant_retire' => $this->request->getPost('montant_retire'), |
||||
|
'motif' => $this->request->getPost('motif_select'), |
||||
|
]; |
||||
|
|
||||
|
|
||||
|
// Set validation rules |
||||
|
$orders = new Orders(); |
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
$paymentData = $orders->getPaymentModes(); |
||||
|
$sortieCaisse = new SortieCaisse(); |
||||
|
$total_sortie_caisse = $sortieCaisse->getTotalSortieCaisse(); |
||||
|
$total_sortie_caisse1= $total_sortie_caisse->mr; |
||||
|
$totalRecouvrement = $Recouvrement->getTotalRecouvrements(); |
||||
|
//me MVOLA => ESPECE |
||||
|
//bm BANQUE => MVOLA |
||||
|
//be BANQUE => ESPECE |
||||
|
//mb MVOLA => BANQUE |
||||
|
$total_recouvrement_me = $totalRecouvrement->me; |
||||
|
$total_recouvrement_bm = $totalRecouvrement->bm; |
||||
|
$total_recouvrement_be = $totalRecouvrement->be; |
||||
|
$total_recouvrement_mb = $totalRecouvrement->mb; |
||||
|
|
||||
|
// Initialisation des totaux avec 0 au cas où il n'y aurait pas de données |
||||
|
$total = isset($paymentData->total) ? $paymentData->total : 0; |
||||
|
$total_espece1 = isset($paymentData->total_espece1) ? $paymentData->total_espece1 : 0; |
||||
|
$total_espece2 = isset($paymentData->total_espece2) ? $paymentData->total_espece2 : 0; |
||||
|
|
||||
|
$total_espece = $total_espece1 + $total_espece2; |
||||
|
$total_espece1 = $total_espece + $total_recouvrement_me + $total_recouvrement_be - $total_sortie_caisse1; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
$Notification = new NotificationController(); |
||||
|
// $recouvrement_id = $this->request->getPost('recouvrement_id'); |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if ($users && isset($users['firstname'], $users['lastname'])) { |
||||
|
$fullname = $users['firstname'] . ' ' . $users['lastname']; |
||||
|
} |
||||
|
|
||||
|
// Motif venant du select ou du champ "Autre" |
||||
|
$motif = $this->request->getPost('motif_select'); |
||||
|
$source_fond =''; |
||||
|
$initiateur_demande = ''; |
||||
|
$binaryData = ""; |
||||
|
$mimeType = ""; |
||||
|
if (isset($mapping[$motif])) { |
||||
|
$source_fond = $this->mapping[$motif]['source_fond']; |
||||
|
$initiateur_demande = $this->mapping[$motif]['initiateur_demande']; |
||||
|
} |
||||
|
|
||||
|
$file = $this->request->getFile('sortie_preuve'); |
||||
|
|
||||
|
|
||||
|
if ( |
||||
|
$file |
||||
|
&& $file->isValid() |
||||
|
&& $file->getError() !== UPLOAD_ERR_NO_FILE |
||||
|
&& ($tmpName = $file->getTempName()) |
||||
|
&& file_exists($tmpName) |
||||
|
) { |
||||
|
|
||||
|
$binaryData = file_get_contents($tmpName); |
||||
|
|
||||
|
$mimeType = $file->getClientMimeType(); |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
$data = [ |
||||
|
'montant_retire' => $this->request->getPost('montant_retire'), |
||||
|
'date_retrait' => date('Y-m-d'), |
||||
|
'motif' => $this->request->getPost('motif_select'), |
||||
|
'commentaire' => $this->request->getPost('sortie_commentaire'), |
||||
|
'fournisseur' => $this->request->getPost('sortie_fournisseur'), |
||||
|
'nif_cin' => $this->request->getPost('sortie_nif'), |
||||
|
'statistique' => $this->request->getPost('sortie_statistique'), |
||||
|
'telephone' => $this->request->getPost('sortie_phone'), |
||||
|
'code_postal' => $this->request->getPost('sortie_adresse'), |
||||
|
'source_fond' => $source_fond, |
||||
|
'initiateur_demande' => $initiateur_demande, |
||||
|
'store_id' => $users['store_id'], |
||||
|
'preuve_achat' => $binaryData, |
||||
|
'mime_type' => $mimeType, |
||||
|
'statut' => "En attente", |
||||
|
'user_id' => $users['id'], |
||||
|
'sortie_personnel' => $fullname |
||||
|
]; |
||||
|
|
||||
|
|
||||
|
if ((int)$this->request->getPost('montant_retire') > $total_espece1) { |
||||
|
if($sortieCaisse->addSortieCaisse($data)){ |
||||
|
$Notification->createNotification("Une demande décaissement a été enregistré", "Conseil", (int)$users['store_id'], 'sortieCaisse'); |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Décaissement enregistré avec succès'; |
||||
|
} |
||||
|
else { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Erreur lors de la modification du décaissement. Veuillez réessayer.' |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Décaissements échoués — fonds en espèce insuffisants'; |
||||
|
} |
||||
|
} else { |
||||
|
// Validation failed, return error messages |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
public function updateSortieCaisse($id_sortie) |
||||
|
{ |
||||
|
$this->verifyRole('updateSortieCaisse'); |
||||
|
|
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
// Load validation service |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
|
||||
|
$SortieCaisse = new SortieCaisse(); |
||||
|
$orders = new Orders(); |
||||
|
$Recouvrement = new Recouvrement(); |
||||
|
$paymentData = $orders->getPaymentModes(); |
||||
|
$sortieCaisse = new SortieCaisse(); |
||||
|
$total_sortie_caisse = $sortieCaisse->getTotalSortieCaisse(); |
||||
|
$total_sortie_caisse1= $total_sortie_caisse->mr; |
||||
|
$totalRecouvrement = $Recouvrement->getTotalRecouvrements(); |
||||
|
|
||||
|
$total_recouvrement_me = $totalRecouvrement->me; |
||||
|
$total_recouvrement_bm = $totalRecouvrement->bm; |
||||
|
$total_recouvrement_be = $totalRecouvrement->be; |
||||
|
$total_recouvrement_mb = $totalRecouvrement->mb; |
||||
|
|
||||
|
// Initialisation des totaux avec 0 au cas où il n'y aurait pas de données |
||||
|
$total = isset($paymentData->total) ? $paymentData->total : 0; |
||||
|
$total_espece1 = isset($paymentData->total_espece1) ? $paymentData->total_espece1 : 0; |
||||
|
$total_espece2 = isset($paymentData->total_espece2) ? $paymentData->total_espece2 : 0; |
||||
|
|
||||
|
$total_espece = $total_espece1 + $total_espece2; |
||||
|
$total_espece1 = $total_espece + $total_recouvrement_me + $total_recouvrement_be - $total_sortie_caisse1; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
if ($users && isset($users['firstname'], $users['lastname'])) { |
||||
|
$fullname = $users['firstname'] . ' ' . $users['lastname']; |
||||
|
} |
||||
|
|
||||
|
// Motif venant du select ou du champ "Autre" |
||||
|
$motif = $this->request->getPost('motif_select'); |
||||
|
|
||||
|
|
||||
|
if (isset($mapping[$motif])) { |
||||
|
$source_fond = $this->mapping[$motif]['source_fond']; |
||||
|
$initiateur_demande = $this->mapping[$motif]['initiateur_demande']; |
||||
|
} |
||||
|
|
||||
|
// Récupération de l'objet UploadedFile |
||||
|
$file = $this->request->getFile('sortie_preuve_edit'); |
||||
|
|
||||
|
if ($file && $file->isValid() && ! $file->hasMoved()) { |
||||
|
// Récupère le chemin temporaire |
||||
|
$tmpName = $file->getTempName(); |
||||
|
// Lit tout le contenu binaire |
||||
|
$binaryData = file_get_contents($tmpName); |
||||
|
// Récupère le Mime-Type pour le stocker si besoin |
||||
|
$mimeType = $file->getClientMimeType(); |
||||
|
} else { |
||||
|
$binaryData = null; |
||||
|
$mimeType = null; |
||||
|
} |
||||
|
$data = [ |
||||
|
'montant_retire' => $this->request->getPost('montant_retire_edit'), |
||||
|
'date_retrait' => date('Y-m-d'), |
||||
|
'motif' => $this->request->getPost('motif_select'), |
||||
|
'commentaire' => $this->request->getPost('sortie_commentaire_edit'), |
||||
|
'fournisseur' => $this->request->getPost('sortie_fournisseur_edit'), |
||||
|
'nif_cin' => $this->request->getPost('sortie_nif_edit'), |
||||
|
'statistique' => $this->request->getPost('sortie_statistique_edit'), |
||||
|
'telephone' => $this->request->getPost('sortie_phone_edit'), |
||||
|
'code_postal' => $this->request->getPost('sortie_adresse_edit'), |
||||
|
'sortie_personnel' => $fullname, |
||||
|
'source_fond' => $source_fond, |
||||
|
'initiateur_demande' => $initiateur_demande, |
||||
|
'store_id' => $users['store_id'], |
||||
|
'preuve_achat' => $binaryData, |
||||
|
'mime_type' => $mimeType |
||||
|
]; |
||||
|
|
||||
|
|
||||
|
$Notification = new NotificationController(); |
||||
|
if ((int) $this->request->getPost('sortie_montant_edit') > $total_espece1) { |
||||
|
if($SortieCaisse->updateSortieCaisse($id_sortie, $data)){ |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Décaissement modifié avec succès !' |
||||
|
]); |
||||
|
} |
||||
|
else { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Erreur lors de la modification du décaissement. Veuillez réessayer.' |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} else { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Décaissements échoués — fonds en espèce insuffisants' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchSortieCaisseSingle($id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
$SortieCaisse = new SortieCaisse(); |
||||
|
|
||||
|
$data = $SortieCaisse->getSortieCaisseSingle($id); |
||||
|
echo json_encode($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function validateSortieCaisse($id_sortie) { |
||||
|
$this->verifyRole('validateSortieCaisse'); |
||||
|
|
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
|
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
$data = [ |
||||
|
'admin_raison' => $this->request->getPost('admin_raison'), |
||||
|
'statut' => $this->request->getPost('statut'), |
||||
|
|
||||
|
]; |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$SortieCaisse = new SortieCaisse(); |
||||
|
$Notification = new NotificationController(); |
||||
|
|
||||
|
if($SortieCaisse->updateSortieCaisse($id_sortie, $data) && $this->request->getPost('statut') === "Valider"){ |
||||
|
$Notification->createNotification("Décaissement validé avec succès", "Caissière", (int)$users["store_id"], 'sortieCaisse'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Décaissement modifié avec succès !' |
||||
|
]); |
||||
|
} |
||||
|
elseif($SortieCaisse->updateSortieCaisse($id_sortie, $data) && $this->request->getPost('statut') === "Refuser"){ |
||||
|
$Notification->createNotification("un décaissement a été réfusé", "Caissière", (int)$users["store_id"], 'sortieCaisse'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Décaissement modifié avec succès !' |
||||
|
]); |
||||
|
} |
||||
|
elseif($SortieCaisse->updateSortieCaisse($id_sortie, $data) && $this->request->getPost('statut') === "En attente"){ |
||||
|
$Notification->createNotification("Décaissement mis en attente", "Caissière", (int)$users["store_id"], 'sortieCaisse'); |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'messages' => 'Décaissement modifié avec succès !' |
||||
|
]); |
||||
|
} |
||||
|
else { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'messages' => 'Erreur lors de la modification du décaissement. Veuillez réessayer.' |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,174 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Groups; |
||||
|
use App\Models\Orders; |
||||
|
use App\Models\Products; |
||||
|
use App\Models\Stores; |
||||
|
use App\Models\Users; |
||||
|
|
||||
|
class StatistiqueController extends AdminController |
||||
|
{ |
||||
|
public function index() |
||||
|
{ |
||||
|
$orderModel = new Orders(); |
||||
|
$userModel = new Users(); |
||||
|
$storeModel = new Stores(); |
||||
|
|
||||
|
// 7 is the role Commercial |
||||
|
$allUsers = $userModel->getUsersByGroup(); |
||||
|
$orderPaid = $orderModel->getPaidOrderData(); |
||||
|
|
||||
|
$newData = []; |
||||
|
for ($i = 0; $i < count($orderPaid); $i++) { |
||||
|
$transitionData = []; |
||||
|
for ($k = 0; $k < count($allUsers); $k++) { |
||||
|
if ($allUsers[$k]['id'] == $orderPaid[$i]['user_id']) { |
||||
|
$transitionData2 = [ |
||||
|
'userId' => $allUsers[$k]['id'], |
||||
|
'userName' => $allUsers[$k]['username'], |
||||
|
'billId' => $orderPaid[$i]['id'], |
||||
|
'billNo' => $orderPaid[$i]['bill_no'], |
||||
|
'dateVente' => $orderPaid[$i]['date_time'], |
||||
|
'montantNet' => $orderPaid[$i]['net_amount'], |
||||
|
]; |
||||
|
$transitionData[] = $transitionData2; |
||||
|
} |
||||
|
} |
||||
|
$newData[] = $transitionData; |
||||
|
} |
||||
|
|
||||
|
// filter to keep non empty array |
||||
|
$filteredArray = array_filter($newData, function ($item) { |
||||
|
return !empty($item); // Keep only non-empty arrays |
||||
|
}); |
||||
|
|
||||
|
|
||||
|
// Re-index the array (optional, if you want sequential keys) |
||||
|
$userWhoSoldProducts = array_values($filteredArray); |
||||
|
|
||||
|
// Count occurrences of each userId |
||||
|
$userIdCounts = array_reduce($userWhoSoldProducts, function($carry, $item) { |
||||
|
$userId = $item[0]['userId']; |
||||
|
if (!isset($carry[$userId])) { |
||||
|
$carry[$userId] = 0; |
||||
|
} |
||||
|
$carry[$userId]++; |
||||
|
return $carry; |
||||
|
}, []); |
||||
|
|
||||
|
foreach ($allUsers as &$user) { |
||||
|
$userId = (int)$user['id']; |
||||
|
if (isset($userIdCounts[$userId])) { |
||||
|
$user['totalVente'] = $userIdCounts[$userId]; |
||||
|
} else { |
||||
|
$user['totalVente'] = 0; // or any default value you want to assign if the user ID is not found in $userIdCount |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
$data['allUsers'] = $allUsers; |
||||
|
$data['page_title'] = 'Statistique'; |
||||
|
// Check if the user is an Conseil |
||||
|
$session = session(); |
||||
|
$user_id = $session->get('user'); |
||||
|
// $data['is_admin'] = ($user_id['id'] == 1); |
||||
|
// echo '<pre>'; |
||||
|
// var_dump($allUsers); |
||||
|
// echo '</pre>'; |
||||
|
$data['is_admin'] = false; |
||||
|
|
||||
|
if ($user_id['group_name'] == "Direction" || $user_id['group_name'] == "Conseil") { |
||||
|
$data['is_admin'] = true; |
||||
|
} |
||||
|
|
||||
|
// echo '<pre>'; |
||||
|
// die(var_dump($newData)); |
||||
|
|
||||
|
return $this->render_template('statistic/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function testindex() |
||||
|
{ |
||||
|
// Sample data |
||||
|
$data = [ |
||||
|
[ |
||||
|
[ |
||||
|
"userId" => "7", |
||||
|
"userName" => "Billy", |
||||
|
"billId" => "10", |
||||
|
"billNo" => "BILPR-500F", |
||||
|
"dateVente" => "2025-01-25 14:33:54", |
||||
|
"montantNet" => "638580.96" |
||||
|
] |
||||
|
], |
||||
|
// [ |
||||
|
// [ |
||||
|
// "userId" => "9", |
||||
|
// "userName" => "john does", |
||||
|
// "billId" => "5", |
||||
|
// "billNo" => "BILPR-3D87", |
||||
|
// "dateVente" => "2025-01-19 14:33:54", |
||||
|
// "montantNet" => "12.90" |
||||
|
// ] |
||||
|
// ], |
||||
|
[ |
||||
|
[ |
||||
|
"userId" => "7", |
||||
|
"userName" => "Billy", |
||||
|
"billId" => "4", |
||||
|
"billNo" => "BILPR-A004", |
||||
|
"dateVente" => "2025-01-18 14:33:54", |
||||
|
"montantNet" => "12.90" |
||||
|
] |
||||
|
] |
||||
|
// [ |
||||
|
// [ |
||||
|
// "userId" => "9", |
||||
|
// "userName" => "john does", |
||||
|
// "billId" => "3", |
||||
|
// "billNo" => "BILPR-7C26", |
||||
|
// "dateVente" => "2025-01-17 14:33:54", |
||||
|
// "montantNet" => "438.60" |
||||
|
// ] |
||||
|
// ] |
||||
|
]; |
||||
|
|
||||
|
// Process data |
||||
|
$userData = []; |
||||
|
foreach ($data as $entry) { |
||||
|
$record = $entry[0]; |
||||
|
$userId = $record['userId']; |
||||
|
$userName = $record['userName']; |
||||
|
|
||||
|
// Ensure user exists in the array |
||||
|
if (!isset($userData[$userId])) { |
||||
|
$userData[$userId] = [ |
||||
|
'name' => $userName, |
||||
|
'dates' => [], |
||||
|
'values' => [] |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Store date and montantNet |
||||
|
$userData[$userId]['dates'][] = $record['dateVente']; |
||||
|
$userData[$userId]['values'][] = (float) $record['montantNet']; |
||||
|
} |
||||
|
|
||||
|
$data['userData'] = json_encode($userData); |
||||
|
$data['page_title'] = 'Statistique'; |
||||
|
// die(var_dump($data)); |
||||
|
// return view('chart_view', ['userData' => json_encode($userData)]); |
||||
|
return $this->render_template('statistic/single', $data); |
||||
|
} |
||||
|
|
||||
|
public function singleStat(int $id) |
||||
|
{ |
||||
|
$Order = new Orders(); |
||||
|
|
||||
|
$data['user_order'] = json_encode($Order->getSingleStat($id), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP); |
||||
|
$data['page_title'] = 'Statistique'; |
||||
|
|
||||
|
return $this->render_template('statistic/single', $data); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,193 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Stores; |
||||
|
|
||||
|
class StoreController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
// Assuming permission is being set from a session |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
private $pageTitle = 'Stores'; |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewStore'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
return $this->render_template('stores/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchStoresDataById($id) |
||||
|
{ |
||||
|
if($id) { |
||||
|
$Stores = new Stores(); |
||||
|
|
||||
|
$data = $Stores->getStoresData($id); |
||||
|
echo json_encode($data); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchStoresData() |
||||
|
{ |
||||
|
$storeModel = new Stores(); // Load the StoreModel |
||||
|
$stores = $storeModel->findAll(); // Fetch all data |
||||
|
$result = ['data' => []]; |
||||
|
|
||||
|
// Iterate through the data |
||||
|
foreach ($stores as $key => $store) { |
||||
|
// Action buttons |
||||
|
$buttons = ''; |
||||
|
|
||||
|
// Check permissions for updating the store |
||||
|
if (in_array('updateStore', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $store['id'] . ')" data-toggle="modal" data-target="#editModal"><i class="fa fa-pencil"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Check permissions for deleting the store |
||||
|
if (in_array('deleteStore', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-danger" onclick="removeFunc(' . $store['id'] . ')" data-toggle="modal" data-target="#removeModal"><i class="fa fa-trash"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
// Status display |
||||
|
$status = ($store['active'] == 1) |
||||
|
? '<span class="label label-success">Active</span>' |
||||
|
: '<span class="label label-warning">Inactive</span>'; |
||||
|
|
||||
|
// Add the row data |
||||
|
$result['data'][$key] = [ |
||||
|
$store['name'], // Store name |
||||
|
$status, // Active or inactive status |
||||
|
$buttons // Action buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
// Return data in JSON format |
||||
|
return $this->response->setJSON($result); |
||||
|
} |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$this->verifyRole('createStore'); |
||||
|
$response = []; |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
$validation->setRules([ |
||||
|
'store_name' => 'required', |
||||
|
'active' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'store_name' => $this->request->getPost('store_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
// Run validation |
||||
|
if ($validation->run($validationData)) { |
||||
|
// // Prepare data |
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('store_name'), |
||||
|
'active' => $this->request->getPost('active'), |
||||
|
]; |
||||
|
|
||||
|
// Load the model and create the store |
||||
|
$storeModel = new Stores(); |
||||
|
if ($storeModel->createStore($data)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Successfully created'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Error in the database while creating the store'; |
||||
|
} |
||||
|
} else { |
||||
|
// Validation failed, return error messages |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function update(int $id) |
||||
|
{ |
||||
|
$this->verifyRole('updateStore'); |
||||
|
$response = []; |
||||
|
// die(var_dump($this->request->getPost())); |
||||
|
if ($id) { |
||||
|
// Set validation rules |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
$validation->setRules([ |
||||
|
'edit_store_name' => 'required', |
||||
|
'edit_active' => 'required', |
||||
|
]); |
||||
|
|
||||
|
$validationData = [ |
||||
|
'edit_store_name' => $this->request->getPost('edit_store_name'), |
||||
|
'edit_active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
$storeModel = new Stores(); |
||||
|
|
||||
|
if ($validation->run($validationData)) { |
||||
|
|
||||
|
$data = [ |
||||
|
'name' => $this->request->getPost('edit_store_name'), |
||||
|
'active' => $this->request->getPost('edit_active'), |
||||
|
]; |
||||
|
|
||||
|
if ($storeModel->updateStore($data, $id)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = 'Mise à jour réussie'; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur dans la base de données lors de la mise à jour du magasin'; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
// Validation failed, return error messages |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = $validation->getErrors(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = 'Erreur, veuillez actualiser la page à nouveau !!'; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
|
||||
|
public function remove() |
||||
|
{ |
||||
|
$this->verifyRole('deleteStore'); |
||||
|
$response = []; |
||||
|
|
||||
|
$storeId = $this->request->getPost('store_id'); |
||||
|
|
||||
|
if ($storeId) { |
||||
|
$storeModel = new Stores(); |
||||
|
|
||||
|
if ($storeModel->delete($storeId)) { |
||||
|
$response['success'] = true; |
||||
|
$response['messages'] = "Supprimé avec succès"; |
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Erreur dans la base de données lors de la suppression des informations sur la marque"; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
$response['success'] = false; |
||||
|
$response['messages'] = "Référez à nouveau la page !!"; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON($response); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,560 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Controllers; |
||||
|
|
||||
|
use App\Models\Groups; |
||||
|
use App\Models\Users; |
||||
|
use App\Models\Stores; |
||||
|
use Config\Services; |
||||
|
|
||||
|
class UserController extends AdminController |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
// Assuming permission is being set from a session |
||||
|
helper(['form', 'url']); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* title of the page |
||||
|
* @var string |
||||
|
*/ |
||||
|
private $pageTitle = 'User'; |
||||
|
private $pageTitle2 = 'Profile'; |
||||
|
|
||||
|
/** |
||||
|
* get all users |
||||
|
*/ |
||||
|
public function index() |
||||
|
{ |
||||
|
$this->verifyRole('viewUser'); |
||||
|
|
||||
|
$Users = new Users(); |
||||
|
$userData = $Users->getUserData(); |
||||
|
$result = []; |
||||
|
$Stores = new Stores(); |
||||
|
foreach ($userData as $key => $value) { |
||||
|
if (is_numeric($value['store_id'])) |
||||
|
$value['store_id'] = $value['store_id'] == 0 ? "TOUS" : $Stores->getStoresData($value['store_id'])["name"]; |
||||
|
$result[$key]['user_info'] = $value; |
||||
|
$group = $Users->getUserGroup($value['id']); |
||||
|
|
||||
|
$result[$key]['user_group'] = $group; |
||||
|
} |
||||
|
|
||||
|
$data['user_data'] = $result; |
||||
|
|
||||
|
$session = session(); |
||||
|
$usersSession = $session->get('user'); |
||||
|
$data['groupName'] = $usersSession['group_name']; |
||||
|
|
||||
|
// die(var_dump($usersSession['group_name'])); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
$data['stores'] = $Stores->getActiveStore(); |
||||
|
|
||||
|
return $this->render_template('users/index', $data); |
||||
|
} |
||||
|
|
||||
|
public function fetchUserData() |
||||
|
{ |
||||
|
$this->verifyRole('viewUser'); |
||||
|
|
||||
|
try { |
||||
|
$Users = new Users(); |
||||
|
$userData = $Users->getUserData(); |
||||
|
$result = []; |
||||
|
$Stores = new Stores(); |
||||
|
|
||||
|
foreach ($userData as $key => $value) { |
||||
|
$buttons = ''; |
||||
|
|
||||
|
if (in_array('updateUser', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-default" onclick="editFunc(' . $value['id'] . ')">' |
||||
|
. '<i class="fa fa-pencil"></i>' |
||||
|
. '</button>'; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
if (in_array('deleteUser', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" ' |
||||
|
. 'class="btn btn-danger" ' |
||||
|
. 'data-toggle="modal" ' |
||||
|
. 'data-target="#removeModal" ' |
||||
|
. 'data-id="' . $value['id'] . '">' |
||||
|
. '<i class="fa fa-trash"></i>' |
||||
|
. '</button>'; |
||||
|
} |
||||
|
if (in_array('viewProfile', $this->permission)) { |
||||
|
$buttons .= ' <button |
||||
|
type="button" |
||||
|
class="btn btn-success" data-toggle="modal" |
||||
|
data-target="#profileModal" |
||||
|
onclick="profileFunc(' . $value['id'] . ')" |
||||
|
title="Voir le profil"> |
||||
|
<i class="fa fa-user"></i> |
||||
|
</button>'; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
if (in_array('viewUser', $this->permission)) { |
||||
|
$buttons .= ' <button type="button" class="btn btn-info" onclick="loginFunc(' . $value['id'] . ')"><i class="fa fa-chevron-right"></i></button>'; |
||||
|
} |
||||
|
|
||||
|
if (in_array('assignerUser', $this->permission)) { |
||||
|
$buttons .= '<button type="button" class="btn btn-info" onclick="assignFunc(' . $value['id'] . ')"> |
||||
|
<i class="fa fa-cog"></i> |
||||
|
</button>'; |
||||
|
} |
||||
|
$group_data = $Users->getUserWithGroupName($value['id']); |
||||
|
// die(var_dump($group_data['group_name'])); |
||||
|
$result[] = [ |
||||
|
$value['firstname'], |
||||
|
$value['lastname'], |
||||
|
$value['email'], |
||||
|
$value['phone'], |
||||
|
$Stores->getStoresName($value['store_id']), |
||||
|
$group_data['group_name'], |
||||
|
$buttons |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON(['data' => $result]); |
||||
|
|
||||
|
} catch (\Exception $e) { |
||||
|
return $this->response->setJSON([ |
||||
|
'data' => [], |
||||
|
'error' => true, |
||||
|
'message' => 'Erreur lors de la récupération des données utilisateur : ' . $e->getMessage() |
||||
|
]); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function assign_store() |
||||
|
{ |
||||
|
// Vérifie que la requête est bien une requête AJAX |
||||
|
if (!$this->request->isAJAX()) { |
||||
|
$response = Services::response(); |
||||
|
$response->setStatusCode(404, 'Page Not Found')->send(); |
||||
|
exit; |
||||
|
} |
||||
|
|
||||
|
// Récupère les données POST sous format JSON |
||||
|
$user_id = $this->request->getPost('user_id'); |
||||
|
$store_id = $this->request->getPost('store_id'); |
||||
|
$Users = new Users(); |
||||
|
|
||||
|
if (!isset($user_id) || !isset($store_id)) { |
||||
|
return $this->response->setJSON([ |
||||
|
'success' => false, |
||||
|
'message' => 'Paramètres manquants.' |
||||
|
])->setStatusCode(400); |
||||
|
} |
||||
|
|
||||
|
$user_id1 = $user_id; |
||||
|
$store_id1 = $store_id; |
||||
|
|
||||
|
$usersModel = new Users(); |
||||
|
// die(var_dump([$user_id, $store_id])); |
||||
|
// Appeler la méthode assignToStore pour mettre à jour la base de données |
||||
|
$result = $usersModel->assignToStore($user_id1, $store_id1); |
||||
|
|
||||
|
// Répondre en JSON avec le résultat |
||||
|
if ($result) { |
||||
|
return $this->response->setJSON(['success' => true, 'message' => 'Mise è jour réusit.']); |
||||
|
} else { |
||||
|
return $this->response->setJSON(['success' => false, 'message' => 'Échec de la mise à jour.']); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
// ini_set('display_errors', 1); |
||||
|
// ini_set('display_startup_errors', 1); |
||||
|
// error_reporting(E_ALL); |
||||
|
|
||||
|
$this->verifyRole('createUser'); |
||||
|
// Define validation rules |
||||
|
$validationRules = [ |
||||
|
'groups' => [ |
||||
|
'label' => 'Group', |
||||
|
'rules' => 'required' |
||||
|
], |
||||
|
'username' => [ |
||||
|
'label' => 'Username', |
||||
|
'rules' => 'required|trim|min_length[5]|is_unique[users.username]' |
||||
|
], |
||||
|
'email' => [ |
||||
|
'label' => 'Email', |
||||
|
'rules' => 'required|trim|valid_email|is_unique[users.email]' |
||||
|
], |
||||
|
'password' => [ |
||||
|
'label' => 'Password', |
||||
|
'rules' => 'required|trim|min_length[8]' |
||||
|
], |
||||
|
'cpassword' => [ |
||||
|
'label' => 'Confirm Password', |
||||
|
'rules' => 'required|trim|matches[password]' |
||||
|
], |
||||
|
'fname' => [ |
||||
|
'label' => 'First Name', |
||||
|
'rules' => 'required|trim' |
||||
|
] |
||||
|
]; |
||||
|
|
||||
|
$Groups = new Groups(); |
||||
|
$Users = new Users(); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
// Check if it's a POST request before validating |
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
// Load validation service and run validation |
||||
|
if (!$this->validate($validationRules)) { |
||||
|
|
||||
|
// Validation failed, load view with errors |
||||
|
$groupData = $Groups->getGroupData(); // Assuming model_groups is loaded |
||||
|
$data['group_data'] = $groupData; |
||||
|
$data['validation'] = $this->validator; // Pass validation instance to the view |
||||
|
$Stores = new Stores(); |
||||
|
$data['stores'] = $Stores->getActiveStore(); |
||||
|
|
||||
|
return $this->render_template('users/create', $data); |
||||
|
} |
||||
|
|
||||
|
// Validation passed, process form data |
||||
|
$password = $this->passwordHash($this->request->getPost('password')); // Update hashing logic if needed |
||||
|
|
||||
|
$data = [ |
||||
|
'username' => $this->request->getPost('username'), |
||||
|
'password' => $password, |
||||
|
'email' => $this->request->getPost('email'), |
||||
|
'firstname' => $this->request->getPost('fname'), |
||||
|
'lastname' => $this->request->getPost('lname'), |
||||
|
'phone' => $this->request->getPost('phone'), |
||||
|
'gender' => $this->request->getPost('gender'), |
||||
|
'store_id' => $this->request->getPost('store'), |
||||
|
]; |
||||
|
|
||||
|
$create = $Users->create($data, $this->request->getPost('groups')); |
||||
|
|
||||
|
if ($create) { |
||||
|
// Success |
||||
|
return redirect()->to('/users')->with('success', 'Successfully created'); |
||||
|
} else { |
||||
|
// Error |
||||
|
return redirect()->to('/users/create')->with('error', 'Error occurred!!'); |
||||
|
} |
||||
|
} |
||||
|
$Stores = new Stores(); |
||||
|
|
||||
|
// If it's not a POST request, just render the create page with no validation errors |
||||
|
$groupData = $Groups->getGroupData(); |
||||
|
$data['group_data'] = $groupData; |
||||
|
$data['stores'] = $Stores->getActiveStore(); |
||||
|
return $this->render_template('users/create', $data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function passwordHash($pass = '') |
||||
|
{ |
||||
|
if ($pass) { |
||||
|
$password = password_hash($pass, PASSWORD_DEFAULT); |
||||
|
return $password; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function edit(int $id = null) |
||||
|
{ |
||||
|
$this->verifyRole('updateUser'); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
$validation = \Config\Services::validation(); |
||||
|
$usersModel = new Users(); |
||||
|
$groupsModel = new Groups(); |
||||
|
|
||||
|
// Define validation rules |
||||
|
$validationRules = [ |
||||
|
'groups' => 'required', |
||||
|
'username' => 'required|trim|min_length[5]|max_length[12]', |
||||
|
'email' => 'required|trim|valid_email', |
||||
|
'fname' => 'required|trim', |
||||
|
]; |
||||
|
|
||||
|
// Check if the ID exists in the request |
||||
|
if ($id) { |
||||
|
// Check if it's a POST request before validating |
||||
|
if ($this->request->getMethod() === 'post') { |
||||
|
// Validate the form |
||||
|
if (!$this->validate($validationRules)) { |
||||
|
// Validation failed |
||||
|
$data['validation'] = $validation; |
||||
|
$data['user_data'] = $usersModel->getUserData($id); |
||||
|
$data['user_group'] = $usersModel->getUserGroup($id); |
||||
|
$data['group_data'] = $groupsModel->getGroupData(); |
||||
|
return $this->render_template('users/edit', $data); |
||||
|
} |
||||
|
|
||||
|
// If password is empty, skip password validation |
||||
|
$password = ''; |
||||
|
if ($this->request->getPost('password') && $this->request->getPost('cpassword')) { |
||||
|
$validation->setRule('password', 'Password', 'required|min_length[8]'); |
||||
|
$validation->setRule('cpassword', 'Confirm Password', 'required|matches[password]'); |
||||
|
|
||||
|
if (!$this->validate($validationRules)) { |
||||
|
// Validation failed for password |
||||
|
$data['validation'] = $validation; |
||||
|
$data['user_data'] = $usersModel->getUserData($id); |
||||
|
$data['user_group'] = $usersModel->getUserGroup($id); |
||||
|
$data['group_data'] = $groupsModel->getGroupData(); |
||||
|
return $this->render_template('users/edit', $data); |
||||
|
} |
||||
|
$password = password_hash($this->request->getPost('password'), PASSWORD_DEFAULT); // Hash the password |
||||
|
} |
||||
|
|
||||
|
// Prepare user data for update |
||||
|
$data = [ |
||||
|
'username' => $this->request->getPost('username'), |
||||
|
'password' => $password ?: $this->request->getPost('password'), // If no new password, keep the old one |
||||
|
'email' => $this->request->getPost('email'), |
||||
|
'firstname' => $this->request->getPost('fname'), |
||||
|
'lastname' => $this->request->getPost('lname'), |
||||
|
'phone' => $this->request->getPost('phone'), |
||||
|
'gender' => $this->request->getPost('gender'), |
||||
|
]; |
||||
|
|
||||
|
$groupId = $this->request->getPost('groups'); |
||||
|
|
||||
|
// Update user |
||||
|
$update = $usersModel->edit($data, $id, $groupId); |
||||
|
|
||||
|
if ($update) { |
||||
|
session()->setFlashdata('success', 'Successfully updated'); |
||||
|
return redirect()->to('/users'); |
||||
|
} else { |
||||
|
session()->setFlashdata('errors', 'Error occurred!'); |
||||
|
return redirect()->to("/users/edit/{$id}"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// If it's not a POST request (initial load), load user data |
||||
|
$data['user_data'] = $usersModel->getUserData($id); |
||||
|
$data['user_group'] = $usersModel->getUserGroup($id); |
||||
|
$data['group_data'] = $groupsModel->getGroupData(); |
||||
|
|
||||
|
return $this->render_template('users/edit', $data); |
||||
|
} |
||||
|
|
||||
|
// If no ID is provided, you can handle the error or redirect |
||||
|
return redirect()->to('/users'); |
||||
|
} |
||||
|
|
||||
|
public function delete($id) |
||||
|
{ |
||||
|
$this->verifyRole('deleteUser'); |
||||
|
|
||||
|
if ($id) { |
||||
|
// Check if the form has been submitted with confirmation |
||||
|
if ($this->request->getPost('confirm')) { |
||||
|
$usersModel = new Users(); // Ensure Users model is loaded |
||||
|
|
||||
|
$delete = $usersModel->delete($id); |
||||
|
$data['page_title'] = $this->pageTitle; |
||||
|
|
||||
|
if ($delete) { |
||||
|
session()->setFlashdata('success', 'Supprimé avec succès'); |
||||
|
return redirect()->to('/users'); |
||||
|
} else { |
||||
|
session()->setFlashdata('error', 'Une erreur est survenue !!'); |
||||
|
return redirect()->to("/users/delete/{$id}"); |
||||
|
} |
||||
|
} else { |
||||
|
// If no confirmation yet, load the delete confirmation view |
||||
|
$data = [ |
||||
|
'id' => $id, |
||||
|
'page_title' => $this->pageTitle |
||||
|
]; |
||||
|
// die(var_dump($data)); |
||||
|
return $this->render_template('users/delete', $data); // Use CodeIgniter 4's view function |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function profile() |
||||
|
{ |
||||
|
$this->verifyRole('viewProfile'); |
||||
|
$user = session()->get('user'); |
||||
|
$userId = $user['id']; |
||||
|
|
||||
|
$Users = new Users(); |
||||
|
$Store = new Stores(); |
||||
|
$data['user_data'] = $Users->getUserData($userId); |
||||
|
$data['store_name']= $Store->getStoreById($data['user_data']['store_id']); |
||||
|
$data['page_title'] = $this->pageTitle2; |
||||
|
$data['user_group'] = $Users->getUserGroup($userId); |
||||
|
|
||||
|
return $this->render_template('users/profile', $data); |
||||
|
} |
||||
|
|
||||
|
public function setting() |
||||
|
{ |
||||
|
$this->verifyRole('updateSetting'); |
||||
|
$user = session()->get('user'); |
||||
|
$userId = $user['id']; |
||||
|
|
||||
|
if ($userId) { |
||||
|
$validation = \Config\Services::validation(); |
||||
|
|
||||
|
// Set validation rules |
||||
|
$validation->setRules([ |
||||
|
'username' => 'required|trim|min_length[5]|max_length[12]', |
||||
|
'email' => 'required|trim|valid_email', |
||||
|
'fname' => 'required|trim', |
||||
|
]); |
||||
|
$Users = new Users(); |
||||
|
// If validation passes for the first set of rules |
||||
|
if ($this->request->getMethod() === 'post' && $validation->withRequest($this->request)->run()) { |
||||
|
// Handle the case when password is not being updated |
||||
|
if (empty($this->request->getPost('password')) && empty($this->request->getPost('cpassword'))) { |
||||
|
|
||||
|
$data = [ |
||||
|
'username' => $this->request->getPost('username'), |
||||
|
'email' => $this->request->getPost('email'), |
||||
|
'firstname' => $this->request->getPost('fname'), |
||||
|
'lastname' => $this->request->getPost('lname'), |
||||
|
'phone' => $this->request->getPost('phone'), |
||||
|
'gender' => $this->request->getPost('gender'), |
||||
|
]; |
||||
|
$update = $Users->update($userId, $data); |
||||
|
// die(var_dump($update)); |
||||
|
|
||||
|
if ($update) { |
||||
|
return redirect()->to('/users/setting')->with('success', 'Successfully updated'); |
||||
|
} else { |
||||
|
return redirect()->back()->with('errors', 'Error occurred!')->withInput(); |
||||
|
} |
||||
|
} else { |
||||
|
// Additional validation for password |
||||
|
$validation->setRules([ |
||||
|
'password' => 'required|min_length[8]', |
||||
|
'cpassword' => 'required|matches[password]', |
||||
|
]); |
||||
|
|
||||
|
if ($validation->withRequest($this->request)->run()) { |
||||
|
$password = password_hash($this->request->getPost('password'), PASSWORD_DEFAULT); |
||||
|
|
||||
|
$data = [ |
||||
|
'username' => $this->request->getPost('username'), |
||||
|
'password' => $password, |
||||
|
'email' => $this->request->getPost('email'), |
||||
|
'firstname' => $this->request->getPost('fname'), |
||||
|
'lastname' => $this->request->getPost('lname'), |
||||
|
'phone' => $this->request->getPost('phone'), |
||||
|
'gender' => $this->request->getPost('gender'), |
||||
|
]; |
||||
|
|
||||
|
$update = $Users->update($userId, $data); |
||||
|
|
||||
|
if ($update) { |
||||
|
return redirect()->to('/users/setting')->with('success', 'Successfully updated'); |
||||
|
} else { |
||||
|
return redirect()->back()->with('errors', 'Error occurred!')->withInput(); |
||||
|
} |
||||
|
} else { |
||||
|
// Handle validation errors for password |
||||
|
return redirect()->back()->with('errors', $validation->getErrors())->withInput(); |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
|
||||
|
$userData = $Users->find($userId); |
||||
|
|
||||
|
$groupModel = new Groups(); // Assuming you have a GroupModel |
||||
|
$groups = $groupModel->findAll(); |
||||
|
|
||||
|
$data = [ |
||||
|
'user_data' => $userData, |
||||
|
'group_data' => $groups, |
||||
|
'validation' => $validation->getErrors(), |
||||
|
'page_title' => 'Paramètre', |
||||
|
]; |
||||
|
|
||||
|
return $this->render_template('users/setting', $data); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function loginToOtherAccount(int $id) |
||||
|
{ |
||||
|
$Users = new Users(); |
||||
|
|
||||
|
$userInfo = $Users->getUserData($id); |
||||
|
|
||||
|
$email = $userInfo['email']; |
||||
|
$password = $userInfo['password']; |
||||
|
$user = $Users->attempt($email, $password, "connected_inside"); |
||||
|
// die(var_dump($user)); |
||||
|
|
||||
|
if ($user) { |
||||
|
// Set user session |
||||
|
session()->set('user', $user); |
||||
|
// Redirect to dashboard |
||||
|
return redirect()->to('/'); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function fetchProfile($id) |
||||
|
{ |
||||
|
$this->verifyRole('viewProfile'); |
||||
|
|
||||
|
$Users = new Users(); |
||||
|
$Store = new Stores(); |
||||
|
|
||||
|
$user_data = $Users->getUserData($id); |
||||
|
if (!$user_data) { |
||||
|
return $this->response->setStatusCode(404)->setBody('Utilisateur introuvable'); |
||||
|
} |
||||
|
|
||||
|
$store_name = $Store->getStoreById($user_data['store_id']); |
||||
|
$user_group = $Users->getUserGroup($id); |
||||
|
|
||||
|
$data =[ |
||||
|
'user_data' => $user_data, |
||||
|
'store_name' => $store_name, |
||||
|
'user_group' => $user_group |
||||
|
]; |
||||
|
return $this->response->setJSON([$data]); |
||||
|
} |
||||
|
|
||||
|
public function fetchUserForAssign() |
||||
|
{ |
||||
|
if (!$this->request->isAJAX()) { |
||||
|
return $this->response->setStatusCode(404)->setJSON(['message' => 'Requête invalide']); |
||||
|
} |
||||
|
|
||||
|
$user_id = $this->request->getPost('user_id'); |
||||
|
$userModel = new Users(); |
||||
|
$storeModel = new Stores(); |
||||
|
|
||||
|
$user = $userModel->getUserDataForAssign($user_id); |
||||
|
$stores = $storeModel->getAllStores(); |
||||
|
|
||||
|
if (!$user) { |
||||
|
return $this->response->setJSON(['success' => false, 'message' => 'Utilisateur introuvable']); |
||||
|
} |
||||
|
|
||||
|
return $this->response->setJSON([ |
||||
|
'success' => true, |
||||
|
'user' => [ |
||||
|
'id' => $user['id'], |
||||
|
'name' => $user['firstname'] . ' ' . $user['lastname'], |
||||
|
'role' => $user['group_name'], |
||||
|
'current_store' => $user['store_name'], |
||||
|
], |
||||
|
'stores' => $stores |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Filters; |
||||
|
|
||||
|
use CodeIgniter\Filters\FilterInterface; |
||||
|
use CodeIgniter\HTTP\RequestInterface; |
||||
|
use CodeIgniter\HTTP\ResponseInterface; |
||||
|
|
||||
|
class AuthCheck implements FilterInterface |
||||
|
{ |
||||
|
/** |
||||
|
* Do whatever processing this filter needs to do. |
||||
|
* By default it should not return anything during |
||||
|
* normal execution. However, when an abnormal state |
||||
|
* is found, it should return an instance of |
||||
|
* CodeIgniter\HTTP\Response. If it does, script |
||||
|
* execution will end and that Response will be |
||||
|
* sent back to the client, allowing for error pages, |
||||
|
* redirects, etc. |
||||
|
* |
||||
|
* @param RequestInterface $request |
||||
|
* @param array|null $arguments |
||||
|
* |
||||
|
* @return RequestInterface|ResponseInterface|string|void |
||||
|
*/ |
||||
|
public function before(RequestInterface $request, $arguments = null) |
||||
|
{ |
||||
|
// Check if the user session exists |
||||
|
if (!session()->get('user')) { |
||||
|
// Redirect to login if not authenticated |
||||
|
return redirect()->to('/login'); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Allows After filters to inspect and modify the response |
||||
|
* object as needed. This method does not allow any way |
||||
|
* to stop execution of other after filters, short of |
||||
|
* throwing an Exception or Error. |
||||
|
* |
||||
|
* @param RequestInterface $request |
||||
|
* @param ResponseInterface $response |
||||
|
* @param array|null $arguments |
||||
|
* |
||||
|
* @return ResponseInterface|void |
||||
|
*/ |
||||
|
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) |
||||
|
{ |
||||
|
// |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Filters; |
||||
|
|
||||
|
use CodeIgniter\Filters\FilterInterface; |
||||
|
use CodeIgniter\HTTP\RequestInterface; |
||||
|
use CodeIgniter\HTTP\ResponseInterface; |
||||
|
|
||||
|
class LoggedInFilter implements FilterInterface |
||||
|
{ |
||||
|
/** |
||||
|
* Do whatever processing this filter needs to do. |
||||
|
* By default it should not return anything during |
||||
|
* normal execution. However, when an abnormal state |
||||
|
* is found, it should return an instance of |
||||
|
* CodeIgniter\HTTP\Response. If it does, script |
||||
|
* execution will end and that Response will be |
||||
|
* sent back to the client, allowing for error pages, |
||||
|
* redirects, etc. |
||||
|
* |
||||
|
* @param RequestInterface $request |
||||
|
* @param array|null $arguments |
||||
|
* |
||||
|
* @return RequestInterface|ResponseInterface|string|void |
||||
|
*/ |
||||
|
public function before(RequestInterface $request, $arguments = null) |
||||
|
{ |
||||
|
// Check if the user is logged in |
||||
|
if (session()->has('user')) { |
||||
|
// Redirect to the dashboard or any other protected page |
||||
|
return redirect()->to('/'); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Allows After filters to inspect and modify the response |
||||
|
* object as needed. This method does not allow any way |
||||
|
* to stop execution of other after filters, short of |
||||
|
* throwing an Exception or Error. |
||||
|
* |
||||
|
* @param RequestInterface $request |
||||
|
* @param ResponseInterface $response |
||||
|
* @param array|null $arguments |
||||
|
* |
||||
|
* @return ResponseInterface|void |
||||
|
*/ |
||||
|
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) |
||||
|
{ |
||||
|
// |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,53 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Filters; |
||||
|
|
||||
|
use CodeIgniter\Filters\FilterInterface; |
||||
|
use CodeIgniter\HTTP\RequestInterface; |
||||
|
use CodeIgniter\HTTP\ResponseInterface; |
||||
|
|
||||
|
class PublicCheck implements FilterInterface |
||||
|
{ |
||||
|
/** |
||||
|
* Do whatever processing this filter needs to do. |
||||
|
* By default it should not return anything during |
||||
|
* normal execution. However, when an abnormal state |
||||
|
* is found, it should return an instance of |
||||
|
* CodeIgniter\HTTP\Response. If it does, script |
||||
|
* execution will end and that Response will be |
||||
|
* sent back to the client, allowing for error pages, |
||||
|
* redirects, etc. |
||||
|
* |
||||
|
* @param RequestInterface $request |
||||
|
* @param array|null $arguments |
||||
|
* |
||||
|
* @return RequestInterface|ResponseInterface|string|void |
||||
|
*/ |
||||
|
public function before(RequestInterface $request, $arguments = null) |
||||
|
{ |
||||
|
// Check if the user session exists |
||||
|
if (!session()->get('user')) { |
||||
|
// Store the current URL in session so it can be accessed after login |
||||
|
session()->set('redirect_url', current_url()); |
||||
|
// Redirect to login if not authenticated |
||||
|
return redirect()->to('/login'); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Allows After filters to inspect and modify the response |
||||
|
* object as needed. This method does not allow any way |
||||
|
* to stop execution of other after filters, short of |
||||
|
* throwing an Exception or Error. |
||||
|
* |
||||
|
* @param RequestInterface $request |
||||
|
* @param ResponseInterface $response |
||||
|
* @param array|null $arguments |
||||
|
* |
||||
|
* @return ResponseInterface|void |
||||
|
*/ |
||||
|
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) |
||||
|
{ |
||||
|
// |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
<?php |
||||
|
|
||||
|
if (!function_exists('set_user_permission')) { |
||||
|
function set_user_permission($permissions) |
||||
|
{ |
||||
|
$GLOBALS['user_permission'] = $permissions; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (!function_exists('get_user_permission')) { |
||||
|
function get_user_permission() |
||||
|
{ |
||||
|
return isset($GLOBALS['user_permission']) ? $GLOBALS['user_permission'] : []; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,4 @@ |
|||||
|
<?php |
||||
|
|
||||
|
// override core en language system validation or define your own en language validation message |
||||
|
return []; |
||||
@ -0,0 +1,72 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Assignation extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table users name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'affect_product'; |
||||
|
protected $primaryKey = 'id'; |
||||
|
protected $allowedFields = ['product_id', 'store_id', 'qty']; |
||||
|
|
||||
|
public function affecterProduits($produitId, $quantite, $pointDeVenteId) |
||||
|
{ |
||||
|
// Charger les modèles |
||||
|
$produitModel = new Products(); |
||||
|
$pointDeVenteModel = new Stores(); |
||||
|
|
||||
|
// Récupérer le produit avec son stock et son point de vente principal |
||||
|
$produit = $produitModel->find($produitId); |
||||
|
|
||||
|
// Récupérer le point de vente principal |
||||
|
$pointDeVentePrincipal = $pointDeVenteModel->find($produit['store_id']); |
||||
|
|
||||
|
// Vérifier que le stock du produit principal est suffisant |
||||
|
if ($produit['qty'] < $quantite) { |
||||
|
return 'Stock insuffisant dans le point de vente principal'; |
||||
|
} |
||||
|
|
||||
|
// Commencer une transaction pour s'assurer de l'intégrité des données |
||||
|
$db = \Config\Database::connect(); |
||||
|
$db->transStart(); |
||||
|
|
||||
|
// 1. Réduire le stock du point de vente principal |
||||
|
$newStockPrincipal = $pointDeVentePrincipal['stock'] - $quantite; |
||||
|
$pointDeVenteModel->update($produit['point_vente_principal_id'], ['stock' => $newStockPrincipal]); |
||||
|
|
||||
|
// 2. Augmenter le stock du point de vente cible |
||||
|
$pointDeVente = $pointDeVenteModel->find($pointDeVenteId); |
||||
|
$newStockVente = $pointDeVente['stock'] + $quantite; |
||||
|
$pointDeVenteModel->update($pointDeVenteId, ['stock' => $newStockVente]); |
||||
|
|
||||
|
// 3. Ajouter un enregistrement dans la table d'affectation |
||||
|
$affectationModel = new AffectationProduitModel(); |
||||
|
$affectationModel->insert([ |
||||
|
'produit_id' => $produitId, |
||||
|
'point_vente_id' => $pointDeVenteId, |
||||
|
'quantite' => $quantite, |
||||
|
'date_affectation' => date('Y-m-d H:i:s') |
||||
|
]); |
||||
|
|
||||
|
// Si tout s'est bien passé, valider la transaction |
||||
|
$db->transComplete(); |
||||
|
|
||||
|
// Vérifier si la transaction a réussi |
||||
|
if ($db->transStatus() === FALSE) { |
||||
|
return 'Une erreur est survenue lors de l\'affectation'; |
||||
|
} |
||||
|
|
||||
|
return 'Affectation réussie'; |
||||
|
} |
||||
|
|
||||
|
public function principalAffect(array $data) |
||||
|
{ |
||||
|
return $this->insert($data); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,151 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Attributes extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table users name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'attributes'; |
||||
|
protected $primaryKey = 'id'; |
||||
|
protected $allowedFields = ['name', 'active']; |
||||
|
|
||||
|
/** |
||||
|
* get active attribute data |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function getActiveAttributeData() |
||||
|
{ |
||||
|
return $this->where('active', 1)->findAll(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* get data by id or all |
||||
|
* @param int $id |
||||
|
* @return array|object|null |
||||
|
*/ |
||||
|
public function getAttributeData(int $id = null) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->find($id); // Find by id |
||||
|
} |
||||
|
return $this->findAll(); // Get all |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Count attribute values |
||||
|
* @param mixed $id |
||||
|
* @return int|string |
||||
|
*/ |
||||
|
public function countAttributeValue($id = null) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->builder('attribute_value')->where('attribute_parent_id', $id)->countAllResults(); |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get attribute value data by attribute_parent_id |
||||
|
* @param mixed $id |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function getAttributeValueData($id = null) |
||||
|
{ |
||||
|
return $this->builder('attribute_value')->where('attribute_parent_id', $id)->get()->getResultArray(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get attribute value by id |
||||
|
* @param mixed $id |
||||
|
* @return array|null |
||||
|
*/ |
||||
|
public function getAttributeValueById($id = null) |
||||
|
{ |
||||
|
return $this->builder('attribute_value')->where('id', $id)->get()->getRowArray(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Insert attribute data |
||||
|
* @param mixed $data |
||||
|
* @return bool|int|string |
||||
|
*/ |
||||
|
public function create($data) |
||||
|
{ |
||||
|
if ($data) { |
||||
|
return $this->insert($data); // Returns true/false based on success |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Update attribute data |
||||
|
* @param mixed $data |
||||
|
* @param mixed $id |
||||
|
* @return bool |
||||
|
*/ |
||||
|
public function updateAttribute($data, $id) |
||||
|
{ |
||||
|
if ($data && $id) { |
||||
|
return $this->update($id, $data); // Returns true/false based on success |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Remove attribute data |
||||
|
* @param mixed $id |
||||
|
* @return bool|\CodeIgniter\Database\BaseResult |
||||
|
*/ |
||||
|
public function remove($id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->delete($id); // Returns true/false based on success |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Insert attribute value |
||||
|
* @param mixed $data |
||||
|
* @return bool|\CodeIgniter\Database\BaseResult|\CodeIgniter\Database\Query |
||||
|
*/ |
||||
|
public function createValue($data) |
||||
|
{ |
||||
|
if ($data) { |
||||
|
return $this->builder('attribute_value')->insert($data); // Insert into attribute_value table |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Update attribute value |
||||
|
* @param mixed $data |
||||
|
* @param mixed $id |
||||
|
* @return bool |
||||
|
*/ |
||||
|
public function updateValue($data, $id) |
||||
|
{ |
||||
|
if ($data && $id) { |
||||
|
return $this->builder('attribute_value')->where('id', $id)->update($data); // Update attribute_value table |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Remove attribute value |
||||
|
* @param mixed $id |
||||
|
* @return bool|string |
||||
|
*/ |
||||
|
public function removeValue($id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->builder('attribute_value')->where('id', $id)->delete(); // Delete from attribute_value table |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,270 @@ |
|||||
|
<?php |
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
class Avance extends Model{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'avances'; |
||||
|
protected $primaryKey = 'avance_id'; |
||||
|
|
||||
|
protected $allowedFields = [ |
||||
|
'avance_amount', 'avance_date','user_id', |
||||
|
'customer_name', |
||||
|
'customer_address', |
||||
|
'customer_phone', |
||||
|
'customer_cin','gross_amount','amount_due','product_id','is_order','active','store_id']; |
||||
|
|
||||
|
public function createAvance( array $data) { |
||||
|
try { |
||||
|
return $this->insert($data); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de l\'ajout de l\'avance : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function updateAvance(int $id, array $data) { |
||||
|
|
||||
|
if ($id <= 0) { |
||||
|
log_message('error', 'ID invalide pour la mise à jour du recouvrement : ' . $id); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
|
||||
|
return $this->update($id, $data); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la mise à jour de l\'avance : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function getAllAvanceData(int $id=null) { |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
if($isAdmin) { |
||||
|
if($id){ |
||||
|
try { |
||||
|
return $this->where('user_id',$id) |
||||
|
->where('is_order',0) |
||||
|
->where('active',1) |
||||
|
->orderBy('avance_date', 'DESC') |
||||
|
->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
try { |
||||
|
return $this |
||||
|
->where('is_order',0) |
||||
|
->where('active',1) |
||||
|
->orderBy('avance_date', 'DESC') ->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
else{ |
||||
|
if($id){ |
||||
|
try { |
||||
|
return $this->where('user_id',$id) |
||||
|
->where('is_order',0) |
||||
|
->where('active',1) |
||||
|
->where('store_id',$users['store_id']) |
||||
|
->orderBy('avance_date', 'DESC') |
||||
|
->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
try { |
||||
|
return $this |
||||
|
->where('is_order',0) |
||||
|
->where('active',1) |
||||
|
->where('store_id',$users['store_id']) |
||||
|
->orderBy('avance_date', 'DESC') ->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public function fetchSingleAvance(int $avance_id){ |
||||
|
return $this->where('avance_id',$avance_id) |
||||
|
->first(); |
||||
|
} |
||||
|
|
||||
|
public function removeAvance(int $avance_id){ |
||||
|
return $this->delete($avance_id); |
||||
|
} |
||||
|
|
||||
|
public function getTotalAvance() { |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
if($isAdmin) { |
||||
|
try { |
||||
|
return $this->select(' |
||||
|
SUM(avance_amount) AS ta, |
||||
|
|
||||
|
') |
||||
|
->where('is_order', 0) |
||||
|
->get() |
||||
|
->getRowObject(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors du total du montant des avances : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
else{ |
||||
|
try { |
||||
|
return $this->select(' |
||||
|
SUM(avance_amount) AS ta, |
||||
|
|
||||
|
') |
||||
|
->where('is_order', 0) |
||||
|
->where('store_id',$users['store_id']) |
||||
|
->get() |
||||
|
->getRowObject(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors du total du montant des avances : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public function getAllAvanceData1(int $id=null) { |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
if($isAdmin) { |
||||
|
if($id){ |
||||
|
try { |
||||
|
return $this->where('user_id',$id) |
||||
|
->where('is_order',1) |
||||
|
->where('active',1) |
||||
|
->orderBy('avance_date', 'DESC') |
||||
|
->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
try { |
||||
|
return $this |
||||
|
->where('is_order',1) |
||||
|
->where('active',1) |
||||
|
->orderBy('avance_date', 'DESC') ->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
else{ |
||||
|
if($id){ |
||||
|
try { |
||||
|
return $this->where('user_id',$id) |
||||
|
->where('is_order',1) |
||||
|
->where('active',1) |
||||
|
->where('store_id',$users['store_id']) |
||||
|
->orderBy('avance_date', 'DESC') |
||||
|
->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
try { |
||||
|
return $this |
||||
|
->where('is_order',0) |
||||
|
->orderBy('avance_date', 'DESC') ->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function getAllAvanceData2(int $id=null) { |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
$isAdmin = in_array($users['group_name'], ['Conseil', 'Direction']); |
||||
|
if($isAdmin) { |
||||
|
if($id){ |
||||
|
try { |
||||
|
return $this->where('user_id',$id) |
||||
|
->where('is_order',0) |
||||
|
->where('active',0) |
||||
|
->orderBy('avance_date', 'DESC') |
||||
|
->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
try { |
||||
|
return $this |
||||
|
->where('is_order',0) |
||||
|
->where('active',0) |
||||
|
->orderBy('avance_date', 'DESC') ->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
else{ |
||||
|
if($id){ |
||||
|
try { |
||||
|
return $this->where('user_id',$id) |
||||
|
->where('is_order',0) |
||||
|
->where('active',0) |
||||
|
->where('store_id',$users['store_id']) |
||||
|
->orderBy('avance_date', 'DESC') |
||||
|
->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
try { |
||||
|
return $this |
||||
|
->where('is_order',0) |
||||
|
->where('active',0) |
||||
|
->where('store_id',$users['store_id']) |
||||
|
->orderBy('avance_date', 'DESC') ->findAll(); |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la récupération des recouvrements : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function checkExpiredAvance() |
||||
|
{ |
||||
|
$now = date('Y-m-d'); |
||||
|
$avances = $this->where('active', '1') |
||||
|
->where('DATE_ADD(avance_date, INTERVAL 15 DAY) <', $now) |
||||
|
->findAll(); |
||||
|
|
||||
|
if (!empty($avances)) { |
||||
|
$productModel = new Products(); |
||||
|
|
||||
|
foreach ($avances as $avance) { |
||||
|
// Mettre l'avance à expirée |
||||
|
$this->update($avance['id'], ['active' => '0']); |
||||
|
|
||||
|
// Remettre le produit disponible |
||||
|
$productModel->update($avance['product_id'], ['product_sold' => 0]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,115 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Brands extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'brands'; |
||||
|
protected $primaryKey = 'id'; // Primary key column |
||||
|
protected $allowedFields = ['name', 'active']; |
||||
|
|
||||
|
/** |
||||
|
* Get active brands information |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function getActiveBrands() |
||||
|
{ |
||||
|
return $this->where('active', 1)->findAll(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get brand data by id or all |
||||
|
* @param mixed $id |
||||
|
* @return array|object|null |
||||
|
*/ |
||||
|
public function getBrandData($id = null) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->find($id); // Find by id |
||||
|
} |
||||
|
return $this->findAll(); // Get all |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Insert new brand |
||||
|
* @param mixed $data |
||||
|
* @return bool|int|string |
||||
|
*/ |
||||
|
public function create($data) |
||||
|
{ |
||||
|
if ($data) { |
||||
|
return $this->insert($data); // Insert data and return true/false based on success |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Update brand data |
||||
|
* @param mixed $data |
||||
|
* @param mixed $id |
||||
|
* @return bool |
||||
|
*/ |
||||
|
public function updateBrand($data, $id) |
||||
|
{ |
||||
|
if ($data && $id) { |
||||
|
return $this->update($id, $data); // Update data by id |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Delete brand |
||||
|
* @param mixed $id |
||||
|
* @return bool|\CodeIgniter\Database\BaseResult |
||||
|
*/ |
||||
|
public function remove($id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->delete($id); // Delete by id |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public function getName() |
||||
|
{ |
||||
|
return $this->db->table('brands')->select('name')->where('active', 1)->get()->getResult(); |
||||
|
} |
||||
|
|
||||
|
public function getNameById(int $id) |
||||
|
{ |
||||
|
return $this->select('name')->where('active', 1) |
||||
|
->where('id', $id)->first(); |
||||
|
} |
||||
|
|
||||
|
public function getOrCreateIdByName(string $name): int |
||||
|
{ |
||||
|
$normalized = trim($name); |
||||
|
|
||||
|
$brand = $this |
||||
|
->where('name', $normalized) |
||||
|
->first(); |
||||
|
|
||||
|
if ($brand) { |
||||
|
return (int) $brand[$this->primaryKey]; |
||||
|
} |
||||
|
|
||||
|
$newData = [ |
||||
|
'name' => $normalized, |
||||
|
'active' => 1, |
||||
|
]; |
||||
|
|
||||
|
$insertedId = $this->insert($newData); |
||||
|
|
||||
|
if (! $insertedId) { |
||||
|
throw new \RuntimeException('Impossible de créer le brand « ' . $normalized . ' »'); |
||||
|
} |
||||
|
|
||||
|
return (int) $insertedId; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,95 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Caisse extends Model{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'caisse'; |
||||
|
protected $primaryKey = 'caisse_id'; |
||||
|
protected $allowedFields = ['caisse_total', 'caisse_mvola', 'caisse_espece', 'caisse_banque']; |
||||
|
|
||||
|
|
||||
|
public function getCaisseById($id = 1) { |
||||
|
return $this->where('caisse_id', $id)->first(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function updateCaisse($data) { |
||||
|
try { |
||||
|
$id = 1; |
||||
|
if ($this->update($id, $data)) { |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} catch (\Exception $e) { |
||||
|
log_message('error', 'Erreur lors de la mise à jour de la caisse : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public function updateCaissePerRecouvrement($montant) { |
||||
|
try { |
||||
|
$this->transStart(); |
||||
|
|
||||
|
$this->set('caisse_espece', 'caisse_espece + ' . (float)$montant, false); |
||||
|
$this->where('caisse_id', 1); |
||||
|
$this->update(); |
||||
|
|
||||
|
$this->set('caisse_mvola', 'caisse_mvola - ' . (float)$montant, false); |
||||
|
$this->where('caisse_id', 1); |
||||
|
$this->update(); |
||||
|
|
||||
|
if ($this->transStatus() === false) { |
||||
|
$this->transRollback(); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
$this->transComplete(); |
||||
|
return true; |
||||
|
} catch (\Exception $e) { |
||||
|
$this->transRollback(); |
||||
|
log_message('error', 'Erreur lors de la mise à jour de la caisse : ' . $e->getMessage()); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function updateCaissePerOrders($p1, $p2, $operation = '+', $p3 = null, $destination = 'banque') { |
||||
|
$caisse = $this->where('caisse_id', 1)->first(); |
||||
|
|
||||
|
if (!$caisse) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
$data = [ |
||||
|
'caisse_total' => $caisse['caisse_total'] + $p1, |
||||
|
]; |
||||
|
|
||||
|
if ($operation == '+') { |
||||
|
$data['caisse_mvola'] = $caisse['caisse_mvola'] + $p2; |
||||
|
} elseif ($operation == '-') { |
||||
|
$data['caisse_mvola'] = $caisse['caisse_mvola'] - $p2; |
||||
|
} |
||||
|
|
||||
|
if ($p3 !== null) { |
||||
|
if ($destination === 'banque') { |
||||
|
$data['caisse_banque'] = $caisse['caisse_banque'] + $p3; |
||||
|
} elseif ($destination === 'espece') { |
||||
|
$data['caisse_espece'] = $caisse['caisse_espece'] + $p3; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Exécuter la mise à jour |
||||
|
return $this->update(1, $data); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Cash extends Model |
||||
|
{ |
||||
|
protected $table = 'cashtransaction'; |
||||
|
protected $primaryKey = 'id'; |
||||
|
protected $allowedFields = ['montant_caisse', 'montant_mvola', 'montant_banque']; |
||||
|
|
||||
|
public function create() |
||||
|
{ |
||||
|
$transaction = $this->db->table('orders'); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,114 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Category extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'categories'; |
||||
|
protected $primaryKey = 'id'; |
||||
|
protected $allowedFields = ['name', 'active']; |
||||
|
|
||||
|
/** |
||||
|
* Get active categories information |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function getActiveCategory() |
||||
|
{ |
||||
|
return $this->where('active', 1)->findAll(); // Get active categories |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get category data by id or all |
||||
|
* @param mixed $id |
||||
|
* @return array|object|null |
||||
|
*/ |
||||
|
public function getCategoryData($id = null) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->find($id); // Find by id |
||||
|
} |
||||
|
return $this->findAll(); // Get all |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Insert new category |
||||
|
* @param mixed $data |
||||
|
* @return bool|int|string |
||||
|
*/ |
||||
|
public function create($data) |
||||
|
{ |
||||
|
if ($data) { |
||||
|
return $this->insert($data); // Insert data and return true/false based on success |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Update category data |
||||
|
* @param mixed $data |
||||
|
* @param mixed $id |
||||
|
* @return bool |
||||
|
*/ |
||||
|
public function updateCategory($data, $id) |
||||
|
{ |
||||
|
if ($data && $id) { |
||||
|
return $this->update($id, $data); // Update data by id |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Delete category |
||||
|
* @param mixed $id |
||||
|
* @return bool|\CodeIgniter\Database\BaseResult |
||||
|
*/ |
||||
|
public function remove($id) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->delete($id); // Delete by id |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
public function getOrCreateIdByName(string $name): int |
||||
|
{ |
||||
|
$normalized = trim($name); |
||||
|
|
||||
|
$brand = $this |
||||
|
->where('name', $normalized) |
||||
|
->first(); |
||||
|
|
||||
|
if ($brand) { |
||||
|
return (int) $brand[$this->primaryKey]; |
||||
|
} |
||||
|
|
||||
|
$newData = [ |
||||
|
'name' => $normalized, |
||||
|
'active' => 1, |
||||
|
]; |
||||
|
|
||||
|
$insertedId = $this->insert($newData); |
||||
|
|
||||
|
if (! $insertedId) { |
||||
|
throw new \RuntimeException('Impossible de créer le brand « ' . $normalized . ' »'); |
||||
|
} |
||||
|
|
||||
|
return (int) $insertedId; |
||||
|
} |
||||
|
public function getNameById(string $id) |
||||
|
{ |
||||
|
$result = $this->select('name') |
||||
|
->where('id', $id) |
||||
|
->first(); |
||||
|
|
||||
|
return $result ? $result['name'] : ''; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Company extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'company'; |
||||
|
// List all the fields that are allowed to be updated or inserted |
||||
|
protected $allowedFields = [ |
||||
|
'company_name', 'service_charge_value', 'vat_charge_value', 'address', 'phone', 'phone2', 'NIF', 'STAT', 'country', 'message', 'currency', |
||||
|
]; |
||||
|
|
||||
|
/** |
||||
|
* Get company data by id or all |
||||
|
* @param mixed $id |
||||
|
* @return array<float|int|object|string|null>|object|null |
||||
|
*/ |
||||
|
public function getCompanyData($id = null) |
||||
|
{ |
||||
|
if ($id) { |
||||
|
return $this->find($id); // Find by id |
||||
|
} |
||||
|
return null; // Return null if no id is provided |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Update company data |
||||
|
* @param mixed $data |
||||
|
* @param mixed $id |
||||
|
* @return bool |
||||
|
*/ |
||||
|
public function updateCompany($data, $id) |
||||
|
{ |
||||
|
if ($data && $id) { |
||||
|
return $this->update($id, $data); // Update data by id |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class FourchettePrix extends Model |
||||
|
{ |
||||
|
protected $table; |
||||
|
protected $primaryKey = 'id'; |
||||
|
protected $allowedFields = ['product_id', 'prix_minimal']; |
||||
|
|
||||
|
public function __construct() |
||||
|
{ |
||||
|
$this->table = 'fourchette_prix'; |
||||
|
parent::__construct(); |
||||
|
} |
||||
|
|
||||
|
public function getFourchettePrixByProductId($productId) |
||||
|
{ |
||||
|
return $this->where('product_id', $productId)->first(); |
||||
|
} |
||||
|
|
||||
|
public function createFourchettePrix($data) |
||||
|
{ |
||||
|
return $this->insert($data); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,87 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Groups extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'groups'; |
||||
|
protected $primaryKey = 'id'; // Primary key of your table |
||||
|
protected $allowedFields = ['group_name', 'permission']; // Fields allowed for insert/update |
||||
|
protected $useTimestamps = false; // Set to true if your table has `created_at` and `updated_at` columns |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Get group data by groupId or all (excluding id = 1) |
||||
|
* @param mixed $groupId |
||||
|
* @return array|object|null |
||||
|
*/ |
||||
|
public function getGroupData($groupId = null) |
||||
|
{ |
||||
|
if ($groupId) { |
||||
|
return $this->find($groupId); // Find by id |
||||
|
} |
||||
|
|
||||
|
return $this->where('id !=', 1)->findAll(); // Get all groups except where id = 1 |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Create new group |
||||
|
* @param mixed $data |
||||
|
* @return bool|int|string |
||||
|
*/ |
||||
|
public function createGroup($data) |
||||
|
{ |
||||
|
return $this->insert($data); // Insert data into the groups table |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Edit group by id |
||||
|
* @param mixed $data |
||||
|
* @param mixed $id |
||||
|
* @return bool |
||||
|
*/ |
||||
|
public function editGroup($data, $id) |
||||
|
{ |
||||
|
return $this->update($id, $data); // Update group by id |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Delete group by id |
||||
|
* @param mixed $id |
||||
|
* @return bool|\CodeIgniter\Database\BaseResult |
||||
|
*/ |
||||
|
public function deleteGroup($id) |
||||
|
{ |
||||
|
return $this->delete($id); // Delete group by id |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Check if group exists in user_group table |
||||
|
* @param mixed $id |
||||
|
* @return bool |
||||
|
*/ |
||||
|
public function existInUserGroup($id) |
||||
|
{ |
||||
|
return $this->db->table('user_group')->where('group_id', $id)->countAllResults() > 0; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get user group by userId |
||||
|
* @param mixed $userId |
||||
|
* @return array|null |
||||
|
*/ |
||||
|
public function getUserGroupByUserId($userId) |
||||
|
{ |
||||
|
return $this->db->table('user_group') |
||||
|
->join('groups', 'groups.id = user_group.group_id') |
||||
|
->where('user_group.user_id', $userId) |
||||
|
->get() |
||||
|
->getRowArray(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,79 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Mecanicien extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'reparations'; |
||||
|
protected $primaryKey = 'reparation_id'; // Primary key of your table |
||||
|
protected $allowedFields = ['user_id', 'produit_id', 'reparation_statut', 'reparation_observation', 'reparation_debut', 'reparation_fin']; // Fields allowed for insert/update |
||||
|
protected $useTimestamps = false; // Set to true if your table has `created_at` and `updated_at` columns |
||||
|
|
||||
|
public function createRepation(array $data) |
||||
|
{ |
||||
|
return $this->insert($data); |
||||
|
} |
||||
|
|
||||
|
public function getReparation(int $id = null) |
||||
|
{ |
||||
|
$session = session(); |
||||
|
$user = $session->get('user'); |
||||
|
if ($user['group_name'] == "Conseil" || $user['group_name'] == "Direction") { |
||||
|
$reparation = $this->select('reparations.reparation_id as reparationsID, reparations.user_id, reparations.reparation_statut, reparations.produit_id, reparations.reparation_observation, reparations.reparation_debut, reparations.reparation_fin, users.*, products.*') |
||||
|
->join('users', 'reparations.user_id = users.id') |
||||
|
->join('products', 'reparations.produit_id = products.id') |
||||
|
->findAll(); |
||||
|
} else { |
||||
|
if ($id !== null) { |
||||
|
$reparation = $this->select('reparations.reparation_id as reparationsID, reparations.user_id, reparations.reparation_statut, reparations.produit_id, reparations.reparation_observation, reparations.reparation_debut, reparations.reparation_fin, users.*, products.*') |
||||
|
->join('users', 'reparations.user_id = users.id') |
||||
|
->join('products', 'reparations.produit_id = products.id') |
||||
|
->where('users.id', $id) |
||||
|
->findAll(); |
||||
|
} else { |
||||
|
|
||||
|
$reparation = []; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $reparation; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function getReparationSingle(int $id) |
||||
|
{ |
||||
|
$reparation = $this->select('reparations.reparation_id as reparationsID, reparations.user_id, reparations.reparation_statut, reparations.reparation_statut, reparations.produit_id, reparations.reparation_observation, reparations.reparation_debut, reparations.reparation_fin, users.*, products.*') |
||||
|
->join('users', 'reparations.user_id = users.id') |
||||
|
->join('products', 'reparations.produit_id = products.id') |
||||
|
->where('reparations.reparation_id', $id) |
||||
|
->first(); |
||||
|
// return $this->where('user_id', $id)->findAll(); |
||||
|
|
||||
|
return $reparation; |
||||
|
} |
||||
|
|
||||
|
public function updateReparation(array $data, int $id) |
||||
|
{ |
||||
|
return $this->update($id, $data); |
||||
|
} |
||||
|
|
||||
|
public function deleteReparation(int $id) |
||||
|
{ |
||||
|
return $this->delete($id); |
||||
|
} |
||||
|
|
||||
|
public function getTotalReparationPerStatut(){ |
||||
|
return $this->db->table('reparation') |
||||
|
->select('COUNT(*) as total') |
||||
|
->where('reparation_statut', 2) |
||||
|
->get() |
||||
|
->getRow(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
|
||||
|
class Notification extends Model |
||||
|
{ |
||||
|
protected $table = 'notification'; |
||||
|
protected $primaryKey = 'id'; |
||||
|
protected $allowedFields = ['message', 'is_read', 'forgroup', 'store_id', "link", 'created_at']; |
||||
|
|
||||
|
public function getNotifications() |
||||
|
{ |
||||
|
$session = session(); |
||||
|
$users = $session->get('user'); |
||||
|
|
||||
|
return $this->where('store_id', $users['store_id']) |
||||
|
->groupStart() |
||||
|
->where('forgroup', $users['group_name']) |
||||
|
->orWhere('forgroup', strtolower('TOUS')) |
||||
|
->groupEnd() |
||||
|
->where('is_read', 0) |
||||
|
->orderBy('created_at', 'DESC') |
||||
|
->findAll(); |
||||
|
} |
||||
|
|
||||
|
public function markAsRead(int $id) |
||||
|
{ |
||||
|
return $this->update($id, ['is_read' => 1]); |
||||
|
} |
||||
|
|
||||
|
public function insertNotification(array $data) |
||||
|
{ |
||||
|
return $this->insert($data); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,83 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use CodeIgniter\Model; |
||||
|
use DateTime; |
||||
|
|
||||
|
/** |
||||
|
* table pivot |
||||
|
*/ |
||||
|
class OrderItems extends Model |
||||
|
{ |
||||
|
/** |
||||
|
* table name |
||||
|
* @var string |
||||
|
*/ |
||||
|
protected $table = 'orders_item'; |
||||
|
protected $allowedFields = ['order_id', 'product_id', 'qty', 'rate' , 'amount' ]; |
||||
|
|
||||
|
public function insertOrderItem($data) |
||||
|
{ |
||||
|
return $this->insert($data); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* get the orders item data |
||||
|
* @param mixed $order_id |
||||
|
* @return array|bool |
||||
|
*/ |
||||
|
public function getOrdersItemData($order_id = null) |
||||
|
{ |
||||
|
if (!$order_id) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
return $this->where('order_id', $order_id)->findAll(); // Get items of a specific order |
||||
|
} |
||||
|
|
||||
|
public function getAllSoldProductToday() { |
||||
|
return $this->select(' |
||||
|
COUNT(orders_item.id) as total_product_sold, |
||||
|
(SELECT SUM(products.qty) FROM products) as total_unsold_product |
||||
|
') |
||||
|
->join('orders', 'orders_item.order_id = orders.id') |
||||
|
->where('DATE(orders.date_time)', date('Y-m-d')) |
||||
|
->get() |
||||
|
->getRow(); |
||||
|
} |
||||
|
|
||||
|
public function getSumOrdersItemData($order_id = null) |
||||
|
{ |
||||
|
if (!$order_id) { |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
return $this->where('order_id', $order_id)->countAllResults(); |
||||
|
} |
||||
|
|
||||
|
public function updateOrderItem(int $id, array $data) |
||||
|
{ |
||||
|
return $this->where('order_id', $id) |
||||
|
->set($data) |
||||
|
->update(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function getProductIds(array $orderIds): array |
||||
|
{ |
||||
|
if (empty($orderIds)) { |
||||
|
return []; |
||||
|
} |
||||
|
|
||||
|
$items = $this->select('product_id') |
||||
|
->whereIn('order_id', $orderIds) |
||||
|
->findAll(); |
||||
|
|
||||
|
// Extrait la colonne product_id |
||||
|
return array_column($items, 'product_id'); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
} |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue